astroport/www/LOVELand/cesium/maps/dist_js/cesium.js.map

1 line
3.5 MiB
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"version":3,"sources":["dist/dist_js/app/entities/peer.js","dist/dist_js/app/entities/block.js","dist/dist_js/app/entities/ws2pmessage.js","dist/dist_js/app/controllers/app-controllers.js","dist/dist_js/app/controllers/join-controllers.js","dist/dist_js/app/controllers/login-controllers.js","dist/dist_js/app/controllers/help-controllers.js","dist/dist_js/app/controllers/wallet-controllers.js","dist/dist_js/app/controllers/wallets-controllers.js","dist/dist_js/app/controllers/wot-controllers.js","dist/dist_js/app/controllers/network-controllers.js","dist/dist_js/app/controllers/currency-controllers.js","dist/dist_js/app/controllers/transfer-controllers.js","dist/dist_js/app/controllers/settings-controllers.js","dist/dist_js/app/controllers/blockchain-controllers.js","dist/dist_js/plugins/es/js/entities/notification.js","dist/dist_js/plugins/es/js/entities/comment.js","dist/dist_js/plugins/es/js/entities/invitation.js","dist/dist_js/plugins/es/js/entities/peer.js","dist/dist_js/plugins/es/js/controllers/common-controllers.js","dist/dist_js/plugins/es/js/controllers/app-controllers.js","dist/dist_js/plugins/es/js/controllers/settings-controllers.js","dist/dist_js/plugins/es/js/controllers/wallet-controllers.js","dist/dist_js/plugins/es/js/controllers/wot-controllers.js","dist/dist_js/plugins/es/js/controllers/registry-controllers.js","dist/dist_js/plugins/es/js/controllers/profile-controllers.js","dist/dist_js/plugins/es/js/controllers/message-controllers.js","dist/dist_js/plugins/es/js/controllers/notification-controllers.js","dist/dist_js/plugins/es/js/controllers/blockchain-controllers.js","dist/dist_js/plugins/es/js/controllers/network-controllers.js","dist/dist_js/plugins/es/js/controllers/group-controllers.js","dist/dist_js/plugins/es/js/controllers/invitation-controllers.js","dist/dist_js/plugins/es/js/controllers/subscription-controllers.js","dist/dist_js/plugins/es/js/controllers/document-controllers.js","dist/dist_js/plugins/es/js/controllers/like-controllers.js","dist/dist_js/app/services/settings-services.js","dist/dist_js/plugins/graph/js/controllers/common-controllers.js","dist/dist_js/plugins/graph/js/controllers/blockchain-controllers.js","dist/dist_js/plugins/graph/js/controllers/network-controllers.js","dist/dist_js/plugins/graph/js/controllers/currency-controllers.js","dist/dist_js/plugins/graph/js/controllers/account-controllers.js","dist/dist_js/plugins/graph/js/controllers/docstats-controllers.js","dist/dist_js/plugins/graph/js/controllers/synchro-controllers.js","dist/dist_js/plugins/map/js/controllers/common-controllers.js","dist/dist_js/plugins/map/js/controllers/wot-controllers.js","dist/dist_js/plugins/map/js/controllers/registry-controllers.js","dist/dist_js/plugins/map/js/controllers/user-controllers.js","dist/dist_js/plugins/map/js/controllers/help-controllers.js","dist/dist_js/app/platform.js","dist/dist_js/app/services/network-services.js","dist/dist_js/app/services/crypto-services.js","dist/dist_js/app/services/utils-services.js","dist/dist_js/app/services/cache-services.js","dist/dist_js/app/services/modal-services.js","dist/dist_js/app/services/http-services.js","dist/dist_js/app/services/desktop-services.js","dist/dist_js/app/services/storage-services.js","dist/dist_js/app/services/device-services.js","dist/dist_js/app/services/currency-services.js","dist/dist_js/app/services/bma-services.js","dist/dist_js/app/services/wot-services.js","dist/dist_js/app/services/tx-services.js","dist/dist_js/app/services/wallet-services.js","dist/dist_js/app/services/help-services.js","dist/dist_js/app/services/plugin-services.js","dist/dist_js/app/services.js","dist/dist_js/app/controllers.js","dist/dist_js/app/templates.js","dist/dist_js/app/translations.js","dist/dist_js/app/plugins.js","dist/dist_js/plugins/translations.js","dist/dist_js/plugins/templates.js","dist/dist_js/plugins/es/js/plugin.js","dist/dist_js/plugins/es/js/services.js","dist/dist_js/plugins/es/js/services/comment-services.js","dist/dist_js/plugins/es/js/services/http-services.js","dist/dist_js/plugins/es/js/services/settings-services.js","dist/dist_js/plugins/es/js/services/registry-services.js","dist/dist_js/plugins/es/js/services/social-services.js","dist/dist_js/plugins/es/js/services/crypto-services.js","dist/dist_js/plugins/es/js/services/profile-services.js","dist/dist_js/plugins/es/js/services/notification-services.js","dist/dist_js/plugins/es/js/services/message-services.js","dist/dist_js/plugins/es/js/services/modal-services.js","dist/dist_js/plugins/es/js/services/blockchain-services.js","dist/dist_js/plugins/es/js/services/group-services.js","dist/dist_js/plugins/es/js/services/invitation-services.js","dist/dist_js/plugins/es/js/services/subscription-services.js","dist/dist_js/plugins/es/js/services/wallet-services.js","dist/dist_js/plugins/es/js/services/wot-services.js","dist/dist_js/plugins/es/js/services/tx-services.js","dist/dist_js/plugins/es/js/services/geo-services.js","dist/dist_js/plugins/es/js/services/document-services.js","dist/dist_js/plugins/es/js/services/network-services.js","dist/dist_js/plugins/es/js/services/like-services.js","dist/dist_js/plugins/es/js/controllers/currency-controllers.js","dist/dist_js/plugins/graph/js/plugin.js","dist/dist_js/plugins/graph/js/services.js","dist/dist_js/plugins/graph/js/services/data-services.js","dist/dist_js/plugins/graph/js/services/color-services.js","dist/dist_js/plugins/map/js/plugin.js","dist/dist_js/plugins/map/js/services.js","dist/dist_js/plugins/map/js/services/wot-services.js","dist/dist_js/plugins/map/js/services/registry-services.js","dist/dist_js/plugins/map/js/services/utils-services.js","dist/dist_js/plugins/map/js/controllers/network-controllers.js","dist/dist_js/plugins/map/js/controllers/settings-controllers.js","dist/dist_js/app/app.js","dist/dist_js/app/components.js","dist/dist_js/app/directives.js","dist/dist_js/app/filters.js"],"names":["Peer","json","that","this","Object","keys","forEach","key","endpoints","Block","attributes","length","_","identitiesCount","identities","joinersCount","joiners","activesCount","actives","leaversCount","leavers","revokedCount","revoked","excludedCount","excluded","certificationsCount","certifications","transactionsCount","transactions","empty","isEmpty","id","number","hash","join","Ws2pMessage","message","parts","split","startsWith","Error","pubkey","buid","prefix","matches","regexp","WS2P_PREFIX","exec","privateOptions","private","useTor","mode","substring","publicOptions","public","ws2pid","software","version","powPrefix","PluginExtensionPointController","$scope","PluginService","extensionPoint","extensions","points","current","get","AppController","$rootScope","$state","$ionicSideMenuDelegate","$q","$timeout","$ionicHistory","$controller","$window","csPlatform","csSettings","CryptoUtils","csCrypto","UIUtils","BMA","csWallet","Device","Modals","csConfig","csHttp","walletData","data","search","login","isLogin","auth","isAuth","motion","default","fullscreen","screen","isEnabled","showHome","nextViewOptions","historyRoot","go","then","loading","hide","createHelptipScope","isTour","tour","settings","helptip","enable","isSmall","helptipScope","$new","startHelpTour","event","skipClearCache","defaultPrevented","clearHistory","clearCache","$destroy","catch","err","disableHelpTour","preventDefault","stopPropagation","store","loadWalletData","options","console","warn","wallet","loadData","loadWallet","isStarted","ready","isDataLoaded","when","loginAndGo","state","closeProfilePopover","httpsMode","location","protocol","href","hashIndex","indexOf","rootPath","substr","httpsModeDebug","debug","logout","force","profilePopover","askConfirm","alert","confirm","show","isOpenLeft","toggleLeft","isDefault","onError","doAuth","isUserPubkey","api","on","deferred","resolve","unauth","showTransferModal","parameters","showTransfer","showAboutModal","showAbout","showJoinModal","showJoin","showSettings","showHelpModal","showHelp","showProfilePopover","popover","templateUrl","scope","autoremove","afterShow","ink","selector","isShown","showPeerInfoPopover","openLink","$event","uri","uid","USER_ID","test","copy","open","showFab","timeout","toggleOn","hideFab","toggleOff","doMotion","askFullscreen","isWeb","undefined","cancelText","okText","toggleFullscreen","toggleAll","HomeController","$translate","$http","csCache","csCurrency","locales","angular","smallscreen","showInstallHelp","enter","e","ionic","Platform","isIOS","window","StatusBar","overlaysWebView","stateParams","error","node","disableAnimate","disableBack","reload","inherit","notify","loadFeeds","$on","feedUrl","getFeedUrl","maxContentLength","feed","now","Date","format","responseType","cache","constants","LONG","success","items","reduce","res","item","title","content_text","content_html","date_published","time","moment","utc","unix","content","replace","endIndex","Math","max","lastIndexOf","truncated","author","concat","status","doQuickFix","action","changeLanguage","langKey","use","hideLocalesPopover","locale","findWhere","showLocalesPopover","localesPopover","JoinController","extend","JoinChooseAccountTypeModalController","formData","slides","slider","loop","effect","speed","load","currency","name","lockSwipes","slidePrev","unlockSwipes","slideNext","selectAccountTypeAndClose","type","demo","accountType","closeModal","helpAnchor","anchor","JoinModalController","$interval","pseudo","pager","showPager","slideBehavior","isLicenseRead","showUsername","showPassword","computing","userIdPattern","accountAvailable","walletId","children","getByPubkey","licenseFileUrl","getLicenseUrl","computeSlideBehavior","showAccountPubkey","scryptKeypair","username","password","keypair","util","encode_base58","signPk","checkAccountAvailable","formDataChanged","getCurrentFormName","index","activeIndex","formName","hasPreviousButton","hasNextButton","hasAcceptButton","focus","hasSendButton","doNext","$submitted","$valid","uiAlreadyUsed","doPrev","doNewAccount","messageKey","cssClass","okType","onErrorLogout","parameter","isNew","method","expectedPubkey","showMethods","alertIfUnusedWallet","needSelf","isUndefined","blockUid","toUpperCase","setSelf","self","membership","inside","ucode","errorCodes","MEMBERSHIP_ALREADY_SEND","requirements","downloadRevocationRegistration","downloadRevocation","startListenLicenseBottom","iframeEl","element","document","querySelector","contentWindow","licenseBottomInterval","yPos","body","scrollTop","scrollHeight","clientHeight","stopListenLicenseBottom","cancel","checkUid","wot","lookup","results","some","pub","uids","idty","$watch","tx","sources","identifierRecovery","i","LoginController","showLoginModal","LoginModalController","$ionicPopover","ionicReady","showPubkey","showComputePubkeyButton","autoComputePubkey","pubkeyPattern","PUBKEY","PUBKEY_WITH_CHECKSUM","isDefined","showNewAccountLink","expectedUid","scryptParamsValues","SCRYPT_PARAMS","label","params","init","grade","toLowerCase","rememberMe","keepAuthIdle","keepAuth","KEEP_AUTH_IDLE_SESSION","changeMethod","leave","methods","doLogin","skipForm","form","promise","scryptPrams","scrypt","pubkeyError","file","valid","readKeyFile","withSecret","trim","showWotLookupModal","pkChecksum","$error","checksum","rememberMeChanged","equals","keepAuthIdleChanged","methodChanged","paramsChanged","useLocalStorage","silent","onScryptFormChanged","computePubkey","salt","pwd","scryptSignPk","showAccountSecurityModal","showAccountSecurity","doScan","barcode","scan","parse","keyfile","parseData","signSk","base58","encode","hideMethodsPopover","find","changeScrypt","subTitle","read","BAD_PASSWORD","onFileChanged","fileData","size","fileContent","validatingFile","removeKeyFile","searchText","showWotLookup","q","showMethodsPopover","methodsPopover","AuthController","config","readonly","setForm","HelpController","$anchorScroll","HelpModalController","itemsClass","listClass","HelpTipController","csHelpConstants","continue","executeStep","partName","steps","step","next","showHelpTip","bindings","value","hasNext","backdropClickToClose","startWalletNoLoginTour","startWalletTour","startWalletCertTour","walletCerts","startTxTour","startWalletsTour","wallets","startHeaderTour","startSettingsTour","startWotLookupTour","cancelled","wotLookup","startWotTour","startWotCertTour","wotCerts","startCurrencyTour","startNetworkTour","network","finishTour","startIndex","contentParams","icon","position","isOpen","useRelative","glyph","is","retry","showNetworkTabIfNeed","tabs","querySelectorAll","triggerHandler","installDocUrl","getElementById","currentUD","hasCertificationsItem","isMember","pendingMembership","stepCount","skipAll","_getProfilBtnElement","elements","el","offsetWidth","style","all","HelpTourController","WalletController","$ionicPopup","$location","ModalUtils","csPopovers","csHelp","qrcodeId","$id","toggleQRCode","likeData","likes","abuses","refresh","enableSelectWallet","count","isDefaultWallet","cleanLocationHref","updateView","addListeners","showQRCode","$broadcast","setRegisterForm","registerForm","onWalletLogout","hideQRCode","removeListeners","listeners","$watchCollection","newEvents","oldEvents","remove","showUidPopup","reject","translations","newUid","buttons","text","onTap","hideActionsPopover","doMembershipIn","retryCount","membershipIn","keepSelf","info","showJoinMember","membershipOut","confirmAgain","out","toast","doUpdate","refreshData","renewMembership","wasMember","needRenew","minData","membershipExpiresIn","fixIdentity","sigDate","fixMembership","inheritedLogout","loadQrCode","svg","html","showCertifications","showGivenCertifications","showTxHistory","showLicenseModal","balance","done","showSecurityModal","showSelectIdentitiesModal","showSelectPubkeyIdentity","alternatives","showSelectWalletModal","showSelectWallet","showDefault","showBalance","excludedWalletId","newWallet","showActionsPopover","actionsPopover","showSharePopover","url","shareBaseUrl","share","titleKey","titleValues","postMessage","showSelectWalletPopover","WalletTxController","csTx","hasMinData","downloadHistoryFile","fromTime","balanceChanged","newVal","oldVal","walletHistoryAutoRefresh","push","newBlock","block","showTxErrors","goState","showMoreTx","walletHistoryTimeSecond","date","HTTP_LIMITATION","toUnlockUIArray","unlockTreeItem","leftPadding","operator","padding-left","child","padding-top","padding-bottom","showLockedOutputsPopover","lockedOutputs","popoverData","lockedOuputs","lockedOutput","amount","unlockFunctions","unlockConditions","unlockTree","hideLockedOutputsPopover","lockedOutputsPopover","stateName","WalletTxErrorController","filterReceivedTx","filterSentTx","hasReceivedTx","errors","hasSentTx","WalletSecurityModalController","isLastSlide","recover","isValidFile","hasSelf","canRevoke","needMembership","option","addQuestion","level","questions","toString","each","translation","checked","hasContent","recoverId","downloadSaveIDFile","selectOption","enableOnDemo","restore","question","answer","revocation","indexOfQuestions","LastIndexQuestions","cypherNonce","cypherPubkey","cypherSalt","cypherPwd","recoverForm","loginData","forceAuth","values","filter","record","getCryptedId","downloadSaveId","isRequired","revokeWithFile","revokeIdentity","downloadRevokeFile","revokeWalletIdentity","revoke","revocationError","downloadKeyFile","WalletListAbstractController","filterTranslations","updatingWalletId","stopped","setParameters","jobs","defaultWallet","walletLoadOptions","hasLoadError","loadCounter","updateWalletView","loadPromise","loaded","refreshOptions","merge","resetData","filterFn","entered","selectorSuffix","selectPrevented","addNewWallet","useLocalStorageEncryption","raisePromise","addListenersOnWallet","add","showNewWalletModal","instance","hasPubkey","select","WalletSelectModalController","isDefaultPrevented","WalletListViewController","editWallet","showEditPopup","newName","localName","storeData","downloadAsFile","downloadFile","selectAndRemoveWallet","showImportFileModal","authData","loginAndAddWallet","setEditForm","editForm","inheritedUpdateView","inheritedUpdateWalletView","WalletSelectPopoverController","closePopover","WalletListImportModalController","rows","row","cols","removeFile","WotLookupController","$focus","csWot","wotSearchTextId","enableFilter","enableWallets","allowMultiple","selection","showResultLabel","updateLocationHref","doSearch","initPhase","doGetPending","doGetNewcomers","doGetWallets","resetWotSearch","match","doSearchText","total","idties","doDisplayResult","countBy","hit","divider","offset","skipLocationUpdate","newcomers","hits","hasMore","searchFunction","pending","avatar","showMore","loadingMore","ok","expire","toggleCheck","identity","addToSelection","removeSelection","toggleSelect","selected","copyIdty","identityInSelection","splice","existIdtyInResult","scanQrCode","result","obj","identityInRes","WotLookupModalController","superEnter","WotIdentityAbstractController","disableCertifyButton","viewData","enableBack","pendingRevocation","canCertify","canSelectAndCertify","cert","received_cert","received_cert_pending","expiresIn","timeWarningExpire","alreadyCertified","certify","displayBalance","expired","previousCert","meta","timestamp","sig","prepareNewCert","unshift","pendingCertificationCount","selectAndCertify","confirmTitle","extendAll","given_cert_pending","removeActionParamInLocationHref","doAction","WotIdentityViewController","fadeSlideInRight","like","kinds","onLoadSuccess","showSelectIdentities","qrcode","WotIdentityTxViewController","WotCertificationsViewController","motions","receivedCertifications","fadeSlideIn","givenCertifications","fadeIn","skipItems","doMotionReceivedCertifications","ionListClass","doMotionGivenCertifications","isWallet","WotSelectPubkeyIdentityModalController","loadRequirements","NetworkLookupController","csNetwork","networkStarted","ionItemClass","expertMode","isHttps","endpoint","bma","ssl","ws2p","sort","asc","compactMode","helptipPrefix","enableLocationHref","isDefaultNode","same","host","port","expert","close","computeOptions","member","mirror","online","start","refreshing","changed","peers","memberPeersCount","isBusy","loadPeers","toggleSearchType","toggleSearchEndpoint","toggleSort","toggleCompactMode","selectPeer","peer","compacted","hasBma","server","getServer","isSsl","isTor","tor","context","clickEvent","showEndpointsPopover","endpointName","getEndpoints","ep","parseEndPoint","path","showWs2pPopover","privateAccessMessage","valueKey","NetworkLookupModalController","NetworkLookupPopoverController","PeerInfoPopoverController","blockchain","medianTime","powMin","useSsl","summary","duniter","latest","latestRelease","compare","isPreRelease","hasNewRelease","PeerViewController","isReachable","serverParts","lightInstance","peering","map","p","blockNumber","dns","getDns","keyID","sortBy","score","hasMainConsensusBlock","ipv4","ipv6","isWs2p","openRawPeering","openRawCurrentBlock","CurrencyViewController","M","MoverN","UD","cactual","c","dt","sigQty","sigStock","msWindow","msValidity","sigWindow","sigValidity","sigPeriod","difficulty","Nprev","stepMax","sentries","xpercent","durationFromLastUD","dtReeval","udReevalTime0","allRules","allWotRules","licenseUrl","mainBlockChanged","mainBlock","lastUDTime","avgGenTime","udTime0","monetaryMass","N","membersCount","NO_CURRENT_BLOCK","stats","ud","blocks","lastBlockWithUD","unitbase","dividend","pow","ud0","Mprev","MoverNprev","ceil","refreshPeers","showExtendActionsPopover","onAllRulesChange","onAllWotRulesChange","CurrencyLicenseModalController","FileSaver","licenseUrlHtml","Blob","saveAs","TransferController","TransferModalController","$filter","convertedBalance","destPub","comment","useComment","restPub","restAmount","udAmount","minAmount","commentPattern","COMMENT","commentInputId","digitKeyboardSettings","keyboard","digit","bindModel","decimal","decimalSeparator","resizeContent","digitKeyboardVisible","destUid","restUid","$$destroyed","onUseRelativeChanged","onAmountChanged","$setPristine","sending","parseFloat","RegExp","min","$invalid","doTransfer","hideDigitKeyboard","askTransferConfirm","toFixed","transferAll","transfer","hasRest","from","to","unit","restTo","addComment","formDataField","showUnitPopover","showDigitKeyboard","SettingsController","popupData","nodePopup","keepAuthIdleLabels","10","labelKey","labelParams","30","60","600","3600","9999","keepAuthIdles","blockValidityWindowLabels","0","6","12","24","blockValidityWindows","blockCount","setPopupForm","popupForm","defaultSettings","reset","pendingSaving","restart","changeNode","showNodePopup","newNode","temporary","isAlive","alive","stop","showNodeList","forceUseSsl","_popupStack","responseDeferred","showNetworkLookup","getBMA","hasValid4","save","saving","cleanupHelpTip","apply","onDataChanged","oldValue","newValue","BlockLookupController","searchTextId","defaultSizeLimit","doSearchLast","blocksSlice","oldestNumber","cleanData","b","doPrepareResult","formatDateShort","previousEmptyBlockDay","lastBlock","day","blockDay","notFirstEmpty","previousNotEmptyOrSameDay","onBlock","websocket","onListener","existingBlock","showBlock","selectBlock","BlockViewController","users","groupBy","issuers","issuer","outputs","output","unlockCondition","parseUnlockCondition","showUnlockConditionPopover","unlockConditionPopover","hideUnlockConditionsPopover","openRawBlock","EsNotification","markAsReadCallback","pubkeys","input","messagePrefixes","user","page","read_signature","code","reference","markAsRead","avatarIcon","Comment","creationTime","reply_to","replyCount","parent","replies","onRemoveListeners","otherComment","avatarStyle","setReplies","copyFromJson","addOnRemoveListener","listener","cleanAllListeners","removeAllReplies","addReplies","cm1","cm2","reply","containsReply","addReply","removeReply","replyId","findIndex","Invitation","separatorIndex","EsPeer","ESPicturesEditController","selectNewPicture","inputSelector","openPicturePopup","fileInput","click","camera","getPicture","imageData","pictures","src","isnew","image","resizeFile","removePicture","favoritePicture","rotatePicture","rotateSrc","dataURL","ESCategoryModalController","allCategories","categories","afterLoad","cat","ESCommentsController","defaultCommentSize","comments","animate","service","scrollToAnchor","loadAvatarAllParent","cmt","changes","elemList","getElementsByName","onKeypress","charCode","ctrlKey","focusNewComment","stateUrl","absolute","postUrl","autoselect","edit","newComment","forceIfSmall","removeParentLink","toggleExpandedReplies","expandedReplies","toggleExpandedParent","expandedParent","ESSocialsEditController","SocialUtils","socialData","reorder","addSocialNetwork","socials","social","startVelocity","editSocialNetwork","reorderSocialNetwork","fromIndex","toIndex","recipient","ESSocialsViewController","openSocial","ESAvatarModalController","$sce","initCrop","imageCropStep","imgSrc","resultBlob","fileReader","FileReader","readAsDataURL","onload","$applyAsync","getTrustedHtml","doCrop","doPrevious","clear","ESPositionEditController","esGeo","defaultCountry","plugins","es","loadingCurrentPosition","formPosition","searchModalOpened","tryToLocalize","getAddressToSearch","point","searchByAddress","updateGeoPoint","openSearchLocationModal","forceFallback","onCityChanged","geoPoint","lat","lon","onUseGeopointChanged","dirty","onGeopointChanged","address","city","cityParts","postcode","country","fallbackText","focusFirstInput","ESLookupPositionController","loadingPosition","geoDistanceLabels","distance","geoDistances","searchPosition","exact","shortName","ESSearchPositionItemController","locations","selectLocationIndex","onKeydown","keyCode","hideDropdown","onEnter","onArrowUpOrDown","showDropdown","selectLocation","velocity","onLocationChanged","requestId","license","exactMatch","ESSearchPositionModalController","firstSearch","dividerText","ESExtensionController","esSettings","isEnable","ESMenuExtendController","showRegistryLookupView","showNotificationsPopover","showMessagesPopover","showInvitationsPopover","ESProfilePopoverExtendController","showEditUserProfile","ESPluginSettingsController","esHttp","esModals","hasWindowNotification","keepEnableState","wasEnable","isFallbackNode","isFallback","changeEsNode","newEsNode","ES_USER_API_ENDPOINT","esEps","getEsEndpoints","esEp","onFormChanged","notifications","emitHtml5","Notification","permission","requestPermission","ESWalletViewController","showProfileHelp","showNewPageModal","showNewPage","ESWalletLikesController","esProfile","canEdit","loadLikes","ESWotLookupExtendController","openRegistryLookup","ESWotIdentityViewController","esLike","esWallet","esInvitation","KINDS","showNewMessageModal","profile","showMessageCompose","sent","showSuggestCertificationModal","hideCertificationActionsPopover","help","box","getKeypair","send","showAskCertificationModal","askCertification","delete","canDelete","moderator","showCertificationActionsPopover","certificationActionsPopover","ESRegistryLookupController","esRegistry","lastRecords","category","advanced","geoDistance","isNaN","geoUnit","finishEntered","d","defaultSearch","registry","instant","last","oldLocation","odlDistance","onGeoPointChanged","resolveLocationPosition","doGetLastRecords","hidePopovers","filters","term","tags","parseTags","multi_match","query","fields","boost","description","nested","bool","category.name","terms","category.id","locationCity","or","and","not","exists","field","match_phrase","geo_distance","request","highlight","should","minimum_should_match","doRequest","formatSlug","urlTitle","removeType","removeCategory","removeLocation","onToggleAdvanced","toggleAdvanced","showRecordTypeModal","showCategoryModal","filtersPopover","showFiltersPopover","hideFiltersPopover","ESWalletPagesController","ESRegistryRecordViewController","args","background-image","secondTry","picture","_source","pic","fromAttachment","pages","ESRegistryRecordEditController","nextParams","fromState","confirmSave","saved","confirmGo","raw","avatarClass","onFormDataChanged","needCategory","hasWaitDebounce","uniq","picturesCount","toAttachment","resizeSrc","imageSrc","_content","_content_type","update","currentView","stateId","rotateAvatar","rotating","fileChanged","target","files","goBack","showAvatarModal","ESViewEditProfileController","existing","socialReorder","source","updateWallet","descriptionHtml","parseAsHtml","showSuccessToast","doFinishSave","saveAndClose","submitAndSaveAndClose","removeProfile","ESMessageAbstractListController","esMessage","limit","fabButtonNewMessageId","s","markAllAsRead","msg","deleteAll","removeAll","messageId","showReplyModal","isReply","onMessageDelete","onNewOutboxMessage","onNewInboxMessage","notification","new","onUnauth","ESMessageInboxListController","ESMessageOutboxListController","ESMessageComposeController","ESMessageComposeModalController","doSend","forceNoContent","destName","ESMessageViewController","clearPageCache","recipientField","PopoverMessageController","onNewMessageNotification","NotificationsController","esNotification","preventSelect","codes","excludes","EXCLUDED_CODES","setWallet","aWallet","resetUnreadCount","unreadCount","lastNotification","readTime","onNewNotification","nextIndex","n","PopoverNotificationsController","ESBlockLookupController","esBlockchain","excludeCurrent","parseSearchText","took","itemRemove","toggleShowQuery","showQuery","ESNetworkLookupController","esNetwork","endpointFilter","ES_USER_API","toggleOnline","ESNetworkLookupModalController","ESNetworkLookupPopoverController","ESPeerInfoPopoverController","ESPeerViewController","getUrl","docCount","hasEsEndpoint","ESGroupListController","esGroup","showNewRecordModal","ESGroupViewController","fetchPictures","ESGroupEditController","InvitationsController","defaultSearchLimit","DEFAULT_LOAD_SIZE","includes","INVITATION_CODES","invitations","onNewInvitation","invitation","accept","showNewInvitationModal","showNewInvitation","PopoverInvitationController","NewInvitationModalController","recipients","suggestions","onUseCommentChanged","removeRecipient","removeSuggestion","showSelectRecipientModal","showSelectSuggestionModal","ViewSubscriptionsController","esSubscription","emailFrequencies","groups","addSubscription","showEmailModal","notImplemented","addToUI","subscriptions","editSubscription","oldRecord","removeFromUI","deleteSubscription","ModalEmailSubscriptionsController","frequencies","frequency","doSubmit","email","subscriptionForm","ES_SUBSCRIPTION_API","ESDocumentLookupController","esDocument","showHeaders","doc","selectDocument","startListenChanges","wsChanges","change","fromHit","_operation","onDeleteDocument","onNewDocument","updated","ESLastDocumentsController","inheritedComputeOptions","side","getTimeFunction","ESLikesController","abuseData","abuseLevels","staring","initLikes","kind","contains","markAsView","$parent","toggleLike","reportAbuse","toggle","delta","wasHitByPubkey","wasHitCount","setAbuseForm","abuseForm","showAbuseCommentPopover","GpCurrencyAbstractController","_truncDate","startOf","rangeDuration","timePct","firstBlockTime","scale","beginAtZero","height","width","maintainAspectRatio","times","t","stepUnit","parseInt","currencyAge","setScale","updateHiddenDataset","updateLocation","setSize","toggleScale","scales","yAxes","yAxe","ticks","callback","log10","setRangeDuration","startTime","endTime","rangeDurationSec","datasetOverride","hidden","yAxisID","dataset","display","onLegendClick","legendItem","datasetIndex","ci","chart","getDatasetMeta","datasets","union","difference","goPreviousRange","loadingRange","goNextRange","timeWindow","onRangeChanged","updateRange","updateTimePct","GpBlockchainTxCountController","gpData","gpColor","displayRightAxis","txCount","datePatterns","hour","month","formatAmount","currencySymbol","labelPattern","labels","local","colors","fix","responsive","gridLines","drawOnChartArea","legend","onClick","tooltips","enabled","callbacks","tooltipItems","yLabel","hoverBackgroundColor","rgba","calm","fill","borderColor","gray","borderWidth","backgroundColor","pointBackgroundColor","pointBorderColor","white","pointHoverBackgroundColor","pointHoverBorderColor","translucent","pointRadius","onChartClick","_index","GpBlockchainIssuersController","countByIssuer","barOptions","custom","GpPeerViewExtendController","GpCurrencyViewExtendController","GpCurrencyMonetaryMassController","displayShareAxis","hiddenDatasets","truncAmount","trunc","withDividend","formatDate","blocksPeriod","pointHitRadius","pointHoverRadius","showLine","energized","GpCurrencyDUController","dateFilter","GpCurrencyMembersCountController","withCurrent","xAxes","GpAccountBalanceController","defaultSetScale","abs","withUD","movement","formatDecimal","received","stacked","positive","assertive","lineTension","GpAccountSumTxController","history","inputChart","computeChartData","outputChart","txArray","formatPubkey","sumByPubkeys","sum","sumItems","reverse","pluck","onInputChartClick","onOutputChartClick","GpAccountCertificationController","formatInteger","deltaReceived","deltaGiven","given","displayFormat","addPlus","GpDocStatsController","chartIdPrefix","charts","series","color","royal","clickState","defaultChartOptions","serie","docstat","usedYAxisIDs","endsWith","previousValue","_chart","canvas","_datasetIndex","GpSynchroController","synchro","execution","MapEditPositionAbstractController","MapUtils","mapId","markers","center","zoom","lng","helpText","draggable","MapWotViewController","$templateCache","$interpolate","leafletData","mapWot","markersSearchLayer","icons","markerColor","iconColor","loadingMarker","layers","overlays","visible","bounds","showDescription","enableDescription","noBackdrop","cPart","loadMap","getMap","L","easyButton","leafletClasses","states","addTo","btn","Control","separate","control","localizeMe","layerGroup","searchTip","layer","propertyName","buildTip","val","moveToLocation","lnglat","_map","setView","panTo","popupMarkerId","popupMarker","_layers","openPopup","firstTipSubmit","tooltipLimit","extractMarkerLayer","marker","markerClusterLayer","markerClusterGroup","disableClusteringAtZoom","LOCALIZE_ZOOM","maxClusterRadius","showCoverageOnHover","iconCreateFunction","cluster","countByLayer","getAllChildMarkers","childCount","getChildCount","className","divIcon","iconSize","Point","eachLayer","addLayer","featureGroup","subGroup","fire","clearLayers","markerTemplate","shortPubkey","opacity","getMessageScope","searchMarker","Marker","centerHash","isNumber","mapwot","startMapWotTour","MapRegistryViewController","mapRegistry","shop","company","association","institution","pageMarkerTemplate","MapPageEditController","MapProfileEditController","MapHelpTipController","module","factory","Api","localStorage","flag","fallbackLocale","fallbackLanguage","fixLocale","localeParts","similarLocale","l","String","prototype","call","previousData","startPromise","fixedLocale","STORAGE_KEY","fixedSettings","cacheTimeMs","timeWarningExpireMembership","minVersion","sourceUrl","sourceLicenseUrl","newIssueUrl","userForumUrl","latestReleaseUrl","duniterLatestReleaseUrl","persistCache","walletHistorySliceSecond","showUDHistory","decimalCount","uiEffects","blockValidityWindow","header","defaultLanguage","en","fr-FR","es-ES","started","emitChangedEvent","raise","getObject","previousSettings","savedData","setObject","applyData","newData","localeChanged","localeId","storedData","numeral","language","registerEvent","getByPath","defaultValue","jsonFeed","interval","isHttpsMode","compact","knownBlocks","minOnlineBlockNumber","uidsByPubkeys","searchingPeersOnNetwork","difficulties","ws2pHeads","loadW2spHeads","heads","head","loadDifficulties","levels","newPeers","flushNewPeersAndSort","sortPeers","initJobs","addOrRefreshPeerFromJson","hasEndpoint","privateWs2pHeads","privateEPCount","hasEndPoint","currentNumber","useWs2p","applyPeerFilter","oldBlock","isBma","list","createPeerEntities","hasUpdates","existingPeer","existingMainBuid","existingOnline","refreshPeer","refreshedPeer","existingIndex","useBma","endpointsAsString","epStr","getHost","ws2pHeadKey","getPort","ROOT_BLOCK_HASH","hardship","updateMainBuid","ids","newPeersAdded","computeScoreAlphaValue","nbChars","charCodeAt","buids","previousPeer","pct","hasConsensusBlock","consensusBlockDelta","$q_started","hasPeers","getPeers","getTrustedPeers","getKnownBlocks","getMainBlockUid","mainBuid","CryptoAbstractService","isLoaded","array_to_string","buf","bb","Uint8Array","f","readAsText","crypto_sign_BYTES","crypto_secretbox_NONCEBYTES","crypto_box_MACBYTES","SEED_LENGTH","SIMPLE","r","memory","DEFAULT","async_load_base58","on_ready","Base58","async_load_scrypt","scrypt_module_factory","async_load_nacl_js","nacl_factory","instantiate","async_load_base64","Base64","async_load_sha256","sha256","seed_from_signSk","seed","crypto","msCrypto","Crypto","FullJSServiceFactory","nacl","base64","check","function_name","check_injectBytes","what","thing","expected_length","check_length","bs","MALLOC","nacl_raw","HEAPU8","set","injectBytes","nbytes","_malloc","FREE","pointer","_free","Target","decode_utf8","unescape","encodeURIComponent","encode_utf8","a","decode_base58","decode","decode_base64","encode_base64","hash_sha256","to_hex","crypto_hash_sha256","random_nonce","getRandomValues","nonce","crypto_box_random_nonce","msg_int8","crypto_scrypt","seedLength","box_keypair_from_sign","signKeyPair","boxSk","boxPk","ska","_crypto_sign_secretkeybytes","skb","_crypto_box_secretkeybytes","_crypto_sign_ed25519_sk_to_curve25519","crypto_box_keypair_from_raw_sk","extractBytes","box_pk_from_sign","pka","_crypto_sign_publickeybytes","pkb","_crypto_box_publickeybytes","_crypto_sign_ed25519_pk_to_curve25519","box_sk_from_sign","recipientPk","senderSk","messageBin","ciphertextBin","crypto_box","box_open","cypherText","senderPk","recipientSk","crypto_box_open","scryptParams","signKeypair","crypto_sign_seed_keypair","boxKeypair","crypto_box_seed_keypair","seedKeypair","verify","signature","sm","crypto_sign_open","sign","m","sk","signedMsg","crypto_sign","defer","naclOptions","scryptOptions","requested_total_memory","loadedLib","checkAllLibLoaded","lib","fromSignKeypair","skFromSignSk","pkFromSignPk","pack","subarray","serviceImpl","regexpContent","xor","buffer","concat_Uint8Array","buffer1","buffer2","tmp","byteLength","WIF","DATA_LENGTH","EWIF","SALT_LENGTH","DERIVED_HALF_LENGTH","REGEXP","SECKEY","FILE","TYPE_LINE","VERSION","PUB","SEC","DATA","BAD_CHECKSUM","parseKeyFileContent","defaultType","typeMatch","parseWIF_or_EWIF","data_base58","data_int8","wif_base58","wif_int8","wif_int8_no_checksum","slice","expectedChecksum","parseWIF_v1","parseEWIF_v1","ewif_base58","ewif_int8","ewif_int8_no_checksum","encryptedhalf1","encryptedhalf2","scrypt_seed","derivedhalf1","derivedhalf2","aesEcb","aesjs","ModeOfOperation","ecb","decryptedhalf1","decrypt","decryptedhalf2","expectedSalt","getBoxKeypair","signPk_int8","reader","parseKeyFileData","generateContent","generateKeyFileContent","fi","seed_fi","wif_v1_from_keypair","seed1_xor_derivedhalf1_1","seed2_xor_derivedhalf1_2","encrypt","ewif_v1_from_keypair","recipientFieldName","cypherFieldNames","boxRecipientPk","fieldName","cypherTexts","cypherFieldName","records","issuerFieldName","issuerBoxPks","issuerBoxPk","$ionicPlatform","readyPromise","$ionicLoading","$ionicConfig","ionicMaterialInk","ionicMaterialMotion","Fullscreen","screenmatch","exports","loadingTextCache","bind","alertError","subtitle","template","alertInfo","hideLoading","showLoading","isSmallScreen","active","imageOnLoadResize","thumbnail","ctx","maxWidth","maxHeight","createElement","getContext","xoffset","yoffset","drawImage","dataurl","toDataURL","showPopover","popovers","_show","isResolved","getSelection","setSelectionRange","autofocus","$emit","_cleanup","removeClass","fromTemplateUrl","afterHidden","motionDelegate","delegate","motionTimeout","defaultSelector","createQRCodeObj","typeNumber","errorCorrectionLevel","mb","stringToBytes","stringToBytesFuncs","qr","addData","make","classList","ripple","blinds","panInLeft","pushDown","slideUp","cancelType","_getLoader","loader","duration","fullMsg","displayEffect","setEffects","views","transition","nothing","class","createSvgTag","img","createImgTag","fab","fabs","getElementsByClassName","showHelptip","preAction","postAction","retryTimeout","selectElementText","childNodes","range","createRange","selectNodeContents","removeAllRanges","addRange","selectedText","angle","PI","rotate","imageOnLoadRotate","CacheFactory","VERY_LONG","MEDIUM","SHORT","storageMode","getSettingsStorageMode","cacheNames","getCacheOptions","deleteOnExpire","onExpire","cacheFlushInterval","onSettingsChanged","newStorageMode","cacheName","setOptions","maxAge","counter","createCache","cachePrefix","clearAll","controller","buildDate","build","DATE_PATTERN","$ionicModal","$injector","DefaultModalController","resolved","openModal","modal","hideModal","propName","getParameters","hideDelay","ctrlName","fragments","animation","locals","ctrlEval","isControllerAs","controllerName","ctrlInstance","showJoinWallet","useDigitKeyboard","showLogin","showLicense","submit","popup","afterShowSaved","sockets","allCachePrefixes","processError","prepare","pkeys","queryParams","newUri","pkey","parseUri","parser","pathname","hostname","compareVersionNumbers","v1","v2","v1parts","v2parts","validateParts","x","NaN","forcedTimeout","headers","getWithCache","autoRefresh","put","post","Content-Type","ws","getWsUrl","_waitOpen","readyState","waitDuration","waitRetryDelay","round","_open","WebSocket","onerror","onmessage","JSON","onopen","openTime","onclose","closeEvent","socket","closing","_close","_remove","isClosed","closeAllWs","sock","isDesktop","nw","Shell","openExternal","openOptions","openTarget","win","moveTo","isCompatible","actualVersion","storage","sessionStorage","stringify","$log","standard","secure","removeItem","cordova","barcodeScanner","clipboard","$cordovaClipboard","sourceType","navigator","PictureSourceType","PHOTOLIBRARY","CAMERA","quality","destinationType","DestinationType","DATA_URL","encodingType","EncodingType","PNG","targetWidth","targetHeight","$cordovaCamera","Keyboard","modelScope","modelPath","getModelValue","setModelValue","paths","property","leftButton","rightButton","userAgent","isOSX","process","InAppBrowser","WELL_KNOWN_CURRENCIES","g1","medianTimeOffset","medianTimeBlocks","currencyName","BLOCK_NOT_FOUND","_safeLoadCurrentUD","blockIndex","base","getData","getDataField","currentBlock","receivedAt","bmaAlive","currentBlockField","getCurrent","lastValid","useCache","SIG","OUTPUT_OBJ","REGEX_ENDPOINT_PARAMS","BMAS","WS2P","BMATOR","WS2PTOR","CURRENCY","INVALID_COMMENT_CHARS","URI_WITH_AT","URI_WITH_PATH","BMA_ENDPOINT","BMAS_ENDPOINT","WS2P_ENDPOINT","BMATOR_ENDPOINT","WS2PTOR_ENDPOINT","PROTOCOL_VERSION","LIMIT_REQUEST_COUNT","LIMIT_REQUEST_DELAY","closeWs","wsByPath","cacheTime","requestKey","getRequestFn","_startPromise","execCount","postRequest","postByPath","REVOCATION_ALREADY_REGISTERED","IDENTITY_SANDBOX_FULL","NO_MATCHING_IDENTITY","UID_ALREADY_USED","NO_MATCHING_MEMBER","NO_IDTY_MATCHING_PUB_OR_UID","WRONG_SIGNATURE_MEMBERSHIP","SOURCE_ALREADY_CONSUMED","TX_INPUTS_OUTPUTS_NOT_EQUAL","TX_OUTPUT_SUM_NOT_EQUALS_PREV_DELTAS","TX_ALREADY_PROCESSED","URI","TX_OUTPUT_SIG","TX_OUTPUT_FUNCTION","TX_OUTPUT_OBJ_OPERATOR_AND","TX_OUTPUT_OBJ_OPERATOR_OR","TX_OUTPUT_OBJ","TX_OUTPUT_OBJ_OPERATOR","TX_OUTPUT_OBJ_PARENTHESIS","TX_OUTPUT_FUNCTIONS","OUTPUT_FUNCTION","node2","port2","certifiedBy","certifiersOf","requirementsWithCache","currentWithCache","pendings","timesWithCache","treeItem","treeItemId","childrenContent","childrenMatches","convertedOutput","treeItems","functions","epPrefix","otherNode","wasStarted","memberUidsByPubkey","getByUid","blockNumbers","getHttpRecursive","peersByLeaves","leaves","httpGetRequest","paramName","paramValues","paramValue","requestParams","getHttpWithRetryIfLimitation","lastUd","pathCount","getLatestRelease","html_url","tag_name","identityCache","requirementsCache","_addUniqueIds","idtyKeys","_sortAndSliceIdentities","_resetRequirements","canMembershipOut","certificationCount","needCertifications","needCertificationCount","willNeedCertificationCount","_fillRequirements","currencyParameters","invalid","membershipPendingExpiresIn","willExpireCertificationCount","willExpire","revocation_sig","pendingCerts","certifiers","_fillIdentitiesMeta","inputData","withCache","cacheKey","outdistanced","certCount","loadIdentityByLookup","revoked_on","certPubkeys","certsMap","idtyFullKey","others","certs","certFullKey","cert_time","block_number","block_hash","signed","loadCertifications","getFunction","lookupCertifications","_certId","lookupHasCertTime","lookupCerticationsByCertId","certId","written","certTime","pendingCertifications","pendingCertByBlocks","validBuid","writtenCertByPubkey","_sortCertifications","errorCertifications","dataByLookup","received_cert_error","given_cert","given_cert_error","addEvent","messageParams","revocationTime","addEvents","safeText","addUniqueId","allowExtension","excludeRevoked","blocUid","lookupResultCount","getNewcomersRecursive","maxResultSize","joiner","idtyKey","memberDate","getAllRecursive","letters","letter","pubkeyAttributeName","skipAddUid","uidsByPubkey","events","memberships","idtiesByBlock","idtiesByPubkey","ms","blockHash","otherIdtySamePubkey","aidty","reduceTxAndPush","processedTxMap","allowPendings","outputBase","walletIsIssuer","otherIssuers","otherRecipients","noffset","outputArray","conditions","outputAmount","powBase","outputCondition","sigMatches","outputPubkey","identifier","consumed","txPubkeys","blockstampTime","txKey","newTx","isUD","locktime","inputs","loadTx","nowInSec","validating","reduceTxFn","sliceTime","loadUDs","tx1","tx2","firstValidatedTxIndex","toTime","addSources","sourcesIndexByKey","srcKey","addSource","loadSourcesAndBalance","txPendings","txErrors","balanceFromSource","balanceWithPending","_processPendingTx","consumedSources","inputKey","srcIndex","txs","allTx","loadSources","currentTime","filename","medianDate","formatSymbol","Idle","defaultBMA","CsWallet","enableAuthIdle","encryptedData","resetKeypair","resetTxAndSources","hasEncryptedData","needLogin","needAuth","loginCheck","restoreData","openEncryptedData","checkAuthIdle","loadOptions","wasAuth","resetStore","isNeverUsed","secureContent","useEncryption","storageKey","childrenCount","contentStr","cypherContent","seckey","sessionStorageData","localStorageData","applyRestoredData","oldChildrenCount","oldChildren","removeAllChildrenWallets","newChildInstance","addChildWallet","cleanEventsByContext","loadTxAndSources","loadSigStock","loadMinData","loadFullData","unused","skipData","truncBase","getInputs","filterBase","sourcesAmount","minBase","maxBase","lowerInputs","floor","logs","amountBase","subUnit","rest","isBase","truncBaseOrMinBase","createAndSendTx","pendingTx","firstSlice","secondSlice","outputOffset","newSources","signedTx","transaction","txHash","getIdentityDocument","sideIn","signedMembership","insertAtFirst","getkeypairSaveId","nbCharSalt","getRevocationDocument","identityLines","idtySignature","setParent","removedChildren","getChildWalletByPubkey","getAllChildrenWallet","isAuthResult","newEnableAuthIdle","setIdle","watch","unwatch","getIdle","getWalletSettings","allSettings","newSettings","useEncryptionChanged","useStorageChanged","internal","addListener","needToLoadRequirements","signedCert","saveId","getSaveIDDocument","saveIdFile","revocationFile","fileName","cleanByContext","create","childIndex","parentWallet","constant","startWalletHelpTip","helpController","provider","eagerLoadingServices","extensionByStates","registerEagerLoadingService","serviceName","extendState","extension","extendStates","stateNames","$get","currentExtensionPointName","getActivesByName","extensionPointName","BMA_REGEXP","BMAS_REGEXP","WS2P_REGEXP","LOCAL_IP_ADDRESS","regex","copyValues","copyValuesFrom","getRaw","bmaRegex","bmasRegex","regExp","getIPv4","getIPv6","getURL","parseArrayValues","parseTransactions","array","itemObjProperties","arrayProperty","toHimself","$inject","$stateProvider","$urlRouterProvider","abstract","large","menuContent","otherwise","silentLocationChange","tab","preferHttp","tab-parameters","tab-wot","tab-network","tab-blocks","run","$translateProvider","COMMON","APP_NAME","APP_VERSION","APP_BUILD","MEMBER","BLOCK","BTN_OK","BTN_YES","BTN_NO","BTN_SEND","BTN_SEND_MONEY","BTN_SEND_MONEY_SHORT","BTN_SAVE","BTN_YES_SAVE","BTN_YES_CONTINUE","BTN_SHOW","BTN_SHOW_PUBKEY","BTN_RELATIVE_UNIT","BTN_BACK","BTN_NEXT","BTN_IMPORT","BTN_CANCEL","BTN_CLOSE","BTN_LATER","BTN_LOGIN","BTN_LOGOUT","BTN_ADD_ACCOUNT","BTN_SHARE","BTN_EDIT","BTN_DELETE","BTN_ADD","BTN_SEARCH","BTN_REFRESH","BTN_RETRY","BTN_START","BTN_CONTINUE","BTN_CREATE","BTN_UNDERSTOOD","BTN_OPTIONS","BTN_HELP_TOUR","BTN_HELP_TOUR_SCREEN","BTN_DOWNLOAD","BTN_DOWNLOAD_ACCOUNT_STATEMENT","BTN_MODIFY","CHOOSE_FILE","DAYS","NO_ACCOUNT_QUESTION","SEARCH_NO_RESULT","LOADING","LOADING_WAIT","SEARCHING","FROM","TO","COPY","LANGUAGE","UNIVERSAL_DIVIDEND","DATE_FILE_PATTERN","DATE_SHORT_PATTERN","DATE_MONTH_YEAR_PATTERN","EMPTY_PARENTHESIS","UID","ENABLE","DISABLE","RESULTS_LIST","RESULTS_COUNT","EXECUTION_TIME","SHOW_VALUES","POPOVER_ACTIONS_TITLE","POPOVER_FILTER_TITLE","SHOW_MORE","SHOW_MORE_COUNT","POPOVER_SHARE","TITLE","SHARE_ON_TWITTER","SHARE_ON_FACEBOOK","SHARE_ON_DIASPORA","SHARE_ON_GOOGLEPLUS","DATE","TYPE","SIZE","VALIDATING","SYSTEM","PICTURE_CHOOSE_TYPE","BTN_PICTURE_GALLERY","BTN_PICTURE_CAMERA","MENU","HOME","WOT","ACCOUNT","WALLETS","SETTINGS","NETWORK","TRANSACTIONS","ABOUT","LICENSE","LATEST_RELEASE","PLEASE_UPDATE","CODE","OFFICIAL_WEB_SITE","DEVELOPERS","FORUM","PLEASE_REPORT_ISSUE","REPORT_ISSUE","BTN_OPEN_DEV_WINDOW","WELCOME","WELCOME_READONLY","MESSAGE","MESSAGE_READONLY","BTN_CURRENCY","BTN_ABOUT","BTN_HELP","BTN_NETWORK","FREE_SOFTWARE","FORK_ME","SHOW_LICENSE","NOT_YOUR_ACCOUNT_QUESTION","BTN_CHANGE_ACCOUNT","CONNECTION_ERROR","SHOW_ALL_FEED","READ_MORE","FEED_SOURCE","DISPLAY_DIVIDER","STORAGE_DIVIDER","NETWORK_SETTINGS","PEER","PEER_SHORT","PEER_CHANGED_TEMPORARY","PERSIST_CACHE","PERSIST_CACHE_HELP","USE_LOCAL_STORAGE","USE_LOCAL_STORAGE_HELP","WALLETS_SETTINGS","USE_WALLETS_ENCRYPTION","USE_WALLETS_ENCRYPTION_HELP","ENABLE_HELPTIP","DISABLE_HELPTIP","ENABLE_UI_EFFECTS","HISTORY_SETTINGS","DISPLAY_UD_HISTORY","TX_HISTORY_AUTO_REFRESH","TX_HISTORY_AUTO_REFRESH_HELP","AUTHENTICATION_SETTINGS","KEEP_AUTH","KEEP_AUTH_SHORT","KEEP_AUTH_HELP","KEEP_AUTH_OPTION","NEVER","SECONDS","MINUTE","MINUTES","HOUR","ALWAYS","KEYRING_FILE","KEYRING_FILE_HELP","REMEMBER_ME","REMEMBER_ME_HELP","PLUGINS_SETTINGS","BTN_RESET","EXPERT_MODE","EXPERT_MODE_HELP","BLOCK_VALIDITY_WINDOW","BLOCK_VALIDITY_WINDOW_SHORT","BLOCK_VALIDITY_WINDOW_HELP","BLOCK_VALIDITY_OPTION","NONE","POPUP_PEER","HOST","HOST_HELP","USE_SSL","USE_SSL_HELP","BTN_SHOW_LIST","BLOCKCHAIN","HASH","VIEW","HEADER_TITLE","TITLE_CURRENT","COMPUTED_BY","SHOW_RAW","TECHNICAL_DIVIDER","UNIVERSAL_DIVIDEND_HELP","EMPTY","POW_MIN","POW_MIN_HELP","DATA_DIVIDER","IDENTITIES_COUNT","JOINERS_COUNT","ACTIVES_COUNT","ACTIVES_COUNT_HELP","LEAVERS_COUNT","LEAVERS_COUNT_HELP","EXCLUDED_COUNT","EXCLUDED_COUNT_HELP","REVOKED_COUNT","REVOKED_COUNT_HELP","TX_COUNT","CERT_COUNT","TX_TO_HIMSELF","TX_OUTPUT_UNLOCK_CONDITIONS","TX_OUTPUT_OPERATOR","AND","OR","XHX","CSV","CLTV","LOOKUP","NO_BLOCK","LAST_BLOCKS","BTN_COMPACT","TAB_CURRENCY","TAB_WOT","TAB_NETWORK","TAB_BLOCKS","CURRENCY_SHORT_DESCRIPTION","NETWORK_RULES_DIVIDER","CURRENCY_NAME","MEMBERS","MEMBERS_VARIATION","MONEY_DIVIDER","MASS","SHARE","C_ACTUAL","MEDIAN_TIME","MONEY_RULES_DIVIDER","C_RULE","UD_RULE","DT_REEVAL","REEVAL_SYMBOL","DT_REEVAL_VALUE","UD_REEVAL_TIME0","SIG_QTY_RULE","SIG_STOCK","SIG_PERIOD","SIG_WINDOW","SIG_VALIDITY","MS_WINDOW","MS_VALIDITY","STEP_MAX","WOT_RULES_DIVIDER","SENTRIES","SENTRIES_FORMULA","XPERCENT","AVG_GEN_TIME","CURRENT","MATH_CEILING","DISPLAY_ALL_RULES","BTN_SHOW_LICENSE","WOT_DIVIDER","NO_LICENSE_FILE","LOADING_PEERS","NODE_ADDRESS","SOFTWARE","WARN_PRE_RELEASE","WARN_NEW_RELEASE","WS2PID","PRIVATE_ACCESS","POW_PREFIX","ENDPOINTS","INFO","ONLY_SSL_PEERS","PEERS","SIGNED_ON_BLOCK","MIRROR","MIRRORS","MIRROR_PEERS","PEER_LIST","MEMBER_PEERS","ALL_PEERS","DIFFICULTY","API","CURRENT_BLOCK","OFFLINE","OFFLINE_PEERS","BTN_SHOW_PEER","OWNER","SHOW_RAW_PEERING","SHOW_RAW_CURRENT_BLOCK","KNOWN_PEERS","GENERAL_DIVIDER","ERROR","LOADING_TOR_NODE_ERROR","LOADING_NODE_ERROR","SEARCH_HELP","SEARCH_INIT_PHASE_WARNING","REGISTERED_SINCE","REGISTERED_SINCE_BLOCK","NO_CERTIFICATION","NO_GIVEN_CERTIFICATION","NOT_MEMBER_PARENTHESIS","IDENTITY_REVOKED_PARENTHESIS","MEMBER_PENDING_REVOCATION_PARENTHESIS","EXPIRE_IN","NOT_WRITTEN_EXPIRE_IN","EXPIRED","PSEUDO","WRITTEN_ON_BLOCK","NOT_MEMBER_ACCOUNT","NOT_MEMBER_ACCOUNT_HELP","BTN_CERTIFY","BTN_YES_CERTIFY","BTN_SELECT_AND_CERTIFY","ACCOUNT_OPERATIONS","POPOVER_SHARE_TITLE","NEWCOMERS","NEWCOMERS_COUNT","PENDING","PENDING_COUNT","REGISTERED","MEMBER_FROM","BTN_NEWCOMERS","BTN_PENDING","NO_PENDING","NO_NEWCOMERS","CONTACTS","MODAL","CERTIFICATIONS","SUMMARY","LIST","PENDING_LIST","RECEIVED","RECEIVED_BY","SENTRY_MEMBER","OPERATIONS","GIVEN_CERTIFICATIONS","SENT","SENT_BY","LOGIN","SCRYPT_FORM_HELP","PUBKEY_FORM_HELP","FILE_FORM_HELP","SCAN_FORM_HELP","SALT","SALT_HELP","SHOW_SALT","PASSWORD","PASSWORD_HELP","PUBKEY_HELP","HAVE_ACCOUNT_QUESTION","CREATE_ACCOUNT","CREATE_FREE_ACCOUNT","FORGOTTEN_ID","ASSOCIATED_PUBKEY","BTN_METHODS","BTN_METHODS_DOTS","METHOD_POPOVER_TITLE","MEMORIZE_AUTH_FILE","SCRYPT_PARAMETERS","AUTO_LOGOUT","BTN_RELOGIN","IDLE_WARNING","METHOD","SCRYPT_DEFAULT","SCRYPT_ADVANCED","SCAN","SCRYPT","SECURE","HARDEST","EXTREME","USER","HELP","AUTH","BTN_AUTH","GENERAL_HELP","EXPECTED_UID_HELP","EXPECTED_PUBKEY_HELP","BALANCE","LAST_TX","BALANCE_ACCOUNT","NO_TX","SHOW_MORE_TX","SHOW_ALL_TX","TX_FROM_DATE","PENDING_TX","VALIDATING_TX","ERROR_TX","ERROR_TX_SENT","PENDING_TX_RECEIVED","EVENTS","OUT_DISTANCED","WAITING_MEMBERSHIP","WAITING_CERTIFICATIONS","WAITING_CERTIFICATIONS_HELP","WILL_MISSING_CERTIFICATIONS","WILL_NEED_RENEW_MEMBERSHIP","NEED_RENEW_MEMBERSHIP","NEED_RENEW_MEMBERSHIP_AFTER_CANCELLED","NO_WAITING_MEMBERSHIP","CERTIFICATION_COUNT","CERTIFICATION_COUNT_SHORT","BTN_RECEIVE_MONEY","BTN_SELECT_ALTERNATIVES_IDENTITIES","BTN_FIX_MEMBERSHIP","BTN_MEMBERSHIP_RENEW","BTN_MEMBERSHIP_RENEW_DOTS","BTN_MEMBERSHIP_OUT_DOTS","BTN_SECURITY_DOTS","BTN_SHOW_DETAILS","LOCKED_OUTPUTS_POPOVER","DESCRIPTION","DESCRIPTION_MANY","LOCKED_AMOUNT","NEW","INTRO_WARNING_TIME","INTRO_WARNING_SECURITY","INTRO_WARNING_SECURITY_HELP","INTRO_HELP","REGISTRATION_NODE","REGISTRATION_NODE_HELP","SELECT_ACCOUNT_TYPE","MEMBER_ACCOUNT","MEMBER_ACCOUNT_TITLE","MEMBER_ACCOUNT_HELP","WALLET_ACCOUNT","WALLET_ACCOUNT_TITLE","WALLET_ACCOUNT_HELP","SALT_WARNING","PASSWORD_WARNING","PSEUDO_WARNING","PSEUDO_HELP","SALT_CONFIRM","SALT_CONFIRM_HELP","PASSWORD_CONFIRM","PASSWORD_CONFIRM_HELP","SLIDE_6_TITLE","COMPUTING_PUBKEY","LAST_SLIDE_CONGRATULATION","CONFIRMATION_MEMBER_ACCOUNT","CONFIRMATION_WALLET_ACCOUNT","CHECKING_PSEUDO","PSEUDO_AVAILABLE","PSEUDO_NOT_AVAILABLE","INFO_LICENSE","BTN_ACCEPT","BTN_ACCEPT_LICENSE","POPUP_REGISTER","SELECT_IDENTITY_MODAL","SELECT_WALLET_MODAL","WALLET_LIST","BTN_NEW","BTN_IMPORT_FILE_DOTS","NO_WALLET","BTN_RENAME","EXPORT_FILENAME","TOTAL_DOTS","EDIT_POPOVER","NAME_HELP","IMPORT_MODAL","WALLET_COUNT","NO_NEW_WALLET","SECURITY","ADD_QUESTION","BTN_CLEAN","DOWNLOAD_REVOKE","DOWNLOAD_REVOKE_HELP","GENERATE_KEYFILE","GENERATE_KEYFILE_HELP","KEYFILE_FILENAME","MEMBERSHIP_IN","MEMBERSHIP_IN_HELP","SEND_IDENTITY","SEND_IDENTITY_HELP","HELP_LEVEL","LEVEL","LOW_LEVEL","MEDIUM_LEVEL","QUESTION_1","QUESTION_2","QUESTION_3","QUESTION_4","QUESTION_5","QUESTION_6","QUESTION_7","QUESTION_8","QUESTION_9","QUESTION_10","QUESTION_11","QUESTION_12","QUESTION_13","QUESTION_14","QUESTION_15","QUESTION_16","QUESTION_17","QUESTION_18","QUESTION_19","RECOVER_ID","RECOVER_ID_HELP","RECOVER_ID_SELECT_FILE","REVOCATION_WITH_FILE","REVOCATION_WITH_FILE_DESCRIPTION","REVOCATION_WITH_FILE_HELP","REVOCATION_WALLET","REVOCATION_WALLET_HELP","REVOCATION_FILENAME","SAVE_ID","SAVE_ID_HELP","STRONG_LEVEL","KEYFILE","PUBSEC_FORMAT","PUBSEC_FORMAT_HELP","WIF_FORMAT","WIF_FORMAT_HELP","EWIF_FORMAT","EWIF_FORMAT_HELP","PASSWORD_POPUP","FILE_NAME","HEADERS","TIME","AMOUNT","TRANSFER","SUB_TITLE","SUB_TITLE_ALL","AMOUNT_HELP","COMMENT_HELP","BTN_ADD_COMMENT","REST","REST_TO","WARN_COMMENT_IS_PUBLIC","UNKNOWN_URI_FORMAT","PUBKEY_INVALID_CHECKSUM","POPUP_TITLE","UNKNOWN_ERROR","CRYPTO_UNKNOWN_ERROR","DOWNLOAD_KEYFILE_FAILED","EQUALS_TO_PSEUDO","EQUALS_TO_SALT","FIELD_REQUIRED","FIELD_TOO_SHORT","FIELD_TOO_SHORT_WITH_LENGTH","FIELD_TOO_LONG","FIELD_TOO_LONG_WITH_LENGTH","FIELD_MIN","FIELD_MAX","FIELD_ACCENT","FIELD_NOT_NUMBER","FIELD_NOT_INT","FIELD_NOT_EMAIL","PASSWORD_NOT_CONFIRMED","SALT_NOT_CONFIRMED","SEND_IDENTITY_FAILED","SEND_CERTIFICATION_FAILED","NEED_MEMBER_ACCOUNT_TO_CERTIFY","NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF","IDENTITY_TO_CERTIFY_HAS_NO_SELF","LOGIN_FAILED","LOAD_IDENTITY_FAILED","LOAD_REQUIREMENTS_FAILED","SEND_MEMBERSHIP_IN_FAILED","SEND_MEMBERSHIP_OUT_FAILED","REFRESH_WALLET_DATA","GET_CURRENCY_PARAMETER","GET_CURRENCY_FAILED","SEND_TX_FAILED","ALL_SOURCES_USED","NOT_ENOUGH_SOURCES","ACCOUNT_CREATION_FAILED","RESTORE_WALLET_DATA_ERROR","LOAD_WALLET_DATA_ERROR","COPY_CLIPBOARD_FAILED","TAKE_PICTURE_FAILED","SCAN_FAILED","SCAN_UNKNOWN_FORMAT","WOT_LOOKUP_FAILED","LOAD_PEER_DATA_FAILED","NEED_LOGIN_FIRST","AMOUNT_REQUIRED","AMOUNT_NEGATIVE","NOT_ENOUGH_CREDIT","INVALID_NODE_SUMMARY","INVALID_USER_ID","INVALID_COMMENT","INVALID_PUBKEY","INVALID_PUBKEY_CHECKSUM","IDENTITY_REVOKED","IDENTITY_REVOKED_WITH_TIME","IDENTITY_PENDING_REVOCATION","IDENTITY_INVALID_BLOCK_HASH","IDENTITY_EXPIRED","IDENTITY_NOT_FOUND","IDENTITY_TX_FAILED","WOT_PENDING_INVALID_BLOCK_HASH","WALLET_INVALID_BLOCK_HASH","WALLET_IDENTITY_EXPIRED","WALLET_REVOKED","WALLET_HAS_NO_SELF","AUTH_REQUIRED","AUTH_INVALID_PUBKEY","AUTH_INVALID_SCRYPT","AUTH_INVALID_FILE","AUTH_FILE_ERROR","IDENTITY_ALREADY_CERTIFY","IDENTITY_ALREADY_CERTIFY_PENDING","UNABLE_TO_CERTIFY_TITLE","LOAD_NEWCOMERS_FAILED","LOAD_PENDING_FAILED","ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION","ONLY_MEMBER_OR_WAS_MEMBER_CAN_EXECUTE_THIS_ACTION","ONLY_SELF_CAN_EXECUTE_THIS_ACTION","GET_BLOCK_FAILED","INVALID_BLOCK_HASH","DOWNLOAD_REVOCATION_FAILED","REVOCATION_FAILED","SALT_OR_PASSWORD_NOT_CONFIRMED","RECOVER_ID_FAILED","LOAD_FILE_FAILED","NOT_VALID_REVOCATION_FILE","NOT_VALID_SAVE_ID_FILE","NOT_VALID_KEY_FILE","EXISTING_ACCOUNT","EXISTING_ACCOUNT_REQUEST","GET_LICENSE_FILE_FAILED","CHECK_NETWORK_CONNECTION","ISSUE_524_TX_FAILED","ADD_SECONDARY_WALLET_FAILED","REMOVE_SECONDARY_WALLET_FAILED","UPDATE_WALLET_LIST_FAILED","LOAD_WALLET_LIST_FAILED","SAVE_WALLET_LIST_FAILED","COULD_NOT_ADD_MAIN_WALLET","COULD_NOT_ADD_EXISTING_WALLET","UNKNOWN_WALLET_ID","RESTORE_WALLET_LIST_FAILED","INVALID_FILE_FORMAT","SAME_TX_RECIPIENT","CERTIFICATION_DONE","TRANSFER_SENT","COPY_TO_CLIPBOARD_DONE","MEMBERSHIP_OUT_SENT","NOT_NEED_MEMBERSHIP","IDENTITY_WILL_MISSING_CERTIFICATIONS","IDENTITY_NEED_MEMBERSHIP","HAS_ALTERNATIVE_IDENTITIES","REVOCATION_SENT","REVOCATION_SENT_WAITING_PROCESS","FEATURES_NOT_IMPLEMENTED","EMPTY_TX_HISTORY","CONFIRM","POPUP_WARNING_TITLE","POPUP_SECURITY_WARNING_TITLE","CERTIFY_RULES_TITLE_UID","CERTIFY_RULES","FULLSCREEN","EXIT_APP","TRANSFER_ALL","MEMBERSHIP_OUT","MEMBERSHIP_OUT_2","LOGIN_UNUSED_WALLET_TITLE","LOGIN_UNUSED_WALLET","FIX_IDENTITY","FIX_MEMBERSHIP","MEMBERSHIP","RENEW_MEMBERSHIP","REVOKE_IDENTITY","REVOKE_IDENTITY_2","NOT_NEED_RENEW_MEMBERSHIP","SAVE_BEFORE_LEAVE","SAVE_BEFORE_LEAVE_TITLE","LOGOUT","USE_FALLBACK_NODE","ISSUE_524_SEND_LOG","MODE","DEMO","BADGE","FEATURE_NOT_AVAILABLE","MODE_HELP","INSTALL_HELP","READONLY","DOWNLOAD","POPUP_REVOKE_MESSAGE","JOIN","SECTION","PUBKEY_DEF","METHOD_DEF","GLOSSARY","MEMBER_DEF","CURRENCY_RULES","CURRENCY_RULES_DEF","BLOCKCHAIN_DEF","UNIVERSAL_DIVIDEND_DEF","WOT_DEF","DISTANCE_RULE","DISTANCE_RULE_DEF","TIP","MENU_BTN_CURRENCY","CURRENCY_WOT","CURRENCY_MASS","CURRENCY_UNIT_RELATIVE","CURRENCY_CHANGE_UNIT","CURRENCY_CHANGE_UNIT_TO_RELATIVE","MENU_BTN_NETWORK","NETWORK_BLOCKCHAIN","NETWORK_PEERS","NETWORK_PEERS_BLOCK_NUMBER","NETWORK_PEERS_PARTICIPATE","MENU_BTN_ACCOUNT","MENU_BTN_ACCOUNT_MEMBER","WALLET_CERTIFICATIONS","WALLET_RECEIVED_CERTIFICATIONS","WALLET_GIVEN_CERTIFICATIONS","WALLET_BALANCE","WALLET_BALANCE_RELATIVE","WALLET_BALANCE_CHANGE_UNIT","WALLET_PUBKEY","WALLET_SEND","WALLET_SEND_NO_MONEY","WALLET_OPTIONS","WALLET_RECEIVED_CERTS","WALLET_CERTIFY","WALLET_CERT_STOCK","MENU_BTN_WALLETS","MENU_BTN_TX","MENU_BTN_WOT","WOT_SEARCH_TEXT_XS","WOT_SEARCH_TEXT","WOT_SEARCH_RESULT","WOT_VIEW_CERTIFICATIONS","WOT_VIEW_CERTIFICATIONS_COUNT","WOT_VIEW_CERTIFICATIONS_CLICK","WOT_VIEW_CERTIFY","MENU_BTN_SETTINGS","HEADER_BAR_BTN_PROFILE","SETTINGS_CHANGE_UNIT","END_LOGIN","END_NOT_LOGIN","END_READONLY","LINK_DOC","LINK_DOC_HELP","LINK_STANDARD_APP","LINK_STANDARD_APP_HELP","MESSAGE_SHORT","DOC_HEADER","TITLE_SHORT","AMOUNTS_HELP","NAME","NODE","BAD_CREDENTIALS","SUCCESS_REDIRECTING_WITH_NAME","SUCCESS_REDIRECTING","CANCEL_REDIRECTING_WITH_NAME","CANCEL_REDIRECTING","TRANSFER_FAILED","DOC","DESCRIPTION_DIVIDER","URL_DIVIDER","PARAMETERS_DIVIDER","AVAILABLE_PARAMETERS","DEMO_DIVIDER","DEMO_HELP","DEMO_RESULT","DEMO_RESULT_PEER","DEMO_SUCCEED","DEMO_CANCELLED","INTEGRATE_DIVIDER","INTEGRATE_CODE","INTEGRATE_RESULT","INTEGRATE_PARAMETERS","PARAM_PUBKEY","PARAM_PUBKEY_HELP","PARAM_AMOUNT","PARAM_AMOUNT_HELP","PARAM_COMMENT","PARAM_COMMENT_HELP","PARAM_NAME","PARAM_NAME_HELP","PARAM_REDIRECT_URL","PARAM_REDIRECT_URL_HELP","PARAM_CANCEL_URL","PARAM_CANCEL_URL_HELP","PARAM_PREFERRED_NODE","PARAM_PREFERRED_NODE_HELP","EXAMPLES_HELP","EXAMPLE_BUTTON","EXAMPLE_BUTTON_DEFAULT_TEXT","EXAMPLE_BUTTON_DEFAULT_STYLE","EXAMPLE_BUTTON_TEXT_HELP","EXAMPLE_BUTTON_BG_COLOR","EXAMPLE_BUTTON_BG_COLOR_HELP","EXAMPLE_BUTTON_FONT_COLOR","EXAMPLE_BUTTON_FONT_COLOR_HELP","EXAMPLE_BUTTON_TEXT_ICON","EXAMPLE_BUTTON_TEXT_WIDTH","EXAMPLE_BUTTON_TEXT_WIDTH_HELP","EXAMPLE_BUTTON_ICON_NONE","EXAMPLE_BUTTON_ICON_DUNITER","EXAMPLE_BUTTON_ICON_CESIUM","EXAMPLE_BUTTON_ICON_G1_COLOR","EXAMPLE_BUTTON_ICON_G1_BLACK","CURRENCIES","DEV_WARNING","DEV_WARNING_MESSAGE","DEV_WARNING_MESSAGE_SHORT","BTN_REGISTRY","SELECT","MEMBERS_COUNT","ERROR_TX_RECEIVED","BTN_MEMBERSHIP_IN_DOTS","BTN_SEND_IDENTITY_DOTS","BTN_REVOKE","SLIDE_1_TITLE","SLIDE_2_TITLE","FEATURE_NOT_AVAILABLE_ON_DEMO","LICENCE","CATEGORY","CATEGORIES","CATEGORY_SEARCH_HELP","LAST_MODIFICATION_DATE","SUBMIT_BY","BTN_LIKE","BTN_LIKE_REMOVE","LIKES_TEXT","ABUSES_TEXT","BTN_REPORT_ABUSE_DOTS","BTN_REMOVE_REPORTED_ABUSE","BTN_PUBLISH","BTN_PICTURE_DELETE","BTN_PICTURE_FAVORISE","BTN_PICTURE_ROTATE","BTN_ADD_PICTURE","NOTIFICATION","HAS_UNREAD","NOTIFICATIONS","MARK_ALL_AS_READ","NO_RESULT","SHOW_ALL","LOAD_NOTIFICATIONS_FAILED","REPORT_ABUSE","REASON_HELP","ASK_DELETE","REGISTRY","USER_PROFILE","MESSAGES","INVITATIONS","ORGANIZATION_ACCOUNT","ORGANIZATION_ACCOUNT_HELP","EVENT","MEMBER_WITHOUT_PROFILE","WS_CONNECTION_FAILED","BTN_SUGGEST_CERTIFICATIONS_DOTS","BTN_ASK_CERTIFICATIONS_DOTS","BTN_ASK_CERTIFICATION","SUGGEST_CERTIFICATIONS_MODAL","ASK_CERTIFICATIONS_MODAL","SEARCH","DIVIDER_PROFILE","DIVIDER_PAGE","DIVIDER_GROUP","SUGGEST_CERTIFICATIONS","ASK_CERTIFICATION","ASK_CERTIFICATIONS","INVITATION","BTN_DELETE_ALL","BTN_NEW_INVITATION","SUGGESTION_CERTIFICATION","SUGGESTED_BY","RECIPIENTS","RECIPIENTS_HELP","RECIPIENTS_MODAL_TITLE","RECIPIENTS_MODAL_HELP","SUGGESTION_IDENTITIES","SUGGESTION_IDENTITIES_HELP","SUGGESTION_IDENTITIES_MODAL_TITLE","SUGGESTION_IDENTITIES_MODAL_HELP","DELETE_ALL_CONFIRMATION","SEND_INVITATIONS_TO_CERTIFY","INVITATION_SENT","LOAD_INVITATIONS_FAILED","REMOVE_INVITATION_FAILED","REMOVE_ALL_INVITATIONS_FAILED","SEND_INVITATION_FAILED","BAD_INVITATION_FORMAT","COMMENTS","DIVIDER","SHOW_MORE_COMMENTS","COMMENT_HELP_REPLY_TO","REPLY","REPLY_TO","REPLY_TO_LINK","REPLY_TO_DELETED_COMMENT","REPLY_COUNT","DELETED_COMMENT","MODIFIED_ON","MODIFIED_PARENTHESIS","FAILED_SAVE_COMMENT","FAILED_REMOVE_COMMENT","REPLY_TITLE_PREFIX","FORWARD_TITLE_PREFIX","BTN_REPLY","BTN_COMPOSE","BTN_WRITE","NO_MESSAGE_INBOX","NO_MESSAGE_OUTBOX","MESSAGE_RECEIVED","INBOX","OUTBOX","LAST_INBOX","LAST_OUTBOX","BTN_LAST_MESSAGES","POPOVER_ACTIONS","DELETE_ALL","COMPOSE","TITLE_REPLY","OBJECT","OBJECT_HELP","ENCRYPTED_HELP","MESSAGE_HELP","CONTENT_CONFIRMATION","SENDER","RECIPIENT","NO_CONTENT","DELETE","REMOVE","REMOVE_ALL","USER_HAS_NO_PROFILE","MESSAGE_REMOVED","All_MESSAGE_REMOVED","MESSAGE_SENT","SEND_MSG_FAILED","LOAD_MESSAGES_FAILED","LOAD_MESSAGE_FAILED","MESSAGE_NOT_READABLE","USER_NOT_RECIPIENT","NOT_AUTHENTICATED_MESSAGE","REMOVE_MESSAGE_FAILED","MESSAGE_CONTENT_TOO_LONG","MARK_AS_READ_FAILED","REMOVE_All_MESSAGES_FAILED","MARK_ALL_AS_READ_FAILED","RECIPIENT_IS_MANDATORY","HEADER_MEDIAN_TIME","HEADER_BLOCK","HEADER_ISSUER","BTN_LAST","DISPLAY_QUERY","HIDE_QUERY","TX_SEARCH_FILTER","MEMBER_FLOWS","EXISTING_TRANSACTION","PERIOD","ISSUER","TX_PUBKEY","SEARCH_BLOCKS_FAILED","LOCATION_DIVIDER","SOCIAL_NETWORKS_DIVIDER","BTN_SHOW_WOT","BTN_SHOW_WOT_HELP","BTN_SHOW_PAGES","BTN_SHOW_PAGES_HELP","MY_PAGES","NO_PAGE","BTN_LAST_RECORDS","BTN_ADVANCED_SEARCH","LOCATION_HELP","RESULTS","RESULT_COUNT_LOCATION","RESULT_COUNT","LAST_RECORDS","LAST_RECORD_COUNT_LOCATION","LAST_RECORD_COUNT","POPOVER_FILTERS","LOCATION","MENU_TITLE","REMOVE_CONFIRMATION","SELECT_TYPE","ENUM","SHOP","COMPANY","ASSOCIATION","INSTITUTION","EDIT","TITLE_NEW","RECORD_TYPE","RECORD_TITLE","RECORD_TITLE_HELP","RECORD_DESCRIPTION","RECORD_DESCRIPTION_HELP","RECORD_ADDRESS","RECORD_ADDRESS_HELP","RECORD_CITY","RECORD_CITY_HELP","RECORD_SOCIAL_NETWORKS","RECORD_PUBKEY","RECORD_PUBKEY_HELP","WALLET","PAGE_DIVIDER","PAGE_DIVIDER_HELP","LOAD_CATEGORY_FAILED","LOAD_RECORD_FAILED","LOOKUP_RECORDS_FAILED","REMOVE_RECORD_FAILED","SAVE_RECORD_FAILED","RECORD_NOT_EXISTS","GEO_LOCATION_NOT_FOUND","RECORD_REMOVED","RECORD_SAVED","PROFILE","PROFILE_DIVIDER","PROFILE_DIVIDER_HELP","NO_PROFILE_DEFINED","BTN_REORDER","TITLE_HELP","DESCRIPTION_HELP","SOCIAL_HELP","MODAL_AVATAR","SELECT_FILE_HELP","BTN_SELECT_FILE","RESIZE_HELP","RESULT_HELP","REMOVE_PROFILE_FAILED","LOAD_PROFILE_FAILED","SAVE_PROFILE_FAILED","INVALID_SOCIAL_NETWORK_FORMAT","IMAGE_RESIZE_FAILED","PROFILE_REMOVED","PROFILE_SAVED","WARNING_PUBLIC_DATA","BTN_GEOLOC_ADDRESS","USE_GEO_POINT","LOADING_LOCATION","ADDRESS","ADDRESS_HELP","CITY","CITY_HELP","DISTANCE","DISTANCE_UNIT","DISTANCE_OPTION","PROFILE_POSITION","ALTERNATIVE_RESULT_DIVIDER","POSITION","CITY_REQUIRED_IF_STREET","REQUIRED_FOR_LOCATION","INVALID_FOR_LOCATION","GEO_LOCATION_FAILED","ADDRESS_LOCATION_FAILED","SUBSCRIPTION","SUBSCRIPTION_DIVIDER","SUBSCRIPTION_DIVIDER_HELP","NO_SUBSCRIPTION","SUBSCRIPTION_COUNT","HELP_TEXT","PROVIDER","EMAIL","DELETE_SUBSCRIPTION","LOAD_SUBSCRIPTIONS_FAILED","ADD_SUBSCRIPTION_FAILED","UPDATE_SUBSCRIPTION_FAILED","DELETE_SUBSCRIPTION_FAILED","MODAL_EMAIL","EMAIL_LABEL","EMAIL_HELP","FREQUENCY_LABEL","FREQUENCY_DAILY","FREQUENCY_WEEKLY","DOCUMENT","BTN_ACTIONS","LAST_DOCUMENTS_DOTS","LAST_DOCUMENTS","SHOW_QUERY","HEADER_TIME","HEADER_RECIPIENT","READ","BTN_REMOVE","HAS_CREATE_OR_UPDATE_PROFILE","REMOVED","LOAD_DOCUMENTS_FAILED","REMOVE_FAILED","REMOVE_ALL_FAILED","ES_SETTINGS","PLUGIN_NAME","PLUGIN_NAME_HELP","ENABLE_TOGGLE","ENABLE_REMOTE_STORAGE","ENABLE_REMOTE_STORAGE_HELP","ENABLE_MESSAGE_TOGGLE","PEER_HELP","ENABLE_TX_SENT","ENABLE_TX_RECEIVED","ENABLE_CERT_SENT","ENABLE_CERT_RECEIVED","ENABLE_HTML5_NOTIFICATION","ENABLE_HTML5_NOTIFICATION_HELP","ASK_ENABLE_TITLE","ASK_ENABLE","ES_WALLET","ES_PEER","DOCUMENTS","DOCUMENT_COUNT","EMAIL_SUBSCRIPTION_COUNT","NODE_STARTED","NODE_BMA_DOWN","NODE_BMA_UP","MEMBER_JOIN","MEMBER_LEAVE","MEMBER_EXCLUDE","MEMBER_REVOKE","MEMBER_ACTIVE","TX_SENT","TX_SENT_MULTI","TX_RECEIVED","TX_RECEIVED_MULTI","CERT_SENT","CERT_RECEIVED","LIKE_RECEIVED","FOLLOW_RECEIVED","STAR_RECEIVED","MODERATION_RECEIVED","DELETION_RECEIVED","ABUSE_RECEIVED","PAGE","NEW_COMMENT","UPDATE_COMMENT","NEW_REPLY_COMMENT","UPDATE_REPLY_COMMENT","FOLLOW_NEW_COMMENT","FOLLOW_UPDATE_COMMENT","FOLLOW_NEW","FOLLOW_UPDATE","LIKE","FAILED_TOGGLE_LIKE","ES_USE_FALLBACK_NODE","ES_CONNECTION_ERROR","ES_MAX_UPLOAD_BODY_SIZE","GROUP","CREATED_TIME","LAST_RESULTS_LIST","OPEN_RESULTS_LIST","MANAGED_RESULTS_LIST","OPEN_GROUP","OPEN_GROUP_HELP","MANAGED_GROUP","MANAGED_GROUP_HELP","OPEN","MANAGED","SEARCH_GROUPS_FAILED","DELETE_BY_MODERATOR","DELETE_PROFILE_FAILED","FOLLOW_CLOSE","ENABLE_SETTINGS_TOGGLE","TITLE_SMALL_DEVICE","BTN_GRAPH","GRAPH","LINEAR_SCALE","LOGARITHMIC_SCALE","BTN_SHOW_STATS","BTN_SHOW_DETAILED_STATS","RANGE_DURATION_DIVIDER","RANGE_DURATION","DAY","MONTH","BALANCE_DIVIDER","BALANCE_TITLE","TX_RECEIVED_LABEL","TX_SENT_LABEL","UD_LABEL","BALANCE_LABEL","INPUT_CHART_TITLE","OUTPUT_CHART_TITLE","BLOCKS_ISSUERS_DIVIDER","BLOCKS_ISSUERS_HELP","BLOCKS_ISSUERS_TITLE","BLOCKS_ISSUERS_LABEL","TX_DIVIDER","TX_AMOUNT_TITLE","TX_AMOUNT_PUBKEY_TITLE","TX_AMOUNT_LABEL","TX_COUNT_TITLE","TX_COUNT_LABEL","TX_AVG_BY_BLOCK","MONETARY_MASS_TITLE","MONETARY_MASS_LABEL","MONETARY_MASS_SHARE_LABEL","UD_TITLE","MEMBERS_COUNT_TITLE","MEMBERS_COUNT_LABEL","BLOCK_COUNT_LABEL","BLOCK_COUNT","DOC_STATS","USER_SETTINGS","USER_DELTA","MESSAGE_INBOX","MESSAGE_OUTBOX","INVITATION_CERTIFICATION","SOCIAL","PAGE_COMMENT","PAGE_RECORD","GROUP_RECORD","OTHER","HISTORY_DELETE","TX_ACCUMULATION_LABEL","UD_ACCUMULATION_LABEL","CERTIFICATION_TITLE","RECEIVED_CERT_LABEL","RECEIVED_CERT_DELTA_LABEL","GIVEN_CERT_LABEL","GIVEN_CERT_DELTA_LABEL","SYNCHRO","COUNT","INSERTS","UPDATES","DELETES","PERFORMANCE","DURATION","MAP","SEARCH_DOTS","BTN_LOCALIZE_ME","BTN_MAP","BTN_MAP_HELP","LAYER","LOAD_POSITION_FAILED","MARKER_HELP","LOCALIZE_ME_FAILED","MAP_DIVIDER","ENABLE_GOOGLE_API","ENABLE_GOOGLE_API_HELP","GOOGLE_API_KEY","BTN_GOOGLE_API","BTN_GOOGLE_API_WARNING","GOOGLE_API_KEY_PLACEHOLDER","WOT_BTN_LAYERS","WOT_BTN_SEARCH","RML9","BTN_EXPORT","BTN_OPEN","BTN_SWOW_TX","CHART","API_REGEXP","getEP","epRegex","isHttp","commons","refreshTreeLinks","addTreeLinks","mapById","incompleteCommentIdByParentIds","_id","order","loadDataByRecordId","recordId","loadAvatar","createOnDeleteListener","onRemoveListener","entity","stopListenChanges","EsHttp","enableCache","defaultSettingsNode","ANY_API_ENDPOINT","MAX_UPLOAD_BODY_SIZE","maxUploadBodySize","IMAGE_SRC","URL","HASH_TAG","USER_TAG","API_ENDPOINT","fallbackNodeIndex","truncUrlFilter","isSameNodeAsSettings","isSameNode","setIsFallbackNode","onSettingsReset","parseTagsFromText","reg","tag","cleanCache","isTemporary","byteCount","encodeURI","_inheritedOpen","checkNodeAlive","fallbackNode","fallbackNodes","newServer","old","skipInit","imageField","attachment","_type","_title","_name","moderators","sameAsSettings","getRequest","postParams","tagFields","fieldNames","fillRecordTags","ignoreFields","str","bodyLength","_version","escape","tagState","uidState","newLine","urls","parseUrlsFromText","link","hashTags","userTags","titles","suffix","lines","line","parseMarkdownTitlesFromText","findObjectInTree","attrName","Array","isArray","countHits","subscription","PluginServiceProvider","previousRemoteData","SETTINGS_SAVE_SPEC","askEnable","useRemoteStorage","txSent","txReceived","certSent","certReceived","enableGoogleApi","googleApiKey","enableMixedSearch","ignoreSettingsChanged","failEnable","onWalletAuth","loadSettings","storeSettingsLocally","refreshState","filteredData","copyUsingSpec","copySpec","storeSettingsRemotely","isEmitHtml5Enable","isMixedSearchEnable","esComment","onWalletReset","onWalletLoad","getCategories","readRecordFromHit","getCommons","geoDistanceObj","geoDistanceUnit","fecthPictures","esCrypto","PHONE","facebook","twitter","googleplus","youtube","github","tumblr","snapchat","linkedin","vimeo","instagram","wordpress","diaspora","bitcoin","curve25519","getTypeFromUrl","urlToMatch","slashPathIndex","getFromUrl","reduceArray","createForEncryption","dataToEncrypt","openArray","socialsToDecrypt","packArray","socialsToEncrypt","getProfile","getAll","found","fillAvatars","datas","pubkeyAtributeName","onWotSearch","dataByPubkey","mixedSearch","_id^4","constant_score","indices_boost","group","indices","avatarFieldName","memberCount","_fillSearchResultFromHit","onWotLoad","getFields","getAvatarAndName","wsUserEventCloseFn","MESSAGE_CODES","createFilterQuery","must","excludesCodes","must_not","gt","loadUnreadNotificationsCount","missing","postCount","getWalletNotifications","Promise","MEDIAN_TIME_OFFSET","warnCount","onNewUserEvent","newInvitation","markNotificationAsRead","$$phase","addNewNotification","emitEsNotification","newMessage","htmlToPlaintext","emitHtml5Notification","lang","onclick","browserNotification","postReadById","countWarnEvents","excludeCodes","ui","onWalletLogin","wsUserEvent","getUserEvent","postSearch","getChanges","walletNotifs","html5","emit","postSearchByType","getByTypeAndId","onWalletInit","messages","countUnreadMessages","onNewMessageEvent","doSendMessage","boxPath","searchMessages","decryptMessages","withSummary","fillSummary","sortFilteredMessages","titleMatch","contentMatch","onSendError","developers","developer","loadMessages","avatarField","filteredMessages","word","filterMessages","outbox","updateNotificationCountAndReadTime","notificationReadTime","showNotifications","onRead","REGEXPS","SEARCH_FILTER","LAST_AND","FIELDS","MINIMAL","COMMONS","ES_CORE_API_ENDPOINT","processSearchResult","fillAvatar","hasExcludedCurrent","unparsedText","filterType","filterText","_internal","_executeSearchRequest","getLastGroups","countUnreadInvitations","onWalletCertify","invitationstoRemove","where","deleteInvitation","onNewInvitationEvent","getInvitationById","jsons","deleteInvitationsByIds","certification","getIds","identitiesToExtend","deleteByIds","countBeforeDeletion","unreadCountBeforeDeletion","$sanitize","issuerContent","recipientContent","encryptedRecord","onWalletUnauth","fullKeypair","membershipsCache","cleanAllCache","lastJoinTime","joinTime","leaveTime","esWot","onLoadUDs","filtered","uds","googleSearchPositionByString","google","apiKey","display_name","address_components","long_name","geometry","osm","freegeoip","hasConfigApiKey","geolocation","getCurrentPosition","coords","latitude","longitude","addressdetails","village","town","road","suburb","hamlet","place_id","osmErr","street","googleErr","lat1","lon1","lat2","lon2","radlat1","radlat2","theta","radtheta","dist","sin","cos","acos","ip","_initOptions","stats.medianTime","nested_path","_readSearchHits","issuerField","docType","queryString","documents","EsNetwork","pod","emailSubscription","sortScore","addLike","postRecord","removeLike","removeRecord","getSearch","searchBaseQueryString","getLikeIds","existingLikeIds","likeId","issuerHitIndex","nav-buttons-right","menu-user","profile-popover-user","nav-buttons","hero","after-general","item-wallet","top","general","after-buttons","buttons-top-fab","tab_registry","tab_inbox","tab_outbox","network-buttons","blockchain-buttons","currencyCache","blockstat","_powBase","rawLightInstance","_initRangeOptions","maxRangeSize","defaultTotalRangeCount","subtract","aggs","blocksByIssuer","aggregations","buckets","agg","doc_count","deltaWithLastDividend","ranges","isBefore","txAmount","avgByBlock","avg","maxByBlock","getByRange","received_stats","sent_stats","getUds","fromMapping","ud_stats","unitbase_stats","udRanges","udFromMapping","pop","udRange","udsMap","truncTime","searchRequest","request_cache","inserts","updates","deletes","peer_count","apis","cardinality","css2Rgb","balanced","stable","startColor","startState","_state2side","defaultStateSize","sides","stateCounters","j","valueOf","mapObject","rgbArray","documents-buttons","parameters-actual","wot-actual","network-actual","AwesomeMarkers","Icon","searchAddress","northEast","southWest","boundingBox","top_left","bottom_right","geo_bounding_box","processLoadHits","commaRegexp","searchAddressItems","random","processRequestResultFn","subRes","leafletHelpers","FRANCE","isSameCenter","isSameCenterOnMap","setControlId","_container","superOnAdd","onAdd","container","DEFAULT_CENTER","overlaysNames","defaults","scrollWheelZoom","tileLayerOptions","attribution","baselayers","layerOptions","subdomains","continuousWorld","controls","updateCenter","invalidateSize","_resetView","isValidCenter","isSame","centerModel","mapCenter","initial","markerLocation","translatePromise","textPlaceholder","textErr","setId","overlayNames","overlayName","addEventListener","filter-buttons","after-position","markerMessageTemplate","offline","markerIdByPeerId","markerCounter","inheritedEnter","_getMarkerColor","countByColor","green","lightgreen","lightgray","getAttribution","markerIdByPeerIdToRemove","markerId","updateMarker","searchIp","peerId","common","deferIntercept","$urlRouter","disableChangeState","preventStateChange","currentScope","newUrl","oldUrl","listen","styleLightContent","bootstrap","component","csId","directive","require","ngModel","compareTo","$validators","modelValue","$eval","$validate","differentTo","NUMBER_REGEXP","numberFloat","$isEmpty","INT_REGEXP","attrs","numberInt","EMAIL_REGEXP","requiredIf","required","restrict","showCopyPopover","copyOnClick","clazz","activeLink","activeLinkPathPrefix","newPath","addClass","returnClose","onReturn","onFocus","onBlur","attr","which","blur","$compile","$parse","compile","tElement","tAttrs","ngBindHtmlGetter","trustAsHtml","ngBindHtmlWatch","$$addBindingClass","$$addBindingInfo","contents","$element","tAttributes","extensionPoints","append","getTemplate","pre","iElement","iAttrs","fn","onReadFile","onChangeEvent","onLoadEvent","srcElement","elem","dropZone","dataTransfer","$apply","transclude","fileSelect","attachEvent","onLocaleChange","onCurrencyChange","pattern","patternRelative","minValueRelative","formatRelative","formatQuantitative","minValue","Infinity","fromNow","separator","_cache","sepChars","charAt","uniformLanguageTag","determinePreferredLanguage","useSanitizeValueStrategy","useLoaderCache","$httpProvider","useXDomain","$compileProvider","debugInfoEnabled","imgSrcSanitizationWhitelist","$animateProvider","classNameFilter","CacheFactoryProvider","recycleFreq","storagePrefix","capacity","screenmatchConfigProvider","rules","$ionicConfigProvider","enableJsScrolling","scrolling","jsScrolling","maxCache","IdleProvider","idle","logoutIdle","logoutTimeout","exception","cause","removeChangeStateListener","enableChangeState","checkBmaNodeAlive","messageParam","errorState","isNewer","device","hideKeyboardAccessoryBar","disableScroll","release","newRelease","registerBackButtonAction","backView","exitApp","rtrim","arguments"],"mappings":"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","file":"../../dist_js/cesium.js","sourcesContent":["\n\nfunction Peer(json) {\n\n var that = this;\n\n Object.keys(json).forEach(function (key) {\n that[key] = json[key];\n });\n\n that.endpoints = that.endpoints || [];\n}\n\n\nPeer.prototype.regexp = {\n BMA: /^BASIC_MERKLED_API[ ]?/,\n BMAS: /^BMAS[ ]?/,\n WS2P: /^WS2P[ ]?/,\n BMA_REGEXP: /^BASIC_MERKLED_API([ ]+([a-z_][a-z0-9-_.ğĞ]*))?([ ]+([0-9.]+))?([ ]+([0-9a-f:]+))?([ ]+([0-9]+))$/,\n BMAS_REGEXP: /^BMAS([ ]+([a-z_][a-z0-9-_.ğĞ]*))?([ ]+([0-9.]+))?([ ]+([0-9a-f:]+))?([ ]+([0-9]+))$/,\n WS2P_REGEXP: /^WS2P[ ]+([a-z0-9]+)([ ]+([a-z_][a-z0-9-_.ğĞ]*))?([ ]+([0-9.]+))?([ ]+([0-9a-f:]+))?([ ]+([0-9]+))([ ]+([a-z0-9/.&#!]+))?$/,\n LOCAL_IP_ADDRESS: /^127[.]0[.]0.|192[.]168[.]|10[.]0[.]0[.]|172[.]16[.]/\n};\nPeer.prototype.regex = Peer.prototype.regexp; // for backward compat\n\nPeer.prototype.keyID = function () {\n var bma = this.bma || this.getBMA();\n if (bma.useBma) {\n return [this.pubkey || \"Unknown\", bma.dns, bma.ipv4, bma.ipv6, bma.port, bma.useSsl, bma.path].join('-');\n }\n return [this.pubkey || \"Unknown\", bma.ws2pid, bma.path].join('-');\n};\n\nPeer.prototype.copyValues = function(to) {\n var obj = this;\n [\"version\", \"currency\", \"pub\", \"endpoints\", \"hash\", \"status\", \"block\", \"signature\"].forEach(function (key) {\n to[key] = obj[key];\n });\n};\n\nPeer.prototype.copyValuesFrom = function(from) {\n var obj = this;\n [\"version\", \"currency\", \"pub\", \"endpoints\", \"block\", \"signature\"].forEach(function (key) {\n obj[key] = from[key];\n });\n};\n\nPeer.prototype.json = function() {\n var obj = this;\n var json = {};\n [\"version\", \"currency\", \"endpoints\", \"status\", \"block\", \"signature\"].forEach(function (key) {\n json[key] = obj[key];\n });\n json.raw = this.raw && this.getRaw();\n json.pubkey = this.pubkey;\n return json;\n};\n\nPeer.prototype.getBMA = function() {\n if (this.bma) return this.bma;\n var bma = null;\n var bmaRegex = this.regexp.BMA_REGEXP;\n var bmasRegex = this.regexp.BMAS_REGEXP;\n this.endpoints.forEach(function(ep){\n var matches = !bma && bmaRegex.exec(ep);\n if (matches) {\n bma = {\n \"dns\": matches[2] || '',\n \"ipv4\": matches[4] || '',\n \"ipv6\": matches[6] || '',\n \"port\": matches[8] || 80,\n \"useSsl\": matches[8] == 443,\n \"useBma\": true\n };\n }\n matches = !bma && bmasRegex.exec(ep);\n if (matches) {\n bma = {\n \"dns\": matches[2] || '',\n \"ipv4\": matches[4] || '',\n \"ipv6\": matches[6] || '',\n \"port\": matches[8] || 80,\n \"useSsl\": true,\n \"useBma\": true\n };\n }\n });\n return bma || {};\n};\n\nPeer.prototype.getEndpoints = function(regex) {\n if (!regex) return this.endpoints;\n return this.endpoints.reduce(function(res, ep){\n return ep.match(regex) ? res.concat(ep) : res;\n }, []);\n};\n\nPeer.prototype.hasEndpoint = function(endpoint){\n //console.debug('testing if hasEndpoint:' + endpoint);\n var regExp = this.regexp[endpoint] || new RegExp('^' + endpoint);\n var endpoints = this.getEndpoints(regExp);\n if (!endpoints.length) return false;\n else return true;\n};\n\nPeer.prototype.getDns = function() {\n var bma = this.bma || this.getBMA();\n return bma.dns ? bma.dns : null;\n};\n\nPeer.prototype.getIPv4 = function() {\n var bma = this.bma || this.getBMA();\n return bma.ipv4 ? bma.ipv4 : null;\n};\n\nPeer.prototype.getIPv6 = function() {\n var bma = this.bma || this.getBMA();\n return bma.ipv6 ? bma.ipv6 : null;\n};\n\nPeer.prototype.getPort = function() {\n var bma = this.bma || this.getBMA();\n return bma.port ? bma.port : null;\n};\n\nPeer.prototype.getHost = function(getHost) {\n bma = getHost || this.bma || this.getBMA();\n return ((bma.port == 443 || bma.useSsl) && bma.dns) ? bma.dns :\n (this.hasValid4(bma) ? bma.ipv4 :\n (bma.dns ? bma.dns :\n (bma.ipv6 ? '[' + bma.ipv6 + ']' :'')));\n};\n\nPeer.prototype.getURL = function(bma) {\n bma = bma || this.bma || this.getBMA();\n var host = this.getHost(bma);\n var protocol = (bma.port == 443 || bma.useSsl) ? 'https' : 'http';\n return protocol + '://' + host + (bma.port ? (':' + bma.port) : '');\n};\n\nPeer.prototype.getServer = function(bma) {\n bma = bma || this.bma || this.getBMA();\n var host = this.getHost(bma);\n return host + (host && bma.port ? (':' + bma.port) : '');\n};\n\nPeer.prototype.hasValid4 = function(bma) {\n return bma.ipv4 &&\n /* exclude private address - see https://fr.wikipedia.org/wiki/Adresse_IP */\n !bma.ipv4.match(this.regexp.LOCAL_IP_ADDRESS) ?\n true : false;\n};\n\nPeer.prototype.isReachable = function () {\n return !!this.getServer();\n};\n\nPeer.prototype.isSsl = function() {\n var bma = this.bma || this.getBMA();\n return bma.useSsl;\n};\n\nPeer.prototype.isTor = function() {\n var bma = this.bma || this.getBMA();\n return bma.useTor;\n};\n\nPeer.prototype.isWs2p = function() {\n var bma = this.bma || this.getBMA();\n return bma.useWs2p;\n};\n\nPeer.prototype.isBma = function() {\n var bma = this.bma || this.getBMA();\n return !bma.useWs2p && !bma.useTor;\n};\n\nPeer.prototype.hasBma = function() {\n return this.hasEndpoint('(BASIC_MERKLE_API|BMAS|BMATOR)');\n};\n","/**\n * Created by blavenie on 01/02/17.\n */\nfunction Block(json, attributes) {\n \"use strict\";\n\n var that = this;\n\n // Copy default fields\n if (!attributes || !attributes.length) {\n [\"currency\", \"issuer\", \"medianTime\", \"number\", \"version\", \"powMin\", \"dividend\", \"membersCount\", \"hash\", \"identities\", \"joiners\", \"actives\", \"leavers\", \"revoked\", \"excluded\", \"certifications\", \"transactions\", \"unitbase\"]\n .forEach(function (key) {\n that[key] = json[key];\n });\n }\n // or just given\n else {\n _.forEach(attributes, function (key) {\n that[key] = json[key];\n });\n\n }\n\n that.identitiesCount = that.identities ? that.identities.length : 0;\n that.joinersCount = that.joiners ? that.joiners.length : 0;\n that.activesCount = that.actives ? that.actives.length : 0;\n that.leaversCount = that.leavers ? that.leavers.length : 0;\n that.revokedCount = that.revoked ? that.revoked.length : 0;\n that.excludedCount = that.excluded ? that.excluded.length : 0;\n that.certificationsCount = that.certifications ? that.certifications.length : 0;\n that.transactionsCount = that.transactions ? that.transactions.length : 0;\n\n that.empty = that.isEmpty();\n\n that.id = [that.number, that.hash].join('-');\n}\n\nBlock.prototype.isEmpty = function(){\n \"use strict\";\n return !this.transactionsCount &&\n !this.certificationsCount &&\n !this.joinersCount &&\n !this.dividend &&\n !this.activesCount &&\n !this.identitiesCount &&\n !this.leaversCount &&\n !this.excludedCount &&\n !this.revokedCount;\n};\n\nBlock.prototype.parseData = function() {\n this.identities = this.parseArrayValues(this.identities, ['pubkey', 'signature', 'buid', 'uid']);\n this.joiners = this.parseArrayValues(this.joiners, ['pubkey', 'signature', 'mBuid', 'iBuid', 'uid']);\n this.actives = this.parseArrayValues(this.actives, ['pubkey', 'signature', 'mBuid', 'iBuid', 'uid']);\n this.leavers = this.parseArrayValues(this.leavers, ['pubkey', 'signature', 'mBuid', 'iBuid', 'uid']);\n this.revoked = this.parseArrayValues(this.revoked, ['pubkey', 'signature']);\n this.excluded = this.parseArrayValues(this.excluded, ['pubkey']);\n\n // certifications\n this.certifications = this.parseArrayValues(this.certifications, ['from', 'to', 'block', 'signature']);\n //this.certifications = _.groupBy(this.certifications, 'to');\n\n // TX\n this.transactions = this.parseTransactions(this.transactions);\n\n delete this.raw; // not need\n};\n\nBlock.prototype.cleanData = function() {\n delete this.identities;\n delete this.joiners;\n delete this.actives;\n delete this.leavers;\n delete this.revoked;\n delete this.excluded;\n delete this.certifications;\n delete this.transactions;\n\n delete this.raw; // not need\n};\n\nBlock.prototype.parseArrayValues = function(array, itemObjProperties){\n if (!array || !array.length) return [];\n return array.reduce(function(res, raw) {\n var parts = raw.split(':');\n if (parts.length != itemObjProperties.length) {\n console.debug('[block] Bad format for \\'{0}\\': [{1}]. Expected {1} parts. Skipping'.format(arrayProperty, raw, itemObjProperties.length));\n return res;\n }\n var obj = {};\n for (var i=0; i<itemObjProperties.length; i++) {\n obj[itemObjProperties[i]] = parts[i];\n }\n return res.concat(obj);\n }, []);\n};\n\nfunction exact(regexpContent) {\n return new RegExp(\"^\" + regexpContent + \"$\");\n}\n\nBlock.prototype.regexp = {\n TX_OUTPUT_SIG: exact(\"SIG\\\\(([0-9a-zA-Z]{43,44})\\\\)\")\n};\n\nBlock.prototype.parseTransactions = function(transactions) {\n if (!transactions || !transactions.length) return [];\n return transactions.reduce(function (res, tx) {\n var obj = {\n issuers: tx.issuers,\n time: tx.time\n };\n\n obj.outputs = tx.outputs.reduce(function(res, output) {\n var parts = output.split(':');\n if (parts.length != 3) {\n console.debug('[block] Bad format a \\'transactions\\': [{0}]. Expected 3 parts. Skipping'.format(output));\n return res;\n }\n\n var amount = parts[0];\n var unitbase = parts[1];\n var unlockCondition = parts[2];\n\n var matches = Block.prototype.regexp.TX_OUTPUT_SIG.exec(parts[2]);\n\n // Simple expression SIG(x)\n if (matches) {\n var pubkey = matches[1];\n if (!tx.issuers || tx.issuers.indexOf(pubkey) != -1) return res;\n return res.concat({\n amount: unitbase <= 0 ? amount : amount * Math.pow(10, unitbase),\n unitbase: unitbase,\n pubkey: pubkey\n });\n }\n\n // Parse complex unlock condition\n else {\n //console.debug('[block] [TX] Detecting unlock condition: {0}.'.format(output));\n return res.concat({\n amount: unitbase <= 0 ? amount : amount * Math.pow(10, unitbase),\n unitbase: unitbase,\n unlockCondition: unlockCondition\n });\n }\n }, []);\n\n // Special cas for TX to himself\n if (!obj.error && !obj.outputs.length) {\n obj.toHimself = true;\n }\n\n return res.concat(obj);\n }, []);\n};\n","\n\nfunction Ws2pMessage(message) {\n\n var that = this;\n\n var parts = message.split(':');\n if (parts.length < 3 || !parts[0].startsWith('WS2P')) {\n throw Error('Invalid format: ' + message);\n }\n // Head message\n if (parts[1] == 'HEAD') {\n if (parts.length < 4) {\n throw Error('Invalid format: ' + message);\n }\n // Duniter version < 1.6.9\n if (parts.length == 4) {\n that.pubkey = parts[2];\n that.buid = parts[3];\n }\n else {\n var version = parts[2];\n if (version >= 1) {\n var prefix = parts[0];\n\n // Private/public options\n if (prefix.length > 4) {\n var matches = this.regexp.WS2P_PREFIX.exec(prefix);\n if (!matches) {\n throw Error('Invalid format: ' + message);\n }\n\n // Private options\n var privateOptions = matches[1];\n if (privateOptions) {\n that.private = {\n useTor: privateOptions.startsWith('T')\n };\n var mode = privateOptions.substring(1);\n if (mode == 'A') {\n that.private.mode = 'all';\n }\n else if (mode == 'M') {\n that.private.mode = 'mixed';\n }\n else if (mode == 'S') {\n that.private.mode = 'strict';\n }\n }\n\n // Public options\n var publicOptions = matches[2];\n if (publicOptions) {\n that.public = {\n useTor: publicOptions.startsWith('T'),\n mode: 'all'\n };\n }\n\n // For DEBUG only:\n /*\n console.log('[http] private {0}, public {1}'.format(\n (that.private && (that.private.useTor ? 'TOR ' : '' ) + (that.private.mode || 'false')) || 'false',\n that.public && ((that.public.useTor ? 'TOR ' : '' ) + (that.public.mode || 'false')) || 'false'\n ), prefix);*/\n }\n\n that.pubkey=parts[3];\n that.buid=parts[4];\n that.ws2pid=parts[5];\n that.software=parts[6];\n that.version=parts[7];\n that.powPrefix=parts[8];\n }\n }\n }\n\n}\n\n\nWs2pMessage.prototype.regexp = {\n WS2P_PREFIX: /^WS2P(?:O([CT][SAM]))?(?:I([CT]))?$/,\n};\n\n\n","\nAppController.$inject = ['$scope', '$rootScope', '$state', '$ionicSideMenuDelegate', '$q', '$timeout', '$ionicHistory', '$controller', '$window', 'csPlatform', 'csSettings', 'CryptoUtils', 'csCrypto', 'UIUtils', 'BMA', 'csWallet', 'Device', 'Modals', 'csConfig', 'csHttp'];\nHomeController.$inject = ['$scope', '$state', '$timeout', '$ionicHistory', '$translate', '$http', 'UIUtils', 'csConfig', 'csCache', 'csPlatform', 'csCurrency', 'csSettings'];\nPluginExtensionPointController.$inject = ['$scope', 'PluginService'];angular.module('cesium.app.controllers', ['cesium.platform', 'cesium.services'])\n\n .config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider) {\n 'ngInject';\n\n $stateProvider\n\n .state('app', {\n url: \"/app\",\n abstract: true,\n templateUrl: \"templates/menu.html\",\n controller: 'AppCtrl',\n data: {\n large: false\n }\n })\n\n .state('app.home', {\n url: \"/home?error\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/home/home.html\",\n controller: 'HomeCtrl'\n }\n }\n })\n\n .state('app.lock', {\n cache: false,\n url: \"/lock\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/common/view_passcode.html\",\n controller: 'PassCodeCtrl'\n }\n }\n })\n ;\n\n // if none of the above states are matched, use this as the fallback\n $urlRouterProvider.otherwise('/app/home');\n\n }])\n\n .controller('AppCtrl', AppController)\n\n .controller('HomeCtrl', HomeController)\n\n .controller('PluginExtensionPointCtrl', PluginExtensionPointController)\n\n;\n\n/**\n * Useful controller that could be reuse in plugin, using $scope.extensionPoint for condition rendered in templates\n */\nfunction PluginExtensionPointController($scope, PluginService) {\n 'ngInject';\n $scope.extensionPoint = PluginService.extensions.points.current.get();\n}\n\n/**\n * Abstract controller (inherited by other controllers)\n */\nfunction AppController($scope, $rootScope, $state, $ionicSideMenuDelegate, $q, $timeout,\n $ionicHistory, $controller, $window, csPlatform, csSettings, CryptoUtils, csCrypto,\n UIUtils, BMA, csWallet, Device, Modals, csConfig, csHttp\n) {\n 'ngInject';\n\n $scope.walletData = csWallet.data;\n $scope.search = {};\n $scope.login = csWallet.isLogin();\n $scope.auth = csWallet.isAuth();\n $scope.motion = UIUtils.motion.default;\n $scope.fullscreen = UIUtils.screen.fullscreen.isEnabled();\n\n $scope.showHome = function() {\n $ionicHistory.nextViewOptions({\n historyRoot: true\n });\n return $state.go('app.home')\n .then(UIUtils.loading.hide);\n };\n\n ////////////////////////////////////////\n // Show Help tour\n ////////////////////////////////////////\n\n $scope.createHelptipScope = function(isTour) {\n if (!isTour && ($rootScope.tour || !$rootScope.settings.helptip.enable || UIUtils.screen.isSmall())) {\n return; // avoid other helptip to be launched (e.g. csWallet)\n }\n // Create a new scope for the tour controller\n var helptipScope = $scope.$new();\n $controller('HelpTipCtrl', { '$scope': helptipScope});\n return helptipScope;\n };\n\n $scope.startHelpTour = function(event, skipClearCache) {\n if (event && event.defaultPrevented) return false; // Event stopped;\n\n $rootScope.tour = true; // to avoid other helptip to be launched (e.g. csWallet)\n\n // Clear cache history\n if (!skipClearCache) {\n $ionicHistory.clearHistory();\n return $ionicHistory.clearCache()\n .then(function() {\n $scope.startHelpTour(null, true/*continue*/);\n });\n }\n\n var helptipScope = $scope.createHelptipScope(true/*is tour*/);\n return helptipScope.startHelpTour()\n .then(function() {\n helptipScope.$destroy();\n delete $rootScope.tour;\n })\n .catch(function(err){\n delete $rootScope.tour;\n });\n };\n\n $scope.disableHelpTour = function(event) {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n if (csSettings.data.helptip && csSettings.data.helptip.enable) {\n $rootScope.settings.helptip.enable = false;\n csSettings.store();\n }\n\n };\n\n ////////////////////////////////////////\n // Login & wallet\n ////////////////////////////////////////\n\n $scope.isLogin = function() {\n return $scope.login;\n };\n\n // Load wallet data (after login)\n $scope.loadWalletData = function(options) {\n\n console.warn(\"[app-controller] DEPRECATED - Please use csWallet.load() instead of $scope.loadWalletData()\", new Error());\n\n options = options || {};\n var wallet = options.wallet || csWallet;\n return wallet.loadData(options)\n\n .then(function(walletData) {\n // cancel login\n if (!walletData) throw 'CANCELLED';\n return walletData;\n });\n };\n\n // Login and load wallet\n $scope.loadWallet = function(options) {\n\n console.warn(\"[app-controller] DEPRECATED - Please use csWallet.loginOrLoad() instead of $scope.loadWallet()\", new Error());\n\n // Make sure the platform is ready\n if (!csPlatform.isStarted()) {\n return csPlatform.ready().then(function(){\n return $scope.loadWallet(options);\n });\n }\n\n options = options || {};\n\n var wallet = options.wallet || csWallet;\n\n // If need auth\n if (options.auth && !wallet.isAuth()) {\n return wallet.auth(options)\n .then(function (walletData) {\n if (walletData) return walletData;\n // failed to auth\n throw 'CANCELLED';\n });\n }\n\n // If need login\n else if (!wallet.isLogin()) {\n return wallet.login(options)\n .then(function (walletData) {\n if (walletData) return walletData;\n // failed to login\n throw 'CANCELLED';\n });\n }\n\n // Already login or auth\n else if (!wallet.isDataLoaded(options)) {\n return $scope.loadWalletData(options);\n }\n else {\n return $q.when(wallet.data);\n }\n };\n\n // Login and go to a state (or wallet if not)\n $scope.loginAndGo = function(state, options) {\n $scope.closeProfilePopover();\n options = options || {};\n var wallet = options.wallet || csWallet;\n delete options.wallet;\n\n state = state || 'app.view_wallet';\n\n if (!wallet.isLogin()) {\n\n // Make sure to protect login modal, if HTTPS enable - fix #340\n if (csConfig.httpsMode && $window.location && $window.location.protocol !== 'https:') {\n var href = $window.location.href;\n var hashIndex = href.indexOf('#');\n var rootPath = (hashIndex != -1) ? href.substr(0, hashIndex) : href;\n rootPath = 'https' + rootPath.substr(4);\n href = rootPath + $state.href(state);\n if (csConfig.httpsModeDebug) {\n // Debug mode: just log, then continue\n console.debug('[httpsMode] --- Should redirect to: ' + href);\n }\n else {\n $window.location.href = href;\n return;\n }\n }\n\n return wallet.login(options)\n .then(function(){\n return $state.go(state, options);\n })\n .then(UIUtils.loading.hide);\n }\n else {\n return $state.go(state, options);\n }\n };\n\n // Logout\n $scope.logout = function(options) {\n options = options || {};\n var wallet = options.wallet || csWallet;\n if (!options.force && $scope.profilePopover) {\n // Make the popover if really closed, to avoid UI refresh on popover buttons\n return $scope.profilePopover.hide()\n .then(function(){\n options.force = true;\n return $scope.logout(options);\n });\n }\n if (options.askConfirm) {\n return UIUtils.alert.confirm('CONFIRM.LOGOUT')\n .then(function(confirm) {\n if (confirm) {\n options.askConfirm=false;\n return $scope.logout(options);\n }\n });\n }\n\n UIUtils.loading.show();\n return wallet.logout()\n .then(function() {\n // Close left menu if open\n if ($ionicSideMenuDelegate.isOpenLeft()) {\n $ionicSideMenuDelegate.toggleLeft();\n }\n\n // If default wallet: clear navigation history, then go back to home\n if (wallet.isDefault()) {\n $ionicHistory.clearHistory();\n\n return $ionicHistory.clearCache()\n .then(function() {\n return $scope.showHome();\n });\n }\n else {\n UIUtils.loading.hide(10);\n }\n })\n .catch(UIUtils.onError('ERROR.LOGOUT'));\n };\n // Do authentification\n $scope.doAuth = function(options) {\n var wallet = options && options.wallet || csWallet;\n return wallet.auth()\n .then(UIUtils.loading.hide);\n };\n\n // If connected and same pubkey\n $scope.isUserPubkey = function(pubkey) {\n return csWallet.isUserPubkey(pubkey);\n };\n\n // add listener on wallet event\n csWallet.api.data.on.login($scope, function(data, deferred) {\n $scope.login = true;\n return deferred ? deferred.resolve() : $q.when();\n });\n csWallet.api.data.on.logout($scope, function() {\n $scope.login = false;\n });\n csWallet.api.data.on.auth($scope, function(data, deferred) {\n $scope.auth = true;\n return deferred ? deferred.resolve() : $q.when();\n });\n csWallet.api.data.on.unauth($scope, function() {\n $scope.auth = false;\n });\n\n ////////////////////////////////////////\n // Useful modals\n ////////////////////////////////////////\n\n // Open transfer modal\n $scope.showTransferModal = function(parameters) {\n return Modals.showTransfer(parameters);\n };\n\n $scope.showAboutModal = function() {\n return Modals.showAbout();\n };\n\n $scope.showJoinModal = function() {\n $scope.closeProfilePopover();\n return Modals.showJoin();\n };\n\n $scope.showSettings = function() {\n $scope.closeProfilePopover();\n return $state.go('app.settings');\n };\n\n $scope.showHelpModal = function(parameters) {\n return Modals.showHelp(parameters);\n };\n\n ////////////////////////////////////////\n // Useful popovers\n ////////////////////////////////////////\n\n $scope.showProfilePopover = function(event) {\n return UIUtils.popover.show(event, {\n templateUrl :'templates/common/popover_profile.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.profilePopover = popover;\n $timeout(function() {\n UIUtils.ink({selector: '#profile-popover .ink, #profile-popover .ink-dark'});\n }, 100);\n }\n });\n };\n\n $scope.closeProfilePopover = function() {\n if ($scope.profilePopover && $scope.profilePopover.isShown()) {\n $timeout(function(){$scope.profilePopover.hide();});\n }\n };\n\n // Change peer info\n $scope.showPeerInfoPopover = function(event) {\n return UIUtils.popover.show(event, {\n templateUrl: 'templates/network/popover_peer_info.html',\n autoremove: true,\n scope: $scope.$new(true)\n });\n };\n\n ////////////////////////////////////////\n // Link management\n ////////////////////////////////////////\n\n $scope.openLink = function($event, uri, options) {\n $event.stopPropagation();\n $event.preventDefault();\n\n // Read URL like '@UID' (Used by home page, in feed's author url)\n if (uri && uri.startsWith('@')) {\n var uid = uri.substr(1);\n if (BMA.regexp.USER_ID.test(uid)) {\n $state.go('app.wot_identity_uid', {uid: uid});\n return false;\n }\n }\n\n options = options || {};\n\n // If unable to open, just copy value\n options.onError = function() {\n return UIUtils.popover.copy($event, uri);\n };\n\n csHttp.uri.open(uri, options);\n\n return false;\n };\n\n ////////////////////////////////////////\n // Layout Methods\n ////////////////////////////////////////\n $scope.showFab = function(id, timeout) {\n UIUtils.motion.toggleOn({selector: '#'+id + '.button-fab'}, timeout);\n };\n\n $scope.hideFab = function(id, timeout) {\n UIUtils.motion.toggleOff({selector: '#'+id + '.button-fab'}, timeout);\n };\n\n // Could be override by subclass\n $scope.doMotion = function(options) {\n return $scope.motion.show(options);\n };\n\n\n ////////////////////////////////////////\n // Fullscreen mode\n ////////////////////////////////////////\n\n $scope.askFullscreen = function() {\n var skip = $scope.fullscreen || !UIUtils.screen.isSmall() || !Device.isWeb();\n if (skip) return;\n\n return UIUtils.alert.confirm('CONFIRM.FULLSCREEN', undefined, {\n cancelText: 'COMMON.BTN_NO',\n okText: 'COMMON.BTN_YES'\n })\n .then(function(confirm) {\n if (!confirm) return;\n $scope.toggleFullscreen();\n });\n };\n\n $scope.toggleFullscreen = function() {\n $scope.fullscreen = !UIUtils.screen.fullscreen.isEnabled();\n UIUtils.screen.fullscreen.toggleAll();\n };\n\n // removeIf(device)\n // Ask switching fullscreen\n $scope.askFullscreen();\n // endRemoveIf(device)\n}\n\n\nfunction HomeController($scope, $state, $timeout, $ionicHistory, $translate, $http, UIUtils,\n csConfig, csCache, csPlatform, csCurrency, csSettings) {\n 'ngInject';\n\n $scope.loading = true;\n $scope.locales = angular.copy(csSettings.locales);\n $scope.smallscreen = UIUtils.screen.isSmall();\n $scope.showInstallHelp = false;\n\n $scope.enter = function(e, state) {\n if (ionic.Platform.isIOS()) {\n if(window.StatusBar) {\n // needed to fix Xcode 9 / iOS 11 issue with blank space at bottom of webview\n // https://github.com/meteor/meteor/issues/9041\n StatusBar.overlaysWebView(false);\n StatusBar.overlaysWebView(true);\n }\n }\n\n if (state && state.stateParams && state.stateParams.error) { // Error query parameter\n $scope.error = state.stateParams.error;\n $scope.node = csCurrency.data.node;\n $scope.loading = false;\n $ionicHistory.nextViewOptions({\n disableAnimate: true,\n disableBack: true,\n historyRoot: true\n });\n $state.go('app.home', {error: undefined}, {\n reload: false,\n inherit: true,\n notify: false});\n }\n else {\n // Wait platform to be ready\n csPlatform.ready()\n .then(function() {\n $scope.loading = false;\n $scope.loadFeeds();\n })\n .catch(function(err) {\n $scope.node = csCurrency.data.node;\n $scope.loading = false;\n $scope.error = err;\n });\n }\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.reload = function() {\n $scope.loading = true;\n delete $scope.error;\n\n $timeout($scope.enter, 200);\n };\n\n $scope.loadFeeds = function() {\n var feedUrl = csSettings.getFeedUrl();\n if (!feedUrl || typeof feedUrl !== 'string') return; // Skip\n\n var maxContentLength = (csConfig.feed && csConfig.feed.maxContentLength) || 650;\n\n var now = Date.now();\n console.debug(\"[home] Loading feeds from {0}...\".format(feedUrl));\n\n $http.get(feedUrl, {responseType: 'json', cache: csCache.get(null, csCache.constants.LONG)})\n .success(function(feed) {\n console.debug('[home] Feeds loaded in {0}ms'.format(Date.now()-now));\n if (!feed || !feed.items || !feed.items.length) return; // skip if empty\n\n feed.items = feed.items.reduce(function(res, item) {\n if (!item || (!item.title && !item.content_text && !item.content_html)) return res; // Skip\n\n // Convert UTC time\n if (item.date_published) {\n item.time = moment.utc(item.date_published).unix();\n }\n // Convert content to HTML\n if (item.content_html) {\n item.content = item.content_html;\n }\n else {\n item.content = (item.content_text||'').replace(/\\n/g, '<br/>');\n }\n\n // Trunc content, if need\n if (maxContentLength !== -1 && item.content && item.content.length > maxContentLength) {\n var endIndex = Math.max(item.content.lastIndexOf(\" \", maxContentLength), item.content.lastIndexOf(\"<\", maxContentLength));\n item.content = item.content.substr(0, endIndex) + ' (...)';\n item.truncated = true;\n }\n\n // If author is missing, copy the main author\n item.author = item.author || feed.author;\n\n return res.concat(item);\n }, []);\n\n $scope.feed = feed;\n })\n .error(function(data, status) {\n console.error('[home] Failed to load feeds.');\n $scope.feed = null;\n });\n };\n\n /**\n * Catch click for quick fix\n * @param event\n */\n $scope.doQuickFix = function(action) {\n if (action === 'settings') {\n $ionicHistory.nextViewOptions({\n historyRoot: true\n });\n $state.go('app.settings');\n }\n };\n\n $scope.changeLanguage = function(langKey) {\n $translate.use(langKey);\n $scope.hideLocalesPopover();\n csSettings.data.locale = _.findWhere($scope.locales, {id: langKey});\n csSettings.store();\n $scope.loadFeeds();\n };\n\n /* -- show/hide locales popup -- */\n\n $scope.showLocalesPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'templates/common/popover_locales.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.localesPopover = popover;\n }\n });\n };\n\n $scope.hideLocalesPopover = function() {\n if ($scope.localesPopover) {\n $scope.localesPopover.hide();\n $scope.localesPopover = null;\n }\n };\n\n // For DEV ONLY\n /*$timeout(function() {\n $scope.loginAndGo();\n }, 500);*/\n}\n","\nJoinController.$inject = ['$scope', '$timeout', '$controller', 'Modals', 'csWallet'];\nJoinChooseAccountTypeModalController.$inject = ['$scope', '$state', 'Modals', 'UIUtils', 'csConfig', 'csCurrency'];\nJoinModalController.$inject = ['$scope', '$state', '$interval', '$q', '$timeout', 'Device', 'UIUtils', 'CryptoUtils', 'csSettings', 'Modals', 'csWallet', 'BMA', 'parameters'];angular.module('cesium.join.controllers', ['cesium.services'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n .state('app.join', {\n url: \"/join\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/home/home.html\",\n controller: 'JoinCtrl'\n }\n }\n })\n ;\n }])\n\n .controller('JoinCtrl', JoinController)\n\n .controller('JoinChooseAccountTypeModalCtrl', JoinChooseAccountTypeModalController)\n\n .controller('JoinModalCtrl', JoinModalController)\n;\n\nfunction JoinController($scope, $timeout, $controller, Modals, csWallet) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('HomeCtrl', {$scope: $scope}));\n\n $scope.showJoinModal = function() {\n if ($scope.loading) return $timeout($scope.showJoinModal, 500); // recursive call\n\n if (!csWallet.isLogin() && !$scope.error) {\n return $timeout(Modals.showJoin, 300);\n }\n };\n $scope.$on('$ionicView.enter', $scope.showJoinModal);\n\n}\n\nfunction JoinChooseAccountTypeModalController($scope, $state, Modals, UIUtils, csConfig, csCurrency) {\n 'ngInject';\n\n $scope.formData = {};\n $scope.slides = {\n slider: null,\n options: {\n loop: false,\n effect: 'slide',\n speed: 500\n }\n };\n $scope.loading = true;\n\n $scope.load = function() {\n if ($scope.loading) {\n return csCurrency.get()\n .then(function (currency) {\n if (!currency) return;\n $scope.currency = currency;\n $scope.formData.currency = currency.name;\n $scope.loading = false;\n })\n .catch(UIUtils.onError('ERROR.GET_CURRENCY_FAILED'));\n }\n };\n $scope.$on('modal.shown', $scope.load);\n\n $scope.$on(\"$ionicSlides.sliderInitialized\", function(event, data){\n // Disable swipe\n data.slider.lockSwipes();\n });\n\n $scope.slidePrev = function() {\n $scope.slides.slider.unlockSwipes();\n $scope.slides.slider.slidePrev();\n $scope.slides.slider.lockSwipes();\n };\n\n $scope.slideNext = function() {\n $scope.slides.slider.unlockSwipes();\n $scope.slides.slider.slideNext();\n $scope.slides.slider.lockSwipes();\n };\n\n $scope.selectAccountTypeAndClose = function(type) {\n if (csConfig.demo) {\n return UIUtils.alert.demo();\n }\n $scope.formData.accountType = type;\n $scope.closeModal($scope.formData);\n };\n\n /**\n * Catch click for quick fix\n * @param fix\n */\n $scope.doQuickFix = function(event) {\n if (event == 'settings') {\n $scope.closeModal();\n $state.go('app.settings');\n }\n };\n\n $scope.showHelpModal = function(helpAnchor) {\n Modals.showHelp({anchor: helpAnchor});\n };\n\n // TODO DEV only\n //$timeout(function() {\n //$scope.selectCurrency('g1');\n //$scope.selectAccountTypeAndClose('member');\n //}, 400);\n}\n\n\nfunction JoinModalController($scope, $state, $interval, $q, $timeout, Device, UIUtils, CryptoUtils, csSettings, Modals, csWallet, BMA, parameters) {\n 'ngInject';\n\n $scope.formData = {\n pseudo: parameters.uid || '',\n pubkey: parameters.pubkey || undefined\n };\n $scope.slides = {\n slider: null,\n options: {\n loop: false,\n effect: 'slide',\n speed: 500,\n pager: false,\n showPager: false\n }\n };\n $scope.slideBehavior = {};\n $scope.loading = true;\n\n $scope.isLicenseRead = Device.isIOS(); // always enable the button, on IOS fix #554\n $scope.showUsername = false;\n $scope.showPassword = false;\n $scope.formData.computing=false;\n $scope.smallscreen = UIUtils.screen.isSmall();\n $scope.userIdPattern = BMA.constants.regexp.USER_ID;\n $scope.accountAvailable = !!parameters.pubkey;\n\n // Read input parameters\n $scope.currency = parameters.currency;\n $scope.accountType = parameters.accountType || 'member';\n\n var wallet;\n\n $scope.load = function() {\n if ($scope.loading) {\n\n // Get the wallet\n wallet = (parameters.walletId && csWallet.children.get(parameters.walletId)) ||\n (parameters.pubkey && csWallet.children.getByPubkey(parameters.pubkey)) ||\n ((!parameters.pubkey || csWallet.isUserPubkey(parameters.pubkey)) && csWallet);\n if (!wallet) throw new Error(\"Cannot found the corresponding wallet, from parameters.pubkey or parameters.walletId\");\n\n console.debug(\"[join] Starting join modal on wallet {0}\".format(wallet.id));\n\n if ($scope.accountType === 'member') {\n $scope.licenseFileUrl = csSettings.getLicenseUrl();\n if ($scope.licenseFileUrl) {\n // Use HTML in iframe, when original file is markdown (fix #538)\n if ( $scope.licenseFileUrl.substring($scope.licenseFileUrl.length - 3) != '.txt') {\n $scope.licenseFileUrl = $scope.licenseFileUrl + '.html';\n }\n if (!$scope.isLicenseRead) {\n //$scope.startListenLicenseBottom();\n\n // Make sure to enable the next button when error occured - Fix issue #592\n $timeout(function() {\n if (!$scope.isLicenseRead) {\n $scope.isLicenseRead = true;\n }\n }, 5000);\n }\n }\n }\n\n $scope.slideBehavior = $scope.computeSlideBehavior();\n $scope.loading = false;\n }\n };\n $scope.$on('modal.shown', $scope.load);\n\n $scope.$on(\"$ionicSlides.sliderInitialized\", function(event, data){\n // Disable swipe\n data.slider.lockSwipes();\n });\n\n $scope.slidePrev = function() {\n $scope.slides.slider.unlockSwipes();\n $scope.slides.slider.slidePrev();\n $scope.slides.slider.lockSwipes();\n };\n\n $scope.slideNext = function() {\n $scope.slides.slider.unlockSwipes();\n $scope.slides.slider.slideNext();\n $scope.slides.slider.lockSwipes();\n };\n\n $scope.showAccountPubkey = function() {\n if (parameters.pubkey && parameters.pseudo === $scope.formData.pseudo) {\n $scope.formData.pubkey = parameters.pubkey;\n $scope.formData.computing = false;\n return;\n }\n\n $scope.formData.computing=true;\n\n CryptoUtils.scryptKeypair($scope.formData.username, $scope.formData.password)\n .then(function(keypair) {\n $scope.formData.pubkey = CryptoUtils.util.encode_base58(keypair.signPk);\n return $scope.checkAccountAvailable();\n })\n .then(function() {\n return $timeout(function(){\n $scope.formData.computing=false;\n }, 400);\n })\n .catch(function(err) {\n $scope.formData.pubkey = undefined;\n $scope.formData.computing=false;\n UIUtils.onError('ERROR.CRYPTO_UNKNOWN_ERROR')(err);\n });\n };\n\n $scope.formDataChanged = function() {\n $scope.formData.computing=false;\n $scope.formData.pubkey=null;\n };\n\n $scope.getCurrentFormName = function() {\n var index = $scope.slides.slider.activeIndex;\n if($scope.accountType === 'member') {\n index += ($scope.licenseFileUrl ? 0 : 1); // skip index 0, when no license file\n index += (parameters.pubkey && index >= 2 ? 2 : 0); // skip salt+pass, if already a pubkey\n if (index === 0) return \"licenseForm\";\n if (index === 1) return \"pseudoForm\";\n if (index === 2) return \"saltForm\";\n if (index === 3) return \"passwordForm\";\n if (index === 4) return \"confirmForm\";\n }\n else {\n if (index === 0) return \"saltForm\";\n if (index === 1) return \"passwordForm\";\n if (index === 2) return \"confirmForm\";\n }\n };\n\n $scope.computeSlideBehavior = function() {\n var formName = $scope.getCurrentFormName();\n\n var behavior;\n if (formName === \"licenseForm\") {\n behavior = {\n hasPreviousButton: false,\n hasNextButton: false,\n hasAcceptButton: true\n };\n }\n else if (formName === \"pseudoForm\") {\n behavior = {\n helpAnchor: 'join-pseudo',\n hasPreviousButton: $scope.licenseFileUrl && true,\n hasNextButton: true,\n focus: 'pseudo'\n };\n }\n else if (formName === \"saltForm\") {\n behavior = {\n helpAnchor: 'join-salt',\n hasPreviousButton: $scope.accountType === 'member',\n hasNextButton: true,\n focus: 'salt'\n };\n }\n else if (formName === \"passwordForm\") {\n behavior = {\n helpAnchor: 'join-password',\n hasPreviousButton: true,\n hasNextButton: true,\n focus: 'password'\n };\n }\n else if (formName === \"confirmForm\") {\n behavior = {\n hasPreviousButton: true,\n hasNextButton: false,\n hasSendButton: true,\n helpAnchor: 'join-pubkey'\n };\n }\n else {\n behavior = {\n hasPreviousButton: false,\n hasNextButton: true\n };\n }\n\n // removeIf(device)\n // Focus input text (only if NOT device, to avoid keyboard opening)\n // FIXME: this cause issue #464\n /*if (behavior.focus) {\n $timeout(function(){\n $focus(behavior.focus);\n }, 100);\n }*/\n // endRemoveIf(device)\n\n return behavior;\n };\n\n\n $scope.doNext = function() {\n var formName = $scope.getCurrentFormName();\n if (formName && $scope[formName]){\n $scope[formName].$submitted=true;\n if(!$scope[formName].$valid) {\n return;\n }\n if (formName === \"pseudoForm\" && $scope.uiAlreadyUsed) {\n return;\n }\n if (formName === \"passwordForm\") {\n $scope.showAccountPubkey();\n }\n }\n\n $scope.slideNext();\n\n $scope.slideBehavior = $scope.computeSlideBehavior();\n };\n\n $scope.doPrev = function() {\n $scope.slidePrev();\n $scope.slideBehavior = $scope.computeSlideBehavior();\n };\n\n $scope.doNewAccount = function(confirm) {\n\n if (!confirm) {\n\n var messageKey = ($scope.accountType === 'member') ? 'ACCOUNT.NEW.CONFIRMATION_MEMBER_ACCOUNT' :\n 'ACCOUNT.NEW.CONFIRMATION_WALLET_ACCOUNT';\n\n return UIUtils.alert.confirm(messageKey, undefined,\n {\n cssClass: 'warning',\n okText: $scope.accountType == 'member' ? 'COMMON.BTN_SEND' : 'COMMON.BTN_CONTINUE',\n okType: 'button-assertive'\n })\n .then(function(confirm) {\n if (confirm) {\n $scope.doNewAccount(true);\n }\n });\n }\n\n var onErrorLogout = function(message) {\n return function(err) {\n if (parameter.uid) {\n wallet.unauth()\n .then(function(){\n UIUtils.onError(message)(err);\n });\n }\n else {\n wallet.logout()\n .then(function(){\n UIUtils.onError(message)(err);\n });\n }\n throw new Error('CANCELLED');\n };\n };\n\n UIUtils.loading.show();\n\n return wallet.login({\n auth: true,\n isNew: true,\n method: 'SCRYPT_DEFAULT',\n expectedPubkey: $scope.formData.pubkey,\n showMethods: false\n })\n .then(function() {\n if ($scope.accountType === \"member\") {\n $scope.closeModal();\n csSettings.data.wallet = csSettings.data.wallet || {};\n csSettings.data.wallet.alertIfUnusedWallet = false; // do not alert if empty\n\n var needSelf = angular.isUndefined(parameters.uid) || angular.isUndefined(parameters.blockUid) ||\n (parameters.uid.toUpperCase() !== $scope.formData.pseudo.toUpperCase());\n if (!needSelf) {\n wallet.setSelf(parameters.uid, parameters.blockUid);\n }\n\n // Self promise (if need)\n var selfPromise = needSelf ?\n wallet.self($scope.formData.pseudo, false/*do NOT load membership here*/)\n .catch(onErrorLogout('ERROR.SEND_IDENTITY_FAILED')) :\n $q.when();\n\n return selfPromise\n .then(function() {\n // Send membership IN\n return wallet.membership.inside()\n .catch(function(err) {\n if (err && err.ucode != BMA.errorCodes.MEMBERSHIP_ALREADY_SEND) return;\n onErrorLogout('ERROR.SEND_MEMBERSHIP_IN_FAILED')(err);\n });\n })\n .then(function() {\n\n $scope.closeModal();\n\n // Redirect to wallet\n if (wallet.isDefault()) {\n return $state.go('app.view_wallet');\n } else {\n return $state.go('app.view_wallet_by_id', {id: wallet.id});\n }\n })\n .then(function() {\n // Wait 2s (for wallet load)\n // then ask to download revocation file\n return $timeout(function() {\n // Hide the loading indicator, if wallet already loaded\n if (wallet.isDataLoaded({requirements: true})) {\n UIUtils.loading.hide();\n }\n return $scope.downloadRevocationRegistration();\n },\n 2000);\n });\n }\n else{\n $scope.closeModal();\n\n // Redirect to wallet\n if (wallet.isDefault()) {\n $state.go('app.view_wallet');\n }\n else {\n $state.go('app.view_wallet_by_id', {id: wallet.id});\n }\n\n }\n })\n .catch(function(err) {\n UIUtils.loading.hide();\n if (err === 'CANCELLED') return;\n if (err && err.ucode != BMA.errorCodes.MEMBERSHIP_ALREADY_SEND) {\n console.error(\"[wallet] Node: already membership\", err);\n return; // OK\n }\n else {\n UIUtils.alert.error('ERROR.UNKNOWN_ERROR');\n }\n });\n };\n\n $scope.downloadRevocationRegistration = function() {\n return UIUtils.alert.confirm('DOWNLOAD.POPUP_REVOKE_MESSAGE', 'DOWNLOAD.POPUP_TITLE', {\n cssClass: 'warning',\n okText: 'COMMON.BTN_DOWNLOAD',\n okType: 'button-assertive',\n cancelText: 'COMMON.BTN_LATER'\n })\n .then(function(confirm) {\n if (!confirm) return;\n return wallet.downloadRevocation();\n });\n };\n\n $scope.showHelpModal = function(helpAnchor) {\n Modals.showHelp({anchor: helpAnchor});\n };\n\n $scope.startListenLicenseBottom = function(){\n var iframeEl = angular.element(document.querySelector('.modal #iframe-license'));\n iframeEl = iframeEl && iframeEl.length ? iframeEl[0] : undefined;\n if (!iframeEl || !iframeEl.contentWindow) {\n console.debug('[join] Waiting license frame to be load...');\n return $timeout($scope.startListenLicenseBottom, 1000);\n }\n\n $scope.licenseBottomInterval = $interval(function(){\n var yPos = iframeEl.contentWindow.document.body.scrollTop;\n var scrollHeight = iframeEl.contentWindow.document.body.scrollHeight;\n var clientHeight = iframeEl.contentWindow.document.body.clientHeight;\n var isBottom = (scrollHeight - clientHeight === yPos);\n if(isBottom){\n $scope.isLicenseRead = true;\n $scope.stopListenLicenseBottom();\n }\n }, 1000);\n };\n\n $scope.stopListenLicenseBottom = function() {\n if ($scope.licenseBottomInterval) {\n $interval.cancel($scope.licenseBottomInterval);\n delete $scope.licenseBottomInterval;\n }\n };\n $scope.$on('modal.hidden', $scope.stopListenLicenseBottom);\n\n $scope.checkUid = function(){\n if (!$scope.formData.pseudo || $scope.formData.pseudo.length < 3) {\n $scope.formData.computing=false;\n delete $scope.uiAlreadyUsed;\n return;\n }\n\n var uid = $scope.formData.pseudo.toUpperCase();\n $scope.formData.computing=true;\n\n // Same has given uid + self block: skip control\n if (parameters.uid && uid === parameters.uid.toUpperCase()) {\n $scope.formData.computing=false;\n $scope.uiAlreadyUsed = false;\n return;\n }\n else {\n // search on uid\n BMA.wot.lookup({ search: uid })\n .then(function(res) {\n $scope.uiAlreadyUsed = (res.results || []).some(function(pub){\n return (pub.uids || []).some(function(idty) {\n return (idty.uid.toUpperCase() === uid); // same Uid\n });\n });\n $scope.formData.computing=false;\n })\n .catch(function(err){\n console.error(err);\n $scope.formData.computing=false;\n $scope.uiAlreadyUsed = false;\n });\n }\n };\n $scope.$watch('formData.pseudo', $scope.checkUid, true);\n\n $scope.checkAccountAvailable = function() {\n if (parameters.pubkey) {\n $scope.accountAvailable = true;\n return;\n }\n\n delete $scope.accountAvailable;\n // Search for tx source, from pubkey\n return BMA.tx.sources({ pubkey: $scope.formData.pubkey })\n .then(function(res) {\n $scope.accountAvailable = !res || !res.sources.length;\n })\n .catch(function(err) {\n console.error(err);\n $scope.accountAvailable = false;\n });\n };\n\n $scope.identifierRecovery = function() {\n // Go back\n $scope.slides.slider.unlockSwipes();\n for (var i = 0; i < 2; i++) {\n $scope.slides.slider.slidePrev();\n }\n $scope.slides.slider.lockSwipes();\n // Recompute behavior\n $scope.slideBehavior = $scope.computeSlideBehavior();\n };\n\n // TODO: remove auto add account when done\n /*$timeout(function() {\n //$scope.selectCurrency('g1');\n //$scope.selectAccountType('member');\n $scope.formData.username=\"azertypoi\";\n $scope.formData.confirmUsername=$scope.formData.username;\n $scope.formData.password=\"azertypoi\";\n $scope.formData.confirmPassword=$scope.formData.password;\n $scope.formData.pseudo=\"azertypoi\";\n //$scope.doNext();\n //$scope.doNext();\n }, 400);*/\n}\n\n","\nLoginController.$inject = ['$scope', '$timeout', '$controller', 'csWallet'];\nLoginModalController.$inject = ['$scope', '$timeout', '$q', '$ionicPopover', '$window', 'CryptoUtils', 'csCrypto', 'ionicReady', 'UIUtils', 'BMA', 'Modals', 'csConfig', 'csSettings', 'Device', 'parameters'];\nAuthController.$inject = ['$scope', '$controller', 'csConfig'];\nangular.module('cesium.login.controllers', ['cesium.services'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n .state('app.login', {\n url: \"/login\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/home/home.html\",\n controller: 'LoginCtrl'\n }\n }\n })\n ;\n }])\n\n .controller('LoginCtrl', LoginController)\n\n .controller('LoginModalCtrl', LoginModalController)\n\n .controller('AuthCtrl', AuthController)\n\n;\n\n\nfunction LoginController($scope, $timeout, $controller, csWallet) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('HomeCtrl', {$scope: $scope}));\n\n $scope.showLoginModal = function() {\n if ($scope.loading) return $timeout($scope.showLoginModal, 500); // recursive call\n\n if (!csWallet.isLogin() && !$scope.error) {\n return $timeout(csWallet.login, 300);\n }\n };\n $scope.$on('$ionicView.enter', $scope.showLoginModal);\n\n}\n\nfunction LoginModalController($scope, $timeout, $q, $ionicPopover, $window, CryptoUtils, csCrypto, ionicReady,\n UIUtils, BMA, Modals, csConfig, csSettings, Device, parameters) {\n 'ngInject';\n\n parameters = parameters || {};\n\n // Demo mode: force PUBKEY method\n if (csConfig.demo) {\n parameters.method = 'PUBKEY';\n }\n\n $scope.computing = false;\n $scope.pubkey = null;\n $scope.formData = {};\n $scope.showPubkey = false;\n $scope.showComputePubkeyButton = false;\n $scope.autoComputePubkey = false;\n $scope.pubkeyPattern = '^(:?{0}|{1})$'.format(BMA.constants.regexp.PUBKEY, BMA.constants.regexp.PUBKEY_WITH_CHECKSUM);\n\n $scope.isAuth = parameters.auth;\n $scope.okText = parameters.okText;\n $scope.title = parameters.title || ($scope.isAuth ? 'AUTH.TITLE' : 'LOGIN.TITLE');\n $scope.showMethods = angular.isDefined(parameters.showMethods) ? parameters.showMethods : true;\n $scope.showNewAccountLink = angular.isDefined(parameters.showNewAccountLink) ? parameters.showNewAccountLink : true;\n $scope.expectedPubkey = parameters.expectedPubkey;\n $scope.expectedUid = parameters.uid;\n\n $scope.scryptParamsValues = _.keys(CryptoUtils.constants.SCRYPT_PARAMS)\n .reduce(function(res, key) {\n return res.concat({id: key, label: 'LOGIN.SCRYPT.' + key, params: CryptoUtils.constants.SCRYPT_PARAMS[key]});\n }, [{id: 'USER', label: 'LOGIN.SCRYPT.USER', params: {}}]);\n\n // modal init\n $scope.init = function() {\n\n ionicReady().then(function(){\n // Should auto-compute pubkey ?\n $scope.autoComputePubkey = ionic.Platform.grade.toLowerCase()==='a' &&\n !UIUtils.screen.isSmall();\n });\n\n // Init remember me\n $scope.formData.rememberMe = csSettings.data.rememberMe;\n\n // Init keep auth, from idle time\n $scope.formData.keepAuthIdle = csSettings.data.keepAuthIdle;\n $scope.formData.keepAuth = ($scope.formData.keepAuthIdle == csSettings.constants.KEEP_AUTH_IDLE_SESSION);\n\n // Init method\n var method = parameters.method || csSettings.data.login && csSettings.data.login.method || 'SCRYPT_DEFAULT';\n var params = csSettings.data.login && csSettings.data.login.params;\n // used default method, when PUBKEY + auth, or SCAN, or if ask for 'default'\n if (($scope.isAuth && method === 'PUBKEY') || (method === 'SCAN') || (method === 'default')) {\n method = 'SCRYPT_DEFAULT';\n }\n $scope.changeMethod(method, params);\n };\n\n // modal enter\n $scope.enter = function() {\n UIUtils.loading.hide();\n // Ink effect\n UIUtils.ink({selector: '.modal-login .ink'});\n };\n $scope.$on('modal.shown', $scope.enter);\n\n // modal leave\n $scope.leave = function() {\n $scope.formData = {};\n $scope.computing = false;\n $scope.pubkey = null;\n $scope.methods = [];\n };\n $scope.$on('modal.hide', $scope.leave);\n\n // Login form submit\n $scope.doLogin = function(skipForm) {\n var method = $scope.formData.method;\n\n if(!$scope.form.$valid && method !== 'SCAN') return;\n\n var keepAuthIdle = $scope.formData.keepAuthIdle;\n var promise;\n\n // Scrypt\n if (method === 'SCRYPT_DEFAULT' || method === 'SCRYPT_ADVANCED') {\n if (!$scope.formData.username || !$scope.formData.password) return;\n var scryptPrams = $scope.formData.scrypt && $scope.formData.scrypt.params;\n UIUtils.loading.show();\n promise = CryptoUtils.scryptKeypair($scope.formData.username, $scope.formData.password, scryptPrams)\n .then(function(keypair) {\n if (!keypair) return UIUtils.loading.hide(10);\n var pubkey = CryptoUtils.util.encode_base58(keypair.signPk);\n // Check pubkey\n if (parameters.expectedPubkey && parameters.expectedPubkey != pubkey) {\n $scope.pubkey = pubkey;\n $scope.showPubkey = true;\n $scope.pubkeyError = true;\n return UIUtils.loading.hide(10);\n }\n\n $scope.pubkeyError = false;\n\n return {\n pubkey: pubkey,\n keypair: keypair,\n params: ($scope.formData.scrypt && $scope.formData.scrypt.id != 'SCRYPT_DEFAULT') ? scryptPrams : undefined\n };\n })\n .catch(UIUtils.onError('ERROR.CRYPTO_UNKNOWN_ERROR'));\n }\n\n // File\n else if (method === 'FILE') {\n if (!$scope.formData.file || !$scope.formData.file.valid || !$scope.formData.file.pubkey) return;\n\n // If checkbox keep auth checked: set idle time to session\n keepAuthIdle = ($scope.formData.keepAuth && csSettings.constants.KEEP_AUTH_IDLE_SESSION) || keepAuthIdle;\n\n promise =\n UIUtils.loading.show()\n .then(function() {\n return $scope.readKeyFile($scope.formData.file, {\n withSecret: ($scope.isAuth || $scope.formData.keepAuth)\n });\n })\n .then(function(keypair) {\n if (!keypair) return UIUtils.loading.hide(10);\n var pubkey = CryptoUtils.util.encode_base58(keypair.signPk);\n\n // Check pubkey\n if (parameters.expectedPubkey && parameters.expectedPubkey != pubkey) {\n $scope.formData.file.valid = false;\n return UIUtils.loading.hide(10);\n }\n\n $scope.pubkeyError = false;\n\n return {\n pubkey: pubkey,\n keypair: keypair\n };\n })\n .catch(UIUtils.onError('ERROR.AUTH_FILE_ERROR'));\n }\n\n // Pubkey\n else if (method === 'PUBKEY') {\n var pubkey = $scope.formData.pubkey && $scope.formData.pubkey.trim();\n var uid = $scope.formData.uid && $scope.formData.uid.trim() || undefined;\n if (!pubkey) return;\n var matches = BMA.regexp.PUBKEY.exec(pubkey);\n // valid pubkey: use it\n if (matches) {\n promise = UIUtils.loading.show()\n .then(function() {\n return {\n pubkey: pubkey,\n uid : uid\n };\n });\n }\n\n // Check checksum\n else {\n\n matches = BMA.regexp.PUBKEY_WITH_CHECKSUM.exec(pubkey);\n if (matches) {\n\n pubkey = matches[1];\n var checksum = matches[2];\n var expectedChecksum = csCrypto.util.pkChecksum(pubkey);\n if (checksum != expectedChecksum) {\n $scope.form.pubkey.$error = {checksum: true};\n }\n else {\n promise = UIUtils.loading.show()\n .then(function() {\n return {\n pubkey: pubkey,\n uid : uid\n };\n });\n }\n }\n // Not a pubkey: launch search on\n else {\n return $scope.showWotLookupModal(pubkey);\n }\n }\n }\n\n // Scan QR code\n else if (method === 'SCAN') {\n var valid = $scope.formData.pubkey && (!$scope.isAuth || !!$scope.formData.keypair);\n if (!valid) return;\n\n promise = UIUtils.loading.show()\n .then(function() {\n return {\n pubkey: $scope.formData.pubkey,\n keypair: $scope.formData.keypair\n };\n });\n }\n\n if (!promise) {\n console.warn('[login] unknown method: ', method);\n return;\n }\n\n return promise.then(function(res) {\n if (!res) return;\n\n // Update settings (if need)\n var rememberMeChanged = !angular.equals(csSettings.data.rememberMe, $scope.formData.rememberMe);\n var keepAuthIdleChanged = !angular.equals(csSettings.data.keepAuthIdle, keepAuthIdle);\n var methodChanged = !angular.equals(csSettings.data.login && csSettings.data.login.method, method);\n var paramsChanged = !angular.equals(csSettings.data.login && csSettings.data.login.params, res.params);\n if (rememberMeChanged || keepAuthIdleChanged || methodChanged || paramsChanged) {\n csSettings.data.rememberMe = $scope.formData.rememberMe;\n csSettings.data.keepAuthIdle = keepAuthIdle;\n csSettings.data.useLocalStorage = csSettings.data.rememberMe ? true : csSettings.data.useLocalStorage;\n csSettings.data.login = csSettings.data.login || {};\n csSettings.data.login.method = method;\n csSettings.data.login.params = res.params;\n $timeout(csSettings.store, 500);\n }\n\n if (parameters.success) {\n parameters.success($scope.formData);\n }\n\n // hide loading\n if (parameters.silent) {\n UIUtils.loading.hide();\n }\n\n // Return result then close\n return $scope.closeModal(res);\n });\n };\n\n $scope.onScryptFormChanged = function() {\n if ($scope.computing) return; // avoid multiple call\n $scope.pubkey = null;\n $scope.pubkeyError = false;\n $scope.showPubkey = !!$scope.formData.username && !!$scope.formData.password;\n if ($scope.autoComputePubkey && $scope.showPubkey) {\n $scope.computePubkey();\n $scope.showComputePubkeyButton = false;\n }\n else {\n $scope.showComputePubkeyButton = !$scope.autoComputePubkey && $scope.showPubkey;\n }\n };\n $scope.$watch('formData.username + formData.password', $scope.onScryptFormChanged, true);\n\n $scope.computePubkey = function() {\n $scope.showComputePubkeyButton = false;\n $scope.computing = true;\n $scope.pubkey = null;\n return $timeout(function() {\n var salt = $scope.formData.username;\n var pwd = $scope.formData.password;\n var scryptPrams = $scope.formData.scrypt && $scope.formData.scrypt.params;\n return CryptoUtils.scryptSignPk(salt, pwd, scryptPrams)\n .then(function (signPk) {\n\n // If model has changed before the response, then retry\n if (salt !== $scope.formData.username || pwd !== $scope.formData.password) {\n return $scope.computePubkey();\n }\n\n $scope.pubkey = CryptoUtils.util.encode_base58(signPk);\n if ($scope.expectedPubkey && $scope.expectedPubkey != $scope.pubkey) {\n $scope.pubkeyError = true;\n }\n\n $scope.computing = false;\n }\n )\n .catch(function (err) {\n UIUtils.onError('ERROR.CRYPTO_UNKNOWN_ERROR')(err);\n $scope.computing = false;\n $scope.autoComputePubkey = false; // Avoid a infinite loop (computePubkey -> onScryptFormChanged -> computePubkey)\n $scope.onScryptFormChanged();\n });\n }, 100);\n };\n\n $scope.showJoinModal = function() {\n $scope.closeModal();\n $timeout(function() {\n Modals.showJoin();\n }, 300);\n };\n\n $scope.showAccountSecurityModal = function() {\n $scope.closeModal();\n $timeout(function() {\n Modals.showAccountSecurity();\n }, 300);\n };\n\n $scope.showHelpModal = function(parameters) {\n return Modals.showHelp(parameters);\n };\n\n $scope.doScan = function() {\n if ($scope.computing) return;\n\n $scope.computing = true;\n $scope.formData.pubkey = null;\n $scope.formData.keypair = null;\n\n // Run scan cordova plugin, on device\n return Device.barcode.scan()\n .then(function(data) {\n if (!data) return;\n\n // Skip simple parsing, if auth if need\n if ($scope.isAuth) return $q.when(data);\n\n // Try to parse as an URI\n return BMA.uri.parse(data)\n .then(function (res) {\n if (!res || !res.pubkey) throw {message: 'ERROR.SCAN_UNKNOWN_FORMAT'};\n // If simple pubkey\n return res;\n })\n .catch(function(err) {\n console.debug('[login] Error while parsing as URI: ' + (err && err.message || err));\n return data;\n });\n })\n .then(function(data) {\n if (!data) return;\n // Parse success: continue\n if (data && data.pubkey) return data;\n\n // Try to read as WIF format\n return csCrypto.keyfile.parseData(data, {silent: true})\n .then(function(keypair) {\n if (!keypair || !keypair.signPk || !keypair.signSk) throw {message: 'ERROR.SCAN_UNKNOWN_FORMAT'}; // rethrow an error\n\n var pubkey = CryptoUtils.base58.encode(keypair.signPk);\n\n // Login using keypair\n return {\n pubkey: pubkey,\n keypair: keypair\n };\n })\n // Unknown format (nor URI, nor WIF/EWIF)\n .catch(UIUtils.onError('ERROR.SCAN_UNKNOWN_FORMAT'));\n })\n .then(function(res) {\n if (!res || !res.pubkey) return; // no data\n\n $scope.pubkeyError = $scope.expectedPubkey && $scope.expectedPubkey != res.pubkey;\n $scope.formData.pubkey = res.pubkey;\n $scope.formData.keypair = res.keypair;\n })\n .then(function() {\n $scope.computing = false;\n UIUtils.loading.hide(10);\n })\n .catch(function(err) {\n $scope.computing = false;\n UIUtils.onError('ERROR.SCAN_FAILED')(err);\n });\n };\n\n $scope.changeMethod = function(method, params){\n $scope.hideMethodsPopover();\n\n if (method !== 'PUBKEY' && csConfig.demo) {\n return UIUtils.alert.demo();\n }\n\n if (!method || method === $scope.formData.method) return; // same method\n\n console.debug(\"[login] method is: \" + method);\n $scope.formData.method = method;\n $scope.formData.uid = null;\n\n if ($scope.form) {\n // hide form's fields errors on the form\n delete $scope.form.$submitted;\n }\n\n // Scrypt (advanced or not)\n if (method === 'SCRYPT_DEFAULT' || method === 'SCRYPT_ADVANCED') {\n $scope.pubkey = null;\n\n\n // Search scrypt object\n var scrypt;\n if (params) {\n scrypt = _.find($scope.scryptParamsValues, function(item){\n return item.params && angular.equals(item.params, params);\n });\n if (!scrypt) {\n scrypt = _.findWhere($scope.scryptParamsValues, {id: 'USER'}) || {};\n scrypt.params = params;\n }\n }\n else {\n scrypt = _.findWhere($scope.scryptParamsValues, {id: 'DEFAULT'});\n }\n $scope.changeScrypt(scrypt);\n\n $scope.autoComputePubkey = $scope.autoComputePubkey && (method === 'SCRYPT_DEFAULT');\n }\n else if (method === 'SCAN') {\n return $scope.doScan();\n }\n else {\n $scope.formData.username = null;\n $scope.formData.password = null;\n $scope.formData.pubkey = null;\n $scope.pubkey = null;\n $scope.computing = false;\n }\n };\n\n $scope.changeScrypt = function(scrypt) {\n // Protect params against changes\n $scope.formData.scrypt = angular.copy(scrypt||{});\n $scope.onScryptFormChanged();\n };\n\n $scope.readKeyFile = function(file, options) {\n options = options || {};\n\n options.password = options.password || $scope.formData.file.password || function() {\n $scope.formData.file.password = undefined;\n return Modals.showPassword({\n title: 'ACCOUNT.SECURITY.KEYFILE.PASSWORD_POPUP.TITLE',\n subTitle: 'ACCOUNT.SECURITY.KEYFILE.PASSWORD_POPUP.HELP',\n error: options.error,\n scope: $scope\n })\n .then(function (password) {\n // Remember password (for validation)\n $scope.formData.file.password = password;\n // Timeout is need to force popup to be hide\n return $timeout(function() {\n return password;\n }, 150);\n });\n };\n\n return csCrypto.keyfile.read($scope.formData.file, options)\n .catch(function(err) {\n $scope.formData.file.password = undefined;\n if (err === 'CANCELLED') {\n UIUtils.loading.hide(10);\n }\n if (err && err.ucode == csCrypto.errorCodes.BAD_PASSWORD) {\n // Recursive call\n return $scope.readKeyFile($scope.formData.file, {withSecret: options.withSecret, error: 'ACCOUNT.SECURITY.KEYFILE.ERROR.BAD_PASSWORD'});\n }\n throw err;\n });\n };\n\n $scope.onFileChanged = function(file) {\n if (!file || !file.fileData) {\n $scope.validatingFile = false;\n return; // Skip\n }\n $scope.formData.file = {\n name: file.fileData.name,\n size: file.fileData.size,\n content: file.fileContent\n };\n $scope.validatingFile = true;\n $timeout(function() {\n console.debug(\"[login] key file changed: \", $scope.formData.file);\n $scope.validatingFile = true;\n\n return $scope.readKeyFile($scope.formData.file, {withSecret: false, password: $scope.formData.file.password})\n .then(function(keypair) {\n if (!keypair || !keypair.signPk) {\n $scope.formData.file.valid = false;\n $scope.formData.file.pubkey = undefined;\n }\n else {\n $scope.formData.file.pubkey = CryptoUtils.util.encode_base58(keypair.signPk);\n $scope.formData.file.valid = !$scope.expectedPubkey || $scope.expectedPubkey === $scope.formData.file.pubkey;\n $scope.validatingFile = false;\n }\n\n })\n .catch(function(err) {\n if (err && err === 'CANCELLED') {\n $scope.removeKeyFile();\n return;\n }\n $scope.validatingFile = false;\n $scope.formData.file.valid = false;\n $scope.formData.file.pubkey = undefined;\n UIUtils.onError('ERROR.AUTH_FILE_ERROR')(err);\n });\n });\n };\n\n $scope.removeKeyFile = function() {\n $scope.formData.file = undefined;\n };\n\n /* -- modals -- */\n\n $scope.showWotLookupModal = function(searchText) {\n return Modals.showWotLookup({q: searchText})\n .then(function(res){\n if (res && res.pubkey) {\n $scope.formData.pubkey = res.pubkey;\n $scope.formData.uid = res.uid || undefined;\n return $timeout($scope.doLogin, 300);\n }\n });\n };\n\n /* -- popover -- */\n $scope.showMethodsPopover = function(event) {\n if (event.defaultPrevented) return;\n UIUtils.popover.show(event, {\n templateUrl :'templates/login/popover_methods.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.methodsPopover = popover;\n UIUtils.ink({selector: '.popover-login-methods .item'});\n }\n });\n };\n\n $scope.hideMethodsPopover = function() {\n if ($scope.methodsPopover) {\n $scope.methodsPopover.hide();\n $scope.methodsPopover = null;\n }\n };\n\n // Default action\n $scope.init();\n\n\n // TODO : for DEV only\n /*$timeout(function() {\n $scope.formData = {\n method: 'SCRYPT_DEFAULT',\n username: 'abc',\n password: 'def'\n };\n $scope.form = {$valid:true};\n\n $timeout($scope.doLogin, 500);\n }, 900); */\n}\n\n\nfunction AuthController($scope, $controller, csConfig){\n\n var config = angular.copy(csConfig);\n config.demo = false;\n config.readonly = false;\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('LoginModalCtrl', {$scope: $scope, parameters: {auth: true}, csConfig: config}));\n\n $scope.setForm = function(form) {\n $scope.form = form;\n };\n\n}\n","\nHelpController.$inject = ['$scope', '$state', '$timeout', '$anchorScroll', 'csSettings'];\nHelpModalController.$inject = ['$scope', '$timeout', '$anchorScroll', 'csSettings', 'parameters'];\nHelpTipController.$inject = ['$scope', '$state', '$window', '$ionicSideMenuDelegate', '$timeout', '$q', '$anchorScroll', 'UIUtils', 'csConfig', 'csSettings', 'csCurrency', 'csHelpConstants', 'Device', 'csWallet'];\nHelpTourController.$inject = ['$scope'];\nangular.module('cesium.help.controllers', ['cesium.services'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n\n\n .state('app.help_tour', {\n url: \"/tour\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/home/home.html\",\n controller: 'HelpTourCtrl'\n }\n }\n })\n\n .state('app.help', {\n url: \"/help?anchor\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/help/view_help.html\",\n controller: 'HelpCtrl'\n }\n }\n })\n\n .state('app.help_anchor', {\n url: \"/help/:anchor\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/help/view_help.html\",\n controller: 'HelpCtrl'\n }\n }\n })\n\n ;\n\n\n }])\n\n .controller('HelpCtrl', HelpController)\n\n .controller('HelpModalCtrl', HelpModalController)\n\n .controller('HelpTipCtrl', HelpTipController)\n\n .controller('HelpTourCtrl', HelpTourController)\n\n\n;\n\n\nfunction HelpController($scope, $state, $timeout, $anchorScroll, csSettings) {\n 'ngInject';\n\n $scope.$on('$ionicView.enter', function(e) {\n $scope.locale = csSettings.data.locale.id;\n if ($state.stateParams && $state.stateParams.anchor) {\n $scope.anchor = $state.stateParams.anchor;\n $timeout(function () {\n $anchorScroll($state.stateParams.anchor);\n }, 100);\n }\n });\n}\n\nfunction HelpModalController($scope, $timeout, $anchorScroll, csSettings, parameters) {\n 'ngInject';\n\n $scope.itemsClass = {};\n $scope.locale = csSettings.data.locale.id;\n\n parameters = parameters || {};\n if (parameters && typeof parameters == \"string\") {\n parameters = {anchor: parameters};\n }\n\n if (parameters.anchor) {\n\n $timeout(function() {\n $anchorScroll(parameters.anchor);\n }, 100);\n\n // Change CSS classes\n $scope.itemsClass = {};\n $scope.itemsClass[parameters.anchor] = 'selected';\n $scope.listClass = 'selection';\n }\n\n}\n\n\n/* ----------------------------\n* Help Tip\n* ---------------------------- */\nfunction HelpTipController($scope, $state, $window, $ionicSideMenuDelegate, $timeout, $q, $anchorScroll,\n UIUtils, csConfig, csSettings, csCurrency, csHelpConstants, Device, csWallet) {\n\n $scope.tour = false; // Is a tour or a helptip ?\n $scope.continue = true;\n\n $scope.executeStep = function(partName, steps, index) {\n index = angular.isDefined(index) ? index : 0;\n\n if (index >= steps.length) {\n return $q.when(true); // end\n }\n\n var step = steps[index];\n if (typeof step !== 'function') {\n throw new Error('[helptip] Invalid step at index {0} of \\'{1}\\' tour: step must be a function'.format(index, partName));\n }\n var promise = step();\n if (typeof promise === 'boolean') {\n promise = $q.when(promise);\n }\n return promise\n .then(function(next) {\n if (angular.isUndefined(next)) {\n $scope.continue = false;\n return index; // keep same index (no button press: popover just closed)\n }\n if (!next || index === steps.length - 1) {\n return next ? -1 : index+1; // last step OK, so mark has finished\n }\n return $scope.executeStep(partName, steps, index+1);\n })\n .catch(function(err) {\n if (err && err.message === 'transition prevented') {\n console.error('ERROR: in help tour [{0}], in step [{1}] -> use large if exists, to prevent [transition prevented] error'.format(partName, index));\n }\n else {\n console.error('ERROR: in help tour [{0}], in step [{1}] : {2}'.format(partName, index, err));\n }\n $scope.continue = false;\n return index;\n });\n };\n\n $scope.showHelpTip = function(id, options) {\n options = options || {};\n options.bindings = options.bindings || {};\n options.bindings.value =options.bindings.value || '';\n options.bindings.hasNext = angular.isDefined(options.bindings.hasNext) ? options.bindings.hasNext : true;\n options.timeout = options.timeout || (Device.enable ? 900 : 500);\n options.autoremove = true; // avoid memory leak\n options.bindings.tour = $scope.tour;\n options.backdropClickToClose = !$scope.tour;\n return UIUtils.popover.helptip(id, options);\n };\n\n $scope.showHelpModal = function(helpAnchor) {\n Modals.showHelp({anchor: helpAnchor});\n };\n\n $scope.startHelpTour = function() {\n $scope.tour = true;\n $scope.continue = true;\n\n console.debug(\"[help] Starting help tour... {demo: {0}, readonly: {1}, isLogin: {2}}\".format(\n csConfig.demo, csConfig.readonly, csWallet.isLogin()));\n\n // Wallet (if NOT readonly and NOT login)\n return ((!csConfig.readonly && csWallet.isLogin()) ? $scope.startWalletNoLoginTour(0, true) : $q.when(true))\n\n // Wallet (if login)\n .then(function(next){\n if (!next) return false;\n if (csConfig.readonly || !csWallet.isLogin()) return true; // not login or readonly: continue\n return $scope.startWalletTour(0, true)\n .then(function(endIndex){\n if (!endIndex) return false;\n csSettings.data.helptip.wallet=endIndex;\n csSettings.store();\n return $scope.continue;\n });\n })\n\n // Wallet certifications\n .then(function(next){\n if (!next) return false;\n if (csConfig.readonly || !csWallet.isLogin()) return true; // not login or readonly: continue\n return $scope.startWalletCertTour(0, true)\n .then(function(endIndex){\n if (!endIndex) return false;\n csSettings.data.helptip.walletCerts=endIndex;\n csSettings.store();\n return $scope.continue;\n });\n })\n\n // My operations (if login)\n .then(function(next){\n if (!next) return false;\n if (csConfig.readonly || !csWallet.isLogin()) return true; // not login or readonly: continue\n return $scope.startTxTour(0, true)\n .then(function(endIndex){\n if (!endIndex) return false;\n csSettings.data.helptip.tx=endIndex;\n csSettings.store();\n return $scope.continue;\n });\n })\n\n // My wallets (if login)\n .then(function(next){\n if (!next) return false;\n if (csConfig.readonly || !csWallet.isLogin()) return true; // not login or readonly: continue\n return $scope.startWalletsTour(0, true)\n .then(function(endIndex){\n if (!endIndex) return false;\n csSettings.data.helptip.wallets=endIndex;\n csSettings.store();\n return $scope.continue;\n });\n })\n\n // Header tour\n .then(function(next){\n if (!next) return false;\n if (csConfig.readonly) return true; // readonly: continue\n return $scope.startHeaderTour(0, true);\n })\n\n // Settings tour (if not readonly mode)\n .then(function(next){\n if (!next) return false;\n if (csConfig.readonly) return true; // Skip if readonly mode (will be play later)\n return $scope.startSettingsTour(0, true);\n })\n\n // Wot lookup tour\n .then(function(next){\n if (!next) return false;\n return $scope.startWotLookupTour(0, true)\n .then(function(endIndex){\n if (!endIndex || $scope.cancelled) return false;\n csSettings.data.helptip.wotLookup=endIndex;\n csSettings.store();\n return $scope.continue;\n });\n })\n\n // Wot identity\n .then(function(next){\n if (!next) return false;\n return $scope.startWotTour(0, true)\n .then(function(endIndex){\n if (!endIndex || $scope.cancelled) return false;\n csSettings.data.helptip.wot=endIndex;\n csSettings.store();\n return $scope.continue;\n });\n })\n\n // Identity certifications\n .then(function(next){\n if (!next) return false;\n return $scope.startWotCertTour(0, true)\n .then(function(endIndex){\n if (!endIndex) return false;\n csSettings.data.helptip.wotCerts=endIndex;\n csSettings.store();\n return $scope.continue;\n });\n })\n\n // Currency tour\n .then(function(next){\n if (!next) return false;\n\n return $scope.startCurrencyTour(0, true)\n .then(function(endIndex){\n if (!endIndex || $scope.cancelled) return false;\n csSettings.data.helptip.currency=endIndex;\n csSettings.store();\n return $scope.continue;\n });\n })\n\n // Network tour\n .then(function(next){\n if (!next) return false;\n return $scope.startNetworkTour(0, true)\n .then(function(endIndex){\n if (!endIndex || $scope.cancelled) return false;\n csSettings.data.helptip.network=endIndex;\n csSettings.store();\n return $scope.continue;\n });\n })\n\n // Settings tour (if readonly mode)\n .then(function(next){\n if (!next) return false;\n if (!csConfig.readonly) return true; // Skip if NOT readonly\n return $scope.startSettingsTour(0, true);\n })\n\n // Finish tour\n .then(function(next){\n if (!next) return false;\n return $scope.finishTour();\n });\n };\n\n /**\n * Features tour on currency\n * @returns {*}\n */\n $scope.startCurrencyTour = function(startIndex, hasNext) {\n\n var showWotTabIfNeed = function() {\n if ($state.is('app.currency.tab_parameters')) {\n $state.go('app.currency.tab_wot');\n }\n };\n\n var contentParams;\n\n var steps = [\n\n function(){\n $ionicSideMenuDelegate.toggleLeft(true);\n return $scope.showHelpTip('helptip-menu-btn-currency', {\n bindings: {\n content: 'HELP.TIP.MENU_BTN_CURRENCY',\n icon: {\n position: UIUtils.screen.isSmall() || csConfig.readonly ? 'left' : 'bottom-left'\n }\n }\n });\n },\n\n function () {\n if ($ionicSideMenuDelegate.isOpen()) {\n $ionicSideMenuDelegate.toggleLeft(false);\n }\n return $state.go(UIUtils.screen.isSmall() ? 'app.currency' : 'app.currency_lg')\n .then(function () {\n return $scope.showHelpTip('helptip-currency-mass-member', {\n bindings: {\n content: 'HELP.TIP.CURRENCY_MASS',\n icon: {\n position: 'center'\n }\n }\n });\n });\n },\n\n function () {\n if (!csSettings.data.useRelative) return true; //skip but continue\n return $scope.showHelpTip('helptip-currency-mass-member-unit', {\n bindings: {\n content: 'HELP.TIP.CURRENCY_UNIT_RELATIVE',\n contentParams: contentParams,\n icon: {\n position: UIUtils.screen.isSmall() ? 'right' : 'center'\n }\n }\n });\n },\n\n // function () {\n // if (!csSettings.data.useRelative) return true; //skip but continue\n // $anchorScroll('helptip-currency-change-unit');\n // return $scope.showHelpTip('helptip-currency-change-unit', {\n // bindings: {\n // content: 'HELP.TIP.CURRENCY_CHANGE_UNIT',\n // contentParams: contentParams,\n // icon: {\n // position: UIUtils.screen.isSmall() ? 'right' : undefined\n // }\n // }\n // });\n // },\n //\n // function () {\n // if (csSettings.data.useRelative) return true; //skip but continue\n // $anchorScroll('helptip-currency-change-unit');\n // return $scope.showHelpTip('helptip-currency-change-unit', {\n // bindings: {\n // content: 'HELP.TIP.CURRENCY_CHANGE_UNIT_TO_RELATIVE',\n // contentParams: contentParams,\n // icon: {\n // position: UIUtils.screen.isSmall() ? 'right' : undefined\n // }\n // }\n // });\n // },\n\n function () {\n $anchorScroll('helptip-currency-rules-anchor');\n return $scope.showHelpTip('helptip-currency-rules', {\n bindings: {\n content: 'HELP.TIP.CURRENCY_RULES',\n icon: {\n position: 'center',\n glyph: 'ion-information-circled'\n }\n }\n });\n },\n\n function () {\n showWotTabIfNeed();\n $anchorScroll('helptip-currency-newcomers-anchor');\n return $scope.showHelpTip('helptip-currency-newcomers', {\n bindings: {\n content: 'HELP.TIP.CURRENCY_WOT',\n icon: {\n position: 'center'\n },\n hasNext: hasNext\n },\n timeout: 1200, // need for Firefox\n retry: 2\n });\n }\n ];\n\n // Get currency parameters, with currentUD\n return csCurrency.get().then(function(currency) {\n contentParams = currency.parameters;\n // Launch steps\n return $scope.executeStep('currency', steps, startIndex);\n });\n };\n\n /**\n * Features tour on network\n * @returns {*}\n */\n $scope.startNetworkTour = function(startIndex, hasNext) {\n\n var showNetworkTabIfNeed = function() {\n if ($state.is('app.currency')) {\n // Select the second tabs\n $timeout(function () {\n var tabs = $window.document.querySelectorAll('ion-tabs .tabs a');\n if (tabs && tabs.length === 3) {\n angular.element(tabs[2]).triggerHandler('click');\n }\n }, 100);\n }\n };\n\n var contentParams;\n\n var steps = [\n\n function(){\n if (UIUtils.screen.isSmall()) return true; // skip but continue\n $ionicSideMenuDelegate.toggleLeft(true);\n return $scope.showHelpTip('helptip-menu-btn-network', {\n bindings: {\n content: 'HELP.TIP.MENU_BTN_NETWORK',\n icon: {\n position: UIUtils.screen.isSmall() || csConfig.readonly ? 'left' : 'bottom-left'\n }\n }\n });\n },\n\n function () {\n if ($ionicSideMenuDelegate.isOpen()) {\n $ionicSideMenuDelegate.toggleLeft(false);\n }\n return $state.go(UIUtils.screen.isSmall() ? 'app.currency.tab_network' : 'app.network')\n .then(function () {\n showNetworkTabIfNeed();\n return $scope.showHelpTip('helptip-network-peers', {\n bindings: {\n content: 'HELP.TIP.NETWORK_BLOCKCHAIN',\n icon: {\n position: 'center',\n glyph: 'ion-information-circled'\n }\n },\n timeout: 1200 // need for Firefox\n });\n });\n },\n\n function() {\n showNetworkTabIfNeed();\n return $scope.showHelpTip('helptip-network-peer-0', {\n bindings: {\n content: 'HELP.TIP.NETWORK_PEERS',\n icon: {\n position: UIUtils.screen.isSmall() ? undefined : 'center'\n }\n },\n timeout: 1000,\n retry: 20\n });\n },\n\n\n function() {\n showNetworkTabIfNeed();\n return $scope.showHelpTip('helptip-network-peer-0-block', {\n bindings: {\n content: 'HELP.TIP.NETWORK_PEERS_BLOCK_NUMBER',\n icon: {\n position: UIUtils.screen.isSmall() ? undefined : 'center'\n }\n }\n });\n },\n\n function() {\n showNetworkTabIfNeed();\n var locale = csSettings.data.locale.id;\n return $scope.showHelpTip('helptip-network-peers', {\n bindings: {\n content: 'HELP.TIP.NETWORK_PEERS_PARTICIPATE',\n contentParams: {\n installDocUrl: (csConfig.helptip && csConfig.helptip.installDocUrl) ?\n (csConfig.helptip.installDocUrl[locale] ? csConfig.helptip.installDocUrl[locale] : csConfig.helptip.installDocUrl) :\n 'http://duniter.org'\n },\n icon: {\n position: 'center',\n glyph: 'ion-information-circled'\n },\n hasNext: hasNext\n }\n });\n }\n ];\n\n // Get currency parameters, with currentUD\n return csCurrency.parameters().then(function(parameters) {\n contentParams = parameters;\n // Launch steps\n return $scope.executeStep('network', steps, startIndex);\n });\n };\n\n /**\n * Features tour on WOT lookup\n * @returns {*}\n */\n $scope.startWotLookupTour = function(startIndex, hasNext) {\n\n var steps = [\n function() {\n $ionicSideMenuDelegate.toggleLeft(true);\n return $scope.showHelpTip('helptip-menu-btn-wot', {\n bindings: {\n content: 'HELP.TIP.MENU_BTN_WOT',\n icon: {\n position: UIUtils.screen.isSmall() || csConfig.readonly ? 'left' : 'bottom-left'\n }\n },\n onError: 'continue'\n });\n },\n\n function() {\n if ($ionicSideMenuDelegate.isOpen()) {\n $ionicSideMenuDelegate.toggleLeft(false);\n }\n return $state.go(UIUtils.screen.isSmall() ? 'app.wot_lookup.tab_search' : 'app.wot_lookup_lg')\n .then(function(){\n return $scope.showHelpTip('helptip-wot-search-text', {\n bindings: {\n content: UIUtils.screen.isSmall() ? 'HELP.TIP.WOT_SEARCH_TEXT_XS' : 'HELP.TIP.WOT_SEARCH_TEXT',\n icon: {\n position: 'center'\n }\n }\n });\n });\n },\n\n function() {\n return $scope.showHelpTip('helptip-wot-search-result-0', {\n bindings: {\n content: 'HELP.TIP.WOT_SEARCH_RESULT',\n icon: {\n position: 'center'\n }\n },\n timeout: 700,\n retry: 15\n });\n },\n\n function() {\n var element = $window.document.getElementById('helptip-wot-search-result-0');\n if (!element) return true;\n $timeout(function() {\n angular.element(element).triggerHandler('click');\n });\n return $scope.showHelpTip('helptip-wot-view-certifications', {\n bindings: {\n content: 'HELP.TIP.WOT_VIEW_CERTIFICATIONS',\n hasNext: hasNext\n },\n timeout: 2500\n });\n }\n ];\n\n // Launch steps\n return $scope.executeStep('wotLookup', steps, startIndex);\n };\n\n /**\n * Features tour on WOT identity\n * @returns {*}\n */\n $scope.startWotTour = function(startIndex, hasNext) {\n var contentParams;\n\n var steps = [\n function() {\n return $scope.showHelpTip('helptip-wot-view-certifications', {\n bindings: {\n content: 'HELP.TIP.WOT_VIEW_CERTIFICATIONS_COUNT',\n contentParams: contentParams,\n icon: {\n position: 'center',\n glyph: 'ion-information-circled'\n }\n }\n });\n },\n\n function() {\n return $scope.showHelpTip('helptip-wot-view-certifications-count', {\n bindings: {\n content: 'HELP.TIP.WOT_VIEW_CERTIFICATIONS_CLICK',\n icon: {\n position: 'center'\n },\n hasNext: hasNext\n }\n });\n }\n ];\n\n // Get currency parameters, with currentUD\n return csCurrency.get().then(function(currency) {\n contentParams = currency.parameters;\n contentParams.currentUD = currency.currentUD;\n // Launch steps\n return $scope.executeStep('wot', steps, startIndex);\n });\n };\n\n /**\n * Features tour on wot certifications\n * @returns {*}\n */\n $scope.startWotCertTour = function(startIndex, hasNext) {\n if (csConfig.readonly) return $q.when(true);\n\n var steps = [\n\n function() {\n // If on identity: click on certifications\n if ($state.is('app.wot_identity')) {\n var element = $window.document.getElementById('helptip-wot-view-certifications');\n if (!element) return true;\n $timeout(function() {\n angular.element(element).triggerHandler('click');\n });\n }\n return $scope.showHelpTip(UIUtils.screen.isSmall() ? 'fab-certify': 'helptip-certs-certify', {\n bindings: {\n content: 'HELP.TIP.WOT_VIEW_CERTIFY',\n icon: {\n position: UIUtils.screen.isSmall() ? 'bottom-right' : 'center'\n }\n },\n timeout: UIUtils.screen.isSmall() ? 2000 : 1000,\n retry: 10\n });\n },\n\n function() {\n return $scope.showHelpTip(UIUtils.screen.isSmall() ? 'fab-certify': 'helptip-certs-certify', {\n bindings: {\n content: 'HELP.TIP.CERTIFY_RULES',\n icon: {\n position: 'center',\n glyph: 'ion-alert-circled'\n },\n hasNext: hasNext\n }\n });\n }\n ];\n\n return $scope.executeStep('certs', steps, startIndex);\n };\n\n /**\n * Features tour on wallet (if not login)\n * @returns {*}\n */\n $scope.startWalletNoLoginTour = function(startIndex, hasNext) {\n if (csWallet.isLogin()) return $q.when(true); // skip if login\n\n var steps = [\n function () {\n $ionicSideMenuDelegate.toggleLeft(true);\n return $scope.showHelpTip('helptip-menu-btn-account', {\n bindings: {\n content: 'HELP.TIP.MENU_BTN_ACCOUNT',\n icon: {\n position: 'left'\n },\n hasNext: hasNext\n }\n });\n },\n\n function () {\n $ionicSideMenuDelegate.toggleLeft(true);\n return $scope.showHelpTip('helptip-menu-btn-tx', {\n bindings: {\n content: 'HELP.TIP.MENU_BTN_TX',\n icon: {\n position: 'left'\n },\n hasNext: hasNext\n }\n });\n },\n\n function () {\n $ionicSideMenuDelegate.toggleLeft(true);\n return $scope.showHelpTip('helptip-menu-btn-wallets', {\n bindings: {\n content: 'HELP.TIP.MENU_BTN_WALLETS',\n icon: {\n position: 'left'\n },\n hasNext: hasNext\n }\n });\n }\n ];\n\n return $scope.executeStep('wallet-no-login', steps, startIndex);\n };\n\n /**\n * Features tour on wallet screens\n * @returns {*}\n */\n $scope.startWalletTour = function(startIndex, hasNext) {\n if (!csWallet.isLogin()) return $q.when(true); // skip if not login\n\n var hasCertificationsItem = csWallet.data.isMember||(csWallet.data.requirements && csWallet.data.requirements.pendingMembership);\n var contentParams;\n\n var steps = [\n function () {\n $ionicSideMenuDelegate.toggleLeft(true);\n return $scope.showHelpTip('helptip-menu-btn-account', {\n bindings: {\n content: csWallet.data.isMember ? 'HELP.TIP.MENU_BTN_ACCOUNT_MEMBER' : 'HELP.TIP.MENU_BTN_ACCOUNT',\n icon: {\n position: 'left'\n }\n }\n });\n },\n\n function () {\n if ($ionicSideMenuDelegate.isOpen()) {\n $ionicSideMenuDelegate.toggleLeft(false);\n }\n\n // Go to wallet\n return $state.go('app.view_wallet')\n .then(function () {\n return $scope.showHelpTip(UIUtils.screen.isSmall() ? 'helptip-wallet-options-xs' : 'helptip-wallet-options', {\n bindings: {\n content: 'HELP.TIP.WALLET_OPTIONS',\n icon: {\n position: UIUtils.screen.isSmall() ? 'right' : 'center'\n }\n },\n timeout: UIUtils.screen.isSmall() ? 2000 : 1000,\n retry: 10\n });\n });\n },\n\n // Wallet pubkey\n function () {\n $anchorScroll('helptip-wallet-pubkey');\n return $scope.showHelpTip('helptip-wallet-pubkey', {\n bindings: {\n content: 'HELP.TIP.WALLET_PUBKEY',\n icon: {\n position: 'center'\n },\n hasNext: !hasCertificationsItem && hasNext\n },\n timeout: UIUtils.screen.isSmall() ? 2000 : 500,\n retry: 10\n });\n },\n\n function () {\n if (!hasCertificationsItem) return hasNext;\n $anchorScroll('helptip-wallet-certifications');\n return $scope.showHelpTip('helptip-wallet-certifications', {\n bindings: {\n content: UIUtils.screen.isSmall() ? 'HELP.TIP.WALLET_RECEIVED_CERTIFICATIONS': 'HELP.TIP.WALLET_CERTIFICATIONS',\n icon: {\n position: 'center'\n },\n hasNext: hasNext\n },\n timeout: 500,\n onError: 'continue' // if simple wallet: no certification item, so continue\n });\n }\n ];\n\n // Check that constants are well configured\n if (steps.length != csHelpConstants.wallet.stepCount) {\n console.error(\"[help] Invalid value of 'csHelpConstants.wallet.stepCount'. Please update to {0}\".format(steps.length));\n }\n\n // Get currency parameters, with currentUD\n return csCurrency.get()\n .then(function(currency) {\n contentParams = currency.parameters;\n contentParams.currentUD = currency.currentUD;\n // Launch steps\n return $scope.executeStep('wallet', steps, startIndex);\n });\n };\n\n /**\n * Features tour on wallet certifications\n * @returns {*}\n */\n $scope.startWalletCertTour = function(startIndex, hasNext) {\n if (!csWallet.isLogin()) return $q.when(true);\n\n var contentParams;\n var skipAll = false;\n\n var steps = [\n\n function() {\n // If on wallet : click on certifications\n if ($state.is('app.view_wallet')) {\n var element = $window.document.getElementById('helptip-wallet-certifications');\n if (!element) {\n skipAll = true;\n return true;\n }\n $timeout(function() {\n angular.element(element).triggerHandler('click');\n });\n }\n if (!UIUtils.screen.isSmall()) return true; // skip this helptip if not in tabs mode\n return $scope.showHelpTip('helptip-received-certs', {\n bindings: {\n content: 'HELP.TIP.WALLET_RECEIVED_CERTS'\n }\n });\n },\n\n function() {\n if (skipAll || !UIUtils.screen.isSmall()) return true;\n return $state.go('app.view_wallet') // go back to wallet (small device only)\n .then(function() {\n return $scope.showHelpTip('helptip-wallet-given-certifications', {\n bindings: {\n content: 'HELP.TIP.WALLET_GIVEN_CERTIFICATIONS',\n icon: {\n position: 'center'\n }\n },\n timeout: 500\n });\n });\n },\n\n function() {\n if (skipAll) return true;\n\n // Click on given cert link (small device only)\n if ($state.is('app.view_wallet')) {\n var element = $window.document.getElementById('helptip-wallet-given-certifications');\n if (!element) {\n skipAll = true;\n return true;\n }\n $timeout(function() {\n angular.element(element).triggerHandler('click');\n }, 500);\n }\n return $scope.showHelpTip(UIUtils.screen.isSmall() ? 'fab-select-certify': 'helptip-certs-select-certify', {\n bindings: {\n content: 'HELP.TIP.WALLET_CERTIFY',\n icon: {\n position: UIUtils.screen.isSmall() ? 'bottom-right' : 'center'\n }\n },\n timeout: UIUtils.screen.isSmall() ? 2000 : 500,\n retry: 10\n });\n },\n\n function() {\n if ($scope.tour || skipAll) return hasNext; // skip Rules if features tour (already display)\n return $scope.showHelpTip('helptip-certs-stock', {\n bindings: {\n content: 'HELP.TIP.CERTIFY_RULES',\n icon: {\n position: 'center',\n glyph: 'ion-alert-circled'\n },\n hasNext: hasNext\n }\n });\n }\n\n /* FIXME : how to select the left tab ?\n ,function() {\n return $scope.showHelpTip('helptip-certs-stock', {\n bindings: {\n content: 'HELP.TIP.WALLET_CERT_STOCK',\n contentParams: contentParams,\n icon: {\n position: 'center'\n },\n hasNext: hasNext\n }\n });\n }*/\n ];\n\n return csCurrency.parameters().then(function(parameters) {\n contentParams = parameters;\n return $scope.executeStep('certs', steps, startIndex);\n });\n };\n\n /**\n * Features tour on TX screen\n * @returns {*}\n */\n $scope.startTxTour = function(startIndex, hasNext) {\n if (!csWallet.isLogin()) return $q.when(true); // skip if not login\n\n var contentParams;\n\n var steps = [\n function () {\n $ionicSideMenuDelegate.toggleLeft(true);\n return $scope.showHelpTip('helptip-menu-btn-tx', {\n bindings: {\n content: 'HELP.TIP.MENU_BTN_TX',\n icon: {\n position: 'left'\n }\n }\n });\n },\n\n function () {\n if ($ionicSideMenuDelegate.isOpen()) {\n $ionicSideMenuDelegate.toggleLeft(false);\n }\n\n // Go to wallet\n return $state.go('app.view_wallet_tx')\n .then(function () {\n return $scope.showHelpTip('helptip-wallet-balance', {\n bindings: {\n content: csSettings.data.useRelative ? 'HELP.TIP.WALLET_BALANCE_RELATIVE' : 'HELP.TIP.WALLET_BALANCE',\n contentParams: contentParams,\n icon: {\n position: 'center'\n }\n },\n retry: 20 // 10 * 500 = 5s max\n });\n });\n },\n\n function () {\n return $scope.showHelpTip('helptip-wallet-balance', {\n bindings: {\n content: 'HELP.TIP.WALLET_BALANCE_CHANGE_UNIT',\n contentParams: contentParams,\n icon: {\n position: 'center',\n glyph: 'ion-information-circled'\n }\n }\n });\n }\n ];\n\n // Get currency parameters, with currentUD\n return csCurrency.get()\n .then(function(currency) {\n contentParams = currency.parameters;\n contentParams.currentUD = currency.currentUD;\n // Launch steps\n return $scope.executeStep('tx', steps, startIndex);\n });\n };\n\n /**\n * Features tour on My wallets\n * @returns {*}\n */\n $scope.startWalletsTour = function(startIndex, hasNext) {\n\n var steps = [\n function () {\n $ionicSideMenuDelegate.toggleLeft(true);\n return $scope.showHelpTip('helptip-menu-btn-wallets', {\n bindings: {\n content: 'HELP.TIP.MENU_BTN_WALLETS',\n icon: {\n position: 'left'\n },\n hasNext: hasNext\n }\n });\n }\n ];\n\n return $scope.executeStep('my-wallets', steps, startIndex);\n };\n\n /**\n * header tour\n * @returns {*}\n */\n $scope.startHeaderTour = function(startIndex, hasNext) {\n if (UIUtils.screen.isSmall() || csConfig.readonly) return $q.when(true);\n\n function _getProfilBtnElement() {\n var elements = $window.document.querySelectorAll('#helptip-header-bar-btn-profile');\n if (!elements || !elements.length) return null;\n return _.find(elements, function(el) {return el.offsetWidth > 0;});\n }\n\n var steps = [\n function () {\n\n if (UIUtils.screen.isSmall()) return true; // skip for small screen\n var element = _getProfilBtnElement();\n if (!element) return true;\n\n return $scope.showHelpTip(element, {\n bindings: {\n content: 'HELP.TIP.HEADER_BAR_BTN_PROFILE',\n icon: {\n position: 'right',\n // If home; add offset because of locales button\n style: $state.is('app.home') ? 'margin-right: 60px' : undefined\n }\n }\n });\n },\n\n function () {\n // small screens\n if (UIUtils.screen.isSmall()) {\n $ionicSideMenuDelegate.toggleLeft(true);\n return $scope.showHelpTip('helptip-menu-btn-settings', {\n bindings: {\n content: 'HELP.TIP.MENU_BTN_SETTINGS',\n icon: {\n position: 'left'\n },\n hasNext: hasNext\n },\n timeout: 1000\n });\n }\n // wide screens\n else {\n var element = _getProfilBtnElement();\n if (!element) return true;\n $timeout(function() {\n angular.element(element).triggerHandler('click');\n });\n return $scope.showHelpTip('helptip-popover-profile-btn-settings', {\n bindings: {\n content: 'HELP.TIP.MENU_BTN_SETTINGS',\n icon: {\n position: 'center'\n },\n hasNext: hasNext\n },\n timeout: 1000\n })\n .then(function(res) {\n // close profile popover\n $scope.closeProfilePopover();\n return res;\n });\n }\n }\n ];\n\n return $scope.executeStep('header', steps, startIndex);\n };\n\n /**\n * Settings tour\n * @returns {*}\n */\n $scope.startSettingsTour = function(startIndex, hasNext) {\n var contentParams;\n var steps = [\n\n function () {\n if (!UIUtils.screen.isSmall() && !csConfig.readonly) return true;\n $ionicSideMenuDelegate.toggleLeft(true);\n return $scope.showHelpTip(UIUtils.screen.isSmall() ? 'helptip-menu-btn-settings' : 'menu-btn-settings', {\n bindings: {\n content: 'HELP.TIP.MENU_BTN_SETTINGS',\n icon: {\n position: UIUtils.screen.isSmall() ? 'left' : 'bottom-left'\n }\n },\n timeout: 1000\n });\n },\n\n function () {\n if ($ionicSideMenuDelegate.isOpen()) {\n $ionicSideMenuDelegate.toggleLeft(false);\n }\n\n // Go to settings\n return $state.go('app.settings')\n .then(function () {\n return $scope.showHelpTip('helptip-settings-btn-unit-relative', {\n bindings: {\n content: 'HELP.TIP.SETTINGS_CHANGE_UNIT',\n contentParams: contentParams,\n icon: UIUtils.screen.isSmall() ? {\n position: 'right',\n style: 'margin-right: 60px'\n } : {position: 'center'},\n hasNext: hasNext\n },\n timeout: 1000\n });\n });\n }\n ];\n\n return csCurrency.parameters()\n .then(function(parameters) {\n contentParams = parameters;\n return $scope.executeStep('settings', steps, startIndex);\n });\n };\n\n\n /**\n * Finish the features tour (last step)\n * @returns {*}\n */\n $scope.finishTour = function() {\n if ($ionicSideMenuDelegate.isOpen()) {\n $ionicSideMenuDelegate.toggleLeft(false);\n }\n\n // If login: redirect to wallet\n if (csWallet.isLogin()) {\n return $state.go('app.view_wallet')\n .then(function(){\n return $scope.showHelpTip('helptip-wallet-pubkey', {\n bindings: {\n content: 'HELP.TIP.END_LOGIN',\n hasNext: false\n },\n timeout: 1200\n });\n });\n }\n\n // If not login: redirect to home\n else {\n var contentParams;\n return $q.all([\n $scope.showHome(),\n\n csCurrency.parameters()\n .then(function(parameters) {\n contentParams = parameters;\n })\n ])\n .then(function(){\n return $scope.showHelpTip('helptip-home-logo', {\n bindings: {\n content: !csConfig.readonly ? 'HELP.TIP.END_NOT_LOGIN' : 'HELP.TIP.END_READONLY',\n contentParams: contentParams,\n hasNext: false\n }\n });\n });\n }\n };\n}\n\n/* ----------------------------\n * Help tour (auto start from home page)\n * ---------------------------- */\nfunction HelpTourController($scope) {\n\n $scope.$on('$ionicView.enter', function(e, state) {\n $scope.startHelpTour();\n });\n\n}\n","\nWalletController.$inject = ['$scope', '$rootScope', '$q', '$ionicPopup', '$timeout', '$state', '$translate', '$ionicPopover', '$location', 'UIUtils', 'ModalUtils', 'Modals', 'csPopovers', 'BMA', 'csConfig', 'csSettings', 'csWallet', 'csHelp'];\nWalletTxController.$inject = ['$scope', '$ionicPopover', '$state', '$timeout', '$location', 'UIUtils', 'Modals', 'csPopovers', 'BMA', 'csHttp', 'csSettings', 'csCurrency', 'csWallet', 'csTx'];\nWalletTxErrorController.$inject = ['$scope', 'UIUtils', 'csSettings', 'csWallet'];\nWalletSecurityModalController.$inject = ['$scope', 'UIUtils', 'csConfig', 'csWallet', '$translate', 'parameters'];angular.module('cesium.wallet.controllers', ['cesium.services', 'cesium.currency.controllers'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n $stateProvider\n\n\n .state('app.view_wallet', {\n url: \"/account?refresh\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wallet/view_wallet.html\",\n controller: 'WalletCtrl'\n }\n },\n data: {\n login: true,\n silentLocationChange: true\n }\n })\n\n .state('app.view_wallet_tx', {\n url: \"/history/account?refresh\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wallet/view_wallet_tx.html\",\n controller: 'WalletTxCtrl'\n }\n },\n data: {\n login: true,\n silentLocationChange: true\n }\n })\n\n .state('app.view_wallet_tx_errors', {\n url: \"/history/account/errors\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wallet/view_wallet_tx_error.html\",\n controller: 'WalletTxErrorCtrl'\n }\n },\n data: {\n login: true\n }\n })\n ;\n }])\n\n .controller('WalletCtrl', WalletController)\n\n .controller('WalletTxCtrl', WalletTxController)\n\n .controller('WalletTxErrorCtrl', WalletTxErrorController)\n\n .controller('WalletSecurityModalCtrl', WalletSecurityModalController)\n;\n\nfunction WalletController($scope, $rootScope, $q, $ionicPopup, $timeout, $state, $translate, $ionicPopover, $location,\n UIUtils, ModalUtils, Modals, csPopovers, BMA, csConfig, csSettings, csWallet, csHelp) {\n 'ngInject';\n\n $scope.loading = true;\n $scope.settings = csSettings.data;\n $scope.qrcodeId = 'qrcode-wallet-' + $scope.$id;\n $scope.toggleQRCode = false;\n $scope.likeData = {\n likes: {},\n abuses: {}\n };\n\n var wallet;\n\n $scope.enter = function(e, state) {\n $scope.loading = $scope.loading || (state.stateParams && state.stateParams.refresh);\n $scope.enableSelectWallet = csWallet.children.count() > 0;\n if ($scope.loading) { // load once\n wallet = (state.stateParams && state.stateParams.id) ? csWallet.children.get(state.stateParams.id) : csWallet;\n if (!wallet) {\n UIUtils.alert.error('ERROR.UNKNOWN_WALLET_ID');\n return $scope.showHome();\n }\n\n $scope.isDefaultWallet = wallet.isDefault();\n $scope.walletId = wallet.id;\n\n $scope.cleanLocationHref(state);\n\n return $scope.load();\n }\n else {\n // update view (to refresh avatar + plugin data, such as profile, subscriptions...)\n UIUtils.loading.hide(10);\n $timeout($scope.updateView, 300);\n }\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.load = function() {\n if (!wallet) return;\n\n return wallet.login()\n .then(function(walletData) {\n $scope.formData = walletData;\n $scope.loading=false; // very important, to avoid TX to be display before wallet.currentUd is loaded\n $scope.updateView();\n $scope.addListeners();\n\n $scope.showQRCode();\n if (wallet.isDefault()) $scope.showHelpTip();\n\n UIUtils.loading.hide(10); // loading could have be open (e.g. new account)\n })\n .catch(function(err){\n if (err === 'CANCELLED') {\n $scope.showHome();\n return;\n }\n UIUtils.onError('ERROR.LOAD_WALLET_DATA_ERROR')(err);\n });\n };\n\n $scope.updateView = function() {\n $scope.motion.show({selector: '#wallet .item'});\n $scope.$broadcast('$$rebind::rebind'); // force rebind\n };\n\n\n $scope.setRegisterForm = function(registerForm) {\n $scope.registerForm = registerForm;\n };\n\n // Clean controller data when logout\n $scope.onWalletLogout = function() {\n // clean QRcode\n $scope.hideQRCode();\n $scope.removeListeners();\n delete $scope.formData;\n wallet = null;\n $scope.loading = true;\n };\n\n $scope.addListeners = function() {\n $scope.listeners = [\n // Reset the view on logout\n wallet.api.data.on.logout($scope, $scope.onWalletLogout),\n\n // Listen new events (can appears from security wizard also)\n $scope.$watchCollection('formData.events', function(newEvents, oldEvents) {\n if (!oldEvents || $scope.loading || angular.equals(newEvents, oldEvents)) return;\n $scope.updateView();\n })\n ];\n };\n\n $scope.removeListeners = function() {\n _.forEach($scope.listeners, function(remove){\n remove();\n });\n $scope.listeners = [];\n };\n\n // Ask uid\n $scope.showUidPopup = function() {\n return $q(function(resolve, reject) {\n $translate(['ACCOUNT.NEW.TITLE', 'ACCOUNT.POPUP_REGISTER.TITLE', 'ACCOUNT.POPUP_REGISTER.HELP', 'COMMON.BTN_OK', 'COMMON.BTN_CANCEL'])\n .then(function (translations) {\n $scope.formData.newUid = (!!$scope.formData.uid ? ''+$scope.formData.uid : '');\n\n // Choose UID popup\n $ionicPopup.show({\n templateUrl: 'templates/wallet/popup_register.html',\n title: translations['ACCOUNT.POPUP_REGISTER.TITLE'],\n subTitle: translations['ACCOUNT.POPUP_REGISTER.HELP'],\n scope: $scope,\n buttons: [\n { text: translations['COMMON.BTN_CANCEL'] },\n {\n text: translations['COMMON.BTN_OK'],\n type: 'button-positive',\n onTap: function(e) {\n $scope.registerForm.$submitted=true;\n if(!$scope.registerForm.$valid || !$scope.formData.newUid) {\n //don't allow the user to close unless he enters a uid\n e.preventDefault();\n } else {\n return $scope.formData.newUid;\n }\n }\n }\n ]\n })\n .then(function(uid) {\n if (!uid) { // user cancel\n delete $scope.formData.uid;\n UIUtils.loading.hide();\n reject('CANCELLED');\n return;\n }\n resolve(uid);\n });\n });\n });\n };\n\n // Send self identity\n $scope.self = function() {\n $scope.hideActionsPopover();\n\n return $scope.showUidPopup()\n .then(function(uid) {\n if (!uid) return;\n\n UIUtils.loading.show();\n\n return wallet.self(uid)\n .then(function() {\n $scope.updateView();\n UIUtils.loading.hide();\n })\n .catch(function(err){\n UIUtils.onError('ERROR.SEND_IDENTITY_FAILED')(err)\n .then(function() {\n $scope.self(); // loop\n });\n });\n });\n };\n\n $scope.doMembershipIn = function(retryCount) {\n return wallet.membership.inside()\n .then(function() {\n $scope.updateView();\n UIUtils.loading.hide();\n })\n .catch(function(err) {\n if (err === 'CANCELLED') throw err;\n if (err && err.ucode != BMA.errorCodes.MEMBERSHIP_ALREADY_SEND) {\n console.error(\"[wallet] Node: already membership\", err);\n UIUtils.loading.hide();\n return; // OK\n }\n if (!retryCount || retryCount <= 2) {\n return $timeout(function() {\n return $scope.doMembershipIn((retryCount||0) + 1);\n }, 1000);\n }\n throw err;\n });\n };\n\n\n // Send membership IN\n $scope.membershipIn = function(keepSelf) {\n $scope.hideActionsPopover();\n\n if (wallet.isMember()) {\n return UIUtils.alert.info(\"INFO.NOT_NEED_MEMBERSHIP\");\n }\n\n var uid = angular.isDefined($scope.formData.blockUid) && $scope.formData.uid || undefined;\n\n // Approve the license\n return Modals.showJoinMember({\n uid : uid,\n blockUid: uid && $scope.formData.blockUid,\n pubkey: $scope.formData.pubkey\n })\n .catch(function(err) {\n if (err === 'CANCELLED') return;\n if (!wallet.data.uid) {\n UIUtils.onError('ERROR.SEND_IDENTITY_FAILED')(err);\n }\n else {\n UIUtils.onError('ERROR.SEND_MEMBERSHIP_IN_FAILED')(err);\n }\n });\n };\n\n // Send membership OUT\n $scope.membershipOut = function(confirm, confirmAgain) {\n $scope.hideActionsPopover();\n\n // Ask user confirmation\n if (!confirm) {\n return UIUtils.alert.confirm('CONFIRM.MEMBERSHIP_OUT', 'CONFIRM.POPUP_WARNING_TITLE', {\n cssClass: 'warning',\n okText: 'COMMON.BTN_YES',\n okType: 'button-assertive'\n })\n .then(function(confirm) {\n if (confirm) $scope.membershipOut(true); // loop with confirmation\n });\n }\n\n if (!confirmAgain) {\n return UIUtils.alert.confirm(\"CONFIRM.MEMBERSHIP_OUT_2\", 'CONFIRM.POPUP_TITLE', {\n cssClass: 'warning',\n okText: 'COMMON.BTN_YES',\n okType: 'button-assertive'\n })\n .then(function (confirm) {\n if (confirm) $scope.membershipOut(true, true); // loop with all confirmations\n });\n }\n\n UIUtils.loading.show();\n return wallet.membership.out()\n .then(function() {\n UIUtils.loading.hide();\n UIUtils.toast.show('INFO.MEMBERSHIP_OUT_SENT');\n })\n .catch(UIUtils.onError('ERROR.SEND_MEMBERSHIP_OUT_FAILED'));\n };\n\n // Updating wallet data\n $scope.doUpdate = function(silent) {\n console.debug('[wallet] Refreshing data...');\n return (silent ?\n wallet.refreshData() :\n UIUtils.loading.show()\n .then(wallet.refreshData)\n .then(UIUtils.loading.hide)\n )\n .then($scope.updateView)\n .catch(UIUtils.onError('ERROR.REFRESH_WALLET_DATA'));\n };\n\n /**\n * Renew membership\n */\n $scope.renewMembership = function(confirm) {\n\n // Make sure user is (or was) a member\n if (!wallet.isMember() && !$scope.formData.requirements.wasMember) {\n return UIUtils.alert.error(\"ERROR.ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION\");\n }\n\n // If renew is not need, ask confirmation\n if (!confirm && !$scope.formData.requirements.needRenew) {\n return $translate(\"CONFIRM.NOT_NEED_RENEW_MEMBERSHIP\", {membershipExpiresIn: $scope.formData.requirements.membershipExpiresIn})\n .then(function(message) {\n return UIUtils.alert.confirm(message);\n })\n .then(function(confirm) {\n if (confirm) {\n // loop with confirm\n return $scope.renewMembership(true);\n }\n });\n }\n\n return wallet.auth({minData: true}) // Ask user to auth, before confirmation - fix #508\n .then(function() {\n UIUtils.loading.hide();\n return UIUtils.alert.confirm(\"CONFIRM.RENEW_MEMBERSHIP\");\n })\n .then(function(confirm) {\n if (confirm) {\n UIUtils.loading.show();\n return $scope.doMembershipIn();\n }\n })\n .catch(function(err){\n if (err === 'CANCELLED') return;\n UIUtils.loading.hide();\n UIUtils.alert.error(err);\n });\n };\n\n\n /**\n * Fix identity (e.g. when identity expired)\n */\n $scope.fixIdentity = function() {\n if (!$scope.formData.uid) return;\n\n return $q.all([\n wallet.auth(),\n $translate('CONFIRM.FIX_IDENTITY', {uid: $scope.formData.uid})\n ])\n .then(function(res) {\n return UIUtils.alert.confirm(res[1]);\n })\n .then(function(confirm) {\n if (!confirm) return;\n UIUtils.loading.show();\n // Reset self data\n $scope.formData.blockUid = null;\n // Reset membership data\n $scope.formData.sigDate = null;\n return wallet.self($scope.formData.uid);\n })\n .then($scope.doMembershipIn)\n .catch(function(err){\n if (err === 'CANCELLED') return;\n UIUtils.loading.hide();\n UIUtils.alert.error(err);\n });\n };\n\n /**\n * Fix membership, when existing MS reference an invalid block\n */\n $scope.fixMembership = function() {\n if (!$scope.formData.uid) return;\n\n if (wallet.isMember()) {\n return UIUtils.alert.info(\"INFO.NOT_NEED_MEMBERSHIP\");\n }\n\n $scope.hideActionsPopover();\n\n return wallet.auth({silent: true})\n .then(function() {\n UIUtils.alert.confirm(\"CONFIRM.FIX_MEMBERSHIP\");\n })\n .then(function(confirm) {\n if (!confirm) return;\n UIUtils.loading.show();\n // Reset self data\n $scope.formData.blockUid = null;\n // Reset membership data\n $scope.formData.sigDate = null;\n return wallet.self($scope.formData.uid, false/*do NOT load membership here*/);\n })\n .then($scope.doMembershipIn)\n .catch(function(err){\n if (err === 'CANCELLED') return;\n UIUtils.loading.hide();\n UIUtils.alert.error(err);\n });\n };\n\n /**\n * Catch click for quick fix\n * @param fix\n */\n $scope.doQuickFix = function(event) {\n if (event === 'renew') {\n $scope.renewMembership();\n }\n else if (event === 'membership') {\n $scope.membershipIn(true/*keep self*/);\n }\n else if (event === 'fixMembership') {\n $scope.fixMembership(false);\n }\n else if (event === 'fixIdentity') {\n $scope.fixIdentity();\n }\n };\n\n /* -- UI actions -- */\n\n var inheritedLogout = $scope.logout;\n $scope.logout = function(options) {\n if ($scope.isDefaultWallet) {\n return inheritedLogout(options);\n }\n };\n\n $scope.startWalletTour = function() {\n $scope.hideActionsPopover();\n return csHelp.wallet.tour();\n };\n\n $scope.showHelpTip = function() {\n return csHelp.wallet.helptip();\n };\n\n $scope.showQRCode = function(timeout) {\n if (!wallet || !$scope.qrcodeId) return; // Skip\n\n // Get the DIV element\n var element = angular.element(document.querySelector('#' + $scope.qrcodeId + ' .content'));\n if (!element) {\n console.error(\"[wallet-controller] Cannot found div #{0} for the QRCode. Skipping.\".format($scope.qrcodeId));\n return;\n }\n\n wallet.loadQrCode()\n .then(function(svg) {\n element.html(svg);\n UIUtils.motion.toggleOn({selector: '#'+$scope.qrcodeId}, timeout || 1100);\n });\n };\n\n $scope.hideQRCode = function() {\n if (!$scope.qrcodeId) return;\n var element = angular.element(document.querySelector('#' + $scope.qrcodeId));\n if (element) {\n UIUtils.motion.toggleOff({selector: '#'+$scope.qrcodeId});\n }\n };\n\n $scope.showCertifications = function() {\n // Warn: do not use a simple link here (a ng-click is mandatory for help tour)\n if ($scope.isDefaultWallet) {\n $state.go(UIUtils.screen.isSmall() ? 'app.wallet_cert' : 'app.wallet_cert_lg', {\n type: 'received'\n });\n }\n else {\n $state.go(UIUtils.screen.isSmall() ? 'app.wallet_cert_by_id' : 'app.wallet_cert_lg_by_id', {\n id: $scope.walletId,\n type: 'received'\n });\n }\n };\n\n $scope.showGivenCertifications = function() {\n // Warn: do not use a simple link here (a ng-click is mandatory for help tour)\n if ($scope.isDefaultWallet) {\n $state.go(UIUtils.screen.isSmall() ? 'app.wallet_cert' : 'app.wallet_cert_lg', {\n type: 'given'\n });\n }\n else {\n $state.go(UIUtils.screen.isSmall() ? 'app.wallet_cert_by_id' : 'app.wallet_cert_lg_by_id', {\n id: $scope.walletId,\n type: 'given'\n });\n }\n };\n\n $scope.showTxHistory = function() {\n $state.go($scope.isDefaultWallet ? 'app.view_wallet_tx' : 'app.view_wallet_tx_by_id', {\n id: $scope.walletId\n });\n };\n\n $scope.showLicenseModal = function() {\n return ModalUtils.show('templates/currency/modal_license.html','CurrencyLicenseModalCtrl');\n };\n\n /* -- modals -- */\n\n // Transfer\n $scope.showTransferModal = function() {\n var hasCredit = (!!$scope.formData.balance && $scope.formData.balance > 0);\n if (!hasCredit && !csWallet.children.count()) {\n UIUtils.alert.info('INFO.NOT_ENOUGH_CREDIT');\n return;\n }\n return Modals.showTransfer({wallet: wallet.id})\n .then(function(done){\n if (done) {\n UIUtils.toast.show('INFO.TRANSFER_SENT');\n $scope.$broadcast('$$rebind::balance'); // force rebind balance\n $scope.motion.show({selector: '.item-pending'});\n }\n });\n };\n\n $scope.showSecurityModal = function(){\n $scope.hideActionsPopover();\n return Modals.showAccountSecurity({wallet: wallet})\n .then(function(res) {\n if (!res) return;\n\n if (res === 'self') {\n return $scope.self();\n }\n else if (res === 'membershipIn') {\n return $scope.membershipIn();\n }\n });\n };\n\n $scope.showSelectIdentitiesModal = function(){\n $scope.hideActionsPopover();\n\n return Modals.showSelectPubkeyIdentity({\n identities: [$scope.formData.requirements].concat($scope.formData.requirements.alternatives)\n })\n .then(function(idty) {\n if (!idty || !idty.uid) return;\n\n $scope.loading = true;\n\n // Set self (= uid + blockUid)\n return wallet.setSelf(idty.uid, idty.blockUid)\n .then(function() {\n $scope.loading=false;\n $scope.updateView();\n UIUtils.loading.hide();\n });\n });\n };\n\n $scope.showSelectWalletModal = function() {\n if (!csWallet.children.count()) return;\n\n return Modals.showSelectWallet({\n parameters: {\n showDefault: true,\n showBalance: false,\n excludedWalletId: $scope.walletId\n }\n })\n .then(function(newWallet) {\n if (!newWallet || wallet && newWallet.id === wallet.id) return;\n $scope.removeListeners();\n $scope.loading = true;\n wallet = newWallet;\n console.debug(\"[transfer] Using wallet {\" + wallet.id + \"}\");\n $scope.formData = {};\n return $scope.load();\n });\n };\n\n /* -- popovers -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'templates/wallet/popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n\n $scope.showSharePopover = function(event) {\n $scope.hideActionsPopover();\n\n var title = $scope.formData.name || $scope.formData.uid || $scope.formData.pubkey;\n // Use shareBasePath (fix #530) or rootPath (fix #390)\n var url = (csConfig.shareBaseUrl || $rootScope.rootPath) + $state.href('app.wot_identity', {pubkey: $scope.formData.pubkey, uid: $scope.formData.uid});\n\n // Override default position, is small screen - fix #545\n if (UIUtils.screen.isSmall()) {\n event = angular.element(document.querySelector('#wallet-share-anchor')) || event;\n }\n\n UIUtils.popover.share(event, {\n bindings: {\n url: url,\n titleKey: 'WOT.VIEW.POPOVER_SHARE_TITLE',\n titleValues: {title: title},\n postMessage: title\n }\n });\n };\n\n $scope.showSelectWalletPopover = function(event) {\n\n return csPopovers.showSelectWallet(event, {\n parameters: {\n excludedWalletId: $scope.walletId\n }})\n .then(function(newWallet) {\n if (!newWallet || newWallet.id === $scope.walletId) return; // nothing changed\n if (newWallet.isDefault()) {\n return $state.go('app.view_wallet');\n }\n return $state.go('app.view_wallet_by_id', {id: newWallet.id});\n });\n };\n\n // remove '?refresh' from the location URI\n $scope.cleanLocationHref = function(state) {\n if (state && state.stateParams && state.stateParams.refresh) {\n $timeout(function() {\n var stateParams = angular.copy(state.stateParams);\n delete stateParams.refresh;\n delete stateParams.id;\n $location.search(stateParams).replace();\n }, 300);\n }\n };\n}\n\n\nfunction WalletTxController($scope, $ionicPopover, $state, $timeout, $location,\n UIUtils, Modals, csPopovers, BMA, csHttp, csSettings, csCurrency, csWallet, csTx) {\n 'ngInject';\n\n $scope.loading = true;\n $scope.settings = csSettings.data;\n $scope.listeners = [];\n $scope.qrcodeId = 'qrcode-wallet-tx-' + $scope.$id;\n\n var wallet;\n\n $scope.enter = function(e, state) {\n $scope.loading = $scope.loading || (state.stateParams && state.stateParams.refresh);\n $scope.enableSelectWallet = csWallet.children.count() > 0;\n if ($scope.loading) {\n\n wallet = (state.stateParams && state.stateParams.id) ? csWallet.children.get(state.stateParams.id) : csWallet;\n if (!wallet) {\n UIUtils.alert.error('ERROR.UNKNOWN_WALLET_ID');\n return $scope.showHome();\n }\n\n $scope.walletId = wallet.id;\n\n $scope.cleanLocationHref(state);\n\n return $scope.load();\n }\n else {\n $scope.addListeners();\n // Make sure to display new pending (e.g. sending using another screen button)\n $timeout($scope.updateView, 300);\n }\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.leave = function() {\n $scope.removeListeners();\n };\n $scope.$on('$ionicView.leave', $scope.leave);\n\n $scope.load = function() {\n if (!wallet) return $q.reject('Missing wallet');\n\n var hasMinData = wallet.isDataLoaded({minData: true});\n var options = {\n requirements: !hasMinData, // load requirements (=minData) once\n minData: !hasMinData,\n sources: true,\n tx: {\n enable: true\n }\n };\n\n return wallet.login(options)\n .then(function(walletData) {\n $scope.formData = walletData;\n $scope.loading = false; // very important, to avoid TX to be display before wallet.currentUd is loaded\n $scope.updateView();\n $scope.addListeners();\n\n $scope.showFab('fab-transfer');\n $scope.showQRCode();\n if (wallet.isDefault()) $scope.showHelpTip();\n\n return UIUtils.loading.hide(10); // loading could have be open (e.g. during login phase)\n })\n .catch(function(err){\n if (err === 'CANCELLED') {\n $scope.showHome();\n return;\n }\n console.error(err);\n UIUtils.onError('ERROR.LOAD_WALLET_DATA_ERROR')(err);\n });\n };\n\n // remove '?refresh' from the location URI\n $scope.cleanLocationHref = function(state) {\n if (state && state.stateParams && state.stateParams.refresh) {\n $timeout(function() {\n var stateParams = angular.copy(state.stateParams);\n delete stateParams.refresh;\n delete stateParams.id;\n $location.search(stateParams).replace();\n }, 300);\n }\n };\n\n // Update view\n $scope.updateView = function() {\n if (!$scope.formData || $scope.loading) return;\n $scope.$broadcast('$$rebind::balance'); // force rebind balance\n $scope.$broadcast('$$rebind::rebind'); // force rebind\n $scope.motion.show({selector: '.view-wallet-tx .item', ink: false});\n };\n\n $scope.downloadHistoryFile = function(options) {\n options = options || {};\n options.fromTime = options.fromTime || -1; // default: full history\n var pubkey = $scope.formData.pubkey;\n csTx.downloadHistoryFile(pubkey, options);\n };\n\n // Updating wallet data\n $scope.doUpdate = function(silent) {\n console.debug('[wallet] TX history reloading...');\n var fromTime = $scope.formData && $scope.formData.tx && $scope.formData.tx.fromTime || undefined;\n var options = {\n sources: true,\n tx: {\n enable: true,\n fromTime: fromTime\n },\n api: false\n };\n return (silent ?\n // If silent: just refresh\n wallet.refreshData(options) :\n // If not silent: show/hide loading indicator\n UIUtils.loading.show()\n .then(function() {\n return wallet.refreshData(options);\n })\n .then(UIUtils.loading.hide)\n )\n .then($scope.updateView)\n .catch(UIUtils.onError('ERROR.REFRESH_WALLET_DATA'));\n };\n\n $scope.showQRCode = function(timeout) {\n if (!wallet || !$scope.qrcodeId) return; // Skip\n\n // Get the DIV element\n var element = angular.element(document.querySelector('#' + $scope.qrcodeId + ' .content'));\n if (!element) {\n console.error(\"[wallet-controller] Cannot found div #{0} for the QRCode. Skipping.\".format($scope.qrcodeId));\n return;\n }\n\n wallet.loadQrCode()\n .then(function(svg) {\n element.html(svg);\n UIUtils.motion.toggleOn({selector: '#'+$scope.qrcodeId}, timeout || 1100);\n });\n };\n\n $scope.hideQRCode = function() {\n if (!$scope.qrcodeId) return;\n var element = angular.element(document.querySelector('#' + $scope.qrcodeId));\n if (element) {\n UIUtils.motion.toggleOff({selector: '#'+$scope.qrcodeId});\n }\n };\n\n /* -- add listeners -- */\n\n $scope.addListeners = function() {\n $scope.listeners = [\n // Reload if wallet balanced changed\n wallet.api.data.on.balanceChanged($scope, $scope.updateView),\n // Reload if useRelative changed\n $scope.$watch('settings.useRelative', $scope.updateView, true),\n // Reload if showUDHistory changed\n $scope.$watch('settings.showUDHistory', function(newVal, oldVal) {\n if (!$scope.formData || $scope.loading || (newVal === oldVal)) return;\n $scope.doUpdate();\n }, true)\n ];\n\n // Listening new block (if auto refresh enable)\n if ($scope.settings.walletHistoryAutoRefresh) {\n $scope.listeners.push(\n csCurrency.api.data.on.newBlock($scope, function(block) {\n if ($scope.loading) return;\n console.debug(\"[wallet] Received new block. Will reload history.\");\n $timeout(function() {\n $scope.doUpdate(true);\n }, 500/*waiting for block propagation*/);\n })\n );\n }\n };\n\n $scope.removeListeners = function() {\n _.forEach($scope.listeners, function(remove){\n remove();\n });\n $scope.listeners = [];\n };\n\n /* -- popup / UI -- */\n\n // Transfer\n $scope.showTransferModal = function() {\n var hasCredit = (!!$scope.formData.balance && $scope.formData.balance > 0);\n if (!hasCredit && !csWallet.children.count()) {\n UIUtils.alert.info('INFO.NOT_ENOUGH_CREDIT');\n return;\n }\n return Modals.showTransfer({wallet: wallet.id})\n .then(function(done){\n if (done) {\n UIUtils.toast.show('INFO.TRANSFER_SENT');\n $scope.$broadcast('$$rebind::balance'); // force rebind balance\n $scope.motion.show({selector: '.item-pending'});\n }\n });\n };\n\n $scope.showHelpTip = function(index, isTour) {\n // TODO\n };\n\n $scope.showTxErrors = function(event) {\n if (wallet.isDefault()) {\n return $scope.goState('app.view_wallet_tx_errors');\n }\n return $scope.goState('app.view_wallet_tx_errors_by_id', {id: wallet.id});\n };\n\n $scope.showMoreTx = function(fromTime) {\n\n fromTime = fromTime ||\n ($scope.formData.tx.fromTime - csSettings.data.walletHistoryTimeSecond) ||\n (csHttp.date.now() - 2 * csSettings.data.walletHistoryTimeSecond);\n\n UIUtils.loading.show();\n return wallet.refreshData({tx: {enable: true, fromTime: fromTime}})\n .then(function() {\n $scope.updateView();\n UIUtils.loading.hide();\n })\n .catch(function(err) {\n // If http rest limitation: wait then retry\n if (err.ucode == BMA.errorCodes.HTTP_LIMITATION) {\n $timeout(function() {\n return $scope.showMoreTx(fromTime);\n }, 2000);\n }\n else {\n UIUtils.onError('ERROR.REFRESH_WALLET_DATA')(err);\n }\n });\n };\n\n $scope.showSelectWalletModal = function() {\n if (!csWallet.children.count()) return;\n\n return Modals.showSelectWallet({\n parameters: {\n showDefault: true,\n showBalance: false,\n excludedWalletId: $scope.walletId\n }\n })\n .then(function(newWallet) {\n if (!newWallet || wallet && newWallet.id === wallet.id) return;\n $scope.removeListeners();\n $scope.loading = true;\n wallet = newWallet;\n console.debug(\"[transfer] Using wallet {\" + wallet.id + \"}\");\n $scope.formData = {};\n return $scope.load();\n });\n };\n\n /* -- popover -- */\n\n var paddingIndent = 10;\n\n $scope.toUnlockUIArray = function(unlockTreeItem, leftPadding, operator) {\n leftPadding = leftPadding || 0;\n\n // If operator (AND, OR)\n if (unlockTreeItem.children && (unlockTreeItem.type == 'AND' || unlockTreeItem.type == 'OR')) {\n return unlockTreeItem.children.reduce(function(res, child, index){\n if (child.children && index > 0) {\n // Add space between expression block\n res = res.concat({\n style: {\n 'padding-left': leftPadding + 'px',\n 'padding-top': '10px',\n 'padding-bottom': '10px'\n },\n operator: unlockTreeItem.type\n });\n\n return res.concat($scope.toUnlockUIArray(child, leftPadding + paddingIndent));\n }\n return res.concat($scope.toUnlockUIArray(child, leftPadding + paddingIndent, index && unlockTreeItem.type));\n }, []);\n }\n\n return {\n style: {\n 'padding-left': leftPadding + 'px'\n },\n operator: operator,\n type: unlockTreeItem.type,\n value: unlockTreeItem.value\n };\n };\n\n $scope.showLockedOutputsPopover = function(tx, event) {\n if (!tx.lockedOutputs) return;\n\n // Convert condition into UI array\n $scope.popoverData = $scope.popoverData || {};\n $scope.popoverData.lockedOuputs = tx.lockedOutputs.reduce(function(res, lockedOutput){\n return res.concat({\n amount: lockedOutput.amount,\n unlockFunctions: lockedOutput.unlockFunctions,\n unlockConditions: $scope.toUnlockUIArray(lockedOutput.unlockTree)\n });\n }, []);\n\n // Open popover\n UIUtils.popover.show(event, {\n templateUrl: 'templates/wallet/tx_locked_outputs_popover.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideLockedOutputsPopover = function() {\n if ($scope.lockedOutputsPopover) {\n $scope.lockedOutputsPopover.hide();\n if ($scope.popoverData) {\n delete $scope.popoverData.unlockConditions;\n }\n $scope.lockedOutputsPopover = null;\n }\n };\n\n $scope.showSelectWalletPopover = function(event) {\n return csPopovers.showSelectWallet(event, {\n scope: $scope\n })\n .then(function(newWallet) {\n if (!newWallet || newWallet.id === wallet.id) return;\n if (newWallet.isDefault()) {\n return $scope.goState('app.view_wallet_tx');\n }\n return $scope.goState('app.view_wallet_tx_by_id', {id: newWallet.id});\n });\n };\n\n $scope.goState = function(stateName, stateParams) {\n $scope.hideLockedOutputsPopover();\n return $state.go(stateName, stateParams);\n };\n}\n\nfunction WalletTxErrorController($scope, UIUtils, csSettings, csWallet) {\n 'ngInject';\n\n var wallet;\n $scope.settings = csSettings.data;\n $scope.loading = true;\n $scope.formData = {};\n\n $scope.$on('$ionicView.enter', function(e, state) {\n\n wallet = (state.stateParams && state.stateParams.id) ? csWallet.children.get(state.stateParams.id) : csWallet;\n if (!wallet) {\n UIUtils.alert.error('ERROR.UNKNOWN_WALLET_ID');\n return $scope.showHome();\n }\n\n return $scope.load();\n });\n\n $scope.load = function() {\n if (!wallet) return;\n\n return wallet.login()\n .then(function(walletData) {\n $scope.formData = walletData;\n $scope.loading = false;\n $scope.doMotion();\n //$scope.showFab('fab-redo-transfer');\n UIUtils.loading.hide();\n });\n };\n\n // Updating wallet data\n $scope.doUpdate = function(silent) {\n\n $scope.loading = true;\n return (silent ?\n wallet.refreshData() :\n UIUtils.loading.show()\n .then(csWallet.refreshData)\n .then(UIUtils.loading.hide)\n )\n .then(function() {\n $scope.doMotion();\n $scope.loading = false;\n })\n .catch(function(err) {\n UIUtils.onError('ERROR.REFRESH_WALLET_DATA')(err);\n $scope.loading = false;\n });\n };\n\n $scope.filterReceivedTx = function(tx){\n return tx.amount && tx.amount > 0;\n };\n\n $scope.filterSentTx = function(tx){\n return tx.amount && tx.amount < 0;\n };\n\n $scope.hasReceivedTx = function(){\n return $scope.formData.tx && _($scope.formData.tx.errors || []).find($scope.filterReceivedTx) && true;\n };\n\n $scope.hasSentTx = function(){\n return $scope.formData.tx && _($scope.formData.tx.errors || []).find($scope.filterSentTx) && true;\n };\n\n}\n\nfunction WalletSecurityModalController($scope, UIUtils, csConfig, csWallet, $translate, parameters){\n\n var wallet = parameters && parameters.wallet || csWallet;\n\n $scope.slides = {\n slider: null,\n options: {\n loop: false,\n effect: 'slide',\n speed: 500\n }\n };\n $scope.isLastSlide = false;\n $scope.smallscreen = UIUtils.screen.isSmall();\n\n $scope.recover = {};\n $scope.isValidFile = false;\n\n\n $scope.login = wallet.isLogin();\n $scope.hasSelf = wallet.hasSelf();\n $scope.needSelf = $scope.login && wallet.data.requirements.needSelf;\n $scope.canRevoke = $scope.login && $scope.hasSelf && !wallet.data.requirements.revoked;\n $scope.needMembership = $scope.login && wallet.data.requirements.needMembership;\n $scope.option = $scope.login ? 'saveID' : 'recoverID';\n\n $scope.formData = {\n addQuestion: '',\n level: '4',\n questions : []\n };\n var questions = [];\n for (var i = 1; i<20; i++) {\n questions.push('ACCOUNT.SECURITY.QUESTION_' + i.toString());\n }\n $translate(questions)\n .then(function(translations){\n _.each(translations, function(translation){\n $scope.formData.questions.push({value: translation , checked: false});\n });\n });\n\n $scope.$on(\"$ionicSlides.sliderInitialized\", function(event, data){\n // Disable swipe\n data.slider.lockSwipes();\n });\n\n $scope.slidePrev = function() {\n $scope.slides.slider.unlockSwipes();\n $scope.slides.slider.slidePrev();\n $scope.slides.slider.lockSwipes();\n $scope.isLastSlide = false;\n\n };\n\n $scope.slideNext = function() {\n $scope.slides.slider.unlockSwipes();\n $scope.slides.slider.slideNext();\n $scope.slides.slider.lockSwipes();\n $scope.isLastSlide = ($scope.slides.slider.activeIndex === 3 && ($scope.option == \"saveID\" || $scope.option == \"recoverID\")) || ($scope.slides.slider.activeIndex === 2 && $scope.option == \"revocation\");\n };\n\n\n $scope.doNext = function(formName) {\n if (!formName) {\n switch ($scope.slides.slider.activeIndex) {\n case 1:\n switch ($scope.option) {\n case \"saveID\":\n formName = \"questionsForm\";\n break;\n case \"recoverID\":\n if ($scope.isValidFile) {\n $scope.slideNext();\n $scope.hasContent = false;\n $scope.fileData = '';\n\n }\n else {\n UIUtils.alert.error(\"ERROR.NOT_VALID_SAVE_ID_FILE\", \"ERROR.LOAD_FILE_FAILED\");\n }\n break;\n }\n break;\n\n case 2:\n switch ($scope.option) {\n case \"recoverID\":\n formName = \"recoverForm\";\n break;\n case \"saveID\":\n formName = \"answersForm\";\n break;\n }\n }\n }\n\n if (formName) {\n $scope[formName].$submitted = true;\n if (!$scope[formName].$valid) {\n return;\n }\n switch (formName) {\n case \"recoverForm\":\n $scope.recoverId();\n break;\n case \"answersForm\":\n $scope.downloadSaveIDFile();\n break;\n default:\n $scope.slideNext();\n }\n }\n };\n\n $scope.selectOption = function(option, enableOnDemo){\n if (!enableOnDemo && csConfig.demo) {\n return UIUtils.alert.demo();\n }\n $scope.option = option;\n $scope.slideNext();\n };\n\n $scope.restore = function(){\n if ($scope.slides.slider.activeIndex === 1 && $scope.option === 'saveID') {\n $scope.formData = {\n addQuestion: '',\n level: '4',\n questions: []\n };\n $translate(questions)\n .then(function (translations) {\n _.each(translations, function (translation) {\n $scope.formData.questions.push({value: translation, checked: false});\n });\n });\n }\n\n else if ($scope.slides.slider.activeIndex === 2 && $scope.option === 'saveID') {\n _.each($scope.formData.questions, function(question){\n question.answer = undefined;\n });\n }\n\n else if ($scope.slides.slider.activeIndex === 1 && $scope.option === 'recoverID'){\n $scope.hasContent = false;\n $scope.recover = {};\n $scope.fileData = '';\n $scope.isValidFile = false;\n }\n\n else if ($scope.slides.slider.activeIndex === 2 && $scope.option === 'recoverID'){\n _.each($scope.recover.questions, function(element){\n element.answer = undefined;\n });\n }\n\n else if ($scope.slides.slider.activeIndex === 2 && $scope.option === 'revocation'){\n $scope.isValidFile = false;\n $scope.hasContent = false;\n $scope.revocation = undefined;\n }\n };\n\n /**\n * Set the file content\n */\n $scope.onFileChanged = function(file) {\n $scope.hasContent = angular.isDefined(file) && file !== '';\n $scope.fileData = file.fileData ? file.fileData : '';\n $scope.isValidFile = $scope.fileData !== '' && $scope.fileData.type === 'text/plain';\n\n if ($scope.isValidFile && $scope.option === 'recoverID') {\n $scope.content = file.fileContent.split('\\n');\n var indexOfQuestions = _.indexOf($scope.content, 'Questions: ');\n var LastIndexQuestions = -1;\n _.each($scope.content, function (element, index) {\n if (/^Issuer:/.test(element)) {\n LastIndexQuestions = index;\n }\n else if (/^Crypted-Nonce:/.test(element)) {\n $scope.recover.cypherNonce = element.split(' ')[1];\n }\n else if (/^Crypted-Pubkey:/.test(element)) {\n $scope.recover.cypherPubkey = element.split(' ')[1];\n }\n else if (/^Crypted-Salt:/.test(element)) {\n $scope.recover.cypherSalt = element.split(' ')[1];\n }\n else if (/^Crypted-Pwd:/.test(element)) {\n $scope.recover.cypherPwd = element.split(' ')[1];\n }\n });\n $scope.recover.questions = [];\n for (var i = indexOfQuestions + 1; i < LastIndexQuestions; i++) {\n $scope.recover.questions.push({value: $scope.content[i]});\n }\n }\n else if ($scope.isValidFile && $scope.option === \"revocation\"){\n $scope.revocation = file.fileContent;\n }\n };\n\n $scope.recoverId = function(){\n if(!$scope.recoverForm.$valid){\n return;\n }\n\n $scope.recover.answer = '';\n _.each($scope.recover.questions, function(element){\n $scope.recover.answer += element.answer;\n });\n\n return wallet.recoverId($scope.recover)\n .then(function (recover){\n if (angular.isDefined(recover)) {\n $scope.recover = recover;\n $scope.slideNext();\n }\n else {\n UIUtils.alert.error('ERROR.RECOVER_ID_FAILED');\n }\n })\n .catch(UIUtils.onError('ERROR.RECOVER_ID_FAILED'));\n\n };\n\n /**\n * Save Id\n */\n $scope.addQuestion = function(){\n if ($scope.formData.addQuestion !== '') {\n $scope.formData.questions.push({value: $scope.formData.addQuestion, checked: true});\n $scope.formData.addQuestion = '';\n }\n };\n\n $scope.downloadSaveIDFile = function(){\n // Force user re-auth\n var loginData;\n return wallet.auth({\n forceAuth: true,\n expectedPubkey: $scope.pubkey,\n silent: true,\n success: function(values) {\n loginData = values;\n }\n })\n .catch(function(err) {\n if (err && err === 'CANCELLED') return;\n UIUtils.alert.error('ERROR.SALT_OR_PASSWORD_NOT_CONFIRMED', 'ERROR.LOGIN_FAILED');\n return;\n })\n .then(function(res) {\n if (!res) return;\n var file = {\n file: _.filter($scope.formData.questions, function (question) {\n return question.checked;\n })\n };\n var record = {\n salt: loginData.username,\n pwd: loginData.password,\n questions: '',\n answer: ''\n };\n _.each(file.file, function (question) {\n record.questions += question.value + '\\n';\n record.answer += question.answer;\n });\n\n return wallet.getCryptedId(record)\n .then(function(record){\n wallet.downloadSaveId(record);\n $scope.closeModal();\n });\n })\n ;\n };\n\n $scope.isRequired = function(){\n var questionChecked = _.filter($scope.formData.questions, function(question) {\n return question.checked;\n });\n return questionChecked.length < $scope.formData.level;\n };\n\n $scope.revokeWithFile = function(){\n if ($scope.isValidFile) {\n $scope.revokeIdentity();\n }\n else {\n UIUtils.alert.error(\"ERROR.NOT_VALID_REVOCATION_FILE\", \"ERROR.LOAD_FILE_FAILED\");\n }\n };\n\n /**\n * Download revocation file\n */\n $scope.downloadRevokeFile = function () {\n // Force re-authentication\n return wallet.auth({forceAuth: true})\n\n // Download file\n .then(function() {\n return wallet.downloadRevocation();\n })\n\n .then(function() {\n UIUtils.loading.hide();\n })\n\n .catch(function(err){\n if (err && err === 'CANCELLED') return;\n UIUtils.onError('ERROR.DOWNLOAD_REVOCATION_FAILED')(err);\n })\n ;\n\n };\n\n /**\n * Revoke wallet identity\n */\n $scope.revokeWalletIdentity = function () {\n if (!$scope.hasSelf) {\n return UIUtils.alert.error(\"ERROR.ONLY_SELF_CAN_EXECUTE_THIS_ACTION\");\n }\n\n // Make sure user re-auth\n return wallet.auth({forceAuth: true})\n .then(function(confirm) {\n UIUtils.loading.hide();\n if (!confirm) return;\n return $scope.revokeIdentity();\n })\n .catch(function (err) {\n if (err === 'CANCELLED') return;\n UIUtils.onError('ERROR.REVOCATION_FAILED')(err);\n });\n };\n\n /**\n * Revoke identity\n */\n $scope.revokeIdentity = function (confirm) {\n\n // Make sure user re-auth + confirm\n if (!confirm) {\n return UIUtils.alert.confirm(\"CONFIRM.REVOKE_IDENTITY\", 'CONFIRM.POPUP_WARNING_TITLE', {\n cssClass: 'warning',\n okText: 'COMMON.BTN_YES',\n okType: 'button-assertive'\n })\n .then(function (confirm) {\n if (!confirm) return;\n return UIUtils.alert.confirm(\"CONFIRM.REVOKE_IDENTITY_2\", 'CONFIRM.POPUP_TITLE', {\n cssClass: 'warning',\n okText: 'COMMON.BTN_YES',\n okType: 'button-assertive'\n });\n })\n .then(function (confirm) {\n if (confirm) $scope.revokeIdentity(true, true); // loop with confirmation\n });\n }\n\n return UIUtils.loading.show()\n .then(function () {\n if (!$scope.revocation){\n return wallet.revoke();\n }\n else {\n return wallet.revokeWithFile($scope.revocation);\n }\n })\n .then(function () {\n UIUtils.toast.show(\"INFO.REVOCATION_SENT\");\n $scope.closeModal();\n return UIUtils.loading.hide();\n })\n .catch(function(err) {\n if ($scope.revocation){\n $scope.isValidFile = false;\n $scope.revocationError = err && err.message || err || 'ERROR.REVOCATION_FAILED';\n UIUtils.loading.hide(10);\n }\n else {\n UIUtils.onError('ERROR.REVOCATION_FAILED')(err);\n }\n });\n };\n\n\n /**\n * Ask self (= send identity)\n */\n $scope.self = function () {\n return $scope.closeModal('self');\n };\n\n /**\n * Ask membership in\n */\n $scope.membershipIn = function () {\n return $scope.closeModal('membershipIn');\n };\n\n /**\n * Generate keyfile\n */\n $scope.downloadKeyFile = function (format) {\n // Force re-authentication\n return wallet.auth({forceAuth: true})\n\n // Download file\n .then(function() {\n return wallet.downloadKeyFile(format);\n })\n\n .then(function() {\n UIUtils.loading.hide();\n return $scope.closeModal();\n })\n\n .catch(function(err){\n if (err && err === 'CANCELLED') {\n UIUtils.loading.hide();\n return;\n }\n UIUtils.onError('ERROR.DOWNLOAD_KEYFILE_FAILED')(err);\n })\n ;\n };\n}\n","\nWalletListAbstractController.$inject = ['$scope', '$q', '$timeout', 'UIUtils', 'filterTranslations', 'csSettings', 'csCurrency', 'csWallet'];\nWalletListViewController.$inject = ['$scope', '$controller', '$state', '$timeout', '$q', '$translate', '$ionicPopover', '$ionicPopup', 'ModalUtils', 'UIUtils', 'Modals', 'csCurrency', 'csSettings', 'csWallet'];\nWalletSelectModalController.$inject = ['$scope', '$controller', 'parameters'];\nWalletListImportModalController.$inject = ['$scope', '$timeout', 'BMA', 'csWallet'];\nWalletSelectPopoverController.$inject = ['$scope', '$controller', 'UIUtils', 'parameters'];angular.module('cesium.wallets.controllers', ['cesium.services', 'cesium.currency.controllers'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n $stateProvider\n\n .state('app.view_wallets', {\n url: \"/wallets\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wallet/list/view_wallets.html\",\n controller: 'WalletListViewCtrl'\n }\n },\n data: {\n login: true\n }\n })\n\n .state('app.view_wallet_by_id', {\n url: \"/wallets/:id?refresh\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wallet/view_wallet.html\",\n controller: 'WalletCtrl'\n }\n },\n data: {\n login: true,\n silentLocationChange: true\n }\n })\n\n .state('app.view_wallet_tx_by_id', {\n url: \"/history/wallets/:id?refresh\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wallet/view_wallet_tx.html\",\n controller: 'WalletTxCtrl'\n }\n },\n data: {\n login: true,\n silentLocationChange: true\n }\n })\n\n .state('app.view_wallet_tx_errors_by_id', {\n url: \"/history/wallets/:id/errors\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wallet/view_wallet_tx_error.html\",\n controller: 'WalletTxErrorCtrl'\n }\n },\n data: {\n login: true\n }\n })\n ;\n }])\n .controller('WalletListAbstractCtrl', WalletListAbstractController)\n\n .controller('WalletListViewCtrl', WalletListViewController)\n\n .controller('WalletSelectModalCtrl', WalletSelectModalController)\n\n .controller('WalletListImportModalCtrl', WalletListImportModalController)\n\n .controller('WalletSelectPopoverCtrl', WalletSelectPopoverController)\n;\n\n\nfunction WalletListAbstractController($scope, $q, $timeout, UIUtils, filterTranslations, csSettings, csCurrency, csWallet) {\n 'ngInject';\n\n $scope.loading = true;\n $scope.wallets = null;\n $scope.formData = {\n useRelative: csSettings.data.useRelative,\n showDefault: true,\n showBalance: false,\n balance: undefined,\n updatingWalletId: undefined,\n stopped: false,\n minData: true\n };\n $scope.motion = null; // no animation\n\n $scope.setParameters = function(parameters) {\n parameters = parameters || {};\n\n $scope.formData.useRelative = angular.isDefined(parameters.useRelative) ? parameters.useRelative : $scope.formData.useRelative;\n $scope.formData.showBalance = angular.isDefined(parameters.showBalance) ? parameters.showBalance : $scope.formData.showBalance;\n $scope.formData.minData = angular.isDefined(parameters.minData) ? parameters.minData : $scope.formData.minData;\n $scope.formData.excludedWalletId = parameters.excludedWalletId;\n $scope.formData.showDefault = (angular.isDefined(parameters.showDefault) ? parameters.showDefault : $scope.formData.showDefault) &&\n ($scope.formData.excludedWalletId !== 'default');\n\n };\n\n $scope.load = function(options) {\n\n options = options || {};\n $scope.loading = (options.silent !== false);\n $scope.formData.balance = undefined;\n $scope.formData.updatingWalletId = undefined;\n $scope.formData.stopped = false;\n\n // Load currency, and filter translations (need by 'formatAmount' filter)\n var jobs = [];\n\n jobs.push(csCurrency.name()\n .then(function(currency) {\n $scope.currency = currency;\n return filterTranslations.ready();\n }));\n\n // Get children wallets\n $scope.defaultWallet = $scope.formData.showDefault ? csWallet : undefined;\n if (!$scope.wallets) {\n jobs.push(\n csWallet.children.all()\n .then(function(children) {\n $scope.wallets=children;\n UIUtils.loading.hide();\n })\n );\n }\n\n // Prepare load options\n var walletLoadOptions = {\n silent: true,\n minData: $scope.formData.minData,\n sources: $scope.formData.showBalance,\n tx: {\n enable: false\n },\n api: true\n };\n var hasLoadError = false;\n var loadCounter = 0;\n var now = Date.now();\n var balance = 0;\n return (jobs.length ? $q.all(jobs) : $q.when())\n // Load wallet data (apply a timeout between each wallet)\n .then(function() {\n var wallets = $scope.formData.showDefault ? [csWallet].concat($scope.wallets) : $scope.wallets;\n if (!wallets.length) return;\n console.debug(\"[wallets] Loading {0} wallets...\".format(wallets.length));\n return wallets.reduce(function(res, wallet) {\n var skip= !options.refresh && wallet.isDataLoaded(walletLoadOptions);\n if (skip) {\n console.debug(\"[wallets] Wallet #{0} already loaded. Skipping\".format(wallet.id));\n return res.then(function(){\n balance += wallet.data.balance;\n $scope.updateWalletView(wallet.id);\n });\n }\n loadCounter++;\n return res.then(function() {\n if ($scope.formData.stopped) return; // skip if stopped\n // Loading next wallet, after waiting some time\n $scope.formData.updatingWalletId = wallet.id;\n var loadPromise;\n if (options.refresh && wallet.data.loaded) {\n var refreshOptions = angular.merge({\n // Refresh requirements if member account\n requirements: (!wallet.data.requirements.loaded || wallet.data.requirements.isMember || wallet.data.requirements.wasMember || wallet.data.requirements.pendingMembership)\n }, walletLoadOptions);\n loadPromise = wallet.refreshData(refreshOptions);\n }\n else {\n loadPromise = wallet.loadData(walletLoadOptions);\n }\n\n loadPromise.then(function(walletData) {\n balance += walletData.balance;\n $scope.updateWalletView(wallet.id);\n })\n .catch(function(err) {\n console.error(\"[wallets] Error while loading data of wallet #{0}\".format(wallet.id), err);\n hasLoadError = true;\n });\n return loadPromise;\n });\n }, $q.when());\n })\n .then(function() {\n if (hasLoadError) {\n return UIUtils.alert.error('ERROR.LOAD_WALLET_LIST_FAILED')\n .then(function() {\n $scope.resetData();\n $scope.cancel();\n });\n }\n // Stop\n if ($scope.formData.stopped) return;\n if (loadCounter) {\n console.debug(\"[wallets] Loaded data of {0} wallet(s) in {1}ms\".format(loadCounter, (Date.now() - now)));\n }\n $scope.formData.balance = balance;\n $scope.formData.updatingWalletId = undefined;\n $scope.loading = false;\n UIUtils.loading.hide();\n $scope.updateView();\n })\n .catch(function(err) {\n $scope.resetData();\n if (err && err === 'CANCELLED') {\n $scope.cancel();\n throw err;\n }\n return UIUtils.onError('ERROR.LOAD_WALLET_LIST_FAILED')(err);\n });\n };\n\n $scope.filterFn = function(parameters) {\n return function(wallet) {\n return !parameters || wallet.id !== parameters.excludedWalletId;\n };\n };\n\n\n // Clean controller data\n $scope.resetData = function() {\n console.debug(\"[wallets] Cleaning wallet list\");\n $scope.wallets = null;\n $scope.loading = true;\n $scope.entered = false;\n $scope.formData.balance = undefined;\n $scope.formData.updatingWalletId = undefined;\n };\n\n $scope.updateView = function(walletId) {\n if (!$scope.wallets || !$scope.wallets.length) return;\n\n var selectorSuffix = walletId && (' #wallet-' + walletId) || '';\n\n if ($scope.motion) {\n $scope.motion.show({selector: '.list .item.item-wallet' + selectorSuffix, ink: true});\n }\n else {\n UIUtils.ink({selector: '.list .item.item-wallet' + selectorSuffix});\n }\n };\n\n $scope.updateWalletView = function(walletId) {\n if ($scope.motion) {\n $scope.motion.show({selector: '.list #wallet-' + walletId, ink: true});\n }\n else {\n UIUtils.ink({selector: '.list #wallet-' + walletId});\n }\n };\n\n $scope.doUpdate = function(silent) {\n if ($scope.loading || !$scope.wallets || !$scope.wallets.length || $scope.formData.updatingWalletId) return $q.when();\n\n $scope.selectPrevented = true;\n $timeout(function() {\n $scope.selectPrevented = false;\n }, 1000);\n\n return $scope.load({silent: silent, refresh: true})\n .then(function() {\n $scope.loading = false;\n $scope.selectPrevented = false;\n if (silent) {\n $scope.$broadcast('$$rebind::rebind'); // force rebind\n }\n $scope.updateView();\n });\n };\n\n $scope.addNewWallet = function(wallet) {\n\n if (!wallet) return $q.reject(\"Missing 'wallet' argument\");\n\n // Make sure auth on the main wallet\n if (csSettings.data.useLocalStorageEncryption && !csWallet.isAuth()) {\n return csWallet.auth({minData: true})\n .then(function() {\n return $scope.addNewWallet(wallet); // loop\n })\n .catch(function(err) {\n if (err === 'CANCELLED') {\n return UIUtils.loading.hide();\n }\n UIUtils.onError('ERROR.ADD_SECONDARY_WALLET_FAILED')(err);\n });\n }\n\n // Call API extension on child wallet\n return csWallet.api.data.raisePromise.load(wallet.data)\n // continue, when plugins extension failed (just log in console)\n .catch(console.error)\n .then(function() {\n $scope.addListenersOnWallet(wallet);\n csWallet.children.add(wallet);\n });\n };\n\n /* -- modals -- */\n\n $scope.showNewWalletModal = function() {\n\n var wallet = csWallet.children.instance();\n return wallet.login({\n showNewAccountLink: false,\n title: 'ACCOUNT.WALLET_LIST.BTN_NEW',\n okText: 'COMMON.BTN_ADD',\n // Load data options :\n minData: true,\n sources: true,\n api: false,\n success: UIUtils.loading.show,\n method: 'PUBKEY' // Default method - fix #767\n })\n .then(function(data) {\n if (!data || !data.pubkey) { // User cancelled\n UIUtils.loading.hide(100);\n return;\n }\n\n // Avoid to add main wallet again\n if (csWallet.isUserPubkey(data.pubkey)) {\n throw new Error('ERROR.COULD_NOT_ADD_MAIN_WALLET');\n }\n\n // Avoid to add exists wallet again\n if (csWallet.children.hasPubkey(data.pubkey)) {\n throw new Error('ERROR.COULD_NOT_ADD_EXISTING_WALLET');\n }\n\n console.debug(\"[wallet] Adding secondary wallet {{0}}\".format(data.pubkey && data.pubkey.substring(0,8)));\n\n // Add the child wallet\n return $scope.addNewWallet(wallet)\n .then(function() {\n UIUtils.loading.hide();\n $scope.updateView();\n });\n })\n .catch(UIUtils.onError('ERROR.ADD_SECONDARY_WALLET_FAILED'));\n };\n\n /* -- Method to override by subclasses-- */\n\n $scope.addListenersOnWallet = function(wallet) {\n // Can be override by subclass\n };\n\n $scope.cancel = function() {\n console.warn(\"cancel() must be implement by subclass\");\n };\n\n $scope.select = function(event, wallet) {\n console.warn(\"select() must be implement by subclass\");\n };\n}\n\nfunction WalletSelectModalController($scope, $controller, parameters) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('WalletListAbstractCtrl', {$scope: $scope}));\n\n $scope.$on('modal.shown', function() {\n $scope.setParameters(parameters);\n $scope.load();\n });\n\n $scope.cancel = function() {\n $scope.closeModal();\n };\n\n $scope.select = function(event, wallet) {\n if (event.isDefaultPrevented() || !wallet || $scope.selectPrevented) return;\n $scope.closeModal(wallet);\n };\n\n // Default actions\n if (parameters) {\n $scope.setParameters(parameters);\n }\n}\n\nfunction WalletListViewController($scope, $controller, $state, $timeout, $q, $translate, $ionicPopover, $ionicPopup,\n ModalUtils, UIUtils, Modals, csCurrency, csSettings, csWallet){\n 'ngInject';\n\n $scope.settings = csSettings.data;\n $scope.listeners = [];\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('WalletListAbstractCtrl', {$scope: $scope, parameters: {}}));\n\n // Override defaults\n $scope.formData.name = undefined;\n $scope.motion = UIUtils.motion.default;\n $scope.entered = false;\n\n $scope.enter = function(e, state) {\n // First enter\n if (!$scope.entered) {\n $scope.entered = true;\n $scope.setParameters({\n showDefault: true,\n showBalance: true,\n minData: false\n });\n\n return $scope.load()\n .then(function() {\n UIUtils.loading.hide();\n if (!$scope.wallets) return; // user cancel, or error\n $scope.addListeners();\n $scope.showFab('fab-add-wallet');\n });\n }\n // If already enter\n else {\n // Re-add listeners\n $scope.addListeners();\n if ($scope.formData.stopped) {\n $scope.loading = false;\n $scope.formData.stopped = false;\n $scope.formData.updatingWalletId = undefined;\n $scope.updateView();\n }\n }\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.leave = function() {\n $scope.formData.stopped = true;\n $scope.formData.updatingWalletId = undefined;\n $scope.loading = false;\n $scope.removeListeners();\n };\n $scope.$on('$ionicView.leave', $scope.leave);\n\n $scope.cancel = function() {\n $scope.showHome();\n };\n\n $scope.select = function(event, wallet) {\n if (event.isDefaultPrevented() || !wallet || $scope.selectPrevented) return;\n if (wallet.isDefault()) {\n $state.go('app.view_wallet');\n }\n else {\n $state.go('app.view_wallet_by_id', {id: wallet.id});\n }\n event.preventDefault();\n };\n\n $scope.editWallet = function(event, wallet) {\n\n event.preventDefault();\n\n return $scope.showEditPopup(wallet)\n .then(function(newName) {\n if (!newName) return;\n\n // Auth (if encryption is need)\n return (csSettings.data.useLocalStorageEncryption ? csWallet.auth({minData: true}) : $q.when())\n\n // Save changes\n .then(function() {\n wallet.data.localName = newName;\n csWallet.storeData();\n UIUtils.loading.hide();\n $scope.updateView();\n })\n .catch(function(err) {\n if (err === 'CANCELLED') {\n return UIUtils.loading.hide();\n }\n UIUtils.onError('ERROR.SAVE_WALLET_LIST_FAILED')(err);\n });\n });\n };\n\n $scope.downloadAsFile = function() {\n if (!$scope.wallets) return; // user cancel\n return csWallet.children.downloadFile();\n };\n\n\n\n $scope.selectAndRemoveWallet = function() {\n $scope.hideActionsPopover();\n return Modals.showSelectWallet({\n wallets: $scope.wallets,\n showDefault: false\n })\n .then(function(wallet) {\n if (!wallet || !wallet.id) return; // User has cancelled\n\n // Auth (if encryption is need))\n return (csSettings.data.useLocalStorageEncryption ? csWallet.auth({minData: true}) : $q.when())\n\n // Remove the wallet\n .then(function() {\n return csWallet.children.remove(wallet.id);\n })\n // Refresh UI\n .then(function() {\n UIUtils.loading.hide();\n $scope.updateView();\n })\n .catch(UIUtils.onError('ERROR.REMOVE_SECONDARY_WALLET_FAILED'));\n });\n };\n\n $scope.showImportFileModal = function() {\n $scope.hideActionsPopover();\n\n var loginAndAddWallet = function(authData) {\n if (!authData || !authData.pubkey) return $q.reject('Invalid authentication data');\n console.debug(\"[wallet] Adding secondary wallet {\"+authData.pubkey.substring(0,8)+\"}\");\n var wallet = csWallet.children.instance();\n return wallet.login({\n authData: authData,\n // Load data options :\n minData: true,\n sources: true,\n api: false,\n success: UIUtils.loading.show\n })\n .then(function(walletData) {\n walletData.localName = authData.localName;\n return $scope.addNewWallet(wallet);\n });\n };\n\n return ModalUtils.show(\n 'templates/wallet/list/modal_import_file.html',\n 'WalletListImportModalCtrl'\n )\n .then(function(items){\n\n if (!items || !items.length) return; // User cancel\n\n UIUtils.loading.show();\n\n // Auth (if encryption is need)\n return (csSettings.data.useLocalStorageEncryption ? csWallet.auth({minData: true}) : $q.when())\n .then(function() {\n // Add wallet one after one\n return items.reduce(function(promise, authData){\n return promise.then(function() {\n return loginAndAddWallet(authData);\n });\n }, $q.when());\n })\n .then(function() {\n UIUtils.loading.hide();\n $scope.updateView();\n })\n .catch(function(err) {\n if (err === 'CANCELLED') {\n return UIUtils.loading.hide();\n }\n UIUtils.onError('ERROR.ADD_SECONDARY_WALLET_FAILED')(err);\n });\n });\n };\n\n /* -- popups -- */\n\n $scope.setEditForm = function(editForm) {\n $scope.editForm = editForm;\n };\n\n $scope.showEditPopup = function(wallet) {\n return $q(function(resolve, reject) {\n $translate(['ACCOUNT.WALLET_LIST.EDIT_POPOVER.TITLE', 'ACCOUNT.WALLET_LIST.EDIT_POPOVER.HELP', 'COMMON.BTN_OK', 'COMMON.BTN_CANCEL'])\n .then(function (translations) {\n $scope.formData.name = wallet.data.localName || wallet.data.name || wallet.data.uid || (wallet.data.pubkey && wallet.data.pubkey.substring(0, 8)) || '';\n\n // Choose UID popup\n $ionicPopup.show({\n templateUrl: 'templates/wallet/list/popup_edit_name.html',\n title: translations['ACCOUNT.WALLET_LIST.EDIT_POPOVER.TITLE'],\n subTitle: translations['ACCOUNT.WALLET_LIST.EDIT_POPOVER.HELP'],\n scope: $scope,\n buttons: [\n { text: translations['COMMON.BTN_CANCEL'] },\n {\n text: translations['COMMON.BTN_OK'],\n type: 'button-positive',\n onTap: function(e) {\n $scope.editForm.$submitted=true;\n if(!$scope.editForm.$valid || !$scope.formData.name) {\n //don't allow the user to close unless he enters a name\n e.preventDefault();\n } else {\n return $scope.formData.name;\n }\n }\n }\n ]\n })\n .then(function(name) {\n if (!name) { // user cancel\n delete $scope.formData.name;\n UIUtils.loading.hide();\n return;\n }\n resolve(name);\n });\n });\n });\n };\n\n /* -- popovers -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'templates/wallet/list/popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n\n /* -- listeners -- */\n\n // Clean controller data when logout\n $scope.onWalletLogout = function() {\n $scope.resetData();\n $scope.removeListeners();\n };\n\n $scope.addListeners = function() {\n\n // First remove lod listeners, if any\n $scope.removeListeners();\n\n $scope.listeners = [\n csWallet.api.data.on.logout($scope, $scope.onWalletLogout)\n ];\n\n // Auto-update on new block\n if (csSettings.data.walletHistoryAutoRefresh) {\n $scope.listeners.push(\n csCurrency.api.data.on.newBlock($scope, function (block) {\n if ($scope.loading) return;\n console.debug(\"[wallet-list] Received new block. Will reload list.\");\n $timeout(function () {\n $scope.doUpdate(true);\n }, 300/*waiting for node cache propagation*/);\n }));\n }\n\n // Listen auth events on each wallet\n _.forEach($scope.wallets||[], $scope.addListenersOnWallet);\n };\n\n $scope.addListenersOnWallet = function(wallet) {\n if (!wallet) return;\n $scope.listeners.push(wallet.api.data.on.unauth($scope, $scope.updateView));\n $scope.listeners.push(wallet.api.data.on.auth($scope, function (data, deferred) {\n $timeout($scope.updateView);\n return deferred ? deferred.resolve() : $q.when();\n }));\n };\n\n $scope.removeListeners = function() {\n _.forEach($scope.listeners, function(remove){\n remove();\n });\n $scope.listeners = [];\n };\n\n var inheritedUpdateView = $scope.updateView;\n $scope.updateView = function() {\n inheritedUpdateView();\n $scope.$broadcast('$$rebind::rebind'); // force rebind\n };\n\n var inheritedUpdateWalletView = $scope.updateWalletView;\n $scope.updateWalletView = function(walletId) {\n inheritedUpdateWalletView(walletId);\n $scope.$broadcast('$$rebind::rebind'); // force rebind\n };\n\n // Detect changes in settings useRelative\n $scope.$watch('settings.useRelative', function(newVal, oldVal) {\n if (!$scope.formData || $scope.loading || (newVal === oldVal)) return;\n $scope.formData.useRelative = csSettings.data.useRelative;\n $scope.updateView();\n }, true);\n}\n\n\nfunction WalletSelectPopoverController($scope, $controller, UIUtils, parameters) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('WalletListAbstractCtrl', {$scope: $scope}));\n\n // Disable list motion\n $scope.motion = null;\n\n $scope.$on('popover.shown', function() {\n if ($scope.loading) {\n $scope.setParameters(parameters);\n $scope.load();\n }\n });\n\n $scope.updateView = function() {\n if (!$scope.wallets || !$scope.wallets.length) return;\n\n UIUtils.ink({selector: '.popover-wallets .list .item'});\n $scope.$broadcast('$$rebind::rebind'); // force rebind\n };\n\n $scope.select = function(event, wallet) {\n if (event.isDefaultPrevented() || !wallet || $scope.selectPrevented) return; // no selection\n $scope.closePopover(wallet);\n };\n\n}\n\nfunction WalletListImportModalController($scope, $timeout, BMA, csWallet) {\n 'ngInject';\n\n $scope.hasContent = false;\n $scope.content = null;\n $scope.fileData = '';\n $scope.isValidFile = false;\n $scope.validatingFile = false;\n\n $scope.onFileChanged = function(file) {\n $scope.validatingFile = true;\n\n $scope.hasContent = angular.isDefined(file) && file !== '';\n $scope.fileData = file.fileData ? file.fileData : '';\n var isValidFile = $scope.fileData !== '' &&\n ($scope.fileData.type === 'text/csv' || $scope.fileData.type === 'text/plain' || 'application/vnd.ms-excel' /*fix issue #810*/);\n\n // Bad file type: invalid file\n if (!isValidFile) {\n console.error(\"[wallet] Import failed. Invalid file type: \" + $scope.fileData.type);\n $scope.isValidFile = false;\n $scope.validatingFile = false;\n return;\n }\n\n // Parse file\n console.debug(\"[wallet] Parsing file to import...\");\n var rows = file.fileContent.split('\\n');\n $scope.content = rows.reduce(function(res, row) {\n // Skip empty row\n if (!row || !row.trim().length) return res;\n\n // Split\n var cols = row.split('\\t', 3) || undefined;\n\n // Invalid column count: mark file as invalid\n if (cols && cols.length != 3) {\n console.debug(\"[wallet] Import: skip invalid row: \" + row);\n isValidFile = false;\n return res;\n }\n\n var item = {\n pubkey: cols[0],\n uid: cols[1],\n localName: cols[2]\n };\n\n // Check pubkey validity\n if (!BMA.regexp.PUBKEY.test(item.pubkey)) {\n console.debug(\"[wallet] Invalid pubkey, found in this row: \", row);\n isValidFile = false;\n return res;\n }\n\n // Ignore if same as current wallet\n if (csWallet.isUserPubkey(item.pubkey)) {\n console.debug(\"[wallet] Pubkey equals to main wallet. Skip this row: \", row);\n return res;\n }\n\n // Ignore if already in children wallet\n if (csWallet.children.hasPubkey(item.pubkey)) {\n console.debug(\"[wallet] Pubkey already in wallet list. Skip this row\", row);\n return res;\n }\n\n // OK: add it to result\n return res.concat(item);\n }, []);\n\n $scope.isValidFile = isValidFile;\n\n $timeout(function() {\n $scope.validatingFile = false;\n }, 250); // need to have a loading effect\n };\n\n $scope.removeFile = function() {\n $scope.hasContent = false;\n $scope.content = null;\n $scope.fileData = '';\n $scope.isValidFile = false;\n $scope.validatingFile = false;\n };\n}\n","\nWotLookupController.$inject = ['$scope', '$state', '$q', '$timeout', '$focus', '$location', '$ionicPopover', '$ionicHistory', 'UIUtils', 'csConfig', 'csCurrency', 'csSettings', 'Device', 'BMA', 'csWallet', 'csWot'];\nWotLookupModalController.$inject = ['$scope', '$controller', '$focus', 'csWallet', 'parameters'];\nWotIdentityAbstractController.$inject = ['$scope', '$rootScope', '$state', '$translate', '$ionicHistory', '$q', 'UIUtils', 'Modals', 'csConfig', 'csSettings', 'csCurrency', 'csWot', 'csWallet'];\nWotIdentityViewController.$inject = ['$scope', '$rootScope', '$controller', '$timeout', '$state', 'UIUtils', 'Modals', 'csWallet'];\nWotIdentityTxViewController.$inject = ['$scope', '$timeout', '$q', 'BMA', 'csSettings', 'csWot', 'csTx', 'UIUtils'];\nWotCertificationsViewController.$inject = ['$scope', '$rootScope', '$controller', 'csSettings', 'csWallet', 'UIUtils'];\nWotSelectPubkeyIdentityModalController.$inject = ['$scope', '$q', 'csWot', 'parameters'];angular.module('cesium.wot.controllers', ['cesium.services'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n $stateProvider\n\n .state('app.wot_lookup', {\n url: \"/wot\",\n abstract: true,\n enableBack: false, // Workaround need for navigation outside tabs (enableBack is forced to 'true' in ViewXXXCtrl)\n views: {\n 'menuContent': {\n templateUrl: \"templates/wot/lookup.html\"\n }\n }\n })\n\n .state('app.wot_lookup.tab_search', {\n url: \"/search?q&type&hash\",\n views: {\n 'tab': {\n templateUrl: \"templates/wot/tabs/tab_lookup.html\",\n controller: 'WotLookupCtrl'\n }\n },\n data: {\n silentLocationChange: true,\n large: 'app.wot_lookup_lg'\n }\n })\n\n .state('app.wot_lookup_lg', {\n url: \"/wot/lg?q&type&hash\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wot/lookup_lg.html\",\n controller: 'WotLookupCtrl'\n }\n },\n data: {\n silentLocationChange: true\n }\n })\n\n .state('app.wot_identity', {\n url: \"/wot/:pubkey/:uid?action&block\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wot/view_identity.html\",\n controller: 'WotIdentityViewCtrl'\n }\n }\n })\n\n .state('app.wot_identity_uid', {\n url: \"/lookup/:uid?action\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wot/view_identity.html\",\n controller: 'WotIdentityViewCtrl'\n }\n }\n })\n\n .state('app.wot_identity_tx_uid', {\n url: \"/wot/tx/:pubkey/:uid?action\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wot/view_identity_tx.html\",\n controller: 'WotIdentityTxViewCtrl'\n }\n }\n })\n\n .state('app.wot_cert', {\n url: \"/wot/:pubkey/:uid/:type?block\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wot/view_certifications.html\",\n controller: 'WotCertificationsViewCtrl'\n }\n },\n data: {\n large: 'app.wot_cert_lg'\n }\n })\n\n .state('app.wot_cert_lg', {\n url: \"/wot/cert/lg/:pubkey/:uid?block\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wot/view_certifications.html\",\n controller: 'WotCertificationsViewCtrl'\n }\n }\n })\n\n // wallet cert\n .state('app.wallet_cert', {\n url: \"/account/cert/:type\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wot/view_certifications.html\",\n controller: 'WotCertificationsViewCtrl'\n }\n },\n data: {\n large: 'app.wallet_cert_lg'\n }\n })\n\n .state('app.wallet_cert_lg', {\n url: \"/account/cert/lg\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wot/view_certifications.html\",\n controller: 'WotCertificationsViewCtrl'\n }\n }\n })\n\n // wallet cert\n .state('app.wallet_cert_by_id', {\n url: \"/wallets/:id/cert/:type\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wot/view_certifications.html\",\n controller: 'WotCertificationsViewCtrl'\n }\n },\n data: {\n large: 'app.wallet_cert_lg_by_id'\n }\n })\n\n .state('app.wallet_cert_lg_by_id', {\n url: \"/wallets/:id/cert/lg\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wot/view_certifications.html\",\n controller: 'WotCertificationsViewCtrl'\n }\n }\n })\n ;\n }])\n\n .controller('WotLookupCtrl', WotLookupController)\n\n .controller('WotLookupModalCtrl', WotLookupModalController)\n\n .controller('WotIdentityAbstractCtrl', WotIdentityAbstractController)\n\n .controller('WotIdentityViewCtrl', WotIdentityViewController)\n\n .controller('WotIdentityTxViewCtrl', WotIdentityTxViewController)\n\n .controller('WotCertificationsViewCtrl', WotCertificationsViewController)\n\n .controller('WotSelectPubkeyIdentityModalCtrl', WotSelectPubkeyIdentityModalController)\n\n;\n\nfunction WotLookupController($scope, $state, $q, $timeout, $focus, $location, $ionicPopover, $ionicHistory,\n UIUtils, csConfig, csCurrency, csSettings, Device, BMA, csWallet, csWot) {\n 'ngInject';\n\n var defaultSearchLimit = 10;\n\n $scope.search = {\n text: '',\n loading: true,\n type: null,\n results: []\n };\n $scope.entered = false;\n $scope.wotSearchTextId = 'wotSearchText';\n $scope.enableFilter = true;\n $scope.enableWallets = false;\n $scope.allowMultiple = false;\n $scope.selection = [];\n $scope.showResultLabel = true;\n $scope.parameters = {}; // override in the modal controller\n\n $scope.enter = function(e, state) {\n if (!$scope.entered) {\n var params = angular.merge({}, $scope.parameters, state && state.stateParams);\n if (params && params.q) { // Query parameter\n $scope.search.text = params.q;\n $timeout(function() {\n $scope.doSearch();\n }, 100);\n }\n else if (params && params.hash) { // hash tag parameter\n $scope.search.text = '#' + params.hash;\n $timeout(function() {\n $scope.doSearch();\n }, 100);\n }\n else {\n $timeout(function() {\n // Init phase\n if (csCurrency.data.initPhase && !params.type) {\n $scope.doGetPending(0, undefined, true/*skipLocationUpdate*/);\n }\n // get new comers\n else if (params.type == 'newcomers' || (!csConfig.initPhase && !params.type)) {\n $scope.doGetNewcomers(0, undefined, true/*skipLocationUpdate*/);\n }\n else if (params.type == 'pending') {\n $scope.doGetPending(0, undefined, true/*skipLocationUpdate*/);\n }\n else if (params.type == 'wallets') {\n $scope.doGetWallets(0, undefined, true/*skipLocationUpdate*/);\n }\n\n }, 100);\n }\n // removeIf(device)\n // Focus on search text (only if NOT device, to avoid keyboard opening)\n $focus($scope.wotSearchTextId);\n // endRemoveIf(device)\n\n $scope.entered = true;\n\n $timeout(UIUtils.ink, 100);\n\n $scope.showHelpTip();\n }\n else {\n\n $scope.updateLocationHref();\n if ($scope.search.results && $scope.search.results.length) {\n $scope.motion.show({selector: '.lookupForm .list .item', ink: true});\n }\n }\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.resetWotSearch = function() {\n $scope.search = {\n text: null,\n loading: false,\n type: 'newcomers',\n results: []\n };\n };\n\n $scope.updateLocationHref = function() {\n // removeIf(device)\n var stateParams = {\n q: undefined,\n hash: undefined,\n type: undefined\n };\n\n if ($scope.search.type === 'text') {\n var text = $scope.search.text.trim();\n if (text.match(/^#[\\wḡĞǦğàáâãäåçèéêëìíîïðòóôõöùúûüýÿ]+$/)) {\n stateParams.hash = text.substr(1);\n }\n else {\n stateParams.q = text;\n }\n }\n else if ($scope.search.type != 'last') {\n stateParams.type = $scope.search.type;\n }\n\n // Update location href\n $location.search(stateParams).replace();\n // endRemoveIf(device)\n };\n\n $scope.doSearchText = function() {\n\n $scope.doSearch();\n $scope.updateLocationHref();\n\n };\n\n $scope.doSearch = function() {\n var text = $scope.search.text.trim();\n if ((UIUtils.screen.isSmall() && text.length < 3) || !text.length) {\n $scope.search.results = undefined;\n $scope.search.type = 'none';\n $scope.search.total = undefined;\n return $q.when();\n }\n\n $scope.search.loading = true;\n $scope.search.type = 'text';\n return csWot.search(text)\n .then(function(idties){\n if ($scope.search.type != 'text') return; // could have change\n if ($scope.search.text.trim() !== text) return; // search text has changed before received response\n\n if ((!idties || !idties.length) && (BMA.regexp.PUBKEY.test(text) || BMA.regexp.PUBKEY_WITH_CHECKSUM.test(text))) {\n return BMA.uri.parse(text)\n .then(function(data) {\n $scope.doDisplayResult([data]);\n });\n }\n else {\n $scope.doDisplayResult(idties);\n\n // count, skipping divider\n var countBy = _.countBy(idties, function(hit) {\n return hit.divider && 'divider' || 'results';\n });\n $scope.search.total = countBy && countBy.results || 0;\n }\n })\n .catch(UIUtils.onError('ERROR.WOT_LOOKUP_FAILED'));\n };\n\n $scope.doGetNewcomers = function(offset, size, skipLocationUpdate) {\n offset = offset || 0;\n size = size || defaultSearchLimit;\n if (size < defaultSearchLimit) size = defaultSearchLimit;\n\n $scope.hideActionsPopover();\n $scope.search.loading = (offset === 0);\n $scope.search.type = 'newcomers';\n\n // Update location href\n if (!offset && !skipLocationUpdate) {\n $scope.updateLocationHref();\n }\n\n return csWot.newcomers(offset, size)\n .then(function(res){\n if ($scope.search.type !== 'newcomers') return false; // could have change\n $scope.doDisplayResult(res && res.hits, offset, size, res && res.total);\n return true;\n })\n .catch(function(err) {\n $scope.search.loading = false;\n $scope.search.results = (offset > 0) ? $scope.search.results : [];\n $scope.search.hasMore = false;\n $scope.search.total = undefined;\n UIUtils.onError('ERROR.LOAD_NEWCOMERS_FAILED')(err);\n });\n };\n\n $scope.doGetPending = function(offset, size, skipLocationUpdate) {\n offset = offset || 0;\n size = size || defaultSearchLimit;\n if (size < defaultSearchLimit) size = defaultSearchLimit;\n\n $scope.hideActionsPopover();\n $scope.search.loading = (offset === 0);\n $scope.search.type = 'pending';\n\n var searchFunction = csCurrency.data.initPhase ?\n csWot.all :\n csWot.pending;\n\n // Update location href\n if (!offset && !skipLocationUpdate) {\n $scope.updateLocationHref();\n }\n\n return searchFunction(offset, size)\n .then(function(res){\n if ($scope.search.type != 'pending') return false; // could have change\n $scope.doDisplayResult(res && res.hits, offset, size, res && res.total);\n // Always disable \"more\" on initphase\n $scope.search.hasMore = !csCurrency.data.initPhase && $scope.search.hasMore;\n return true;\n })\n .catch(function(err) {\n $scope.search.loading = false;\n $scope.search.results = (offset > 0) ? $scope.search.results : [];\n $scope.search.total = undefined;\n $scope.search.hasMore = false;\n UIUtils.onError('ERROR.LOAD_PENDING_FAILED')(err);\n });\n };\n\n $scope.doGetWallets = function(offset, size, skipLocationUpdate) {\n offset = offset || 0;\n size = size || defaultSearchLimit;\n if (size < defaultSearchLimit) size = defaultSearchLimit;\n\n $scope.hideActionsPopover();\n $scope.search.loading = (offset === 0);\n $scope.search.type = 'wallets';\n\n // Update location href\n if (!offset && !skipLocationUpdate) {\n $scope.updateLocationHref();\n }\n\n return csWallet.children.all()\n .then(function(children) {\n if (!children || $scope.search.type != 'wallets') return false; // could have change\n var res = [csWallet].concat(children).reduce(function(res, wallet, index) {\n var item = {\n id: index,\n pubkey: wallet.data.pubkey,\n uid: wallet.data.uid,\n name: wallet.data.localName || wallet.data.name,\n avatar: wallet.data.avatar\n };\n return res.concat(item);\n }, []);\n\n $scope.doDisplayResult(res, offset, size, res.length);\n $scope.search.hasMore = false;\n return true;\n });\n\n\n };\n\n $scope.showMore = function() {\n var offset = $scope.search.results ? $scope.search.results.length : 0;\n\n $scope.search.loadingMore = true;\n var searchFunction = ($scope.search.type == 'newcomers') ?\n $scope.doGetNewcomers :\n $scope.doGetPending;\n\n return searchFunction(offset)\n .then(function(ok) {\n if (ok) {\n $scope.search.loadingMore = false;\n $scope.$broadcast('scroll.infiniteScrollComplete');\n }\n })\n .catch(function(err) {\n console.error(err);\n $scope.search.loadingMore = false;\n $scope.search.hasMore = false;\n $scope.$broadcast('scroll.infiniteScrollComplete');\n });\n };\n\n $scope.select = function(item) {\n var state = item.state;\n\n // Identity\n if (!state && item.pubkey) {\n // identity = self -> open the user wallet\n state = csWallet.isUserPubkey(item.pubkey) ? 'app.view_wallet' : 'app.wot_identity';\n }\n\n if (state) {\n // Need to have a back button outside tabs\n $ionicHistory.nextViewOptions({\n historyRoot: false,\n disableAnimate: false,\n expire: 300\n });\n\n $state.go(state, item.stateParams||item);\n }\n };\n\n $scope.next = function() {\n // This method should be override by sub controller (e.g. modal controller)\n console.warn('Selected identities (should be override):', $scope.selection);\n };\n\n $scope.toggleCheck = function(index, e) {\n var identity = $scope.search.results[index];\n if (identity.checked) {\n $scope.addToSelection(identity);\n }\n else {\n $scope.removeSelection(identity, e);\n }\n };\n\n $scope.toggleSelect = function(identity){\n identity.selected = !identity.selected;\n };\n\n $scope.addToSelection = function(identity) {\n\n var copyIdty = angular.copy(identity);\n if (copyIdty.name) {\n copyIdty.name = copyIdty.name.replace('<em>', '').replace('</em>', ''); // remove highlight\n }\n\n $scope.selection.push(copyIdty);\n };\n\n $scope.removeSelection = function(identity, e) {\n\n // Remove from selection array\n var identityInSelection = _.findWhere($scope.selection, {id: identity.id});\n if (identityInSelection) {\n $scope.selection.splice($scope.selection.indexOf(identityInSelection), 1);\n }\n\n // Uncheck in result array, if exists\n if (!$scope.search.loading) {\n var existIdtyInResult = _.findWhere($scope.search.results, {id: identity.id});\n if (existIdtyInResult && existIdtyInResult.checked) {\n existIdtyInResult.checked = false;\n }\n }\n //e.preventDefault();\n };\n\n $scope.scanQrCode = function(){\n if (!Device.barcode.enable) {\n return;\n }\n Device.barcode.scan()\n .then(function(result) {\n if (!result) {\n return;\n }\n BMA.uri.parse(result)\n .then(function(obj){\n if (obj.pubkey) {\n $scope.search.text = obj.pubkey;\n }\n else if (result.uid) {\n $scope.search.text = obj.uid;\n }\n else {\n $scope.search.text = result;\n }\n $scope.doSearch();\n });\n })\n .catch(UIUtils.onError('ERROR.SCAN_FAILED'));\n };\n\n // Show help tip (show only not already shown)\n $scope.showHelpTip = function(index) {\n if (!$scope.isLogin()) return;\n index = angular.isDefined(index) ? index : csSettings.data.helptip.wotLookup;\n if (index < 0) return;\n if (index === 0) index = 1; // skip first step\n\n // Create a new scope for the tour controller\n var helptipScope = $scope.createHelptipScope();\n if (!helptipScope) return; // could be undefined, if a global tour already is already started\n\n return helptipScope.startWotLookupTour(index, false)\n .then(function(endIndex) {\n helptipScope.$destroy();\n csSettings.data.helptip.wotLookup = endIndex;\n csSettings.store();\n });\n };\n\n $scope.doDisplayResult = function(res, offset, size, total) {\n res = res || [];\n\n // pre-check result if already in selection\n if ($scope.allowMultiple && res.length && $scope.selection.length) {\n _.forEach($scope.selection, function(identity) {\n var identityInRes = _.findWhere(res, {id: identity.id});\n if (identityInRes) {\n identityInRes.checked = true;\n }\n });\n }\n\n if (!offset) {\n $scope.search.results = res || [];\n }\n else {\n $scope.search.results = $scope.search.results.concat(res);\n }\n $scope.search.total = angular.isDefined(total) ? total : undefined;\n $scope.search.loading = false;\n $scope.search.hasMore = $scope.search.results.length >= offset + size;\n\n $scope.smallscreen = UIUtils.screen.isSmall();\n\n if (!$scope.search.results.length) return;\n\n // Motion\n if (res.length > 0 && $scope.motion) {\n $scope.motion.show({selector: '.lookupForm .list .item', ink: true});\n }\n };\n\n /* -- show/hide popup -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'templates/wot/lookup_popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n}\n\nfunction WotLookupModalController($scope, $controller, $focus, csWallet, parameters){\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('WotLookupCtrl', {$scope: $scope}));\n\n parameters = parameters || {};\n $scope.search.loading = false;\n $scope.enableFilter = angular.isDefined(parameters.enableFilter) ? parameters.enableFilter : false;\n $scope.enableWallets = angular.isDefined(parameters.enableWallets) ? (csWallet.isLogin() && csWallet.children.count() && parameters.enableWallets) : false;\n $scope.allowMultiple = angular.isDefined(parameters.allowMultiple) ? parameters.allowMultiple : false;\n $scope.parameters = parameters;\n $scope.showResultLabel = false;\n\n $scope.wotSearchTextId = 'wotSearchTextModal';\n\n if ($scope.allowMultiple && parameters.selection) {\n $scope.selection = parameters.selection;\n }\n\n var superEnter = $scope.enter;\n $scope.enter = function(e) {\n if ($scope.parameters && $scope.parameters.q) {\n $scope.search.text=$scope.parameters.q;\n if ($scope.parameters.q.trim().length > 2) {\n superEnter(e); // call enter, that launch the search\n }\n }\n };\n $scope.$on('modal.shown', $scope.enter);\n\n $scope.cancel = function(){\n $scope.closeModal();\n };\n\n $scope.select = function(identity){\n $scope.closeModal({\n pubkey: identity.pubkey,\n uid: identity.uid,\n name: identity.name && identity.name.replace(/<\\/?em>/ig, '')\n });\n };\n\n $scope.next = function() {\n $scope.closeModal($scope.selection);\n };\n\n $scope.updateLocationHref = function() {\n // Do NOT change location href\n };\n\n $scope.showHelpTip = function() {\n // silent\n };\n\n // removeIf(device)\n // Focus on search text (only if NOT device, to avoid keyboard opening)\n $focus($scope.wotSearchTextId);\n // endRemoveIf(device)\n}\n\n/**\n * Abtract controller that load identity, that expose some useful methods in $scope, like 'certify()'\n * @param $scope\n * @param $state\n * @param $timeout\n * @param UIUtils\n * @param Modals\n * @param csConfig\n * @param csWot\n * @param csWallet\n * @constructor\n */\nfunction WotIdentityAbstractController($scope, $rootScope, $state, $translate, $ionicHistory, $q,\n UIUtils, Modals, csConfig, csSettings, csCurrency, csWot, csWallet) {\n 'ngInject';\n\n $scope.formData = {\n hasSelf: true\n };\n $scope.disableCertifyButton = true;\n $scope.loading = true;\n\n $scope.$on('$ionicView.beforeEnter', function (event, viewData) {\n // Enable back button (workaround need for navigation outside tabs - https://stackoverflow.com/a/35064602)\n viewData.enableBack = UIUtils.screen.isSmall() ? true : viewData.enableBack;\n });\n\n $scope.load = function(pubkey, uid, options) {\n return csWot.load(pubkey, uid, options)\n .then(function(identity){\n if (!identity) return UIUtils.onError('ERROR.IDENTITY_NOT_FOUND')().then($scope.showHome);\n $scope.formData = identity;\n var isLogin = csWallet.isLogin();\n $scope.revoked = identity.requirements && (identity.requirements.revoked || identity.requirements.pendingRevocation);\n $scope.canCertify = identity.hasSelf && !$scope.revoked && (!isLogin || !csWallet.isUserPubkey(pubkey) || csWallet.children.count() > 0);\n $scope.canSelectAndCertify = identity.hasSelf && (csWallet.isUserPubkey(pubkey) || csWallet.children.hasPubkey(pubkey));\n var cert = isLogin && _.find((identity.received_cert||[]).concat(identity.received_cert_pending||[]), function (cert) {\n return cert.pubkey === csWallet.data.pubkey && cert.valid && cert.expiresIn > csSettings.data.timeWarningExpire;\n });\n $scope.alreadyCertified = (!$scope.canCertify || !isLogin || csWallet.children.count() > 0) ? false : !!cert;\n $scope.disableCertifyButton = $scope.alreadyCertified || $scope.revoked;\n $scope.loading = false;\n })\n .catch(function(err) {\n $scope.loading = false;\n UIUtils.onError('ERROR.LOAD_IDENTITY_FAILED')(err);\n });\n };\n\n\n $scope.doUpdate = function(silent) {\n if (!silent) {\n $scope.loading = true;\n UIUtils.loading.show();\n }\n var options = {\n cache: false, // No cache\n blockUid: $scope.formData.blockUid || undefined\n };\n return $scope.load($scope.formData.pubkey, $scope.formData.uid, options)\n .then(UIUtils.loading.hide);\n };\n\n // Certify the current identity\n $scope.certify = function() {\n\n // Select wallet, if many\n return (csWallet.children.count() ? Modals.showSelectWallet({displayBalance: false}) : $q.when(csWallet))\n .then(function(wallet) {\n if (!wallet) return; // user cancelled\n\n // Need user auth - fix #513\n return wallet.auth({minData: true})\n .then(function(walletData) {\n UIUtils.loading.hide();\n\n if (!csCurrency.data.initPhase && !walletData.isMember) {\n UIUtils.alert.error(walletData.requirements.needSelf ?\n 'ERROR.NEED_MEMBER_ACCOUNT_TO_CERTIFY' : 'ERROR.NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF');\n return;\n }\n\n if (!csCurrency.data.initPhase && !$scope.formData.hasSelf) {\n UIUtils.alert.error('ERROR.IDENTITY_TO_CERTIFY_HAS_NO_SELF');\n return;\n }\n\n // Check identity not expired\n if ($scope.formData.requirements.expired) {\n UIUtils.alert.error('ERROR.IDENTITY_EXPIRED');\n return;\n }\n\n // Check not already certified\n var previousCert = _.find($scope.formData.received_cert, function(cert) {\n return cert.pubkey === wallet.data.pubkey && cert.valid && cert.expiresIn > csSettings.data.timeWarningExpire;\n });\n if (previousCert) {\n $translate('ERROR.IDENTITY_ALREADY_CERTIFY', previousCert)\n .then(function(message) {\n UIUtils.alert.error(message, 'ERROR.UNABLE_TO_CERTIFY_TITLE');\n });\n return;\n }\n\n // Check no pending certification\n previousCert = _.findWhere($scope.formData.received_cert_pending, { pubkey: wallet.data.pubkey, valid: true});\n if (previousCert) {\n $translate('ERROR.IDENTITY_ALREADY_CERTIFY_PENDING', previousCert)\n .then(function(message) {\n UIUtils.alert.error(message, 'ERROR.UNABLE_TO_CERTIFY_TITLE');\n });\n return;\n }\n\n UIUtils.alert.confirm('CONFIRM.CERTIFY_RULES', 'CONFIRM.POPUP_SECURITY_WARNING_TITLE', {\n cssClass: 'warning',\n okText: 'WOT.BTN_YES_CERTIFY',\n okType: 'button-assertive'\n })\n .then(function(confirm){\n if (!confirm) {\n return;\n }\n UIUtils.loading.show();\n wallet.certify($scope.formData.uid,\n $scope.formData.pubkey,\n $scope.formData.blockUid || ($scope.formData.requirements && $scope.formData.requirements.meta && $scope.formData.requirements.meta.timestamp),\n $scope.formData.requirements && $scope.formData.requirements.meta && $scope.formData.requirements.meta.sig,\n $scope.formData.isMember,\n $scope.formData.wasMember)\n .then(function(cert) {\n UIUtils.loading.hide();\n if (cert) {\n $scope.prepareNewCert(wallet, cert);\n $scope.alreadyCertified = true;\n UIUtils.toast.show('INFO.CERTIFICATION_DONE');\n $scope.formData.received_cert_pending.unshift(cert);\n $scope.formData.requirements.pendingCertificationCount++;\n $scope.doMotion();\n }\n })\n .catch(UIUtils.onError('ERROR.SEND_CERTIFICATION_FAILED'));\n });\n })\n .catch(function(err) {\n if (err === 'CANCELLED') return;\n UIUtils.onError('ERROR.LOGIN_FAILED')(err);\n });\n });\n };\n\n // Select an identity and certify\n $scope.selectAndCertify = function() {\n\n // Select wallet, if many\n return (csWallet.children.count() ? Modals.showSelectWallet({displayBalance: false}) : $q.when(csWallet))\n .then(function(wallet) {\n // Need user auth - fix #513\n return wallet.auth({minData: true})\n .then(function (walletData) {\n if (!csCurrency.data.initPhase && !walletData.isMember) {\n UIUtils.alert.error(walletData.requirements.needSelf || walletData.requirements.needMembership ?\n 'ERROR.NEED_MEMBER_ACCOUNT_TO_CERTIFY' : 'ERROR.NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF');\n return;\n }\n UIUtils.loading.hide();\n // Open Wot lookup modal\n return Modals.showWotLookup();\n })\n .then(function (idty) {\n if (!idty || !idty.pubkey) {\n return; // cancelled\n }\n if (!idty.uid) { // not a member\n UIUtils.alert.error('ERROR.IDENTITY_TO_CERTIFY_HAS_NO_SELF');\n return;\n }\n\n UIUtils.loading.show();\n\n var options = {cache: false, blockUid: idty.blockUid};\n\n // load selected identity\n return csWot.load(idty.pubkey, idty.uid, options);\n })\n\n .then(function (identity) {\n if (!identity) return; // cancelled\n UIUtils.loading.hide();\n if (!identity || !identity.hasSelf) {\n UIUtils.alert.error('ERROR.IDENTITY_TO_CERTIFY_HAS_NO_SELF');\n return;\n }\n\n // Check identity not expired\n if (identity.requirements.expired) {\n UIUtils.alert.error('ERROR.IDENTITY_EXPIRED');\n return;\n }\n\n // Check not already certified\n var previousCert = _.findWhere(identity.received_cert, {pubkey: wallet.data.pubkey, valid: true});\n if (previousCert) {\n $translate('ERROR.IDENTITY_ALREADY_CERTIFY', previousCert)\n .then(function (message) {\n UIUtils.alert.error(message, 'ERROR.UNABLE_TO_CERTIFY_TITLE');\n });\n return;\n }\n\n // Check not pending certification\n previousCert = _.findWhere(identity.received_cert_pending, {pubkey: wallet.data.pubkey, valid: true});\n if (previousCert) {\n $translate('ERROR.IDENTITY_ALREADY_CERTIFY_PENDING', previousCert)\n .then(function (message) {\n UIUtils.alert.error(message, 'ERROR.UNABLE_TO_CERTIFY_TITLE');\n });\n return;\n }\n\n // Ask confirmation\n $translate('CONFIRM.CERTIFY_RULES_TITLE_UID', {uid: identity.uid})\n .then(function (confirmTitle) {\n return UIUtils.alert.confirm('CONFIRM.CERTIFY_RULES', confirmTitle);\n })\n .then(function (confirm) {\n if (!confirm) {\n return;\n }\n UIUtils.loading.show();\n\n // Send certification\n wallet.certify(identity.uid,\n identity.pubkey,\n identity.blockUid || (identity.requirements && identity.requirements.meta && identity.requirements.meta.timestamp),\n identity.requirements && identity.requirements.meta && identity.requirements.meta.sig,\n identity.isMember,\n identity.wasMember)\n .then(function (cert) {\n UIUtils.loading.hide();\n if (!cert) return;\n return csWot.extendAll([cert], 'pubkey')\n .then(function () {\n UIUtils.toast.show('INFO.CERTIFICATION_DONE');\n $scope.formData.given_cert_pending.unshift(cert);\n $scope.doMotion();\n });\n })\n .catch(UIUtils.onError('ERROR.SEND_CERTIFICATION_FAILED'));\n });\n })\n .catch(function (err) {\n if (err === 'CANCELLED') return;\n UIUtils.onError('ERROR.LOAD_IDENTITY_FAILED')(err);\n });\n });\n };\n\n // Add wallet's data to a new cert\n $scope.prepareNewCert = function(wallet, cert) {\n cert.uid = wallet.data.uid;\n cert.pubkey = wallet.data.pubkey;\n cert.isMember = wallet.data.isMember;\n cert.avatar = wallet.data.avatar;\n cert.name = wallet.data.name;\n };\n\n $scope.removeActionParamInLocationHref = function(state) {\n if (!state || !state.stateParams || !state.stateParams.action) return;\n\n var stateParams = angular.copy(state.stateParams);\n\n // Reset action param\n stateParams.action = null;\n\n // Update location href\n $ionicHistory.nextViewOptions({\n disableAnimate: true,\n disableBack: false,\n historyRoot: false\n });\n $state.go(state.stateName, stateParams,\n {\n reload: false,\n inherit: true,\n notify: false\n });\n };\n\n $scope.doAction = function(action, options) {\n if (action == 'certify') {\n return $scope.certify();\n }\n if (action == 'transfer') {\n $scope.showTransferModal(options);\n }\n };\n\n /* -- open screens -- */\n\n $scope.showCertifications = function() {\n var block = $scope.formData.requirements && $scope.formData.requirements.alternatives && $scope.formData.blockUid || undefined;\n // Warn: do not use a simple link here (a ng-click is mandatory for help tour)\n if (UIUtils.screen.isSmall() ) {\n $state.go('app.wot_cert', {\n pubkey: $scope.formData.pubkey,\n uid: $scope.formData.uid,\n type: 'received',\n block: block\n });\n }\n else {\n $state.go('app.wot_cert_lg', {\n pubkey: $scope.formData.pubkey,\n uid: $scope.formData.uid,\n block: block\n });\n }\n };\n\n $scope.showGivenCertifications = function() {\n var block = $scope.formData.requirements && $scope.formData.requirements.alternatives && $scope.formData.blockUid || undefined;\n // Warn: do not use a simple link here (a ng-click is mandatory for help tour)\n if (UIUtils.screen.isSmall() ) {\n $state.go('app.wot_cert', {\n pubkey: $scope.formData.pubkey,\n uid: $scope.formData.uid,\n type: 'given',\n block: block\n });\n }\n else {\n $state.go('app.wot_cert_lg', {\n pubkey: $scope.formData.pubkey,\n uid: $scope.formData.uid,\n block: block\n });\n }\n };\n\n $scope.showSharePopover = function(event) {\n var title = $scope.formData.name || $scope.formData.uid || $scope.formData.pubkey;\n // Use shareBasePath (fix #530) or rootPath (fix #390)\n var url = (csConfig.shareBaseUrl || $rootScope.rootPath) + $state.href('app.wot_identity', {pubkey: $scope.formData.pubkey, uid: $scope.formData.uid});\n // Override default position, is small screen - fix #545\n if (UIUtils.screen.isSmall()) {\n event = angular.element(document.querySelector('#wot-share-anchor-'+$scope.formData.pubkey)) || event;\n }\n UIUtils.popover.share(event, {\n bindings: {\n url: url,\n titleKey: 'WOT.VIEW.POPOVER_SHARE_TITLE',\n titleValues: {title: title},\n postMessage: title\n }\n });\n };\n}\n\n/**\n * Identity view controller - should extend WotIdentityAbstractCtrl\n */\nfunction WotIdentityViewController($scope, $rootScope, $controller, $timeout, $state, UIUtils, Modals, csWallet) {\n 'ngInject';\n // Initialize the super class and extend it.\n angular.extend(this, $controller('WotIdentityAbstractCtrl', {$scope: $scope}));\n\n $scope.motion = UIUtils.motion.fadeSlideInRight;\n $scope.qrcodeId = 'qrcode-wot-' + $scope.$id;\n\n // Init likes here, to be able to use in extension\n $scope.options = $scope.options || {};\n $scope.options.like = {\n kinds: ['LIKE', 'ABUSE'],\n index: 'user',\n type: 'profile'\n };\n $scope.likeData = {\n likes: {},\n abuses: {}\n };\n\n $scope.$on('$ionicView.enter', function(e, state) {\n\n var onLoadSuccess = function() {\n $scope.doMotion();\n if (state.stateParams && state.stateParams.action) {\n $timeout(function() {\n $scope.doAction(state.stateParams.action.trim());\n }, 100);\n\n $scope.removeActionParamInLocationHref(state);\n\n // Need by like controller\n $scope.likeData.id = $scope.formData.pubkey;\n }\n\n $scope.showQRCode();\n };\n var options = {\n cache: true,\n blockUid: state.stateParams && state.stateParams.block || undefined\n };\n\n if (state.stateParams &&\n state.stateParams.pubkey &&\n state.stateParams.pubkey.trim().length > 0) {\n if ($scope.loading) { // load once\n\n return $scope.load(state.stateParams.pubkey.trim(), state.stateParams.uid, options)\n .then(onLoadSuccess)\n .catch(UIUtils.onError(\"ERROR.LOAD_IDENTITY_FAILED\"));\n }\n }\n\n else if (state.stateParams &&\n state.stateParams.uid &&\n state.stateParams.uid.trim().length > 0) {\n if ($scope.loading) { // load once\n return $scope.load(null, state.stateParams.uid, options)\n .then(onLoadSuccess);\n }\n }\n\n // Redirect to home\n else {\n $scope.showHome();\n }\n\n });\n\n $scope.doMotion = function() {\n $scope.motion.show({selector: '.view-identity .list .item'});\n\n // Transfer button\n $scope.showFab('fab-transfer');\n\n // Certify button\n if (($scope.canCertify && !$scope.alreadyCertified) || $rootScope.tour) {\n $scope.showFab('fab-certify-' + $scope.formData.uid);\n }\n\n $scope.$broadcast('$csExtension.motion');\n };\n\n $scope.doQuickFix = function(event) {\n if (event === 'showSelectIdentities') {\n return $scope.showSelectIdentities();\n }\n };\n\n $scope.showSelectIdentities = function() {\n if (!$scope.formData.requirements || !$scope.formData.requirements.alternatives) return;\n\n return Modals.showSelectPubkeyIdentity({\n identities: [$scope.formData.requirements].concat($scope.formData.requirements.alternatives)\n })\n .then(function(res) {\n if (!res || !res.pubkey) return; // Skip if cancelled\n // open the identity\n return $state.go('app.wot_identity', {\n pubkey: res.pubkey,\n uid: res.uid,\n block: res.meta && res.meta.timestamp || res.blockUid\n });\n });\n };\n\n $scope.showQRCode = function(timeout) {\n if (!$scope.qrcodeId || !$scope.formData.pubkey) return; // Skip\n\n // Get the DIV element\n var element = angular.element(document.querySelector('#' + $scope.qrcodeId + ' .content'));\n if (!element) {\n console.error(\"[wot-controller] Cannot found div #{0} for the QRCode. Skipping.\".format($scope.qrcodeId));\n return;\n }\n\n console.debug(\"[wot-controller] Generating QR code for identity...\");\n $timeout(function() {\n var svg = UIUtils.qrcode.svg($scope.formData.pubkey);\n element.html(svg);\n UIUtils.motion.toggleOn({selector: '#'+$scope.qrcodeId}, timeout || 1100);\n });\n };\n\n $scope.hideQRCode = function() {\n if (!$scope.qrcodeId) return;\n var element = angular.element(document.querySelector('#' + $scope.qrcodeId));\n if (element) {\n UIUtils.motion.toggleOff({selector: '#'+$scope.qrcodeId});\n }\n };\n}\n\n/**\n * Identity tx view controller\n */\nfunction WotIdentityTxViewController($scope, $timeout, $q, BMA, csSettings, csWot, csTx, UIUtils) {\n 'ngInject';\n\n $scope.formData= {};\n $scope.loading = true;\n $scope.motion = UIUtils.motion.fadeSlideInRight;\n\n $scope.$on('$ionicView.enter', function(e, state) {\n if ($scope.loading) {\n $scope.pubkey = state.stateParams.pubkey;\n $scope.uid = state.stateParams.uid;\n $scope.load();\n }\n else {\n // update view\n $scope.updateView();\n }\n });\n\n // Load data\n $scope.load = function(fromTime) {\n return $q.all([\n csWot.extend({pubkey: $scope.pubkey}),\n csTx.load($scope.pubkey, fromTime)\n ])\n .then(function(res) {\n $scope.formData = angular.merge(res[0], res[1]);\n $scope.loading = false;\n $scope.updateView();\n });\n };\n\n // Updating data\n $scope.doUpdate = function(silent) {\n console.debug('[wot] TX history reloading...');\n $scope.formData = {};\n return (silent ?\n $scope.load() :\n UIUtils.loading.show()\n .then($scope.load)\n .then(UIUtils.loading.hide)\n )\n .then($scope.updateView)\n .catch(UIUtils.onError('ERROR.IDENTITY_TX_FAILED'));\n };\n\n // Update view\n $scope.updateView = function() {\n $scope.$broadcast('$$rebind::balance'); // force rebind balance\n $scope.$broadcast('$$rebind::rebind'); // force rebind\n $scope.motion.show();\n };\n\n $scope.downloadHistoryFile = function(options) {\n options = options || {};\n options.fromTime = options.fromTime || -1; // default: full history\n csTx.downloadHistoryFile($scope.pubkey, options);\n };\n\n $scope.showMoreTx = function(fromTime) {\n\n fromTime = fromTime ||\n ($scope.formData.tx.fromTime - csSettings.data.walletHistoryTimeSecond) ||\n (moment().utc().unix() - 2 * csSettings.data.walletHistoryTimeSecond);\n\n UIUtils.loading.show();\n return csTx.load($scope.pubkey, fromTime)\n .then(function(res) {\n angular.merge($scope.formData, res);\n $scope.updateView();\n UIUtils.loading.hide();\n })\n .catch(function(err) {\n // If http rest limitation: wait then retry\n if (err.ucode == BMA.errorCodes.HTTP_LIMITATION) {\n $timeout(function() {\n return $scope.showMoreTx(fromTime);\n }, 2000);\n }\n else {\n UIUtils.onError('ERROR.IDENTITY_TX_FAILED')(err);\n }\n });\n };\n\n}\n\n\n/**\n * Certifications controller - extend WotIdentityAbstractCtrl\n */\nfunction WotCertificationsViewController($scope, $rootScope, $controller, csSettings, csWallet, UIUtils) {\n 'ngInject';\n\n var wallet;\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('WotIdentityAbstractCtrl', {$scope: $scope}));\n\n // Values overwritten in tab controller (for small screen)\n $scope.motions = {\n receivedCertifications: angular.copy(UIUtils.motion.fadeSlideIn),\n givenCertifications: angular.copy(UIUtils.motion.fadeSlideInRight),\n avatar: angular.copy(UIUtils.motion.fadeIn),\n };\n $scope.motions.receivedCertifications.enable = true;\n $scope.motions.givenCertifications.enable = true;\n $scope.motions.avatar.enable = true;\n\n $scope.$on('$ionicView.enter', function(e, state) {\n if (state.stateParams && state.stateParams.type) {\n $scope.motions.receivedCertifications.enable = (state.stateParams.type != 'given');\n $scope.motions.givenCertifications.enable = (state.stateParams.type == 'given');\n $scope.motions.avatar.enable = false;\n }\n\n // First load\n if ($scope.loading) {\n var options = {\n cache: true,\n blockUid: state.stateParams && state.stateParams.block || undefined\n };\n\n if (state.stateParams &&\n state.stateParams.pubkey &&\n state.stateParams.pubkey.trim().length > 0) {\n\n return $scope.load(state.stateParams.pubkey.trim(), state.stateParams.uid, options)\n .then(function () {\n $scope.doMotion();\n $scope.showHelpTip();\n });\n }\n\n else {\n wallet = (state.stateParams && state.stateParams.id) ? csWallet.children.get(state.stateParams.id) : csWallet;\n if (!wallet) {\n UIUtils.alert.error('ERROR.UNKNOWN_WALLET_ID');\n return $scope.showHome();\n }\n if (!wallet.isLogin()) {\n return $scope.showHome();\n }\n return $scope.load(wallet.data.pubkey, wallet.data.uid, options)\n .then(function () {\n $scope.doMotion();\n $scope.showHelpTip();\n });\n }\n }\n\n else {\n $scope.doMotion();\n }\n });\n\n $scope.$on('$ionicView.leave', function() {\n $scope.loading = true;\n });\n\n // Updating data\n $scope.doUpdate = function() {\n var options = {\n cache: false, // No cache\n blockUid: $scope.formData.blockUid || undefined\n };\n return $scope.load($scope.formData.pubkey, $scope.formData.uid, options)\n .then(function() {\n $scope.doMotion();\n $scope.showHelpTip();\n });\n };\n\n $scope.doMotion = function(skipItems) {\n\n // Motions received certifications part\n $scope.doMotionReceivedCertifications(0, skipItems);\n\n // Motion on avatar part\n if ($scope.motions.avatar.enable) {\n $scope.motions.avatar.show({selector: '.col-avatar .' + $scope.motions.avatar.ionListClass});\n }\n\n // Motion on given certification part\n $scope.doMotionGivenCertifications($scope.motions.receivedCertifications.enable ? 100 : 10, skipItems);\n };\n\n // Effects on received certifcations\n $scope.doMotionReceivedCertifications = function(timeout, skipItems) {\n if ($scope.motions.receivedCertifications.enable) {\n if (!skipItems) {\n $scope.motions.receivedCertifications.show({selector: '.list.certifications .item', timeout: timeout});\n }\n\n // Fab button\n if (($scope.canCertify && !$scope.alreadyCertified) || $rootScope.tour) {\n $scope.showFab('fab-certify', timeout);\n }\n }\n // If not enable, make sure to hide fab button\n else {\n // Hide fab button\n if ($scope.canCertify || $rootScope.tour) {\n $scope.hideFab('fab-certify', 0);\n }\n }\n };\n\n // Effects on given certifcations\n $scope.doMotionGivenCertifications = function(timeout, skipItems) {\n\n if ($scope.motions.givenCertifications.enable) {\n if (!skipItems) {\n $scope.motions.givenCertifications.show({selector: '.list.given-certifications .item', timeout: timeout});\n }\n // Fab button\n if ($scope.canSelectAndCertify || $rootScope.tour) {\n $scope.showFab('fab-select-certify');\n }\n }\n\n // If not enable, make sure to hide fab button\n else {\n // Hide fab button\n if ($scope.canSelectAndCertify || $rootScope.tour) {\n $scope.hideFab('fab-select-certify', 0);\n }\n }\n };\n\n // Show help tip\n $scope.showHelpTip = function() {\n if (!$scope.isLogin()) return;\n if (!csSettings.data.helptip.enable) return;\n\n // Create a new scope for the tour controller\n var helptipScope = $scope.createHelptipScope();\n if (!helptipScope) return; // could be undefined, if a global tour already is already started\n\n var isWallet = csWallet.isUserPubkey($scope.formData.pubkey);\n var index = isWallet ? csSettings.data.helptip.walletCerts : csSettings.data.helptip.wotCerts;\n if (index < 0) return;\n\n var startFunc = isWallet ?\n helptipScope.startWalletCertTour(index, false) :\n helptipScope.startWotCertTour(index, false);\n\n return startFunc.then(function(endIndex) {\n helptipScope.$destroy();\n if (isWallet) {\n csSettings.data.helptip.walletCerts = endIndex;\n }\n else {\n csSettings.data.helptip.wotCerts = endIndex;\n }\n csSettings.store();\n });\n };\n}\n\n\n/**\n * Select identities from a pubkey (useful when many self on the same pubkey)\n * @param $scope\n * @param $q\n * @param csWot\n * @param parameters\n * @constructor\n */\nfunction WotSelectPubkeyIdentityModalController($scope, $q, csWot, parameters) {\n\n $scope.loading = true;\n\n $scope.load = function() {\n // If list of identities given by parameters: use it\n if (parameters && parameters.identities) {\n $scope.identities = parameters.identities;\n $scope.pubkey = $scope.identities[0].pubkey;\n $scope.loading = false;\n return $q.when();\n }\n\n // Or load from pubkey\n $scope.pubkey = parameters && parameters.pubkey;\n if (!pubkey) {\n return $q.reject('Missing parameters: [pubkey] or [identities]');\n }\n\n return csWot.loadRequirements({pubkey: pubkey, uid: uid})\n .then(function(data) {\n if (data && data.requirements) {\n $scope.identities = data.requirements;\n if (data.requirements.alternatives) {\n $scope.identities = [data.requirements].concat(data.requirements.alternatives);\n }\n else {\n $scope.identities = [data.requirements];\n }\n }\n $scope.loading = false;\n });\n };\n $scope.$on('modal.shown', $scope.load);\n}\n","\nNetworkLookupController.$inject = ['$scope', '$state', '$location', '$ionicPopover', '$window', '$translate', 'BMA', 'UIUtils', 'csConfig', 'csSettings', 'csCurrency', 'csNetwork', 'csWot'];\nPeerViewController.$inject = ['$scope', '$q', '$window', '$state', 'UIUtils', 'csWot', 'BMA'];\nNetworkLookupModalController.$inject = ['$scope', '$controller', 'parameters'];\nNetworkLookupPopoverController.$inject = ['$scope', '$controller'];\nPeerInfoPopoverController.$inject = ['$scope', '$q', 'csSettings', 'csCurrency', 'csHttp', 'BMA'];\nangular.module('cesium.network.controllers', ['cesium.services'])\n\n.config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n\n .state('app.network', {\n url: \"/network?type&expert\",\n cache: false, // fix #766\n views: {\n 'menuContent': {\n templateUrl: \"templates/network/view_network.html\",\n controller: 'NetworkLookupCtrl'\n }\n },\n data: {\n silentLocationChange: true\n }\n })\n\n .state('app.view_peer', {\n url: \"/network/peer/:server?ssl&tor\",\n cache: false,\n views: {\n 'menuContent': {\n templateUrl: \"templates/network/view_peer.html\",\n controller: 'PeerViewCtrl'\n }\n },\n data: {\n preferHttp: true // avoid HTTPS if config has httpsMode=clever\n }\n });\n}])\n\n.controller('NetworkLookupCtrl', NetworkLookupController)\n\n.controller('PeerViewCtrl', PeerViewController)\n\n.controller('NetworkLookupModalCtrl', NetworkLookupModalController)\n\n.controller('NetworkLookupPopoverCtrl', NetworkLookupPopoverController)\n\n.controller('PeerInfoPopoverCtrl', PeerInfoPopoverController)\n\n;\n\nfunction NetworkLookupController($scope, $state, $location, $ionicPopover, $window, $translate,\n BMA, UIUtils, csConfig, csSettings, csCurrency, csNetwork, csWot) {\n 'ngInject';\n\n $scope.networkStarted = false;\n $scope.ionItemClass = '';\n $scope.expertMode = csSettings.data.expertMode && !UIUtils.screen.isSmall();\n $scope.isHttps = ($window.location.protocol === 'https:');\n $scope.search = {\n text: '',\n loading: true,\n type: undefined,\n results: [],\n endpoint: null,\n bma: undefined,\n ssl: undefined,\n ws2p: undefined,\n sort : undefined,\n asc: true\n };\n $scope.compactMode = true;\n $scope.listeners = [];\n $scope.helptipPrefix = 'helptip-network';\n $scope.enableLocationHref = true; // can be overrided by sub-controller (e.g. popup)\n\n $scope.removeListeners = function() {\n if ($scope.listeners.length) {\n console.debug(\"[network] Closing listeners\");\n _.forEach($scope.listeners, function(remove){\n remove();\n });\n $scope.listeners = [];\n }\n };\n\n /**\n * Enter in view\n */\n $scope.enter = function(e, state) {\n if ($scope.networkStarted) return;\n $scope.networkStarted = true;\n $scope.search.loading = true;\n csCurrency.get()\n .then(function (currency) {\n if (currency) {\n var isDefaultNode = BMA.node.same(currency.node);\n $scope.node = isDefaultNode ? BMA :\n BMA.instance(currency.node.host, currency.node.port);\n if (state && state.stateParams) {\n if (state.stateParams.type && ['mirror', 'member', 'offline'].indexOf(state.stateParams.type) != -1) {\n $scope.search.type = state.stateParams.type;\n }\n if (state.stateParams.expert) {\n $scope.expertMode = (state.stateParams.expert == 'true');\n }\n }\n $scope.load();\n }\n })\n .catch(function(err) {\n UIUtils.onError('ERROR.GET_CURRENCY_FAILED')(err);\n $scope.networkStarted = false;\n });\n };\n $scope.$on('$ionicParentView.enter', $scope.enter);\n\n /**\n * Leave the view\n */\n $scope.leave = function() {\n // Close node, if not the default BMA\n if ($scope.node !== BMA) {\n $scope.node.close();\n }\n if (!$scope.networkStarted) return;\n $scope.removeListeners();\n csNetwork.close();\n $scope.networkStarted = false;\n $scope.search.loading = true;\n };\n $scope.$on('$ionicView.beforeLeave', $scope.leave);\n $scope.$on('$ionicParentView.beforeLeave', $scope.leave);\n $scope.$on('$destroy', $scope.leave);\n\n\n $scope.computeOptions = function() {\n var options = {\n filter: {\n member: (!$scope.search.type || $scope.search.type === 'member'),\n mirror: (!$scope.search.type || $scope.search.type === 'mirror'),\n endpoint : (angular.isDefined($scope.search.endpoint) ? $scope.search.endpoint : null),\n bma : $scope.search.bma,\n ssl : $scope.search.ssl,\n ws2p : $scope.search.ws2p,\n online: !($scope.search.type && $scope.search.type === 'offline')\n },\n sort: {\n type : $scope.search.sort,\n asc : $scope.search.asc\n },\n expertMode: $scope.expertMode,\n // larger timeout when on expert mode\n timeout: csConfig.timeout && ($scope.expertMode ? (csConfig.timeout / 10) : (csConfig.timeout / 100))\n };\n return options;\n };\n\n $scope.load = function() {\n\n if ($scope.search.loading){\n // Start network scan\n csNetwork.start($scope.node, $scope.computeOptions());\n\n // Catch event on new peers\n $scope.refreshing = false;\n $scope.listeners.push(\n csNetwork.api.data.on.changed($scope, function(data){\n if (!$scope.refreshing) {\n $scope.refreshing = true;\n csWot.extendAll(data.peers)\n .then(function() {\n // Avoid to refresh if view has been leaving\n if ($scope.networkStarted) {\n $scope.updateView(data);\n }\n $scope.refreshing = false;\n });\n }\n }));\n }\n\n // Show help tip\n $scope.showHelpTip();\n };\n\n $scope.updateView = function(data) {\n console.debug(\"[peers] Updating UI\");\n $scope.$broadcast('$$rebind::rebind'); // force data binding\n $scope.search.results = data.peers;\n $scope.search.memberPeersCount = data.memberPeersCount;\n // Always tru if network not started (e.g. after leave+renter the view)\n $scope.search.loading = !$scope.networkStarted || csNetwork.isBusy();\n if (!$scope.loading) {\n $scope.$broadcast('$$rebind::rebind'); // force data binding\n }\n if ($scope.motion && $scope.search.results && $scope.search.results.length > 0) {\n $scope.motion.show({selector: '.item-peer'});\n }\n };\n\n $scope.refresh = function() {\n // Network\n $scope.search.loading = true;\n csNetwork.loadPeers();\n };\n\n $scope.sort = function() {\n $scope.search.loading = true;\n $scope.refreshing = true;\n csNetwork.sort($scope.computeOptions());\n $scope.updateView(csNetwork.data);\n };\n\n $scope.toggleSearchType = function(type){\n $scope.hideActionsPopover();\n if ($scope.search.type === type || type === 'none') {\n $scope.search.type = undefined;\n }\n else {\n $scope.search.type = type;\n }\n csNetwork.close();\n $scope.search.loading = true;\n $scope.load();\n\n // Update location href\n if ($scope.enableLocationHref) {\n $location.search({type: $scope.search.type}).replace();\n }\n };\n\n $scope.toggleSearchEndpoint = function(endpoint){\n $scope.hideActionsPopover();\n if ($scope.search.endpoint === endpoint || endpoint === null) {\n $scope.search.endpoint = null;\n }\n else {\n $scope.search.endpoint = endpoint;\n }\n $scope.sort();\n };\n\n $scope.toggleSort = function(sort){\n if ($scope.search.sort === sort && !$scope.search.asc) {\n $scope.search.asc = undefined;\n $scope.search.sort = undefined;\n }\n else {\n $scope.search.asc = ($scope.search.sort === sort) ? !$scope.search.asc : true;\n $scope.search.sort = sort;\n }\n $scope.sort();\n };\n\n $scope.toggleCompactMode = function() {\n $scope.compactMode = !$scope.compactMode;\n $scope.$broadcast('$$rebind::rebind'); // force data binding\n };\n\n $scope.selectPeer = function(peer) {\n if (peer.compacted && $scope.compactMode) {\n $scope.toggleCompactMode();\n return;\n }\n\n // Skip offline or not a BMA peer\n if (!peer.online || !peer.hasBma()) return;\n\n var stateParams = {server: peer.getServer()};\n if (peer.isSsl()) {\n stateParams.ssl = true;\n }\n if (peer.isTor()) {\n stateParams.tor = true;\n }\n $state.go('app.view_peer', stateParams);\n };\n\n $scope.$on('csView.action.refresh', function(event, context) {\n if (context === 'peers') {\n $scope.refresh();\n }\n });\n\n $scope.$on('csView.action.showActionsPopover', function(event, clickEvent) {\n $scope.showActionsPopover(clickEvent);\n });\n\n /* -- popover -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'templates/network/lookup_popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n\n $scope.showEndpointsPopover = function($event, peer, endpointName) {\n $event.preventDefault();\n $event.stopPropagation();\n\n var endpoints = peer.getEndpoints(endpointName);\n endpoints = (endpoints||[]).reduce(function(res, ep) {\n var bma = BMA.node.parseEndPoint(ep) || BMA.node.parseEndPoint(ep, endpointName);\n return res.concat({\n label: 'NETWORK.VIEW.NODE_ADDRESS',\n value: peer.getServer(bma) + (bma && bma.path||'')\n });\n }, []);\n if (!endpoints.length) return;\n\n // Call extension points\n UIUtils.popover.show($event, {\n templateUrl: 'templates/network/popover_endpoints.html',\n bindings: {\n titleKey: 'NETWORK.VIEW.ENDPOINTS.' + endpointName,\n items: endpoints\n }\n });\n };\n\n $scope.showWs2pPopover = function($event, peer) {\n $event.stopPropagation();\n\n return $translate('NETWORK.VIEW.PRIVATE_ACCESS')\n .then(function(privateAccessMessage) {\n UIUtils.popover.show($event, {\n templateUrl: 'templates/network/popover_endpoints.html',\n bindings: {\n titleKey: 'NETWORK.VIEW.ENDPOINTS.WS2P',\n valueKey: 'NETWORK.VIEW.NODE_ADDRESS',\n items: [\n {\n label: 'NETWORK.VIEW.NODE_ADDRESS',\n value: !peer.bma.private ? (peer.getServer() + (peer.bma.path||'')) : privateAccessMessage\n },\n {\n label: 'NETWORK.VIEW.WS2PID',\n value: peer.bma.ws2pid\n },\n {\n label: 'NETWORK.VIEW.POW_PREFIX',\n value: peer.powPrefix\n }]\n }\n });\n });\n };\n\n\n\n /* -- help tip -- */\n\n // Show help tip\n $scope.showHelpTip = function(index, isTour) {\n index = angular.isDefined(index) ? index : csSettings.data.helptip.network;\n isTour = angular.isDefined(isTour) ? isTour : false;\n if (index < 0) return;\n\n // Create a new scope for the tour controller\n var helptipScope = $scope.createHelptipScope();\n if (!helptipScope) return; // could be undefined, if a global tour already is already started\n helptipScope.tour = isTour;\n\n return helptipScope.startNetworkTour(index, false)\n .then(function(endIndex) {\n helptipScope.$destroy();\n if (!isTour) {\n csSettings.data.helptip.network = endIndex;\n csSettings.store();\n }\n });\n };\n}\n\n\nfunction NetworkLookupModalController($scope, $controller, parameters) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('NetworkLookupCtrl', {$scope: $scope}));\n\n // Read parameters\n parameters = parameters || {};\n $scope.enableFilter = angular.isDefined(parameters.enableFilter) ? parameters.enableFilter : true;\n $scope.search.type = angular.isDefined(parameters.type) ? parameters.type : $scope.search.type;\n $scope.search.endpoint = angular.isDefined(parameters.endpoint) ? parameters.endpoint : $scope.search.endpoint;\n $scope.search.bma = angular.isDefined(parameters.bma) ? parameters.bma : $scope.search.bma;\n $scope.search.ssl = angular.isDefined(parameters.ssl) ? parameters.ssl : $scope.search.ssl;\n $scope.search.ws2p = angular.isDefined(parameters.ws2p) ? parameters.ws2p : $scope.search.ws2p;\n $scope.expertMode = angular.isDefined(parameters.expertMode) ? parameters.expertMode : $scope.expertMode;\n $scope.ionItemClass = parameters.ionItemClass || 'item-border-large';\n $scope.enableLocationHref = false;\n $scope.helptipPrefix = '';\n\n $scope.selectPeer = function(peer) {\n $scope.closeModal(peer);\n };\n\n $scope.$on('modal.hidden', function(){\n $scope.leave();\n });\n\n // Disable this unsed method - called by load()\n $scope.showHelpTip = function() {};\n\n // Enter the modal\n $scope.enter();\n}\n\n\nfunction NetworkLookupPopoverController($scope, $controller) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('NetworkLookupCtrl', {$scope: $scope}));\n\n // Read parameters\n var parameters = parameters || {};\n $scope.enableFilter = angular.isDefined(parameters.enableFilter) ? parameters.enableFilter : true;\n $scope.search.type = angular.isDefined(parameters.type) ? parameters.type : $scope.search.type;\n $scope.search.endpoint = angular.isDefined(parameters.endpoint) ? parameters.endpoint : $scope.search.endpoint;\n $scope.expertMode = angular.isDefined(parameters.expertMode) ? parameters.expertMode : $scope.expertMode;\n $scope.ionItemClass = parameters.ionItemClass || 'item-border-large';\n $scope.helptipPrefix = '';\n\n $scope.selectPeer = function(peer) {\n $scope.closePopover(peer);\n };\n\n $scope.$on('popover.hidden', function(){\n $scope.leave();\n });\n\n // Disable this unsed method - called by load()\n $scope.showHelpTip = function() {};\n\n // Enter the popover\n $scope.enter();\n}\n\nfunction PeerInfoPopoverController($scope, $q, csSettings, csCurrency, csHttp, BMA) {\n 'ngInject';\n\n $scope.loading = true;\n $scope.formData = {};\n\n $scope.load = function() {\n\n console.debug(\"[peer-popover] Loading peer info...\");\n $scope.loading = true;\n $scope.formData = {};\n\n return $q.all([\n // get current block\n csCurrency.blockchain.current()\n .then(function(block) {\n $scope.formData.number = block.number;\n $scope.formData.medianTime = block.medianTime;\n $scope.formData.powMin = block.powMin;\n $scope.formData.useSsl = BMA.useSsl;\n })\n .catch(function() {\n delete $scope.formData.number;\n delete $scope.formData.medianTime;\n delete $scope.formData.powMin;\n delete $scope.formData.useSsl;\n // continue\n }),\n\n // Get node current version\n BMA.node.summary()\n .then(function(res){\n $scope.formData.version = res && res.duniter && res.duniter.version;\n $scope.formData.software = res && res.duniter && res.duniter.software;\n })\n .catch(function() {\n delete $scope.formData.version;\n delete $scope.formData.software;\n // continue\n }),\n\n // Get latest version\n BMA.version.latest()\n .then(function(latestRelease){\n $scope.formData.latestRelease = latestRelease;\n })\n .catch(function() {\n delete $scope.formData.latestRelease;\n // continue\n })\n ])\n .then(function() {\n // Compare, to check if newer\n if ($scope.formData.latestRelease && $scope.formData.software == 'duniter') {\n var compare = csHttp.version.compare($scope.formData.version, $scope.formData.latestRelease.version);\n $scope.formData.isPreRelease = compare > 0;\n $scope.formData.hasNewRelease = compare < 0;\n }\n else {\n $scope.formData.isPreRelease = false;\n $scope.formData.hasNewRelease = false;\n }\n $scope.loading = false;\n $scope.$broadcast('$$rebind::rebind'); // force data binding\n });\n };\n\n // Update UI on new block\n csCurrency.api.data.on.newBlock($scope, function(block) {\n if ($scope.loading) return;\n console.debug(\"[peer info] Received new block. Reload content\");\n $scope.load();\n });\n\n // Update UI on settings changed\n csSettings.api.data.on.changed($scope, function(data) {\n if ($scope.loading) return;\n console.debug(\"[peer info] Peer settings changed. Reload content\");\n $scope.load();\n });\n\n // Load data when enter\n $scope.load();\n}\n\nfunction PeerViewController($scope, $q, $window, $state, UIUtils, csWot, BMA) {\n 'ngInject';\n\n $scope.node = {};\n $scope.loading = true;\n $scope.isHttps = ($window.location.protocol === 'https:');\n $scope.isReachable = true;\n\n $scope.$on('$ionicView.beforeEnter', function (event, viewData) {\n // Enable back button (workaround need for navigation outside tabs - https://stackoverflow.com/a/35064602)\n viewData.enableBack = UIUtils.screen.isSmall() ? true : viewData.enableBack;\n });\n\n $scope.$on('$ionicView.enter', function(e, state) {\n var isDefaultNode = !state.stateParams || !state.stateParams.server;\n var server = state.stateParams && state.stateParams.server || BMA.server;\n var useSsl = state.stateParams && state.stateParams.ssl == \"true\" || (isDefaultNode ? BMA.useSsl : false);\n var useTor = state.stateParams.tor == \"true\" || (isDefaultNode ? BMA.useTor : false);\n\n return $scope.load(server, useSsl, useTor)\n .then(function() {\n return $scope.$broadcast('$csExtension.enter', e, state);\n })\n .then(function(){\n $scope.loading = false;\n })\n .catch(function() {\n $scope.loading = false;\n });\n });\n\n $scope.load = function(server, useSsl, useTor) {\n var node = {\n server: server,\n host: server,\n useSsl: useSsl,\n useTor: useTor\n };\n var serverParts = server.split(':');\n if (serverParts.length === 2) {\n node.host = serverParts[0];\n node.port = serverParts[1];\n }\n\n angular.merge($scope.node,\n useTor ?\n // For TOR, use a web2tor to access the endpoint\n BMA.lightInstance(node.host + \".to\", 443, true/*ssl*/, 60000 /*long timeout*/) :\n BMA.lightInstance(node.host, node.port, node.useSsl),\n node);\n\n $scope.isReachable = !$scope.isHttps || useSsl;\n if (!$scope.isReachable) {\n // Get node from the default BMA node\n return BMA.network.peers()\n .then(function(res) {\n // find the current peer\n var peers = (res && res.peers || []).reduce(function(res, json) {\n var peer = new Peer(json);\n return (peer.getEndpoints('BASIC_MERKLED_API') || []).reduce(function(res, ep) {\n var bma = BMA.node.parseEndPoint(ep);\n if((bma.dns === node.host || bma.ipv4 === node.host || bma.ipv6 === node.host) && (\n bma.port == node.port)) {\n peer.bma = bma;\n return res.concat(peer);\n }\n return res;\n }, res);\n }, []);\n var peer = peers.length && peers[0];\n\n // Current node found\n if (peer) {\n $scope.node.pubkey = peer.pubkey;\n $scope.node.currency = peer.currency;\n return csWot.extend($scope.node);\n }\n else {\n console.warn('Could not get peer from /network/peers');\n }\n });\n }\n\n return $q.all([\n\n // Get node peer info\n $scope.node.network.peering.self()\n .then(function(json) {\n $scope.node.pubkey = json.pubkey;\n $scope.node.currency = json.currency;\n })\n .catch(function(err){\n console.error(err && err.message || err);\n }),\n\n // Get known peers\n $scope.node.network.peers()\n .then(function(json) {\n var peers = (json && json.peers || []).map(function (p) {\n var peer = new Peer(p);\n peer.online = p.status === 'UP';\n peer.buid = peer.block;\n peer.blockNumber = peer.buid && peer.buid.split('-')[0];\n peer.dns = peer.getDns();\n peer.id = peer.keyID();\n peer.server = peer.getServer();\n return peer;\n });\n\n // Extend (add uid+name+avatar)\n return csWot.extendAll([$scope.node].concat(peers))\n .then(function() {\n // Final sort\n $scope.peers = _.sortBy(peers, function(p) {\n var score = 1;\n score += 10000 * (p.online ? 1 : 0);\n score += 1000 * (p.hasMainConsensusBlock ? 1 : 0);\n score += 100 * (p.uid ? 1 : 0);\n return -score;\n });\n $scope.motion.show({selector: '.item-peer'});\n });\n }),\n\n // Get current block\n $scope.node.blockchain.current()\n .then(function(json) {\n $scope.current = json;\n })\n ])\n .catch(function(err) {\n console.error(err && err.message || err);\n UIUtils.onError(useTor ? \"PEER.VIEW.ERROR.LOADING_TOR_NODE_ERROR\" : \"PEER.VIEW.ERROR.LOADING_NODE_ERROR\")(err);\n throw err;\n });\n };\n\n $scope.selectPeer = function(peer) {\n // Skipp offline or WS2P node\n if (!peer.online || peer.isWs2p()) return;\n\n var stateParams = {server: peer.getServer()};\n if (peer.isSsl()) {\n stateParams.ssl = true;\n }\n if (peer.isTor()) {\n stateParams.tor = true;\n }\n $state.go('app.view_peer', stateParams);\n };\n\n /* -- manage link to raw document -- */\n\n $scope.openRawPeering = function(event) {\n return $scope.openLink(event, $scope.node.url + '/network/peering');\n };\n\n $scope.openRawCurrentBlock = function(event) {\n return $scope.openLink(event, $scope.node.url + '/blockchain/current');\n };\n}\n","\nCurrencyViewController.$inject = ['$scope', '$q', '$timeout', '$ionicPopover', 'Modals', 'BMA', 'UIUtils', 'csSettings', 'csCurrency', 'csNetwork', 'ModalUtils'];\nCurrencyLicenseModalController.$inject = ['$scope', '$http', 'UIUtils', 'csSettings', 'FileSaver'];\nangular.module('cesium.currency.controllers', ['ngFileSaver', 'cesium.services'])\n\n.config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n\n .state('app.currency', {\n url: \"/currency\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/currency/view_currency.html\",\n controller: 'CurrencyViewCtrl'\n }\n },\n data: {\n large: 'app.currency_lg'\n }\n })\n\n .state('app.currency.tab_parameters', {\n url: \"/parameters\",\n views: {\n 'tab-parameters': {\n templateUrl: \"templates/currency/tabs/tab_parameters.html\"\n }\n }\n })\n\n .state('app.currency.tab_wot', {\n url: \"/community\",\n views: {\n 'tab-wot': {\n templateUrl: \"templates/currency/tabs/tab_wot.html\"\n }\n }\n })\n\n .state('app.currency.tab_network', {\n url: \"/network\",\n views: {\n 'tab-network': {\n templateUrl: \"templates/currency/tabs/tab_network.html\",\n controller: 'NetworkLookupCtrl'\n }\n }\n })\n\n .state('app.currency.tab_blocks', {\n url: \"/blocks\",\n views: {\n 'tab-blocks': {\n templateUrl: \"templates/currency/tabs/tab_blocks.html\",\n controller: 'BlockLookupCtrl'\n }\n }\n })\n\n .state('app.currency_lg', {\n url: \"/currency/lg\",\n cache: false,\n views: {\n 'menuContent': {\n templateUrl: \"templates/currency/view_currency_lg.html\",\n controller: 'CurrencyViewCtrl'\n }\n }\n })\n ;\n\n}])\n\n .controller('CurrencyViewCtrl', CurrencyViewController)\n\n .controller('CurrencyLicenseModalCtrl', CurrencyLicenseModalController)\n;\n\nfunction CurrencyViewController($scope, $q, $timeout, $ionicPopover, Modals, BMA, UIUtils, csSettings, csCurrency, csNetwork, ModalUtils) {\n 'ngInject';\n\n $scope.formData = {\n useRelative: false, // Override in enter()\n currency: '',\n M: 0,\n MoverN: 0,\n UD: 0,\n cactual: 0,\n c: 0,\n dt: 0,\n sigQty: 0,\n sigStock: 0,\n msWindow: 0,\n msValidity: 0,\n sigWindow: 0,\n sigValidity: 0,\n sigPeriod: 0,\n medianTime : 0,\n difficulty : 0,\n Nprev: 0,\n stepMax: 0,\n sentries: 0,\n xpercent: 0,\n durationFromLastUD: 0,\n blockUid: null,\n dtReeval: 0,\n udReevalTime0: 0,\n allRules: angular.isDefined(csSettings.data.currency && csSettings.data.currency.allRules) ?\n csSettings.data.currency.allRules :\n csSettings.data.expertMode,\n allWotRules: angular.isDefined(csSettings.data.currency && csSettings.data.currency.allWotRules) ?\n csSettings.data.currency.allWotRules :\n csSettings.data.expertMode,\n licenseUrl: csSettings.getLicenseUrl()\n };\n $scope.loading = true;\n $scope.screen = UIUtils.screen;\n\n $scope.enter = function(e, state) {\n if ($scope.loading) { // run only once (first enter)\n $scope.formData.useRelative = csSettings.data.useRelative;\n csCurrency.get()\n .then($scope.load)\n .then(function() {\n // Show help tip, if login\n if ($scope.isLogin()) {\n $scope.showHelpTip();\n }\n })\n .catch(UIUtils.onError('ERROR.GET_CURRENCY_FAILED'));\n\n csNetwork.api.data.on.mainBlockChanged($scope, function(mainBlock) {\n if ($scope.loading) return;\n if ($scope.formData.blockUid !== mainBlock.buid) {\n console.debug(\"[currency] Updating parameters UI (new main block detected)\");\n $timeout($scope.load, 1000 /*waiting propagation to requested node*/);\n }\n });\n }\n // Notify extensions\n $scope.$broadcast('$csExtension.enter', state);\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.load = function() {\n // Load data from node\n var data = {}, M, lastUDTime, now = Date.now();\n return $q.all([\n\n // Get the currency parameters\n BMA.blockchain.parameters()\n .then(function(json){\n data.currency = json.currency;\n data.c = json.c;\n data.dt = json.dt;\n data.sigQty = json.sigQty;\n data.sigStock = json.sigStock;\n data.msWindow = json.msWindow;\n data.msValidity = json.msValidity;\n data.sigWindow = json.sigWindow;\n data.sigValidity = json.sigValidity;\n data.sigPeriod = json.sigPeriod;\n data.stepMax = json.stepMax;\n data.xpercent = json.xpercent;\n data.avgGenTime = json.avgGenTime;\n data.dtReeval = json.dtReeval;\n data.udTime0 = json.udTime0;\n data.udReevalTime0 = json.udReevalTime0;\n\n // Compat with Duniter < 1.0\n if (!data.dtReeval) {\n data.dtReeval = data.dt;\n }\n }),\n\n // Get the current block information\n csCurrency.blockchain.current()\n .then(function(block){\n M = block.monetaryMass;\n data.N = block.membersCount;\n data.medianTime = block.medianTime;\n data.difficulty = block.powMin;\n data.blockUid = [block.number, block.hash].join('-');\n })\n .catch(function(err){\n // Special case for currency init (root block not exists): use fixed values\n if (err && err.ucode == BMA.errorCodes.NO_CURRENT_BLOCK) {\n M = 0;\n data.N = 0;\n data.medianTime = moment().utc().unix();\n data.difficulty = 0;\n data.blockUid = null;\n return;\n }\n throw err;\n }),\n\n // Get the UD informations\n BMA.blockchain.stats.ud()\n .then(function(res){\n if (res.result.blocks.length) {\n var lastBlockWithUD = res.result.blocks[res.result.blocks.length - 1];\n return BMA.blockchain.block({ block: lastBlockWithUD })\n .then(function(block){\n data.currentUD = (block.unitbase > 0) ? block.dividend * Math.pow(10, block.unitbase) : block.dividend;\n lastUDTime = block.medianTime;\n data.Nprev = block.membersCount;\n });\n }\n // block #0\n else {\n lastUDTime=0;\n data.Nprev=0;\n return BMA.blockchain.parameters()\n .then(function(json){\n data.currentUD = json.ud0;\n });\n }\n })\n ])\n\n // Process loaded data\n .then(function(){\n var Mprev = M - data.currentUD * data.Nprev; // remove fresh money\n var MoverNprev = data.Nprev ? (Mprev / data.Nprev) : 0;\n data.cactual = MoverNprev ? 100 * data.currentUD / MoverNprev : 0;\n data.M = M;\n data.MoverN = data.Nprev ? ((Mprev ? Mprev : M/*need at currency start only*/) / data.Nprev) : 0;\n data.UD = data.currentUD;\n data.durationFromLastUD = lastUDTime ? data.medianTime - lastUDTime : 0;\n data.sentries = Math.ceil(Math.pow(data.N, 1/ data.stepMax));\n\n // Apply to formData\n angular.extend($scope.formData, data);\n\n console.debug(\"[currency] Parameters loaded in \" + (Date.now() - now) + 'ms' );\n $scope.loading = false;\n $scope.$broadcast('$$rebind::rebind'); // force bind of currency name\n\n // Set Ink\n UIUtils.ink();\n\n return UIUtils.loading.hide();\n })\n .catch(function(err) {\n $scope.loading = false;\n UIUtils.onError('ERROR.LOAD_PEER_DATA_FAILED')(err);\n });\n };\n\n $scope.refresh = function() {\n if ($scope.loading) return;\n\n $scope.loading= true;\n UIUtils.loading.show();\n\n // Load data\n return $scope.load()\n .then(function() {\n // Notify extensions\n $scope.$broadcast('csView.action.refresh', 'currency');\n });\n };\n\n $scope.refreshPeers = function() {\n $scope.$broadcast('csView.action.refresh', 'peers');\n return $q.when(); // need by 'ion-refresher'\n };\n\n $scope.showExtendActionsPopover = function(event) {\n $scope.$broadcast('csView.action.showActionsPopover', event);\n };\n\n $scope.onAllRulesChange = function() {\n csSettings.data.currency = csSettings.data.currency || {};\n if (csSettings.data.currency.allRules !== $scope.formData.allRules) {\n csSettings.data.currency.allRules = $scope.formData.allRules;\n csSettings.store();\n }\n };\n $scope.$watch('formData.allRules', $scope.onAllRulesChange);\n\n $scope.onAllWotRulesChange = function() {\n csSettings.data.currency = csSettings.data.currency || {};\n if (csSettings.data.currency.allWotRules !== $scope.formData.allWotRules) {\n csSettings.data.currency.allWotRules = $scope.formData.allWotRules;\n csSettings.store();\n }\n };\n $scope.$watch('formData.allWotRules', $scope.onAllWotRulesChange);\n\n /* -- help tip -- */\n\n\n $scope.startCurrencyTour = function() {\n $scope.hideActionsPopover();\n return $scope.showHelpTip(0, true);\n };\n\n $scope.showHelpTip = function(index, isTour) {\n index = angular.isDefined(index) ? index : csSettings.data.helptip.currency;\n isTour = angular.isDefined(isTour) ? isTour : false;\n if (index < 0) return;\n\n // Create a new scope for the tour controller\n var helptipScope = $scope.createHelptipScope(isTour);\n if (!helptipScope) return; // could be undefined, if a global tour already is already started\n helptipScope.tour = isTour;\n\n return helptipScope.startCurrencyTour(index, false)\n .then(function(endIndex) {\n helptipScope.$destroy();\n csSettings.data.helptip.currency = endIndex;\n csSettings.store();\n });\n };\n\n /* -- modals -- */\n\n $scope.showLicenseModal = function() {\n return ModalUtils.show('templates/currency/modal_license.html','CurrencyLicenseModalCtrl');\n };\n\n $scope.showHelpModal = function(helpAnchor) {\n Modals.showHelp({anchor: helpAnchor});\n };\n\n /* -- popover -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'templates/currency/popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n}\n\n\nfunction CurrencyLicenseModalController($scope, $http, UIUtils, csSettings, FileSaver) {\n 'ngInject';\n\n $scope.loading = true;\n\n $scope.load = function() {\n if ($scope.loading) {\n $scope.licenseUrl = csSettings.getLicenseUrl();\n // Use HTML in iframe, when original file is markdown (fix #538)\n if ($scope.licenseUrl && $scope.licenseUrl.substring($scope.licenseUrl.length - 3) != '.txt') {\n $scope.licenseUrlHtml = $scope.licenseUrl + '.html';\n $scope.licenseUrl = $scope.licenseUrl +'.txt';\n }\n $scope.loading = false;\n }\n };\n $scope.$on('modal.shown', $scope.load);\n\n $scope.downloadFile = function() {\n if (!$scope.licenseUrl) return;\n return $http.get($scope.licenseUrl)\n .success(function(data){\n var file = new Blob([data], {type: 'text/plain; charset=utf-8'});\n FileSaver.saveAs(file, 'license.txt');\n }).error(function(){\n UIUtils.onError('ERROR.GET_LICENSE_FILE_FAILED')();\n });\n\n };\n}\n","\nTransferController.$inject = ['$scope', '$controller', 'UIUtils'];\nTransferModalController.$inject = ['$scope', '$q', '$translate', '$timeout', '$filter', '$focus', 'Device', 'BMA', 'UIUtils', 'Modals', 'csWallet', 'csWot', 'csCurrency', 'csSettings', 'parameters'];angular.module('cesium.transfer.controllers', ['cesium.services', 'cesium.currency.controllers'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n $stateProvider\n\n .state('app.new_transfer', {\n cache: false,\n url: \"/transfer?amount&udAmount&comment&restPub&all&wallet\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wallet/new_transfer.html\",\n controller: 'TransferCtrl'\n }\n }\n })\n\n .state('app.new_transfer_pubkey_uid', {\n cache: false,\n url: \"/transfer/:pubkey/:uid?amount&udAmount&comment&restPub&all&wallet\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wallet/new_transfer.html\",\n controller: 'TransferCtrl'\n }\n }\n })\n\n .state('app.new_transfer_pubkey', {\n cache: false,\n url: \"/transfer/:pubkey?amount&udAmount&comment&restPub&all&wallet\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wallet/new_transfer.html\",\n controller: 'TransferCtrl'\n }\n }\n })\n ;\n }])\n\n .controller('TransferCtrl', TransferController)\n\n .controller('TransferModalCtrl', TransferModalController)\n;\n\nfunction TransferController($scope, $controller, UIUtils) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('TransferModalCtrl', {$scope: $scope, parameters: {}}));\n\n $scope.enter = function(e, state) {\n\n // Apply state parameters\n if (state && state.stateParams) {\n $scope.setParameters(state.stateParams);\n }\n\n // Load wallet\n return $scope.load()\n .then(UIUtils.loading.hide);\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.setForm = function(form) {\n $scope.form = form;\n };\n\n // override modal close\n $scope.closeModal = function() {\n return $scope.showHome();\n };\n}\n\nfunction TransferModalController($scope, $q, $translate, $timeout, $filter, $focus, Device, BMA, UIUtils, Modals,\n csWallet, csWot, csCurrency, csSettings, parameters) {\n 'ngInject';\n\n var\n wallet,\n minQuantitativeAmount = 0.01;\n\n $scope.convertedBalance = 0;\n $scope.formData = {\n destPub: null,\n amount: null,\n comment: null,\n useRelative: csSettings.data.useRelative,\n useComment: false,\n all: false,\n restPub: null,\n restAmount: null,\n walletId: null\n };\n $scope.udAmount = null;\n $scope.minAmount = minQuantitativeAmount;\n $scope.commentPattern = BMA.regexp.COMMENT;\n $scope.currency = csCurrency.data.name;\n $scope.loading = true;\n $scope.commentInputId = 'transferComment-' + $scope.$id;\n $scope.enableSelectWallet = true;\n\n // Define keyboard settings, to bind with model (If small screen AND mobile devices)\n $scope.smallscreen = angular.isDefined($scope.smallscreen) ? $scope.smallscreen : UIUtils.screen.isSmall();\n if ($scope.smallscreen || Device.enable) {\n $scope.digitKeyboardSettings = $scope.digitKeyboardSettings || Device.keyboard.digit.settings.bindModel(\n $scope,\n 'formData.amount',\n {\n decimal: true,\n decimalSeparator: '.',\n resizeContent:false\n });\n $scope.digitKeyboardVisible = false;\n }\n\n $scope.setParameters = function(parameters) {\n if (!parameters) return;\n if (parameters.pubkey) {\n $scope.formData.destPub = parameters.pubkey;\n }\n if (parameters.uid) {\n $scope.destUid = parameters.uid;\n $scope.destPub = '';\n }\n else {\n $scope.destUid = '';\n $scope.destPub = parameters.pubkey;\n }\n if (parameters.amount) {\n $scope.formData.amount = parameters.amount;\n $scope.formData.useRelative=false;\n }\n else if (parameters.udAmount) {\n $scope.formData.amount = parameters.udAmount;\n $scope.formData.useRelative=true;\n }\n if (parameters.comment) {\n $scope.formData.useComment=true;\n $scope.formData.comment = parameters.comment;\n }\n if (parameters.restPub || parameters.all) {\n $scope.restUid = '';\n $scope.restPub = parameters.restPub;\n $scope.formData.restPub = parameters.restPub;\n $scope.formData.all = true;\n }\n else {\n $scope.formData.all = false;\n }\n if (!parameters.wallet || parameters.wallet === \"default\") {\n $scope.formData.walletId = csWallet.id;\n }\n else {\n $scope.formData.walletId = parameters.wallet;\n }\n };\n // Read default parameters\n $scope.setParameters(parameters);\n\n $scope.load = function() {\n $scope.enableSelectWallet = csWallet.children.count() > 0;\n\n wallet = $scope.enableSelectWallet && ($scope.formData.walletId ? csWallet.children.get($scope.formData.walletId) : csWallet) || csWallet;\n if (!wallet.isDefault()) {\n console.debug(\"[transfer] Using wallet {\" + wallet.id + \"}\");\n }\n // Make to sure to load full wallet data (balance)\n return wallet.login({sources: true, silent: true})\n .then(function(data) {\n if (!wallet || $scope.$$destroyed) return; // user have cancelled before end of load\n $scope.walletData = data;\n $scope.formData.walletId = wallet.id;\n $scope.onUseRelativeChanged();\n $scope.onAmountChanged();\n\n $scope.$watch('walletData.balance', $scope.onAmountChanged, true);\n $scope.$watch('formData.amount', $scope.onAmountChanged, true);\n\n $scope.$watch('formData.useRelative', $scope.onUseRelativeChanged, true);\n $scope.$watch('walletData.balance', $scope.onUseRelativeChanged, true);\n\n UIUtils.ink({selector: '.modal-transfer .ink'});\n\n if (!$scope.destPub || $scope.destUid) {\n $scope.loading = false;\n }\n else {\n // Fill the uid from the pubkey\n return csWot.extend({pubkey: $scope.destPub})\n .then(function(res) {\n $scope.destUid = res && (res.name || res.uid);\n if ($scope.destUid) {\n $scope.destPub = '';\n }\n $scope.loading = false;\n });\n }\n })\n .catch(function(err){\n if (err === 'CANCELLED') return $scope.cancel(); // close the modal\n UIUtils.onError('ERROR.LOGIN_FAILED')(err);\n });\n };\n $scope.$on('modal.shown', $scope.load);\n\n $scope.cancel = function() {\n $scope.closeModal();\n wallet = null;\n };\n\n // When changing use relative UD\n $scope.onUseRelativeChanged = function() {\n $scope.currency = csCurrency.data.name;\n if ($scope.formData.useRelative) {\n $scope.convertedBalance = $scope.walletData.balance / csCurrency.data.currentUD;\n $scope.minAmount = minQuantitativeAmount / (csCurrency.data.currentUD / 100);\n } else {\n $scope.convertedBalance = $scope.walletData.balance / 100;\n $scope.minAmount = minQuantitativeAmount;\n }\n if ($scope.form && !$scope.loading) {\n $scope.form.$setPristine(true);\n }\n };\n\n $scope.onAmountChanged = function() {\n if ($scope.sending) return; // skip if sending TX\n\n var amount = $scope.formData.amount;\n if (amount && typeof amount === \"string\") {\n amount = parseFloat(amount.replace(new RegExp('[.,]'), '.'));\n }\n\n var valid = true;\n\n // Avoid amount less than the minimal - fix #373\n if (amount && amount < $scope.minAmount) {\n valid = false;\n $scope.form.amount.$error = $scope.form.amount.$error || {};\n $scope.form.amount.$error.min = true;\n }\n else if ($scope.form.amount && $scope.form.amount.$error && $scope.form.amount.$error.min){\n delete $scope.form.amount.$error.min;\n }\n\n // Avoid amount greater than the balance\n if (amount && amount > $scope.convertedBalance){\n $scope.form.$valid = false;\n $scope.form.amount.$invalid = true;\n $scope.form.amount.$error = $scope.form.amount.$error || {};\n $scope.form.amount.$error = {max: true};\n }\n else if ($scope.form.amount && $scope.form.amount.$error && $scope.form.amount.$error.max){\n delete $scope.form.amount.$error.max;\n }\n\n $scope.form.$valid = valid;\n if ($scope.form.amount) $scope.form.amount.$invalid = !valid;\n\n if (!valid || !$scope.formData.all || !amount) {\n $scope.formData.restAmount = undefined;\n }\n else {\n if ($scope.formData.useRelative) {\n $scope.formData.restAmount = $scope.walletData.balance - amount * csCurrency.data.currentUD;\n if ($scope.formData.restAmount < minQuantitativeAmount) {\n $scope.formData.restAmount = 0;\n }\n } else {\n $scope.formData.restAmount = $scope.walletData.balance - amount * 100;\n }\n }\n };\n\n $scope.doTransfer = function() {\n if ($scope.loading) return; // Skip\n\n $scope.form.$submitted=true;\n\n if(!$scope.form.$valid || !$scope.formData.destPub || !$scope.formData.amount) {\n return;\n }\n var amount = $scope.formData.amount;\n if (typeof amount === \"string\") {\n amount = parseFloat(amount.replace(new RegExp('[.,]'), '.'));\n }\n\n // Avoid multiple call\n if ($scope.sending) return;\n $scope.sending = true;\n\n var currentUD;\n return $q.all([\n // Make sure user is auth\n wallet.auth({silent: true}),\n\n // Get current UD\n csCurrency.currentUD()\n .then(function(res) {\n currentUD = res;\n }),\n\n // Hide digit keyboard\n $scope.hideDigitKeyboard(300)\n ])\n .then($scope.askTransferConfirm)\n .then(function(confirm){\n if (!confirm) {\n $scope.sending = false;\n return;\n }\n\n return UIUtils.loading.show()\n .then(function(){\n // convert amount\n if ($scope.formData.useRelative) {\n amount = currentUD * amount;\n }\n else {\n amount = amount.toFixed(2) * 100; // remove 2 decimals on quantitative mode\n }\n\n // convert comment: trim, then null if empty\n var comment = $scope.formData.comment && $scope.formData.comment.trim();\n if (comment && !comment.length) {\n comment = null;\n }\n var hasRest = $scope.formData.all && $scope.formData.restAmount > 0;\n if (hasRest) {\n return wallet.transferAll($scope.formData.destPub, amount, comment, $scope.formData.useRelative, $scope.formData.restPub);\n }\n else {\n return wallet.transfer($scope.formData.destPub, amount, comment, $scope.formData.useRelative);\n }\n })\n .then(function() {\n UIUtils.loading.hide();\n return $scope.closeModal(true);\n })\n .then(function(res) {\n $timeout(function() {\n $scope.sending = false;\n UIUtils.toast.show('INFO.TRANSFER_SENT');\n }, 500);\n return res;\n });\n })\n .catch(function(err) {\n $scope.sending = false;\n // Wallet auth cancelled by user\n if (err === 'CANCELLED') return;\n UIUtils.onError('ERROR.SEND_TX_FAILED')(err);\n });\n };\n\n $scope.askTransferConfirm = function() {\n return $translate(['COMMON.UD', 'COMMON.EMPTY_PARENTHESIS'])\n .then(function(translations) {\n var hasRest = $scope.formData.all && $scope.formData.restAmount > 0;\n return $translate(hasRest ? 'CONFIRM.TRANSFER_ALL' : 'CONFIRM.TRANSFER', {\n from: $scope.walletData.isMember ? $scope.walletData.uid : $filter('formatPubkey')($scope.walletData.pubkey),\n to: $scope.destUid || $scope.destPub,\n amount: $scope.formData.amount,\n unit: $scope.formData.useRelative ? translations['COMMON.UD'] : $filter('abbreviate')($scope.currency),\n comment: (!$scope.formData.comment || $scope.formData.comment.trim().length === 0) ? translations['COMMON.EMPTY_PARENTHESIS'] : $scope.formData.comment,\n restAmount: hasRest && $filter('formatAmount')($scope.formData.restAmount, {useRelative: $scope.formData.useRelative}),\n restTo: hasRest && ($scope.restUid || $scope.restPub)\n });\n })\n .then(UIUtils.alert.confirm);\n };\n\n $scope.addComment = function() {\n $scope.formData.useComment = true;\n // Focus on comment field\n // removeIf(device)\n if ($scope.commentInputId) {\n $timeout(function() {\n $focus($scope.commentInputId);\n }, 200);\n }\n // endRemoveIf(device)\n };\n\n /* -- modals -- */\n $scope.showWotLookupModal = function(formDataField) {\n\n formDataField = formDataField || 'destPub';\n\n // Hide numerical keyboard\n $scope.hideDigitKeyboard(0);\n\n return Modals.showWotLookup({enableWallets: true})\n .then(function(result){\n if (result) {\n if (formDataField === 'destPub') {\n $scope.destUid = result.uid;\n $scope.destPub = result.uid ? '' : result.pubkey;\n $scope.formData.destPub = result.pubkey;\n }\n else if (formDataField === 'restPub') {\n $scope.restUid = result.uid;\n $scope.restPub = result.uid ? '' : result.pubkey;\n $scope.formData.restPub = result.pubkey;\n }\n }\n });\n };\n\n $scope.showSelectWalletModal = function() {\n if (!$scope.enableSelectWallet) return;\n\n return Modals.showSelectWallet({\n useRelative: $scope.formData.useRelative,\n showDefault: true,\n showBalance: true\n })\n .then(function(newWallet) {\n if (!newWallet || (wallet && wallet.id === newWallet.id)) return;\n wallet = newWallet;\n $scope.walletData = wallet.data;\n console.debug(\"[transfer] Using wallet {\" + wallet.id + \"}\");\n $scope.onAmountChanged();\n });\n };\n\n /* -- popover -- */\n\n $scope.showUnitPopover = function($event) {\n UIUtils.popover.show($event, {\n templateUrl: 'templates/wallet/popover_unit.html',\n scope: $scope\n })\n .then(function(useRelative) {\n $scope.formData.useRelative = useRelative;\n });\n };\n\n /* -- keyboard -- */\n $scope.showDigitKeyboard = function() {\n // No keyboard settings, or already visible: skip\n if (!$scope.digitKeyboardSettings || $scope.digitKeyboardVisible) return;\n\n // Device enable: hide OS keyboard\n if (Device.enable) {\n\n // Hide device keyboard\n Device.keyboard.close();\n\n // Open the digit keyboard (with a delay)\n return $timeout(function() {\n $scope.digitKeyboardVisible = true;\n }, 200);\n }\n\n // Open the digit keyboard\n $scope.digitKeyboardVisible = true;\n return $q.when();\n };\n\n $scope.hideDigitKeyboard = function(timeout) {\n if (!$scope.digitKeyboardVisible) return $q.when();\n $scope.digitKeyboardVisible = false;\n return $timeout(function() {}, timeout||200);\n };\n}\n\n","\nSettingsController.$inject = ['$scope', '$q', '$window', '$ionicHistory', '$ionicPopup', '$timeout', '$translate', '$ionicPopover', 'UIUtils', 'Modals', 'BMA', 'csHttp', 'csConfig', 'csCurrency', 'csSettings', 'csPlatform'];\nangular.module('cesium.settings.controllers', ['cesium.services', 'cesium.currency.controllers'])\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n\n .state('app.settings', {\n url: \"/settings\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/settings/settings.html\",\n controller: 'SettingsCtrl'\n }\n }\n })\n ;\n }])\n\n .controller('SettingsCtrl', SettingsController)\n;\n\nfunction SettingsController($scope, $q, $window, $ionicHistory, $ionicPopup, $timeout, $translate, $ionicPopover,\n UIUtils, Modals, BMA, csHttp, csConfig, csCurrency, csSettings, csPlatform) {\n 'ngInject';\n\n $scope.formData = angular.copy(csSettings.data);\n $scope.popupData = {}; // need for the node popup\n $scope.loading = true;\n $scope.nodePopup = {};\n $scope.bma = BMA;\n\n\n $scope.keepAuthIdleLabels = {\n /*0: {\n labelKey: 'SETTINGS.KEEP_AUTH_OPTION.NEVER'\n },*/\n 10: {\n labelKey: 'SETTINGS.KEEP_AUTH_OPTION.SECONDS',\n labelParams: {value: 10}\n },\n 30: {\n labelKey: 'SETTINGS.KEEP_AUTH_OPTION.SECONDS',\n labelParams: {value: 30}\n },\n 60: {\n labelKey: 'SETTINGS.KEEP_AUTH_OPTION.MINUTE',\n labelParams: {value: 1}\n },\n 600: {\n labelKey: 'SETTINGS.KEEP_AUTH_OPTION.MINUTES',\n labelParams: {value: 10}\n },\n 3600: {\n labelKey: 'SETTINGS.KEEP_AUTH_OPTION.HOUR',\n labelParams: {value: 1}\n },\n 9999: {\n labelKey: 'SETTINGS.KEEP_AUTH_OPTION.ALWAYS'\n }\n };\n $scope.keepAuthIdles = _.keys($scope.keepAuthIdleLabels);\n\n $scope.blockValidityWindowLabels = {\n 0: {\n labelKey: 'SETTINGS.BLOCK_VALIDITY_OPTION.NONE'\n },\n 6: {\n labelKey: 'SETTINGS.BLOCK_VALIDITY_OPTION.N',\n labelParams: {count: 6, time: undefined /*defined in enter*/}\n },\n 12: {\n labelKey: 'SETTINGS.BLOCK_VALIDITY_OPTION.N',\n labelParams: {count: 12, time: undefined /*defined in enter*/}\n },\n 24: {\n labelKey: 'SETTINGS.BLOCK_VALIDITY_OPTION.N',\n labelParams: {count: 24, time: undefined /*defined in enter*/}\n }\n };\n $scope.blockValidityWindows = _.keys($scope.blockValidityWindowLabels);\n\n $scope.$on('$ionicView.enter', function() {\n $q.all([\n csSettings.ready(),\n csCurrency.parameters()\n .catch(function(err) {\n // Continue (will use default value)\n // Make sure to continue even if node is down - Fix #788\n })\n .then(function(parameters) {\n var avgGenTime = parameters && parameters.avgGenTime;\n if (!avgGenTime || avgGenTime < 0) {\n console.warn(\"[settings] Could not not currency parameters. Using default G1 'avgGenTime' (300s)\");\n avgGenTime = 300; /* = G1 value = 5min */\n }\n _.each($scope.blockValidityWindows, function(blockCount) {\n if (blockCount > 0) {\n $scope.blockValidityWindowLabels[blockCount].labelParams.time = avgGenTime * blockCount;\n }\n });\n })\n ])\n .then($scope.load);\n });\n\n $scope.setPopupForm = function(popupForm) {\n $scope.popupForm = popupForm;\n };\n\n $scope.load = function() {\n $scope.loading = true; // to avoid the call of csWallet.store()\n\n // Fill locales\n $scope.locales = angular.copy(csSettings.locales);\n\n // Apply settings\n angular.merge($scope.formData, csSettings.data);\n\n // Make sure to use full locale object (id+name)\n $scope.formData.locale = (csSettings.data.locale && csSettings.data.locale.id && _.findWhere($scope.locales, {id: csSettings.data.locale.id})) ||\n _.findWhere($scope.locales, {id: csSettings.defaultSettings.locale.id});\n\n\n return $timeout(function() {\n $scope.loading = false;\n // Set Ink\n UIUtils.ink({selector: '.item'});\n $scope.showHelpTip();\n }, 100);\n };\n\n $scope.reset = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n }\n $scope.pendingSaving = true;\n csSettings.reset()\n .then(csPlatform.restart)\n .then(function() {\n // reload\n $scope.load();\n $scope.pendingSaving = false;\n });\n };\n\n $scope.changeLanguage = function(langKey) {\n $translate.use(langKey);\n };\n\n // Change node\n $scope.changeNode= function(node) {\n var port = !!$scope.formData.node.port && $scope.formData.node.port != 80 && $scope.formData.node.port != 443 ? $scope.formData.node.port : undefined;\n node = node || {\n host: $scope.formData.node.host,\n port: port,\n useSsl: angular.isDefined($scope.formData.node.useSsl) ?\n $scope.formData.node.useSsl :\n ($scope.formData.node.port == 443)\n };\n $scope.showNodePopup(node)\n .then(function(newNode) {\n if (newNode.host === $scope.formData.node.host &&\n newNode.port === $scope.formData.node.port &&\n newNode.useSsl === $scope.formData.node.useSsl && !$scope.formData.node.temporary) {\n return; // same node = nothing to do\n }\n UIUtils.loading.show();\n\n BMA.isAlive(newNode)\n .then(function(alive) {\n if (!alive) {\n UIUtils.loading.hide();\n return UIUtils.alert.error('ERROR.INVALID_NODE_SUMMARY')\n .then(function(){\n $scope.changeNode(newNode); // loop\n });\n }\n UIUtils.loading.hide();\n angular.merge($scope.formData.node, newNode);\n delete $scope.formData.node.temporary;\n BMA.stop();\n BMA.copy(newNode);\n $scope.bma = BMA;\n\n // Restart platform (or start if not already started)\n csPlatform.restart();\n\n // Reset history cache\n return $ionicHistory.clearCache();\n });\n });\n };\n\n $scope.showNodeList = function() {\n // Check if need a filter on SSL node\n var forceUseSsl = (csConfig.httpsMode === 'true' || csConfig.httpsMode === true || csConfig.httpsMode === 'force') ||\n ($window.location && $window.location.protocol === 'https:') ? true : false;\n\n $ionicPopup._popupStack[0].responseDeferred.promise.close();\n return Modals.showNetworkLookup({\n enableFilter: true, // enable filter button\n bma: true, // only BMA node\n ssl: forceUseSsl ? true : undefined\n })\n .then(function (peer) {\n if (peer) {\n var bma = peer.getBMA();\n return {\n host: (bma.dns ? bma.dns :\n (peer.hasValid4(bma) ? bma.ipv4 : bma.ipv6)),\n port: bma.port || 80,\n useSsl: bma.useSsl || bma.port == 443\n };\n }\n })\n .then(function(newNode) {\n $scope.changeNode(newNode);\n });\n };\n\n // Show node popup\n $scope.showNodePopup = function(node) {\n return $q(function(resolve, reject) {\n $scope.popupData.newNode = node.port ? [node.host, node.port].join(':') : node.host;\n $scope.popupData.useSsl = node.useSsl;\n if (!!$scope.popupForm) {\n $scope.popupForm.$setPristine();\n }\n $translate(['SETTINGS.POPUP_PEER.TITLE', 'COMMON.BTN_OK', 'COMMON.BTN_CANCEL'])\n .then(function (translations) {\n // Choose UID popup\n $ionicPopup.show({\n templateUrl: 'templates/settings/popup_node.html',\n title: translations['SETTINGS.POPUP_PEER.TITLE'],\n scope: $scope,\n buttons: [\n { text: translations['COMMON.BTN_CANCEL'] },\n {\n text: translations['COMMON.BTN_OK'],\n type: 'button-positive',\n onTap: function(e) {\n $scope.popupForm.$submitted=true;\n if(!$scope.popupForm.$valid || !$scope.popupForm.newNode) {\n //don't allow the user to close unless he enters a node\n e.preventDefault();\n } else {\n return {\n server: $scope.popupData.newNode,\n useSsl: $scope.popupData.useSsl\n };\n }\n }\n }\n ]\n })\n .then(function(res) {\n if (!res) { // user cancel\n UIUtils.loading.hide();\n return;\n }\n var parts = res.server.split(':');\n parts[1] = parts[1] ? parts[1] : 80;\n resolve({\n host: parts[0],\n port: parts[1],\n useSsl: res.useSsl\n });\n });\n });\n });\n };\n\n $scope.save = function() {\n if ($scope.loading || $scope.pendingSaving) return $q.when();\n if ($scope.saving) {\n $scope.pendingSaving = true;\n // Retry later\n return $timeout(function() {\n $scope.pendingSaving = false;\n return $scope.save();\n }, 500);\n }\n $scope.saving = true;\n\n // Async - to avoid UI lock\n return $timeout(function() {\n // Make sure to format helptip\n $scope.cleanupHelpTip();\n\n // Applying\n csSettings.apply($scope.formData);\n\n // Store\n return csSettings.store();\n\n }, 100)\n .then(function() {\n //return $timeout(function() {\n $scope.saving = false;\n //}, 100);\n });\n };\n\n $scope.onDataChanged = function(oldValue, newValue, scope) {\n if ($scope.loading || $scope.pendingSaving) return $q.when();\n if ($scope.saving) {\n $scope.pendingSaving = true;\n // Retry later\n return $timeout(function() {\n $scope.pendingSaving = false;\n return $scope.onDataChanged(oldValue, newValue, scope);\n }, 500);\n }\n\n // Changes from the current scope: save changes\n if ((scope === $scope) && !angular.equals(oldValue, newValue)) {\n $scope.save();\n }\n };\n $scope.$watch('formData', $scope.onDataChanged, true);\n\n // Detected changes from outside (e.g. enabling encryption on wallet can be rollback if user cancel auth)\n csSettings.api.data.on.changed($scope, function(data) {\n if ($scope.loading || $scope.saving || $scope.pendingSaving) return;\n\n var updated = !angular.equals(data.useLocalStorageEncryption, $scope.formData.useLocalStorageEncryption);\n if (updated) {\n console.debug('[settings] Settings changed (outside the settings page). Reloading...');\n $scope.load();\n }\n });\n\n $scope.getServer = function() {\n if (!$scope.formData.node || !$scope.formData.node.host) return '';\n return csHttp.getServer($scope.formData.node.host, $scope.formData.node.port);\n };\n\n $scope.cleanupHelpTip = function() {\n var helptipChanged = $scope.formData.helptip.enable !== csSettings.data.helptip.enable;\n if (helptipChanged) {\n var enable = $scope.formData.helptip.enable;\n // Apply default values\n $scope.formData.helptip = angular.merge({}, csSettings.defaultSettings.helptip);\n // Then restore the enable flag\n $scope.formData.helptip.enable = enable;\n }\n };\n\n /* -- modals & popover -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'templates/settings/popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n\n $scope.startSettingsTour = function() {\n $scope.hideActionsPopover();\n\n return $scope.showHelpTip(0, true);\n };\n\n // Show help tip (show only not already shown)\n $scope.showHelpTip = function(index, tour) {\n if (!$scope.isLogin() && !tour) return;\n index = angular.isDefined(index) ? index : csSettings.data.helptip.settings;\n if (index < 0) return;\n if (index === 0) index = 1; // skip first step\n\n // Create a new scope for the tour controller\n var helptipScope = $scope.createHelptipScope(tour);\n if (!helptipScope) return; // could be undefined, if a global tour already is already started\n\n return helptipScope.startSettingsTour(index, false)\n .then(function(endIndex) {\n helptipScope.$destroy();\n csSettings.data.helptip.settings = endIndex;\n csSettings.store();\n });\n };\n}\n","\nBlockLookupController.$inject = ['$scope', '$timeout', '$focus', '$filter', '$state', '$anchorScroll', 'UIUtils', 'BMA', 'csCurrency', 'csWot', 'csSettings'];\nBlockViewController.$inject = ['$scope', '$ionicPopover', '$state', 'UIUtils', 'BMA', 'csCurrency', 'csWot'];\nangular.module('cesium.blockchain.controllers', ['cesium.services'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n\n .state('app.blockchain', {\n url: \"/blockchain\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/blockchain/lookup.html\",\n controller: 'BlockLookupCtrl'\n }\n },\n data: {\n large: 'app.blockchain_lg'\n }\n })\n\n .state('app.blockchain_lg', {\n url: \"/blockchain/lg\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/blockchain/lookup_lg.html\",\n controller: 'BlockLookupCtrl'\n }\n }\n })\n\n .state('app.server_blockchain', {\n url: \"/network/peer/:server/blockchain?ssl&tor\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/blockchain/lookup.html\",\n controller: 'BlockLookupCtrl'\n }\n },\n data: {\n large: 'app.server_blockchain_lg'\n }\n })\n\n .state('app.server_blockchain_lg', {\n url: \"/network/peer/:server/blockchain/lg?ssl&tor\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/blockchain/lookup_lg.html\",\n controller: 'BlockLookupCtrl'\n }\n }\n })\n\n .state('app.view_block', {\n url: \"/block/:number\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/blockchain/view_block.html\",\n controller: 'BlockViewCtrl'\n }\n }\n })\n\n .state('app.view_block_hash', {\n url: \"/block/:number/:hash\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/blockchain/view_block.html\",\n controller: 'BlockViewCtrl'\n }\n }\n })\n\n .state('app.view_server_block_hash', {\n url: \"/network/peer/:server/block/:number/:hash?ssl&tor\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/blockchain/view_block.html\",\n controller: 'BlockViewCtrl'\n }\n }\n });\n }])\n\n .controller('BlockLookupCtrl', BlockLookupController)\n\n .controller('BlockViewCtrl', BlockViewController)\n\n;\n\nfunction BlockLookupController($scope, $timeout, $focus, $filter, $state, $anchorScroll, UIUtils, BMA, csCurrency, csWot, csSettings) {\n 'ngInject';\n\n $scope.search = {\n result: [],\n total: 0,\n loading: true,\n loadingMore: false,\n hasMore: false,\n type: 'last'\n };\n $scope.node = {};\n $scope.currency = false;\n $scope.entered = false;\n $scope.searchTextId = null;\n $scope.ionItemClass = 'item-border-large';\n $scope.defaultSizeLimit = UIUtils.screen.isSmall() ? 50 : 100;\n $scope.helptipPrefix = 'helptip-network';\n $scope.listeners = [];\n\n /**\n * Enter into the view\n * @param e\n * @param state\n */\n $scope.enter = function(e, state) {\n if (!$scope.entered) {\n if (state && state.stateParams && state.stateParams.q) { // Query parameter\n $scope.search.text = state.stateParams.q;\n if ($scope.search.text && $scope.search.text.trim().length) {\n $scope.search.type='text';\n }\n }\n\n // Load from server if need\n if (state && state.stateParams && state.stateParams.server) {\n var useSsl = state.stateParams.ssl == \"true\";\n var useTor = state.stateParams.tor == \"true\";\n\n var node = {\n server: state.stateParams.server,\n host: state.stateParams.server,\n useSsl: useSsl,\n useTor: useTor\n };\n var serverParts = state.stateParams.server.split(':');\n if (serverParts.length === 2) {\n node.host = serverParts[0];\n node.port = serverParts[1];\n }\n\n if (BMA.node.same(node)) {\n $scope.node = BMA;\n }\n else {\n $scope.node = useTor ?\n // For TOR, use a web2tor to access the endpoint\n BMA.instance(node.host + \".to\", 443, true/*ssl*/, 600000 /*long timeout*/) :\n BMA.instance(node.host, node.port, node.useSsl);\n return $scope.node.blockchain.parameters()\n .then(function(json) {\n $scope.currency = json.currency;\n $scope.enter(); // back to enter()\n });\n }\n }\n\n // Load currency if need\n if (!$scope.currency) {\n return csCurrency.get()\n .then(function(currency) {\n $scope.currency = currency ? currency.name : null;\n $scope.node = currency.node ? currency.node : BMA;\n\n if (!$scope.currency) {\n UIUtils.alert.error('ERROR.GET_CURRENCY_FAILED');\n return;\n }\n $scope.enter(); // back to enter(), with no stateParams\n })\n .catch(UIUtils.onError('ERROR.GET_CURRENCY_FAILED'));\n }\n\n $scope.compactMode = angular.isDefined($scope.compactMode) ? $scope.compactMode : true;\n $scope.expertMode = angular.isDefined($scope.expertMode) ? $scope.expertMode : !UIUtils.screen.isSmall() && csSettings.data.expertMode;\n\n $scope.doSearch();\n\n // removeIf(device)\n // Focus on search text (only if NOT device, to avoid keyboard opening)\n if ($scope.searchTextId) {\n $timeout(function(){\n $focus($scope.searchTextId);\n }, 100);\n }\n // endRemoveIf(device)\n\n $scope.addListeners();\n\n $scope.entered = true;\n\n $scope.showHelpTip();\n }\n else {\n $scope.addListeners();\n }\n };\n //$scope.$on('$ionicView.enter', $scope.enter);\n $scope.$on('$ionicParentView.enter', $scope.enter);\n\n\n /**\n * Leave the view\n * @param e\n * @param state\n */\n $scope.leave = function() {\n $scope.removeListeners();\n };\n //$scope.$on('$ionicView.leave', $scope.leave);\n $scope.$on('$ionicParentView.leave', $scope.leave);\n $scope.$on('$destroy', $scope.leave);\n\n $scope.doSearchLast = function() {\n $scope.search.type = 'last';\n return $scope.doSearch();\n };\n\n $scope.doSearch = function(from) {\n from = angular.isDefined(from) ? from : 0;\n\n $scope.search.loading = (from === 0);\n $scope.search.hasMore = false;\n\n var promise;\n\n // get blocks\n if (from === 0) {\n promise = $scope.node.blockchain.current(false)\n .then(function(current) {\n var size = current.number < $scope.defaultSizeLimit ? current.number : $scope.defaultSizeLimit;\n return $scope.node.blockchain.blocksSlice({count: size, from: current.number-size})\n .then(function(blocks) {\n if (!!blocks) blocks.splice(0,0,current);\n return blocks;\n });\n })\n .catch(function(err) {\n // Special case when block #0 not written yet\n if (err && err.ucode == BMA.errorCodes.NO_CURRENT_BLOCK) {\n return [];\n }\n throw err;\n });\n }\n else {\n var oldestNumber = $scope.search.results[$scope.search.results.length-1].number;\n var size = oldestNumber < $scope.defaultSizeLimit ? oldestNumber : $scope.defaultSizeLimit;\n promise = $scope.node.blockchain.blocksSlice({count: size, from: oldestNumber-size});\n }\n\n // process blocks\n return promise\n .then(function(blocks) {\n // If no result\n if (!blocks || !blocks.length) {\n $scope.doDisplayResult([], from, 0);\n $scope.search.loading = false;\n return;\n }\n\n // Transform to entities\n blocks = blocks.reduce(function(res, json){\n var block = new Block(json);\n block.cleanData(); // release arrays content\n return res.concat(block);\n }, []);\n\n // Order by number (desc)\n blocks = _.sortBy(blocks, function(b) {\n return -1 * b.number;\n });\n\n // Prepare then display results\n var total = ((from===0) ? blocks[0].number: $scope.search.results[0].number) + 1;\n return $scope.doPrepareResult(blocks, from)\n .then(function() {\n $scope.doDisplayResult(blocks, from, total);\n $scope.search.loading = false;\n });\n })\n\n .catch(function(err) {\n UIUtils.onError('BLOCKCHAIN.ERROR.SEARCH_BLOCKS_FAILED')(err);\n $scope.search.loading = false;\n });\n };\n\n var formatDateShort = $filter('formatDateShort');\n\n $scope.doPrepareResult = function(blocks, offset) {\n offset = angular.isDefined(offset) ? offset : 0;\n\n if ($scope.search.type=='last') {\n\n var previousEmptyBlockDay;\n if (offset > 0 && $scope.search.results.length) {\n var lastBlock = $scope.search.results[$scope.search.results.length-1];\n previousEmptyBlockDay = lastBlock.empty ? lastBlock.day : undefined;\n }\n\n _.forEach(blocks, function(block, index){\n // If empty\n if (block.empty) {\n // compute the day\n var blockDay = formatDateShort(block.medianTime);\n var notFirstEmpty = (index !== 0) || (offset !== 0);\n var previousNotEmptyOrSameDay = !previousEmptyBlockDay || (previousEmptyBlockDay == blockDay);\n block.compacted = notFirstEmpty && previousNotEmptyOrSameDay;\n previousEmptyBlockDay = blockDay;\n }\n else {\n previousEmptyBlockDay = undefined;\n }\n });\n }\n\n return csWot.extendAll(blocks, 'issuer');\n };\n\n $scope.doDisplayResult = function(res, offset, total) {\n if (!offset) {\n $scope.search.results = res || [];\n }\n else {\n $scope.search.results = $scope.search.results.concat(res);\n }\n $scope.search.hasMore = total && $scope.search.results.length < total;\n $scope.search.total = total || $scope.search.total;\n\n $scope.smallscreen = UIUtils.screen.isSmall();\n\n $scope.$broadcast('$$rebind::rebind'); // notify binder\n\n // Set Motion\n if (res && res.length) {\n $scope.motion.show({selector: '.list-blocks .item-block'});\n }\n };\n\n $scope.showMore = function() {\n var from = $scope.search.results ? $scope.search.results.length : 0;\n\n $scope.search.loadingMore = true;\n\n return $scope.doSearch(from)\n .then(function() {\n $scope.search.loadingMore = false;\n $scope.$broadcast('scroll.infiniteScrollComplete');\n })\n .catch(function(err) {\n console.error(err);\n $scope.search.loadingMore = false;\n $scope.search.hasMore = false;\n $scope.$broadcast('scroll.infiniteScrollComplete');\n });\n };\n\n $scope.removeListeners = function() {\n if ($scope.listeners.length) {\n console.debug(\"[block] Closing listeners\");\n _.forEach($scope.listeners, function(remove){\n remove();\n });\n $scope.listeners = [];\n }\n };\n\n $scope.addListeners = function() {\n if ($scope.listeners.length) return; // already started\n\n console.debug(\"[block] Starting listeners\");\n if ($scope.node === BMA) {\n $scope.listeners = [\n csCurrency.api.data.on.newBlock($scope, $scope.onBlock)\n ];\n }\n else {\n $scope.listeners = [\n $scope.node.websocket.block().onListener(function(json) {\n // Skip if WS closed (after leave view - should never happen) or invalid json\n if (!json) return;\n var block = new Block(json);\n block.cleanData(); // Remove unused content (arrays...)\n $scope.onBlock(block);\n })\n ];\n }\n };\n\n $scope.onBlock = function(block) {\n // Skip if still loading or if filter/sort is not the default (not last blocks)\n if ($scope.search.loading || $scope.search.type !== 'last' ||\n ($scope.search.sort && $scope.search.sort !== 'desc')) return; // skip\n\n // Make sure results is init\n $scope.search.results = $scope.search.results || [];\n\n if (!$scope.search.results.length) {\n console.debug('[blockchain] new block #{0} received (by websocket)'.format(block.number));\n // add it to result\n $scope.search.total++;\n $scope.search.results.push(block);\n\n // Prepare the new block, then show it\n $scope.doPrepareResult([block])\n .then(function() {\n return $scope.showBlock(block);\n });\n }\n else {\n // Find existing block, by number\n var existingBlock = _.findWhere($scope.search.results, {number: block.number});\n\n // replace existing block (fork could have replaced previous block)\n if (existingBlock) {\n if (existingBlock.hash !== block.hash) {\n console.debug('[blockchain] block #{0} updated (by websocket)'.format(block.number));\n // Replace existing content\n angular.copy(block, existingBlock);\n // Prepare the new block, then show it\n $scope.doPrepareResult([block, $scope.search.results[1]])\n .then(function() {\n return $scope.showBlock(existingBlock);\n });\n }\n }\n else {\n console.debug('[blockchain] new block #{0} received (by websocket)'.format(block.number));\n // Insert at index 0\n $scope.search.total++;\n $scope.search.results.splice(0, 0, block);\n\n // Prepare the new block, then show it\n $scope.doPrepareResult([block, $scope.search.results[1]])\n .then(function() {\n return $scope.showBlock(block);\n });\n }\n }\n };\n\n $scope.showBlock = function(block){\n // Force rebind\n $scope.$broadcast('$$rebind::rebind');\n $scope.motion.show({selector: '#block-'+block.number});\n };\n\n $scope.selectBlock = function(block) {\n if (block.compacted && $scope.compactMode) {\n $scope.toggleCompactMode();\n $timeout(function(){\n $anchorScroll('block-' + block.number);\n }, 900);\n }\n else if (BMA.node.same($scope.node)) {\n $state.go('app.view_block_hash', {number: block.number, hash: block.hash});\n }\n else {\n $state.go('app.view_server_block_hash', {server: $scope.node.server, ssl: $scope.node.useSsl, number: block.number, hash: block.hash});\n }\n };\n\n $scope.toggleCompactMode = function() {\n $scope.compactMode = !$scope.compactMode;\n $scope.doDisplayResult($scope.search.results, 0, $scope.search.total/*keep previous total*/);\n\n // Workaround to re-initialized the <ion-infinite-loop>\n if (!$scope.search.hasMore && $scope.search.results.length && $scope.search.type == 'last') {\n var lastBlock = $scope.search.results[$scope.search.results.length-1];\n if (lastBlock && lastBlock.number > 0) {\n $timeout(function() {\n $scope.search.hasMore = true;\n }, 500);\n }\n }\n };\n\n $scope.toggleSort = function(sort){\n if ($scope.search.sort === sort && !$scope.search.asc) {\n $scope.search.asc = undefined;\n $scope.search.sort = undefined;\n }\n else {\n $scope.search.asc = ($scope.search.sort === sort) ? !$scope.search.asc : true;\n $scope.search.sort = sort;\n }\n $scope.doSearch();\n };\n\n $scope.showHelpTip = function() {\n // TODO\n };\n}\n\n\nfunction BlockViewController($scope, $ionicPopover, $state, UIUtils, BMA, csCurrency, csWot) {\n 'ngInject';\n\n $scope.loading = true;\n $scope.formData = {};\n $scope.compactMode = true; // TODO change to true\n\n $scope.$on('$ionicView.beforeEnter', function (event, viewData) {\n // Enable back button (workaround need for navigation outside tabs - https://stackoverflow.com/a/35064602)\n viewData.enableBack = UIUtils.screen.isSmall() ? true : viewData.enableBack;\n });\n\n /**\n * Enter on view\n */\n $scope.enter = function(e, state) {\n if (!$scope.loading) return; // call once\n\n if (state) {\n $scope.number = state.stateParams && angular.isDefined(state.stateParams.number) ? state.stateParams.number : 'current';\n $scope.hash = state.stateParams && state.stateParams.hash ? state.stateParams.hash : undefined;\n\n // Load from server if need\n if (state.stateParams && state.stateParams.server) {\n var useSsl = state.stateParams.ssl == \"true\";\n var useTor = state.stateParams.tor == \"true\";\n\n var node = {\n server: state.stateParams.server,\n host: state.stateParams.server,\n useSsl: useSsl,\n useTor: useTor\n };\n var serverParts = state.stateParams.server.split(':');\n if (serverParts.length == 2) {\n node.host = serverParts[0];\n node.port = serverParts[1];\n }\n\n if (BMA.node.same(node)) {\n $scope.node = BMA;\n }\n else {\n $scope.node = useTor ?\n // For TOR, use a web2tor to access the endpoint\n BMA.instance(node.host + \".to\", 443, true/*ssl*/, 600000 /*long timeout*/) :\n BMA.instance(node.host, node.port, node.useSsl);\n return $scope.node.blockchain.parameters()\n .then(function (json) {\n $scope.currency = json.currency;\n $scope.enter(); // back to enter(), with no stateParams\n });\n }\n }\n }\n\n if (!$scope.currency || !$scope.node) {\n csCurrency.get()\n .then(function (currency) {\n if (currency) {\n $scope.currency = currency.name;\n $scope.node = currency.node;\n $scope.load();\n }\n })\n .catch(UIUtils.onError('ERROR.GET_CURRENCY_FAILED'));\n }\n else {\n $scope.load();\n }\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n /**\n * Leave the view\n */\n $scope.leave = function() {\n //console.debug(\"Leaving view peer...\");\n };\n $scope.$on('$ionicParentView.beforeLeave', $scope.leave);\n\n $scope.load = function() {\n if (!$scope.number) return;\n\n var promise = $scope.number == 'current' ?\n $scope.node.blockchain.current() :\n $scope.node.blockchain.block({block: $scope.number});\n\n return promise\n .then(function(json) {\n var block = new Block(json);\n block.parseData();\n if (!block || !angular.isDefined(block.number) || !block.hash) {\n $scope.loading = false;\n UIUtils.alert.error('ERROR.GET_BLOCK_FAILED');\n return;\n }\n if ($scope.hash && block.hash != $scope.hash) {\n $scope.loading = false;\n UIUtils.alert.error('ERROR.INVALID_BLOCK_HASH');\n return;\n }\n\n var users = [];\n if (block.joiners.length) {\n users = users.concat(block.joiners);\n }\n if (block.certifications.length) {\n users = block.certifications.reduce(function(res, cert) {\n cert.to = {\n pubkey: cert.to\n };\n cert.from = {\n pubkey: cert.from\n };\n return res.concat(cert.to , cert.from);\n }, users);\n block.certifications = _.groupBy(block.certifications, function(cert) {\n return cert.to.pubkey;\n });\n }\n if (block.transactions.length) {\n users = block.transactions.reduce(function(res, tx) {\n tx.issuers = tx.issuers.reduce(function(res, issuer) {\n return res.concat({pubkey: issuer});\n }, []);\n\n // Parse unlockConditions\n _.forEach(tx.outputs||[], function(output) {\n if (output.unlockCondition) {\n angular.merge(output, BMA.tx.parseUnlockCondition(output.unlockCondition));\n }\n });\n\n return res.concat(tx.issuers.concat(tx.outputs||[]));\n }, users);\n }\n\n var issuer = {pubkey: block.issuer};\n users.push(issuer);\n return csWot.extendAll(users)\n .then(function() {\n $scope.updateView({block: block, issuer: issuer});\n });\n })\n .catch(function(err) {\n $scope.loading = false;\n UIUtils.onError('ERROR.GET_BLOCK_FAILED')(err);\n });\n };\n\n $scope.updateView = function(data) {\n $scope.formData = data.block;\n //angular.copy(data.block, $scope.formData);\n $scope.issuer = data.issuer;\n $scope.loading = false;\n };\n\n $scope.toggleCompactMode = function() {\n $scope.compactMode = !$scope.compactMode;\n };\n\n /* -- popover -- */\n\n var paddingIndent = 10;\n\n $scope.toUnlockUIArray = function(unlockTreeItem, leftPadding, operator) {\n leftPadding = leftPadding || paddingIndent;\n\n // If operator (AND, OR)\n if (unlockTreeItem.children && (unlockTreeItem.type == 'AND' || unlockTreeItem.type == 'OR')) {\n return unlockTreeItem.children.reduce(function(res, child, index){\n if (child.children && index > 0) {\n // Add space between expression block\n res = res.concat({\n style: {\n 'padding-left': leftPadding + 'px',\n 'padding-top': '10px',\n 'padding-bottom': '10px'\n },\n operator: unlockTreeItem.type\n });\n\n return res.concat($scope.toUnlockUIArray(child, leftPadding + paddingIndent));\n }\n return res.concat($scope.toUnlockUIArray(child, leftPadding + paddingIndent, index && unlockTreeItem.type));\n }, []);\n }\n\n return {\n style: {\n 'padding-left': leftPadding + 'px'\n },\n operator: operator,\n type: unlockTreeItem.type,\n value: unlockTreeItem.value\n };\n };\n\n $scope.showUnlockConditionPopover = function(output, event) {\n if (!output.unlockTree) return;\n\n // Convert condition into UI array\n $scope.popoverData = $scope.popoverData || {};\n $scope.popoverData.unlockConditions = $scope.toUnlockUIArray(output.unlockTree);\n\n // Open popover\n UIUtils.popover.show(event, {\n templateUrl: 'templates/blockchain/unlock_condition_popover.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.unlockConditionPopover = popover;\n }\n });\n };\n\n $scope.hideUnlockConditionsPopover = function() {\n if ($scope.unlockConditionPopover) {\n $scope.unlockConditionPopover.hide();\n $scope.unlockConditionPopover = null;\n }\n };\n\n $scope.goState = function(stateName, stateParams) {\n $scope.hideUnlockConditionsPopover();\n $state.go(stateName, stateParams);\n };\n\n /* -- manage link to raw document -- */\n\n $scope.openRawBlock = function(event) {\n return $scope.openLink(event, $scope.node.url + '/blockchain/block/' + $scope.formData.number);\n };\n\n /* -- help tip -- */\n\n // Show help tip\n $scope.showHelpTip = function(index) {\n // No helptip here (done in network controller)\n };\n}\n\n","\nfunction EsNotification(json, markAsReadCallback) {\n\n var messagePrefixes = {\n 'user': 'EVENT.USER.',\n 'page': 'EVENT.PAGE.'\n };\n\n var that = this;\n\n // Avoid undefined errors\n json = json || {};\n\n that.id = json.id || ('' + Date.now()); // Keep id if exists, otherwise create it from timestamp\n that.type = json.type && json.type.toLowerCase();\n that.time = json.time;\n that.hash = json.hash;\n that.read = json.read_signature ? true : false;\n\n that.message = json.code && (json.reference && messagePrefixes[json.reference.index] ?\n messagePrefixes[json.reference.index] + json.code :\n 'EVENT.' + json.code) || json.message;\n that.params = json.params;\n\n if (markAsReadCallback && (typeof markAsReadCallback === \"function\") ) {\n that.markAsReadCallback = markAsReadCallback;\n }\n\n function _formatHash(input) {\n return input ? input.substr(0,4) + input.substr(input.length-4) : '';\n }\n\n that.markAsRead = function() {\n if (that.markAsReadCallback) {\n that.markAsReadCallback(that);\n }\n };\n\n var pubkeys;\n\n json.code = json.code || '';\n\n // Membership\n if (json.code.startsWith('MEMBER_')) {\n that.avatarIcon = 'ion-person';\n that.icon = 'ion-information-circled positive';\n that.state = 'app.view_wallet';\n that.medianTime = that.time;\n }\n\n // TX\n else if (json.code.startsWith('TX_')) {\n that.avatarIcon = 'ion-card';\n that.icon = (json.code === 'TX_SENT') ? 'ion-paper-airplane dark' : 'ion-archive balanced';\n that.medianTime = that.time;\n pubkeys = json.params.length > 0 ? json.params[0] : null;\n if (pubkeys && pubkeys.indexOf(',') == -1) {\n that.pubkey = pubkeys;\n }\n that.state = 'app.view_wallet_tx';\n that.stateParams = {refresh: true};\n }\n\n // Certifications\n else if (json.code.startsWith('CERT_')) {\n that.avatarIcon = (json.code === 'CERT_RECEIVED') ? 'ion-ribbon-b' : 'ion-ribbon-a';\n that.icon = (json.code === 'CERT_RECEIVED') ? 'ion-ribbon-b balanced' : 'ion-ribbon-a gray';\n that.pubkey = json.params.length > 0 ? json.params[0] : null;\n that.medianTime = that.time;\n that.state = 'app.wallet_cert';\n that.stateParams = {\n type: (json.code === 'CERT_RECEIVED') ? 'received' : 'given'\n };\n }\n\n // Message\n else if (json.code.startsWith('MESSAGE_')) {\n that.avatarIcon = 'ion-email';\n that.icon = 'ion-email dark';\n pubkeys = json.params.length > 0 ? json.params[0] : null;\n if (pubkeys && pubkeys.indexOf(',') === -1) {\n that.pubkey = pubkeys;\n }\n that.id = json.reference.id; // Do not care about notification ID, because notification screen use message _id\n }\n\n // user profile record\n else if (json.reference && json.reference.index === 'user' && json.reference.type === 'profile') {\n that.pubkey = json.params.length > 0 ? json.params[0] : null;\n that.state = 'app.wot_identity';\n that.stateParams = {\n pubkey: that.pubkey,\n uid: json.params && json.params[3],\n };\n if (json.code.startsWith('LIKE_')) {\n that.avatarIcon = 'ion-person';\n that.icon = 'ion-ios-heart positive';\n }\n else if (json.code.startsWith('STAR_')) {\n that.avatarIcon = 'ion-person';\n that.icon = 'ion-star gray';\n }\n else if (json.code.startsWith('FOLLOW_')) {\n that.avatarIcon = 'ion-person';\n that.icon = 'ion-ios-people gray';\n }\n else if (json.code.startsWith('ABUSE_')) {\n that.avatarIcon = 'ion-person';\n that.icon = 'ion-android-warning assertive';\n }\n else if (json.code.startsWith('MODERATION_')) {\n that.state = 'app.wot_identity';\n that.stateParams = {\n pubkey: json.reference.id,\n uid: json.params && json.params[3],\n };\n that.avatarIcon = 'ion-alert-circled';\n that.icon = 'ion-alert-circled energized';\n\n // If deletion has been asked, change the message\n var level = json.params && json.params[4] || 0;\n if (json.code === 'MODERATION_RECEIVED' && level == 5) {\n that.message = 'EVENT.USER.DELETION_RECEIVED';\n that.icon = 'ion-trash-a assertive';\n }\n }\n else {\n that.icon = 'ion-person dark';\n }\n\n }\n\n // page record\n else if (json.reference && json.reference.index === 'page') {\n that.pubkey = json.params.length > 0 ? json.params[0] : null;\n that.avatarIcon = 'ion-social-buffer';\n if (json.reference.anchor) {\n that.icon = 'ion-ios-chatbubble-outline dark';\n that.state = 'app.view_page_anchor';\n that.stateParams = {\n id: json.reference.id,\n title: json.params[1],\n anchor: _formatHash(json.reference.anchor)\n };\n }\n else {\n that.icon = 'ion-social-buffer dark';\n that.state = 'app.view_page';\n that.stateParams = {\n id: json.reference.id,\n title: json.params[1]\n };\n }\n\n if (json.code.startsWith('LIKE_')) {\n that.icon = 'ion-ios-heart positive';\n }\n else if (json.code.startsWith('FOLLOW_')) {\n that.avatarIcon = 'ion-person';\n }\n else if (json.code.startsWith('ABUSE_')) {\n that.icon = 'ion-alert-circled energized';\n }\n else if (json.code.startsWith('MODERATION_')) {\n that.avatarIcon = 'ion-alert-circled';\n that.icon = 'ion-alert-circled energized';\n\n // If deletion has been asked, change the message\n if (json.code === 'MODERATION_RECEIVED' && json.level === 5) {\n that.message = 'EVENT.PAGE.DELETION_RECEIVED';\n that.icon = 'ion-trash-a assertive';\n }\n }\n }\n\n // info message\n else if (json.type === 'INFO') {\n that.avatarIcon = 'ion-information';\n that.icon = 'ion-information-circled positive';\n }\n // warn message\n else if (json.type === 'WARN') {\n that.avatarIcon = 'ion-alert-circled';\n that.icon = 'ion-alert-circled energized';\n }\n // error message\n else if (json.type === 'ERROR') {\n that.avatarIcon = 'ion-close';\n that.icon = 'ion-close-circled assertive';\n }\n\n return that;\n}\n","\nfunction Comment(id, json) {\n\n var that = this;\n\n that.id = id;\n that.message = null; // set in copyFromJson()\n that.html = null; // set in copyFromJson()\n that.issuer = null; // set in copyFromJson()\n that.time = null; // set in copyFromJson()\n that.creationTime = null; // set in copyFromJson()\n that.reply_to = null; // set in copyFromJson()\n\n that.replyCount = 0;\n that.parent = null;\n that.replies = [];\n that.onRemoveListeners = [];\n\n that.copy = function(otherComment) {\n // Mandatory fields\n that.message = otherComment.message;\n that.html = otherComment.html;\n that.issuer = otherComment.issuer;\n that.time = otherComment.time;\n that.creationTime = otherComment.creationTime || that.time; // fill using time, for backward compatibility\n\n // Optional fields\n that.id = otherComment.id || that.id;\n that.reply_to = otherComment.reply_to || that.reply_to;\n that.uid = otherComment.uid || that.uid;\n that.name = otherComment.name || that.name;\n that.avatarStyle = otherComment.avatarStyle || that.avatarStyle;\n if (otherComment.parent) {\n that.parent = otherComment.parent;\n }\n if (otherComment.replies) that.setReplies(otherComment.replies);\n };\n\n that.copyFromJson = function(json) {\n that.message = json.message;\n that.issuer = json.issuer;\n that.time = json.time;\n that.creationTime = json.creationTime || that.time;\n that.reply_to = json.reply_to;\n };\n\n that.addOnRemoveListener = function(listener) {\n if (listener && (typeof listener === \"function\") ) {\n that.onRemoveListeners.push(listener);\n }\n };\n\n that.cleanAllListeners = function() {\n that.onRemoveListeners = [];\n };\n\n that.setReplies = function(replies) {\n that.removeAllReplies();\n that.addReplies(replies);\n };\n\n that.addReplies = function(replies) {\n if (!replies || !replies.length) return;\n replies = replies.sort(function(cm1, cm2) {\n return (cm1.time - cm2.time);\n });\n _.forEach(replies, function(reply) {\n reply.parent = that;\n that.replies.push(reply);\n });\n that.replyCount += replies.length;\n };\n\n that.containsReply = function(reply) {\n return that.replies.indexOf(reply) != -1;\n };\n\n that.addReply = function(reply) {\n that.replyCount += 1;\n that.replies.push(reply);\n that.replies = that.replies.sort(function(cm1, cm2) {\n return (cm1.time - cm2.time);\n });\n reply.parent = that;\n };\n\n that.removeAllReplies = function() {\n if (that.replyCount) {\n var replies = that.replies.splice(0, that.replies.length);\n that.replyCount = 0;\n _.forEach(replies, function (reply) {\n reply.remove();\n });\n }\n };\n\n that.removeReply = function(replyId) {\n var index = _.findIndex(that.replies, {id: replyId});\n if (index != -1) {\n that.replyCount--;\n var reply = that.replies.splice(index, 1)[0];\n delete reply.parent;\n }\n };\n\n that.remove = function() {\n if (that.parent) {\n that.parent.removeReply(that.id);\n delete that.parent;\n }\n //that.removeAllReplies();\n if (that.onRemoveListeners.length) {\n _.forEach(that.onRemoveListeners, function(listener) {\n listener(that);\n });\n that.issuer = null;\n that.message = null;\n that.cleanAllListeners();\n }\n };\n\n // Init from json\n if (json && typeof json === \"object\") {\n that.copyFromJson(json);\n }\n}\n","\nfunction Invitation(json) {\n\n var that = this;\n\n // Avoid undefined errors\n json = json || {};\n\n that.type = json.type && json.type.toLowerCase();\n that.time = json.time;\n that.id = json.id;\n\n // Invitation to certify\n if (that.type == 'certification') {\n\n that.comment = json.comment;\n that.icon = 'ion-ribbon-a';\n that.okText= 'WOT.BTN_CERTIFY';\n\n // read the identity to certify\n if (!json.content || json.content.indexOf('-') == -1) {\n console.error('[invitation] Empty content for invitation [{0}]'.format(that.id));\n that.message = 'INVITATION.ERROR.BAD_INVITATION_FORMAT';\n that.pubkey = json.issuer;\n return;\n }\n\n var separatorIndex = json.content.lastIndexOf('-');\n if (separatorIndex == -1) {\n console.error('[invitation] Bad content format for invitation [{0}]: {1}'.format(that.id, json.content));\n that.message = 'INVITATION.ERROR.BAD_INVITATION_FORMAT';\n that.pubkey = json.issuer;\n return;\n }\n\n var identity = {\n uid: json.content.substr(0, separatorIndex),\n pubkey: json.content.substr(separatorIndex+1)\n };\n\n // Prepare the state action\n that.state = 'app.wot_identity';\n that.stateParams = {\n pubkey: identity.pubkey,\n uid: identity.uid,\n action: 'certify'\n };\n\n // Ask certification to himself\n if (identity.pubkey == json.issuer) {\n that.pubkey = json.issuer;\n that.uid = identity.uid;\n that.message = 'INVITATION.ASK_CERTIFICATION';\n }\n\n // Ask certification to someone else\n else {\n that.issuer = {\n pubkey: json.issuer\n };\n that.message = 'INVITATION.SUGGESTION_CERTIFICATION';\n that.pubkey = identity.pubkey;\n that.uid = identity.uid;\n }\n\n }\n\n}\n","\n\nfunction EsPeer(json) {\n\n var that = this;\n\n Object.keys(json).forEach(function (key) {\n that[key] = json[key];\n });\n\n that.endpoints = that.endpoints || [];\n}\n\n\nEsPeer.prototype.regexp = {\n API_REGEXP: /^([A-Z_]+)(?:[ ]+([a-z_][a-z0-9-_.ğĞ]*))?(?:[ ]+([0-9.]+))?(?:[ ]+([0-9a-f:]+))?(?:[ ]+([0-9]+))(?:\\/[^\\/]+)?$/,\n LOCAL_IP_ADDRESS: /^127[.]0[.]0.|192[.]168[.]|10[.]0[.]0[.]|172[.]16[.]/\n};\n\nEsPeer.prototype.keyID = function () {\n var ep = this.ep || this.getEP();\n if (ep.useBma) {\n return [this.pubkey || \"Unknown\", ep.dns, ep.ipv4, ep.ipv6, ep.port, ep.useSsl, ep.path].join('-');\n }\n return [this.pubkey || \"Unknown\", ep.ws2pid, ep.path].join('-');\n};\n\nEsPeer.prototype.copyValues = function(to) {\n var obj = this;\n [\"version\", \"currency\", \"pub\", \"endpoints\", \"hash\", \"status\", \"block\", \"signature\"].forEach(function (key) {\n to[key] = obj[key];\n });\n};\n\nEsPeer.prototype.copyValuesFrom = function(from) {\n var obj = this;\n [\"version\", \"currency\", \"pub\", \"endpoints\", \"block\", \"signature\"].forEach(function (key) {\n obj[key] = from[key];\n });\n};\n\nEsPeer.prototype.json = function() {\n var obj = this;\n var json = {};\n [\"version\", \"currency\", \"endpoints\", \"status\", \"block\", \"signature\"].forEach(function (key) {\n json[key] = obj[key];\n });\n json.raw = this.raw && this.getRaw();\n json.pubkey = this.pubkey;\n return json;\n};\n\nEsPeer.prototype.getEP = function() {\n if (this.ep) return this.ep;\n var ep = null;\n var epRegex = this.regexp.API_REGEXP;\n this.endpoints.forEach(function(epStr){\n var matches = !ep && epRegex.exec(epStr);\n if (matches) {\n ep = {\n \"api\": matches[1] || '',\n \"dns\": matches[2] || '',\n \"ipv4\": matches[3] || '',\n \"ipv6\": matches[4] || '',\n \"port\": matches[5] || 80,\n \"path\": matches[6] || '',\n \"useSsl\": matches[5] == 443\n };\n }\n });\n return ep || {};\n};\n\nEsPeer.prototype.getEndpoints = function(regexp) {\n if (!regexp) return this.endpoints;\n if (typeof regexp === 'string') regexp = new RegExp('^' + regexp);\n return this.endpoints.reduce(function(res, ep){\n return ep.match(regexp) ? res.concat(ep) : res;\n }, []);\n};\n\nEsPeer.prototype.hasEndpoint = function(endpoint){\n var regExp = this.regexp[endpoint] || new RegExp('^' + endpoint);\n var endpoints = this.getEndpoints(regExp);\n return endpoints && endpoints.length > 0;\n};\n\nEsPeer.prototype.hasEsEndpoint = function() {\n var endpoints = this.getEsEndpoints();\n return endpoints && endpoints.length > 0;\n};\n\nEsPeer.prototype.getEsEndpoints = function() {\n return this.getEndpoints(/^(ES_CORE_API|ES_USER_API|ES_SUBSCRIPTION_API|GCHANGE_API)/);\n};\n\nEsPeer.prototype.getDns = function() {\n var ep = this.ep || this.getEP();\n return ep.dns ? ep.dns : null;\n};\n\nEsPeer.prototype.getIPv4 = function() {\n var ep = this.ep || this.getEP();\n return ep.ipv4 ? ep.ipv4 : null;\n};\n\nEsPeer.prototype.getIPv6 = function() {\n var ep = this.ep || this.getEP();\n return ep.ipv6 ? ep.ipv6 : null;\n};\n\nEsPeer.prototype.getPort = function() {\n var ep = this.ep || this.getEP();\n return ep.port ? ep.port : null;\n};\n\nEsPeer.prototype.getHost = function() {\n var ep = this.ep || this.getEP();\n return ((ep.port == 443 || ep.useSsl) && ep.dns) ? ep.dns :\n (this.hasValid4(ep) ? ep.ipv4 :\n (ep.dns ? ep.dns :\n (ep.ipv6 ? '[' + ep.ipv6 + ']' :'')));\n};\n\nEsPeer.prototype.getURL = function() {\n var ep = this.ep || this.getEP();\n var host = this.getHost();\n var protocol = (ep.port == 443 || ep.useSsl) ? 'https' : 'http';\n return protocol + '://' + host + (ep.port ? (':' + ep.port) : '');\n};\n\nEsPeer.prototype.getServer = function() {\n var ep = this.ep || this.getEP();\n var host = this.getHost();\n return host + (host && ep.port ? (':' + ep.port) : '');\n};\n\nEsPeer.prototype.hasValid4 = function(ep) {\n return ep.ipv4 &&\n /* exclude private address - see https://fr.wikipedia.org/wiki/Adresse_IP */\n !ep.ipv4.match(this.regexp.LOCAL_IP_ADDRESS) ?\n true : false;\n};\n\nEsPeer.prototype.isReachable = function () {\n return !!this.getServer();\n};\n\nEsPeer.prototype.isSsl = function() {\n var ep = this.ep || this.getEP();\n return ep.useSsl;\n};\n\nEsPeer.prototype.isTor = function() {\n var ep = this.ep || this.getEP();\n return ep.useTor;\n};\n\nEsPeer.prototype.isHttp = function() {\n var ep = this.ep || this.getEP();\n return !bma.useTor;\n};\n\n","\nESPicturesEditController.$inject = ['$scope', 'UIUtils', '$q', 'Device'];\nESSocialsEditController.$inject = ['$scope', '$focus', '$filter', 'UIUtils', 'SocialUtils'];\nESSocialsViewController.$inject = ['$scope'];\nESCommentsController.$inject = ['$scope', '$filter', '$state', '$focus', '$timeout', '$anchorScroll', 'UIUtils'];\nESCategoryModalController.$inject = ['$scope', 'UIUtils', '$timeout', 'parameters'];\nESAvatarModalController.$inject = ['$scope', '$sce'];\nESPositionEditController.$inject = ['$scope', 'csConfig', 'esGeo', 'ModalUtils'];\nESLookupPositionController.$inject = ['$scope', '$q', 'csConfig', 'esGeo', 'ModalUtils'];\nESSearchPositionItemController.$inject = ['$scope', '$timeout', 'ModalUtils', 'csConfig', 'esGeo'];\nESSearchPositionModalController.$inject = ['$scope', '$q', '$translate', 'esGeo', 'parameters'];angular.module('cesium.es.common.controllers', ['ngResource', 'cesium.es.services'])\n\n .controller('ESPicturesEditCtrl', ESPicturesEditController)\n\n .controller('ESPicturesEditCtrl', ESPicturesEditController)\n\n .controller('ESSocialsEditCtrl', ESSocialsEditController)\n\n .controller('ESSocialsViewCtrl', ESSocialsViewController)\n\n .controller('ESCommentsCtrl', ESCommentsController)\n\n .controller('ESCategoryModalCtrl', ESCategoryModalController)\n\n .controller('ESAvatarModalCtrl', ESAvatarModalController)\n\n .controller('ESPositionEditCtrl', ESPositionEditController)\n\n .controller('ESLookupPositionCtrl', ESLookupPositionController)\n\n .controller('ESSearchPositionItemCtrl', ESSearchPositionItemController)\n\n .controller('ESSearchPositionModalCtrl', ESSearchPositionModalController)\n;\n\n\nfunction ESPicturesEditController($scope, UIUtils, $q, Device) {\n 'ngInject';\n\n $scope.selectNewPicture = function(inputSelector) {\n if (Device.enable){\n $scope.openPicturePopup();\n }\n else {\n var fileInput = angular.element(document.querySelector(inputSelector||'#pictureFile'));\n if (fileInput && fileInput.length > 0) {\n fileInput[0].click();\n }\n }\n };\n\n $scope.openPicturePopup = function() {\n Device.camera.getPicture()\n .then(function(imageData) {\n $scope.pictures.push({\n src: \"data:image/png;base64,\" + imageData,\n isnew: true // use to prevent visibility hidden (if animation)\n });\n })\n .catch(UIUtils.onError('ERROR.TAKE_PICTURE_FAILED'));\n };\n\n $scope.onFileChanged = function(event) {\n if (!event || !event.file) return;\n UIUtils.loading.show();\n var file = event.file;\n return UIUtils.image.resizeFile(file)\n .then(function(imageData) {\n $scope.pictures.push({\n src: imageData,\n isnew: true // use to prevent visibility hidden (if animation)\n });\n UIUtils.loading.hide(100);\n })\n .catch(function(err) {\n console.error(err);\n UIUtils.loading.hide();\n });\n };\n\n $scope.removePicture = function(index){\n $scope.pictures.splice(index, 1);\n };\n\n $scope.favoritePicture = function(index){\n if (index > 0) {\n var item = $scope.pictures[index];\n $scope.pictures.splice(index, 1);\n $scope.pictures.splice(0, 0, item);\n }\n };\n\n $scope.rotatePicture = function(index){\n var item = $scope.pictures[index];\n UIUtils.image.rotateSrc(item.src)\n .then(function(dataURL){\n item.src = dataURL;\n });\n };\n}\n\n\nfunction ESCategoryModalController($scope, UIUtils, $timeout, parameters) {\n 'ngInject';\n\n $scope.loading = true;\n $scope.allCategories = [];\n $scope.categories = [];\n this.searchText = '';\n\n // modal title\n this.title = parameters && parameters.title;\n\n $scope.afterLoad = function(result) {\n $scope.categories = result;\n $scope.allCategories = result;\n $scope.loading = false;\n $timeout(function() {\n UIUtils.ink();\n }, 10);\n };\n\n this.doSearch = function() {\n var searchText = this.searchText.toLowerCase().trim();\n if (searchText.length > 1) {\n $scope.loading = true;\n $scope.categories = $scope.allCategories.reduce(function(result, cat) {\n if (cat.parent && cat.name.toLowerCase().search(searchText) != -1) {\n return result.concat(cat);\n }\n return result;\n }, []);\n\n $scope.loading = false;\n }\n else {\n $scope.categories = $scope.allCategories;\n }\n };\n\n // load categories\n if (parameters && parameters.categories) {\n $scope.afterLoad(parameters.categories);\n }\n else if (parameters && parameters.load) {\n parameters.load()\n .then(function(res){\n $scope.afterLoad(res);\n });\n }\n\n}\n\n\n\nfunction ESCommentsController($scope, $filter, $state, $focus, $timeout, $anchorScroll, UIUtils) {\n 'ngInject';\n\n $scope.loading = true;\n $scope.defaultCommentSize = 5;\n $scope.formData = {};\n $scope.comments = {};\n\n $scope.$on('$recordView.enter', function(e, state) {\n // First enter\n if ($scope.loading) {\n $scope.anchor = state && state.stateParams.anchor;\n }\n // second call (when using cached view)\n else if (!$scope.loading && $scope.id) {\n $scope.load($scope.id, {animate: false});\n }\n });\n\n $scope.$on('$recordView.load', function(event, id, service) {\n $scope.id = id || $scope.id;\n $scope.service = service || $scope.service;\n console.debug(\"[ES] [comment] Will use {\" + service.index + \"} service\");\n if ($scope.id) {\n $scope.load($scope.id)\n .then(function() {\n // Scroll to anchor\n $scope.scrollToAnchor();\n });\n }\n });\n\n $scope.load = function(id, options) {\n options = options || {};\n options.from = options.from || 0;\n // If anchor has been defined, load all comments\n options.size = options.size || ($scope.anchor && -1/*all*/);\n options.size = options.size || $scope.defaultCommentSize;\n options.animate = angular.isDefined(options.animate) ? options.animate : true;\n options.loadAvatarAllParent = angular.isDefined(options.loadAvatarAllParent) ? options.loadAvatarAllParent : true;\n $scope.loading = true;\n return $scope.service.load(id, options)\n .then(function(data) {\n if (!options.animate && data.result.length) {\n _.forEach(data.result, function(cmt) {\n cmt.isnew = true;\n });\n }\n $scope.comments = data;\n $scope.comments.hasMore = (data.total > data.result.length);\n $scope.loading = false;\n $scope.service.changes.start(id, data, $scope);\n\n // Set Motion\n $scope.motion.show({\n selector: '.comments .item',\n ink: false\n });\n });\n };\n\n $scope.$on('$recordView.beforeLeave', function(){\n if ($scope.comments) {\n if (!$scope.service) {\n console.error('[comment] Comment controller has no service ! Unable to listen changes...');\n return;\n }\n $scope.service.changes.stop($scope.comments);\n }\n });\n\n $scope.scrollToAnchor = function() {\n if (!$scope.anchor) return;\n var elemList = document.getElementsByName($scope.anchor);\n // Waiting for the element\n if (!elemList || !elemList.length) {\n return $timeout($scope.scrollToAnchor, 500);\n }\n // If many, remove all anchor except the last one\n for (var i = 0; i<elemList.length-1; i++) {\n angular.element(elemList[i]).remove();\n }\n // Scroll to the anchor\n $anchorScroll($scope.anchor);\n // Remove the anchor. This will the CSS class 'positive-100-bg' on the comment\n $timeout(function () {\n $scope.anchor = null;\n }, 1500);\n };\n\n $scope.showMore = function(){\n var from = 0;\n var size = -1;\n $scope.load($scope.id, {from: from, size: size, loadAvatarAllParent: false})\n .then(function() {\n // Set Motion\n $scope.motion.show({\n selector: '.card-avatar'\n });\n });\n };\n\n $scope.onKeypress = function(event) {\n // If Ctrl + Enter: submit\n if (event && event.charCode == 10 && event.ctrlKey) {\n $scope.save();\n event.preventDefault();\n }\n };\n\n $scope.save = function() {\n if (!$scope.formData.message || !$scope.formData.message.length) return;\n\n $scope.loadWallet({minData: true, auth: true})\n .then(function() {\n UIUtils.loading.hide();\n var comment = $scope.formData;\n $scope.formData = {};\n $scope.focusNewComment();\n return $scope.service.save($scope.id, $scope.comments, comment);\n })\n .then(function() {\n $scope.comments.total++;\n })\n .catch(UIUtils.onError('COMMENTS.ERROR.FAILED_SAVE_COMMENT'));\n };\n\n $scope.share = function(event, comment) {\n var params = angular.copy($state.params);\n var stateUrl;\n if (params.anchor) {\n params.anchor= $filter('formatHash')(comment.id);\n stateUrl = $state.href($state.current.name, params, {absolute: true});\n }\n else {\n stateUrl = $state.href($state.current.name, params, {absolute: true}) + '/' + $filter('formatHash')(comment.id);\n }\n var index = _.findIndex($scope.comments.result, {id: comment.id});\n var url = stateUrl + '?u=' + (comment.uid||$filter('formatPubkey')(comment.issuer));\n UIUtils.popover.show(event, {\n templateUrl: 'templates/common/popover_share.html',\n scope: $scope,\n bindings: {\n titleKey: 'COMMENTS.POPOVER_SHARE_TITLE',\n titleValues: {number: index ? index + 1 : 1},\n date: comment.creationTime,\n value: url,\n postUrl: stateUrl,\n postMessage: comment.message\n },\n autoselect: '.popover-share input'\n });\n };\n\n $scope.edit = function(comment) {\n var newComment = new Comment();\n newComment.copy(comment);\n $scope.formData = newComment;\n };\n\n $scope.remove = function(comment) {\n if (!comment) {return;}\n comment.remove();\n $scope.comments.total--;\n };\n\n $scope.reply = function(parent) {\n if (!parent || !parent.id) {return;}\n\n $scope.formData = {\n parent: parent\n };\n\n $scope.focusNewComment(true);\n };\n\n $scope.cancel = function() {\n $scope.formData = {};\n $scope.focusNewComment();\n };\n\n $scope.focusNewComment = function(forceIfSmall) {\n if (!UIUtils.screen.isSmall()) {\n $focus('comment-form-textarea');\n }\n else {\n if (forceIfSmall) $focus('comment-form-input');\n }\n };\n\n $scope.removeParentLink = function() {\n delete $scope.formData.parent;\n delete $scope.formData.reply_to;\n $scope.focusNewComment();\n };\n\n $scope.toggleExpandedReplies = function(comment, index) {\n comment.expandedReplies = comment.expandedReplies || {};\n comment.expandedReplies[index] = !comment.expandedReplies[index];\n };\n\n $scope.toggleExpandedParent = function(comment, index) {\n comment.expandedParent = comment.expandedParent || {};\n comment.expandedParent[index] = !comment.expandedParent[index];\n };\n}\n\nfunction ESSocialsEditController($scope, $focus, $filter, UIUtils, SocialUtils) {\n 'ngInject';\n\n $scope.socialData = {\n url: null,\n reorder: false\n };\n\n $scope.addSocialNetwork = function() {\n if (!$scope.socialData.url || $scope.socialData.url.trim().length === 0) {\n return;\n }\n\n $scope.formData.socials = $scope.formData.socials || [];\n var url = $scope.socialData.url.trim();\n\n var exists = _.findWhere($scope.formData.socials, {url: url});\n if (exists) { // duplicate entry\n $scope.socialData.url = '';\n return;\n }\n\n var social = SocialUtils.get(url);\n if (!social) {\n UIUtils.alert.error('PROFILE.ERROR.INVALID_SOCIAL_NETWORK_FORMAT');\n $focus('socialUrl');\n return; // stop here\n }\n $scope.formData.socials.push(social);\n $scope.socialData.url = '';\n\n // Set Motion\n $scope.motion.show({\n selector: '#social-' + $filter('formatSlug')(social.url),\n startVelocity: 10000\n });\n };\n\n $scope.editSocialNetwork = function(index) {\n var social = $scope.formData.socials[index];\n $scope.formData.socials.splice(index, 1);\n $scope.socialData.url = social.url;\n $focus('socialUrl');\n };\n\n\n $scope.reorderSocialNetwork = function(social, fromIndex, toIndex) {\n if (!social || fromIndex == toIndex) return; // no changes\n $scope.formData.socials.splice(fromIndex, 1);\n $scope.formData.socials.splice(toIndex, 0, social);\n };\n\n $scope.filterFn = function(social) {\n return !social.recipient || social.valid;\n };\n}\n\nfunction ESSocialsViewController($scope) {\n 'ngInject';\n\n $scope.openSocial = function(event, social) {\n return $scope.openLink(event, social.url, {\n type: social.type\n });\n };\n\n\n $scope.filterFn = function(social) {\n return !social.recipient || social.valid;\n };\n\n}\n\n\n\nfunction ESAvatarModalController($scope, $sce) {\n\n $scope.formData = {\n initCrop: false,\n imageCropStep: 0,\n imgSrc: undefined,\n result: undefined,\n resultBlob: undefined\n };\n\n $scope.onFileChanged = function(event) {\n if (!event || !event.file) return; // Skip\n\n var fileReader = new FileReader();\n fileReader.readAsDataURL(event.file);\n\n fileReader.onload = function(e) {\n var res = this.result;\n $scope.$applyAsync(function() {\n $scope.formData.imgSrc = $sce.getTrustedHtml(res);\n });\n };\n };\n\n $scope.doNext = function() {\n if ($scope.formData.imageCropStep === 2) {\n $scope.doCrop();\n }\n else if ($scope.formData.imageCropStep === 3) {\n $scope.closeModal($scope.formData.result);\n }\n };\n\n $scope.doPrevious = function() {\n $scope.formData.imageCropStep -= 1;\n };\n\n $scope.doCrop = function() {\n $scope.formData.initCrop = true;\n };\n\n $scope.clear = function() {\n $scope.formData = {\n initCrop: false,\n imageCropStep: 1,\n imgSrc: undefined,\n result: undefined,\n resultBlob: undefined\n };\n };\n\n}\n\n\nfunction ESPositionEditController($scope, csConfig, esGeo, ModalUtils) {\n 'ngInject';\n\n // The default country used for address localisation\n var defaultCountry = csConfig.plugins && csConfig.plugins.es && csConfig.plugins.es.defaultCountry;\n\n var loadingCurrentPosition = false;\n $scope.formPosition = {\n loading: false,\n enable: undefined\n };\n $scope.searchModalOpened = false;\n\n $scope.tryToLocalize = function() {\n if ($scope.formPosition.loading || loadingCurrentPosition) return;\n\n var searchText = $scope.getAddressToSearch();\n\n // No address, so try to localize by device\n if (!searchText) {\n loadingCurrentPosition = true;\n return esGeo.point.current()\n .then($scope.updateGeoPoint)\n .then(function() {\n loadingCurrentPosition = false;\n })\n .catch(function(err) {\n console.error(err); // Silent\n loadingCurrentPosition = false;\n });\n }\n\n $scope.formPosition.loading = true;\n return esGeo.point.searchByAddress(searchText)\n .then(function(res) {\n if (res && res.length == 1) {\n return $scope.updateGeoPoint(res[0]);\n }\n return $scope.openSearchLocationModal({\n text: searchText,\n results: res||[],\n forceFallback: !res || !res.length // force fallback search first\n });\n })\n .then(function() {\n $scope.formPosition.loading = false;\n })\n .catch(function(err) {\n console.error(err); // Silent\n $scope.formPosition.loading = false;\n });\n };\n\n $scope.onCityChanged = function() {\n if ($scope.loading) return;\n if ($scope.formPosition.enable) {\n if ($scope.formData.geoPoint) {\n // Invalidate the position\n $scope.formData.geoPoint.lat = undefined;\n $scope.formData.geoPoint.lon = undefined;\n }\n return $scope.tryToLocalize();\n }\n };\n\n $scope.onUseGeopointChanged = function() {\n if ($scope.loading) return;\n if (!$scope.formPosition.enable) {\n if ($scope.formData.geoPoint) {\n $scope.formData.geoPoint.lat = undefined;\n $scope.formData.geoPoint.lon = undefined;\n $scope.dirty = true;\n }\n }\n else {\n $scope.tryToLocalize();\n }\n };\n\n $scope.onGeopointChanged = function() {\n if ($scope.loading) {\n $scope.formPosition.enable = $scope.formData.geoPoint && !!$scope.formData.geoPoint.lat && !!$scope.formData.geoPoint.lon;\n }\n };\n $scope.$watch('formData.geoPoint', $scope.onGeopointChanged);\n\n $scope.getAddressToSearch = function() {\n return $scope.formData.address && $scope.formData.city ?\n [$scope.formData.address.trim(), $scope.formData.city.trim()].join(', ') :\n $scope.formData.city || $scope.formData.address || $scope.formData.location ;\n };\n\n $scope.updateGeoPoint = function(res) {\n // user cancel\n if (!res || !res.lat || !res.lon) {\n // nothing to do\n return;\n }\n\n $scope.dirty = true;\n $scope.formData.geoPoint = $scope.formData.geoPoint || {};\n $scope.formData.geoPoint.lat = parseFloat(res.lat);\n $scope.formData.geoPoint.lon = parseFloat(res.lon);\n\n if (res.address && res.address.city) {\n var cityParts = [res.address.city];\n if (res.address.postcode) {\n cityParts.push(res.address.postcode);\n }\n if (res.address.country != defaultCountry) {\n cityParts.push(res.address.country);\n }\n $scope.formData.city = cityParts.join(', ');\n }\n };\n\n /* -- modal -- */\n\n $scope.openSearchLocationModal = function(options) {\n\n if ($scope.searchModalOpened) return; // Skip\n\n $scope.searchModalOpened = true;\n options = options || {};\n\n var parameters = {\n text: options.text || $scope.getAddressToSearch(),\n results: options.results,\n fallbackText: options.fallbackText || $scope.formData.city,\n forceFallback: angular.isDefined(options.forceFallback) ? options.forceFallback : undefined\n };\n\n return ModalUtils.show(\n 'plugins/es/templates/common/modal_location.html',\n 'ESSearchPositionModalCtrl',\n parameters,\n {\n focusFirstInput: true\n }\n )\n .then(function(res) {\n $scope.searchModalOpened = false;\n $scope.updateGeoPoint(res);\n })\n .catch(function() {\n console.error(err);\n $scope.searchModalOpened = false;\n });\n };\n}\n\n\nfunction ESLookupPositionController($scope, $q, csConfig, esGeo, ModalUtils) {\n 'ngInject';\n\n // The default country used for address localisation\n var defaultCountry = csConfig.plugins && csConfig.plugins.es && csConfig.plugins.es.defaultCountry;\n var loadingPosition = false;\n\n $scope.geoDistanceLabels = [5,10,20,50,100,250,500].reduce(function(res, distance){\n res[distance] = {\n labelKey: 'LOCATION.DISTANCE_OPTION',\n labelParams: {value: distance}\n };\n return res;\n }, {});\n $scope.geoDistances = _.keys($scope.geoDistanceLabels);\n\n $scope.searchPosition = function(searchText) {\n if (loadingPosition) return $q.when();\n\n loadingPosition = true;\n\n // No address, so try to localize by device\n var promise = !searchText ?\n esGeo.point.current() :\n esGeo.point.searchByAddress(searchText)\n .then(function(res) {\n if (res && res.length == 1) {\n res[0].exact = true;\n return res[0];\n }\n return $scope.openSearchLocationModal({\n text: searchText,\n results: res||[],\n forceFallback: !res || !res.length // force fallback search first\n })\n .then(function(res) {\n // Compute point name\n if (res && res.address && res.address.city) {\n var cityParts = [res.address.city];\n if (res.address.postcode) {\n cityParts.push(res.address.postcode);\n }\n if (res.address.country != defaultCountry) {\n cityParts.push(res.address.country);\n }\n res.shortName = cityParts.join(', ');\n }\n return res;\n });\n });\n\n promise\n .then(function(res) {\n\n loadingPosition = false;\n\n // user cancel\n if (!res || !res.lat || !res.lon) return;\n\n return {\n lat: parseFloat(res.lat),\n lon: parseFloat(res.lon),\n name: res.shortName,\n exact: res.exact\n };\n\n })\n .catch(function(err) {\n console.error(err); // Silent\n loadingPosition = false;\n });\n\n return promise;\n };\n\n\n /* -- modal -- */\n\n $scope.openSearchLocationModal = function(options) {\n\n options = options || {};\n\n var parameters = {\n text: options.text || $scope.getAddressToSearch(),\n results: options.results,\n fallbackText: options.fallbackText || $scope.search.location,\n forceFallback: angular.isDefined(options.forceFallback) ? options.forceFallback : undefined\n };\n\n return ModalUtils.show(\n 'plugins/es/templates/common/modal_location.html',\n 'ESSearchPositionModalCtrl',\n parameters,\n {\n focusFirstInput: true\n //,scope: $scope\n }\n );\n };\n}\n\nfunction ESSearchPositionItemController($scope, $timeout, ModalUtils, csConfig, esGeo) {\n 'ngInject';\n\n // The default country used for address localisation\n var defaultCountry = csConfig.plugins && csConfig.plugins.es && csConfig.plugins.es.defaultCountry;\n //$scope.smallscreen = angular.isDefined($scope.smallscreen) ? $scope.smallscreen : UIUtils.screen.isSmall();\n\n var loadingPosition = false;\n var minLength = 3;\n $scope.locations = undefined;\n $scope.selectLocationIndex = -1;\n\n $scope.onKeydown = function(e) {\n\n switch(e.keyCode)\n {\n case 27://Esc\n $scope.hideDropdown();\n break;\n case 13://Enter\n if($scope.locations && $scope.locations.length)\n $scope.onEnter();\n break;\n case 38://Up\n $scope.onArrowUpOrDown(-1);\n e.preventDefault();\n break;\n case 40://Down\n $scope.onArrowUpOrDown(1);\n e.preventDefault();\n break;\n case 8://Backspace\n case 45://Insert\n case 46://Delete\n break;\n case 37://Left\n case 39://Right\n case 16://Shift\n case 17://Ctrl\n case 35://End\n case 36://Home\n break;\n default://All keys\n $scope.showDropdown();\n }\n };\n\n $scope.onEnter = function() {\n if ($scope.selectLocationIndex > -1) {\n $scope.selectLocation($scope.locations[$scope.selectLocationIndex]);\n }\n else {\n $scope.selectLocation($scope.locations[0]);\n }\n };\n\n $scope.onArrowUpOrDown = function(velocity) {\n if (!$scope.locations) return;\n\n $scope.selectLocationIndex+=velocity;\n if ($scope.selectLocationIndex >= $scope.locations.length) {\n $scope.selectLocationIndex = 0;\n }\n if ($scope.selectLocationIndex < 0) {\n $scope.selectLocationIndex = $scope.locations.length-1;\n }\n\n _.forEach($scope.locations||[], function(item, index) {\n item.selected = (index == $scope.selectLocationIndex);\n });\n\n // TODO: scroll to item ?\n };\n\n $scope.onLocationChanged = function() {\n if (loadingPosition || $scope.search.loading) return;\n $scope.search.geoPoint = undefined; // reset geo point\n\n $scope.showDropdown();\n };\n\n $scope.showDropdown = function() {\n var text = $scope.search.location && $scope.search.location.trim();\n if (!text || text.length < minLength) {\n return $scope.hideDropdown(true/*force, if still loading*/);\n }\n\n // Compute a request id, to apply response only if current request\n var requestId = ($scope.requestId && $scope.requestId + 1) || 1;\n $scope.requestId = requestId;\n\n loadingPosition = true;\n\n // Execute the given query\n return esGeo.point.searchByAddress(text)\n .then(function(res) {\n if ($scope.requestId != requestId) return; // Skip apply if not same request:\n\n loadingPosition = false;\n $scope.locations = res||[];\n $scope.license = res && res.length && res[0].license;\n })\n .catch(function(err) {\n $scope.hideDropdown();\n throw err;\n });\n };\n\n $scope.hideDropdown = function(force) {\n // force, even if still loading\n if (force) {\n $scope.locations = undefined;\n $scope.selectLocationIndex = -1;\n $scope.license = undefined;\n loadingPosition = false;\n return;\n }\n\n return $timeout(function() {\n if (loadingPosition) return;\n $scope.locations = undefined;\n $scope.license = undefined;\n loadingPosition = false;\n }, 500);\n };\n\n $scope.selectLocation = function(res, exactMatch) {\n loadingPosition = true; // avoid event\n if (res) {\n // Update position\n $scope.search.geoPoint = $scope.search.geoPoint || {};\n $scope.search.geoPoint.lat = parseFloat(res.lat);\n $scope.search.geoPoint.lon = parseFloat(res.lon);\n\n if (exactMatch) {\n $scope.search.geoPoint.exact = true;\n }\n else {\n // Update location name\n if (res && res.address && res.address.city) {\n var cityParts = [res.address.city];\n if (res.address.postcode) {\n cityParts.push(res.address.postcode);\n }\n if (res.address.country != defaultCountry) {\n cityParts.push(res.address.country);\n }\n $scope.search.location = cityParts.join(', ');\n }\n }\n }\n\n $scope.hideDropdown(true);\n };\n\n /* -- modal -- */\n\n $scope.openSearchLocationModal = function(options) {\n\n options = options || {\n text: $scope.search.location\n };\n\n var parameters = {\n text: options.text || $scope.search.location\n };\n\n return ModalUtils.show(\n 'plugins/es/templates/common/modal_location.html',\n 'ESSearchPositionModalCtrl',\n parameters,\n {\n focusFirstInput: true\n }\n )\n .then($scope.selectLocation);\n };\n\n}\n\nfunction ESSearchPositionModalController($scope, $q, $translate, esGeo, parameters) {\n 'ngInject';\n\n $scope.search = {\n text: parameters.text || '',\n fallbackText: parameters.fallbackText || undefined,\n forceFallback: angular.isDefined(parameters.forceFallback) ? parameters.forceFallback : false,\n loading: false,\n results: parameters.results || undefined\n };\n\n $scope.$on('modal.shown', function() {\n // Load search\n $scope.doSearch(true/*first search*/);\n });\n\n $scope.doSearch = function(firstSearch) {\n\n var text = $scope.search.text && $scope.search.text.trim();\n if (!text) {\n return $q.when(); // nothing to search\n }\n\n $scope.search.loading = true;\n\n // Compute alternative query text\n var fallbackText = firstSearch && $scope.search.fallbackText && $scope.search.fallbackText.trim();\n fallbackText = fallbackText && fallbackText != text ? fallbackText : undefined;\n\n // Execute the given query\n return ((firstSearch && $scope.search.forceFallback && $scope.search.results) ?\n $q.when($scope.search.results) :\n esGeo.point.searchByAddress(text)\n )\n .then(function(res) {\n if (res && res.length || !fallbackText) return res;\n\n // Fallback search\n return $q.all([\n $translate('LOCATION.MODAL.ALTERNATIVE_RESULT_DIVIDER', {address: fallbackText}),\n esGeo.point.searchByAddress(fallbackText)\n ])\n .then(function (res) {\n var dividerText = res[0];\n res = res[1];\n if (!res || !res.length) return res;\n\n return [{name: dividerText}].concat(res);\n });\n })\n .then(function(res) {\n $scope.search.loading = false;\n $scope.search.results = res||[];\n\n $scope.license = res && res.length && res[0].license;\n })\n .catch(function(err) {\n $scope.search.loading = false;\n $scope.search.results = [];\n $scope.license = undefined;\n throw err;\n })\n ;\n };\n\n}\n","\nESExtensionController.$inject = ['$scope', 'esSettings', 'PluginService'];\nESMenuExtendController.$inject = ['$scope', '$state', '$controller', 'UIUtils', 'csWallet'];\nESProfilePopoverExtendController.$inject = ['$scope', '$q', '$state', 'esSettings', 'csWallet'];angular.module('cesium.es.app.controllers', ['ngResource', 'cesium.es.services'])\n\n // Configure menu items\n .config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Menu extension points\n PluginServiceProvider.extendState('app', {\n points: {\n // removeIf(device)\n 'nav-buttons-right': {\n templateUrl: \"plugins/es/templates/menu_extend.html\",\n controller: \"ESMenuExtendCtrl\"\n },\n // endRemoveIf(device)\n 'menu-user': {\n templateUrl: \"plugins/es/templates/menu_extend.html\",\n controller: \"ESMenuExtendCtrl\"\n }\n }\n });\n\n // Profile popover extension points\n PluginServiceProvider.extendState('app', {\n points: {\n 'profile-popover-user': {\n templateUrl: \"plugins/es/templates/common/popover_profile_extend.html\",\n controller: \"ESProfilePopoverExtendCtrl\"\n }\n }\n });\n }\n }])\n\n .controller('ESExtensionCtrl', ESExtensionController)\n\n .controller('ESMenuExtendCtrl', ESMenuExtendController)\n\n .controller('ESProfilePopoverExtendCtrl', ESProfilePopoverExtendController)\n\n\n;\n\n\n/**\n * Generic controller, that enable/disable depending on esSettings enable/disable\n */\nfunction ESExtensionController($scope, esSettings, PluginService) {\n 'ngInject';\n $scope.extensionPoint = PluginService.extensions.points.current.get();\n $scope.enable = esSettings.isEnable();\n esSettings.api.state.on.changed($scope, function(enable) {\n $scope.enable = enable;\n $scope.$broadcast('$$rebind::state');\n });\n}\n\n/**\n * Control menu extension\n */\nfunction ESMenuExtendController($scope, $state, $controller, UIUtils, csWallet) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESExtensionCtrl', {$scope: $scope}));\n\n $scope.showRegistryLookupView = function() {\n $state.go(UIUtils.screen.isSmall() ? 'app.wot_lookup.tab_registry': 'app.registry_lookup_lg');\n };\n\n $scope.showNotificationsPopover = function(event) {\n return UIUtils.popover.show(event, {\n templateUrl :'plugins/es/templates/notification/popover_notification.html',\n scope: $scope,\n autoremove: false, // reuse popover\n // Auto-close if open when un-authenticate\n afterShow: function(popover) {\n var listener = csWallet.api.data.on.unauth(popover.scope, function() {\n popover.scope.closePopover();\n listener();\n });\n }\n });\n };\n\n $scope.showMessagesPopover = function(event) {\n // Make sure tobe auth before opening this popover\n if (!csWallet.isAuth()) {\n return csWallet.auth({minData: true}).then(function(){\n UIUtils.loading.hide();\n return $scope.showMessagesPopover(event); // loop\n });\n }\n\n return UIUtils.popover.show(event, {\n templateUrl :'plugins/es/templates/message/popover_message.html',\n scope: $scope,\n autoremove: false, // reuse popover\n // Auto-close if open when un-authenticate\n afterShow: function(popover) {\n var listener = csWallet.api.data.on.unauth(popover.scope, function() {\n popover.scope.closePopover();\n listener();\n });\n }\n });\n };\n\n $scope.showInvitationsPopover = function(event) {\n // Make sure tobe auth before opening this popover\n if (!csWallet.isAuth()) {\n return csWallet.auth().then(function(){\n UIUtils.loading.hide();\n return $scope.showInvitationsPopover(event); // loop\n });\n }\n\n return UIUtils.popover.show(event, {\n templateUrl :'plugins/es/templates/invitation/popover_invitation.html',\n scope: $scope,\n autoremove: false, // reuse popover\n // Auto-close if open when un-authenticate\n afterShow: function(popover) {\n var listener = csWallet.api.data.on.unauth(popover.scope, function() {\n popover.scope.closePopover();\n listener();\n });\n }\n });\n };\n}\n\n/**\n * Control profile popover extension\n */\nfunction ESProfilePopoverExtendController($scope, $q, $state, esSettings, csWallet) {\n 'ngInject';\n\n $scope.updateView = function() {\n $scope.enable = csWallet.isLogin() && esSettings.isEnable();\n };\n\n $scope.showEditUserProfile = function() {\n $scope.closeProfilePopover();\n $state.go('app.edit_profile');\n };\n\n esSettings.api.state.on.changed($scope, $scope.updateView);\n csWallet.api.data.on.login($scope, function(data, deferred){\n $scope.enable = esSettings.isEnable();\n return deferred && deferred.resolve() || $q.when();\n });\n csWallet.api.data.on.logout($scope, function() {\n $scope.enable = false;\n });\n\n // Default action\n $scope.updateView();\n\n}\n","\nESPluginSettingsController.$inject = ['$scope', '$window', '$q', '$translate', '$ionicPopup', 'UIUtils', 'Modals', 'csHttp', 'csConfig', 'csSettings', 'esHttp', 'esSettings', 'esModals'];angular.module('cesium.es.settings.controllers', ['cesium.es.services'])\n\n // Configure menu items\n .config(['PluginServiceProvider', '$stateProvider', 'csConfig', function(PluginServiceProvider, $stateProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Extend settings via extension points\n PluginServiceProvider.extendState('app.settings', {\n points: {\n 'plugins': {\n templateUrl: \"plugins/es/templates/settings/settings_extend.html\",\n controller: \"ESExtensionCtrl\"\n }\n }\n });\n\n $stateProvider\n .state('app.es_settings', {\n url: \"/settings/es\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/settings/plugin_settings.html\",\n controller: 'ESPluginSettingsCtrl'\n }\n }\n });\n }\n }])\n\n .controller('ESPluginSettingsCtrl', ESPluginSettingsController)\n;\n\n\n/*\n * Settings extend controller\n */\nfunction ESPluginSettingsController ($scope, $window, $q, $translate, $ionicPopup,\n UIUtils, Modals, csHttp, csConfig, csSettings, esHttp, esSettings, esModals) {\n 'ngInject';\n\n $scope.hasWindowNotification = !!(\"Notification\" in window);\n $scope.formData = {};\n $scope.popupData = {}; // need for the node popup\n $scope.loading = true;\n\n $scope.enter= function(e, state) {\n $scope.load();\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.load = function(keepEnableState) {\n $scope.loading = true;\n\n var wasEnable = $scope.formData.enable;\n $scope.formData = csSettings.data.plugins && csSettings.data.plugins.es ?\n angular.copy(csSettings.data.plugins.es) : {\n enable: false,\n host: undefined,\n port: undefined\n };\n if (keepEnableState && wasEnable) {\n $scope.formData.enable = wasEnable;\n }\n\n $scope.isFallbackNode = $scope.formData.enable && esHttp.node.isFallback();\n $scope.server = $scope.getServer(esHttp);\n\n $scope.loading = false;\n };\n\n esSettings.api.state.on.changed($scope, function(enable) {\n $scope.load(true);\n });\n\n $scope.setPopupForm = function(popupForm) {\n $scope.popupForm = popupForm;\n };\n\n // Change ESnode\n $scope.changeEsNode= function(node) {\n node = node || {\n host: $scope.formData.host,\n port: $scope.formData.port && $scope.formData.port != 80 && $scope.formData.port != 443 ? $scope.formData.port : undefined,\n useSsl: angular.isDefined($scope.formData.useSsl) ?\n $scope.formData.useSsl :\n ($scope.formData.port == 443)\n };\n\n $scope.showNodePopup(node)\n .then(function(newNode) {\n if (newNode.host === $scope.formData.host &&\n newNode.port == $scope.formData.port &&\n newNode.useSsl == $scope.formData.useSsl) {\n UIUtils.loading.hide();\n return; // same node = nothing to do\n }\n UIUtils.loading.show();\n\n var newEsNode = esHttp.instance(newNode.host, newNode.port, newNode.useSsl);\n return newEsNode.isAlive() // ping the node\n .then(function(alive) {\n if (!alive) {\n UIUtils.loading.hide();\n return UIUtils.alert.error('ERROR.INVALID_NODE_SUMMARY')\n .then(function(){\n $scope.changeEsNode(newNode); // loop\n });\n }\n\n $scope.formData.host = newEsNode.host;\n $scope.formData.port = newEsNode.port;\n $scope.formData.useSsl = newEsNode.useSsl;\n\n return esHttp.copy(newEsNode);\n })\n .then(function() {\n $scope.server = $scope.getServer(esHttp);\n $scope.isFallbackNode = false;\n UIUtils.loading.hide();\n });\n });\n };\n\n // Show node popup\n $scope.showNodePopup = function(node) {\n\n return $q(function(resolve, reject) {\n var parts = [node.host];\n if (node.port && node.port != 80) {\n parts.push(node.port);\n }\n $scope.popupData.newNode = parts.join(':');\n $scope.popupData.useSsl = angular.isDefined(node.useSsl) ? node.useSsl : (node.port == 443);\n if (!!$scope.popupForm) {\n $scope.popupForm.$setPristine();\n }\n $translate(['ES_SETTINGS.POPUP_PEER.TITLE', 'ES_SETTINGS.POPUP_PEER.HELP', 'COMMON.BTN_OK', 'COMMON.BTN_CANCEL'])\n .then(function (translations) {\n // Choose UID popup\n $ionicPopup.show({\n templateUrl: 'templates/settings/popup_node.html',\n title: translations['ES_SETTINGS.POPUP_PEER.TITLE'],\n subTitle: translations['ES_SETTINGS.POPUP_PEER.HELP'],\n scope: $scope,\n buttons: [\n { text: translations['COMMON.BTN_CANCEL'] },\n {\n text: translations['COMMON.BTN_OK'],\n type: 'button-positive',\n onTap: function(e) {\n $scope.popupForm.$submitted=true;\n if(!$scope.popupForm.$valid || !$scope.popupForm.newNode) {\n //don't allow the user to close unless he enters a node\n e.preventDefault();\n } else {\n return {\n server: $scope.popupData.newNode,\n useSsl: $scope.popupData.useSsl\n };\n }\n }\n }\n ]\n })\n .then(function(res) {\n if (!res) { // user cancel\n UIUtils.loading.hide();\n return;\n }\n var parts = res.server.split(':');\n parts[1] = parts[1] ? parts[1] : (res.useSsl ? 443 : 80);\n resolve({\n host: parts[0],\n port: parts[1],\n useSsl: res.useSsl\n });\n });\n });\n });\n };\n\n $scope.showNodeList = function() {\n // Check if need a filter on SSL node\n var forceUseSsl = (csConfig.httpsMode === 'true' || csConfig.httpsMode === true || csConfig.httpsMode === 'force') ||\n ($window.location && $window.location.protocol === 'https:') ? true : false;\n\n $ionicPopup._popupStack[0].responseDeferred.promise.close();\n return esModals.showNetworkLookup({\n enableFilter: true,\n endpoint: esHttp.constants.ES_USER_API_ENDPOINT,\n ssl: forceUseSsl ? true: undefined\n })\n .then(function (peer) {\n if (!peer) return;\n var esEps = (peer.getEsEndpoints() || []).reduce(function(res, ep){\n var esEp = esHttp.node.parseEndPoint(ep);\n return esEp ? res.concat(esEp) : res;\n }, []);\n if (!esEps.length) return;\n var ep = esEps[0];\n return {\n host: (ep.dns ? ep.dns :\n (peer.hasValid4(ep) ? ep.ipv4 : ep.ipv6)),\n port: ep.port || 80,\n useSsl: ep.useSsl || ep.port == 443\n };\n })\n .then(function(newEsNode) {\n $scope.changeEsNode(newEsNode); // get back to node popup\n });\n };\n\n $scope.onFormChanged = function() {\n if ($scope.loading) return;\n\n if ($scope.hasWindowNotification &&\n $scope.formData.notifications.emitHtml5 !== (window.Notification.permission === \"granted\")){\n window.Notification.requestPermission(function (permission) {\n // If the user accepts, let's create a notification\n $scope.formData.notifications.emitHtml5 = (permission === \"granted\"); // revert to false if permission not granted\n $scope.onFormChanged(); // Loop\n });\n return;\n }\n\n $scope.loading = true;\n csSettings.data.plugins = csSettings.data.plugins || {};\n csSettings.data.plugins.es = csSettings.data.plugins.es ?\n angular.merge(csSettings.data.plugins.es, $scope.formData) :\n $scope.formData;\n\n // Fix old settings (unused)\n delete csSettings.data.plugins.es.newNode;\n\n csSettings.store()\n .then(function() {\n $scope.loading = false;\n });\n };\n $scope.$watch('formData', $scope.onFormChanged, true);\n\n $scope.getServer = function(node) {\n node = node || $scope.formData;\n if (!node.host) return undefined;\n return csHttp.getServer(node.host, node.port);\n };\n}\n","\nESWalletViewController.$inject = ['$scope', '$controller', '$state', 'csWallet', 'esModals'];\nESWalletLikesController.$inject = ['$scope', '$controller', 'UIUtils', 'esHttp', 'esProfile'];angular.module('cesium.es.wallet.controllers', ['cesium.es.services'])\n\n .config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n PluginServiceProvider\n .extendStates(['app.view_wallet', 'app.view_wallet_by_id'], {\n points: {\n 'hero': {\n templateUrl: \"plugins/es/templates/wallet/view_wallet_extend.html\",\n controller: 'ESWalletLikesCtrl'\n },\n 'after-general': {\n templateUrl: \"plugins/es/templates/wallet/view_wallet_extend.html\",\n controller: 'ESWalletViewCtrl'\n }\n }\n })\n\n .extendState('app.view_wallets', {\n points: {\n 'item-wallet': {\n templateUrl: \"plugins/es/templates/wallet/item_wallet_extend.html\",\n controller: 'ESExtensionCtrl'\n }\n }\n })\n\n ;\n }\n\n }])\n\n\n .controller('ESWalletViewCtrl', ESWalletViewController)\n\n .controller('ESWalletLikesCtrl', ESWalletLikesController)\n\n;\n\nfunction ESWalletViewController($scope, $controller, $state, csWallet, esModals) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESExtensionCtrl', {$scope: $scope}));\n\n $scope.showProfileHelp = false;\n\n /* -- modals -- */\n\n $scope.showNewPageModal = function(event) {\n var wallet = ($state.params && $state.params.id) ? csWallet.children.get($state.params.id) : csWallet;\n if (!wallet) {\n UIUtils.alert.error('ERROR.UNKNOWN_WALLET_ID');\n return;\n }\n\n return esModals.showNewPage({wallet: wallet});\n };\n}\n\n\nfunction ESWalletLikesController($scope, $controller, UIUtils, esHttp, esProfile) {\n 'ngInject';\n\n $scope.options = $scope.options || {};\n $scope.options.like = $scope.options.like || {\n index: 'user',\n type: 'profile',\n service: esProfile.like\n };\n $scope.canEdit = true; // Avoid to change like counter itself\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESLikesCtrl', {$scope: $scope}));\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESExtensionCtrl', {$scope: $scope}));\n\n // Load likes, when profile loaded\n $scope.$watch('formData.pubkey', function(pubkey) {\n if (pubkey) {\n $scope.loadLikes(pubkey);\n }\n });\n}\n","\nESWotLookupExtendController.$inject = ['$scope', '$controller', '$state'];\nESWotIdentityViewController.$inject = ['$scope', '$ionicPopover', '$q', '$controller', '$timeout', 'UIUtils', 'Modals', 'csWallet', 'esHttp', 'esLike', 'esModals', 'esWallet', 'esProfile', 'esInvitation'];angular.module('cesium.es.wot.controllers', ['cesium.es.services'])\n\n .config(['$stateProvider', 'PluginServiceProvider', 'csConfig', function($stateProvider, PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n PluginServiceProvider\n\n .extendState('app.wot_lookup', {\n points: {\n 'tabs': {\n templateUrl: \"plugins/es/templates/wot/lookup_extend.html\",\n controller: \"ESExtensionCtrl\"\n }\n }\n })\n\n .extendState('app.wot_lookup_lg', {\n points: {\n 'top': {\n templateUrl: \"plugins/es/templates/wot/lookup_lg_extend.html\",\n controller: \"ESWotLookupExtendCtrl\"\n }\n }\n })\n\n .extendStates(['app.wot_identity', 'app.wot_identity_uid'], {\n points: {\n 'hero': {\n templateUrl: \"plugins/es/templates/wot/view_identity_extend.html\",\n controller: 'ESWotIdentityViewCtrl'\n },\n 'general': {\n templateUrl: \"plugins/es/templates/wot/view_identity_extend.html\",\n controller: 'ESWotIdentityViewCtrl'\n },\n 'after-general': {\n templateUrl: \"plugins/es/templates/wot/view_identity_extend.html\",\n controller: 'ESWotIdentityViewCtrl'\n },\n 'buttons': {\n templateUrl: \"plugins/es/templates/wot/view_identity_extend.html\",\n controller: 'ESWotIdentityViewCtrl'\n },\n 'after-buttons': {\n templateUrl: \"plugins/es/templates/wot/view_identity_extend.html\",\n controller: 'ESWotIdentityViewCtrl'\n },\n 'buttons-top-fab': {\n templateUrl: \"plugins/es/templates/wot/view_identity_extend.html\",\n controller: 'ESWotIdentityViewCtrl'\n }\n }\n })\n\n .extendStates(['app.wot_cert', 'app.wot_cert_lg', 'app.wallet_cert', 'app.wallet_cert_lg'], {\n points: {\n 'nav-buttons': {\n templateUrl: \"plugins/es/templates/wot/view_certifications_extend.html\",\n controller: 'ESWotIdentityViewCtrl'\n },\n 'buttons': {\n templateUrl: \"plugins/es/templates/wot/view_certifications_extend.html\",\n controller: 'ESWotIdentityViewCtrl'\n }\n }\n })\n ;\n }\n\n }])\n\n\n .controller('ESWotLookupExtendCtrl', ESWotLookupExtendController)\n\n .controller('ESWotIdentityViewCtrl', ESWotIdentityViewController)\n\n;\n\nfunction ESWotLookupExtendController($scope, $controller, $state) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESExtensionCtrl', {$scope: $scope}));\n\n $scope.openRegistryLookup = function() {\n\n var text = $scope.search.text && $scope.search.text.trim() || '';\n var location = $scope.search.location && $scope.search.location.trim() || '';\n var stateParams = {\n q: text.length ? text : undefined,\n location: location.length ? location : undefined\n };\n\n $state.go('app.wot_lookup.tab_registry', stateParams);\n };\n}\n\nfunction ESWotIdentityViewController($scope, $ionicPopover, $q, $controller, $timeout, UIUtils, Modals, csWallet,\n esHttp, esLike, esModals, esWallet, esProfile, esInvitation) {\n 'ngInject';\n\n $scope.options = $scope.options || {};\n $scope.options.like = $scope.options.like || {\n kinds: esLike.constants.KINDS,\n index: 'user',\n type: 'profile',\n service: esProfile.like\n };\n $scope.smallscreen = angular.isDefined($scope.smallscreen) ? $scope.smallscreen : UIUtils.screen.isSmall();\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESLikesCtrl', {$scope: $scope}));\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESExtensionCtrl', {$scope: $scope}));\n\n $scope.canCertify = false; // disable certify on the popover (by default - override by the wot map controller)\n\n /* -- modals -- */\n\n $scope.showNewMessageModal = function(confirm) {\n\n // note: not need to select wallet here, because message modal will do it, if need\n return csWallet.login({minData: true, method: 'default'})\n .then(function() {\n UIUtils.loading.hide();\n\n // Ask confirmation, if user has no Cesium+ profil\n if (!confirm && !$scope.formData.profile) {\n return UIUtils.alert.confirm('MESSAGE.CONFIRM.USER_HAS_NO_PROFILE')\n .then(function (confirm) {\n // Recursive call (with confirm flag)\n if (confirm) return true;\n });\n }\n return true;\n })\n // Open modal\n .then(function(confirm) {\n if (!confirm) return false;\n\n return esModals.showMessageCompose({\n destPub: $scope.formData.pubkey,\n destUid: $scope.formData.name||$scope.formData.uid\n })\n .then(function(sent) {\n if (sent) UIUtils.toast.show('MESSAGE.INFO.MESSAGE_SENT');\n });\n });\n };\n\n $scope.showSuggestCertificationModal = function() {\n\n $scope.hideCertificationActionsPopover();\n\n var identities;\n\n return csWallet.auth({minData: true})\n .then(function(walletData) {\n UIUtils.loading.hide();\n if (!walletData) return;\n\n // Not allow for non-member - issue #561\n if (!walletData.isMember) {\n return UIUtils.alert.error('ERROR.ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION');\n }\n\n return Modals.showWotLookup({\n allowMultiple: true,\n enableFilter: true,\n title: 'WOT.SUGGEST_CERTIFICATIONS_MODAL.TITLE',\n help: 'WOT.SUGGEST_CERTIFICATIONS_MODAL.HELP',\n okText: 'COMMON.BTN_NEXT',\n okType: 'button-positive'\n })\n .then(function(res) {\n if (!res || !res.length) return; // user cancelled\n identities = res;\n\n return $q.all([\n // Get keypair only once (if not done here, certification.send() with compute it many times)\n esWallet.box.getKeypair(walletData.keypair),\n // Ask confirmation\n UIUtils.alert.confirm('WOT.CONFIRM.SUGGEST_CERTIFICATIONS', undefined, {okText: 'COMMON.BTN_SEND'})\n ])\n .then(function(res) {\n if (!res) return;\n var keypair = res[0];\n var confirm = res[1];\n if (!confirm) return;\n var time = moment().utc().unix(); // use same date for each invitation\n return $q.all(\n identities.reduce(function(res, identity){\n return res.concat(\n esInvitation.send({\n issuer: walletData.pubkey,\n recipient: $scope.formData.pubkey,\n time: time,\n content: [identity.uid, identity.pubkey].join('-')\n }, keypair, 'certification')\n );\n }, [])\n );\n })\n .then(function() {\n UIUtils.toast.show('INVITATION.INFO.INVITATION_SENT');\n })\n .catch(UIUtils.onError('INVITATION.ERROR.SEND_INVITATION_FAILED'));\n });\n });\n };\n\n $scope.showAskCertificationModal = function() {\n\n $scope.hideCertificationActionsPopover();\n\n var identities;\n return (csWallet.children.count() ? Modals.showSelectWallet({displayBalance: false}) : $q.when(csWallet))\n .then(function(wallet) {\n if (!wallet) throw 'CANCELLED';\n return wallet.auth({minData: true});\n })\n .then(function(walletData) {\n UIUtils.loading.hide();\n if (!walletData) return;\n\n // Not allow for non-member - issue #561\n if (!walletData.isMember) {\n return UIUtils.alert.error('ERROR.ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION');\n }\n\n return Modals.showWotLookup({\n allowMultiple: true,\n enableFilter: false,\n title: 'WOT.ASK_CERTIFICATIONS_MODAL.TITLE',\n help: 'WOT.ASK_CERTIFICATIONS_MODAL.HELP',\n okText: 'COMMON.BTN_NEXT',\n okType: 'button-positive'\n })\n .then(function(res) {\n if (!res || !res.length) return; // user cancelled\n identities = res;\n\n return $q.all([\n // Get keypair only once (if not done here, certification.send() with compute it many times)\n esWallet.box.getKeypair(walletData.keypair),\n // Ask confirmation\n UIUtils.alert.confirm('WOT.CONFIRM.ASK_CERTIFICATIONS', undefined, {okText: 'COMMON.BTN_SEND'})\n ])\n .then(function(res) {\n var keypair = res && res[0];\n var confirm = res && res[1];\n if (!keypair || !confirm) return;\n var time = moment().utc().unix(); // use same date for each invitation\n return $q.all(identities.reduce(function(res, identity){\n return res.concat(\n esInvitation.send({\n issuer: walletData.pubkey,\n recipient: identity.pubkey,\n time: time,\n content: [walletData.uid, walletData.pubkey].join('-')\n }, keypair, 'certification')\n );\n }, []))\n .then(function() {\n UIUtils.toast.show('INVITATION.INFO.INVITATION_SENT');\n })\n .catch(UIUtils.onError('INVITATION.ERROR.SEND_INVITATION_FAILED'));\n });\n });\n });\n };\n\n $scope.askCertification = function() {\n $scope.hideCertificationActionsPopover();\n\n return (csWallet.children.count() ? Modals.showSelectWallet({displayBalance: false}) : $q.when(csWallet))\n .then(function(wallet) {\n return wallet.auth({minData: true});\n })\n .then(function(walletData) {\n UIUtils.loading.hide();\n if (!walletData) return;\n\n // Not allow for non-member - issue #561\n if (!walletData.isMember) {\n return UIUtils.alert.error('ERROR.ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION');\n }\n // ask confirmation\n return UIUtils.alert.confirm('WOT.CONFIRM.ASK_CERTIFICATION', undefined, {\n okText: 'COMMON.BTN_SEND'\n })\n .then(function(confirm) {\n if (!confirm) return;\n return esInvitation.send({\n issuer: walletData.pubkey,\n recipient: $scope.formData.pubkey,\n content: [walletData.uid, walletData.pubkey].join('-')\n },\n {\n type: 'certification',\n keypair: walletData.keypair\n })\n .then(function() {\n UIUtils.toast.show('INVITATION.INFO.INVITATION_SENT');\n })\n .catch(UIUtils.onError('INVITATION.ERROR.SEND_INVITATION_FAILED'));\n });\n });\n };\n\n /**\n * Delete the user profile (need moderator access, on Cs+ pod)\n * @param confirm\n * @returns {*}\n */\n $scope.delete = function(confirm) {\n\n if (!confirm) {\n $scope.hideActionsPopover();\n if (!$scope.formData.pubkey) return; // Skip\n\n return UIUtils.alert.confirm('PROFILE.CONFIRM.DELETE_BY_MODERATOR')\n .then(function(confirm) {\n if (confirm) return $scope.delete(confirm); // recursive call\n });\n }\n\n // TODO: ask for deletion of all data ? (e.g. message, comment, likes, etc.)\n // if (angular.isUndefined(allData)) {\n // return UIUtils.alert.confirm(...)\n // ...\n // }\n\n return UIUtils.loading.show()\n .then(function() {\n return esProfile.remove($scope.formData.pubkey);\n })\n .then(function() {\n return $scope.doUpdate();\n })\n .then(function() {\n return $timeout(function() {\n UIUtils.toast.show('DOCUMENT.INFO.REMOVED'); // toast\n }, 800);\n })\n .catch(UIUtils.onError(\"PROFILE.ERROR.DELETE_PROFILE_FAILED\"));\n };\n\n /* -- Load data -- */\n\n // Watch when profile loaded\n $scope.$watch('formData.pubkey', function(pubkey) {\n if (pubkey) {\n\n // Load likes,\n $scope.loadLikes(pubkey);\n\n // Enable deletion, if moderator\n $scope.canDelete = $scope.formData.profile && csWallet.isLogin() && csWallet.data.moderator === true;\n }\n\n });\n\n /* -- Popover -- */\n\n $scope.showCertificationActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'plugins/es/templates/wot/popover_certification_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.certificationActionsPopover = popover;\n }\n });\n };\n\n $scope.hideCertificationActionsPopover = function() {\n if ($scope.certificationActionsPopover) {\n $scope.certificationActionsPopover.hide();\n $scope.certificationActionsPopover = null;\n }\n return true;\n };\n\n $scope.showActionsPopover = function (event) {\n UIUtils.popover.show(event, {\n templateUrl: 'plugins/es/templates/wot/view_popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n return true;\n };\n\n if ($scope.extensionPoint === 'buttons-top-fab') {\n // Show fab button, when parent execute motions\n $scope.$on('$csExtension.motion', function(event) {\n var canCompose = !!$scope.formData.profile;\n if (canCompose) {\n $scope.showFab('fab-compose-' + $scope.formData.pubkey);\n }\n });\n }\n\n // TODO : for DEV only\n /*$timeout(function() {\n if ($scope.extensionPoint != 'buttons') return;\n $scope.showSuggestCertificationModal();\n }, 1000);*/\n}\n","\nESRegistryLookupController.$inject = ['$scope', '$focus', '$timeout', '$filter', '$controller', '$location', '$translate', '$ionicPopover', 'Device', 'UIUtils', 'ModalUtils', 'BMA', 'csSettings', 'csWallet', 'esModals', 'esRegistry', 'esHttp'];\nESWalletPagesController.$inject = ['$scope', '$controller', '$timeout', 'UIUtils', 'esModals', 'csWallet'];\nESRegistryRecordViewController.$inject = ['$scope', '$rootScope', '$state', '$q', '$timeout', '$ionicPopover', '$ionicHistory', '$translate', '$controller', '$anchorScroll', 'csConfig', 'csWallet', 'esRegistry', 'UIUtils', 'esHttp'];\nESRegistryRecordEditController.$inject = ['$scope', '$timeout', '$state', '$q', '$ionicHistory', '$focus', '$translate', '$controller', 'Device', 'UIUtils', 'ModalUtils', 'csWallet', 'esHttp', 'esRegistry'];angular.module('cesium.es.registry.controllers', ['cesium.es.services', 'cesium.es.common.controllers'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n\n .state('app.wot_lookup.tab_registry', {\n url: \"/page?q&type&hash&category&location&issuer&reload&lat&lon&d&last\",\n views: {\n 'tab_registry': {\n templateUrl: \"plugins/es/templates/registry/tabs/tab_registry.html\",\n controller: 'ESRegistryLookupCtrl'\n }\n },\n data: {\n large: 'app.registry_lookup_lg',\n silentLocationChange: true\n }\n })\n\n .state('app.registry_lookup_lg', {\n url: \"/wot/page/lg?q&type&hash&category&location&issuer&reload&lat&lon&d&last\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/registry/lookup_lg.html\",\n controller: 'ESRegistryLookupCtrl'\n }\n },\n data: {\n silentLocationChange: true\n }\n })\n\n .state('app.wallet_pages', {\n url: \"/account/pages?refresh\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/registry/view_wallet_pages.html\",\n controller: 'ESWalletPagesCtrl'\n }\n },\n data: {\n login: true,\n minData: true,\n silentLocationChange: true\n }\n })\n\n .state('app.wallet_pages_by_id', {\n url: \"/wallets/:id/pages?refresh\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/registry/view_wallet_pages.html\",\n controller: 'ESWalletPagesCtrl'\n }\n },\n data: {\n login: true,\n minData: true,\n silentLocationChange: true\n }\n })\n\n .state('app.view_page', {\n url: \"/page/view/:id/:title?refresh\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/registry/view_record.html\",\n controller: 'ESRegistryRecordViewCtrl'\n }\n }\n })\n\n .state('app.view_page_anchor', {\n url: \"/page/view/:id/:title/:anchor\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/registry/view_record.html\",\n controller: 'ESRegistryRecordViewCtrl'\n }\n }\n })\n\n .state('app.registry_add_record', {\n cache: false,\n url: \"/page/add/:type?wallet\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/registry/edit_record.html\",\n controller: 'ESRegistryRecordEditCtrl'\n }\n },\n data: {\n auth: true,\n minData: true\n }\n })\n\n .state('app.registry_edit_record', {\n cache: false,\n url: \"/page/edit/:id/:title?wallet\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/registry/edit_record.html\",\n controller: 'ESRegistryRecordEditCtrl'\n }\n },\n data: {\n auth: true,\n minData: true\n }\n })\n ;\n }])\n\n .controller('ESRegistryLookupCtrl', ESRegistryLookupController)\n\n .controller('ESWalletPagesCtrl', ESWalletPagesController)\n\n .controller('ESRegistryRecordViewCtrl', ESRegistryRecordViewController)\n\n .controller('ESRegistryRecordEditCtrl', ESRegistryRecordEditController)\n\n;\n\nfunction ESRegistryLookupController($scope, $focus, $timeout, $filter, $controller, $location, $translate, $ionicPopover,\n Device, UIUtils, ModalUtils, BMA, csSettings, csWallet, esModals, esRegistry, esHttp) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESLookupPositionCtrl', {$scope: $scope}));\n\n var defaultSearchLimit = 10;\n\n $scope.search = {\n text: '',\n results: [],\n loading: true,\n lastRecords: true,\n type: null,\n category: null,\n location: null,\n advanced: null,\n issuer: null,\n geoDistance: !isNaN(csSettings.data.plugins.es.geoDistance) ? csSettings.data.plugins.es.geoDistance : 20\n };\n $scope.searchTextId = 'registrySearchText';\n $scope.enableFilter = true;\n $scope.smallscreen = angular.isDefined($scope.smallscreen) ? $scope.smallscreen : UIUtils.screen.isSmall();\n\n $scope.options = angular.merge($scope.options||{}, {\n location: {\n show: true,\n help: 'REGISTRY.SEARCH.LOCATION_HELP'\n }\n });\n\n $scope.enter = function(e, state) {\n if (!$scope.entered || !$scope.search.results || $scope.search.results.length === 0) {\n\n // Resolve distance unit\n if (!$scope.geoUnit) {\n return $translate('LOCATION.DISTANCE_UNIT')\n .then(function(unit) {\n $scope.geoUnit = unit;\n return $scope.enter(e, state); // Loop\n });\n }\n\n var finishEntered = function() {\n // removeIf(device)\n // Focus on search text (only if NOT device, to avoid keyboard opening)\n if ($scope.searchTextId) {\n $focus($scope.searchTextId);\n }\n // endRemoveIf(device)\n\n $scope.entered = true;\n\n $scope.doSearch();\n };\n\n // Search by text\n if (state.stateParams && state.stateParams.q && (typeof state.stateParams.q == 'string')) {\n $scope.search.text=state.stateParams.q;\n }\n\n if (state.stateParams && state.stateParams.hash) { // hash tag parameter\n $scope.search.text = '#' + state.stateParams.hash;\n }\n\n // Search on location\n if (state.stateParams && state.stateParams.location) {\n $scope.search.location = state.stateParams.location;\n if (state.stateParams.lat && state.stateParams.lon) {\n $scope.search.geoPoint = {\n lat: parseFloat(state.stateParams.lat),\n lon: parseFloat(state.stateParams.lon)\n };\n }\n if (state.stateParams.d) {\n $scope.search.geoDistance = state.stateParams.d;\n }\n }\n else {\n var defaultSearch = csSettings.data.plugins.es.registry && csSettings.data.plugins.es.registry.defaultSearch;\n // Apply defaults from settings\n if (defaultSearch) {\n if (defaultSearch.location){\n angular.merge($scope.search, csSettings.data.plugins.es.registry.defaultSearch);\n }\n else {\n defaultSearch = undefined; // invalid\n }\n }\n // First time calling this view: apply profile location (if loaded)\n if (!defaultSearch && csWallet.isLogin() && csWallet.data.profile) {\n if (!csWallet.isDataLoaded()) {\n UIUtils.loading.show();\n return csWallet.loadData()\n .then(function() {\n UIUtils.loading.hide();\n return $scope.enter(e,state); // loop\n });\n }\n $scope.search.geoPoint = csWallet.data.profile.geoPoint;\n $scope.search.location = csWallet.data.profile.city||(csWallet.data.profile.geoPoint ? $translate.instant('LOCATION.PROFILE_POSITION') : undefined);\n }\n }\n\n // Search on type\n if (state.stateParams && (state.stateParams.type || state.stateParams.last)) {\n if (state.stateParams.last || state.stateParams.type == 'last') {\n $scope.search.lastRecords = true;\n $scope.search.type = undefined;\n }\n else {\n $scope.search.type = state.stateParams.type;\n }\n }\n else {\n $scope.search.lastRecords = false;\n }\n\n // Search on issuer\n if (state.stateParams && state.stateParams.issuer) {\n $scope.search.issuer = state.stateParams.issuer;\n }\n\n // Search on category\n if (state.stateParams && state.stateParams.category) {\n esRegistry.category.get({id: state.stateParams.category})\n .then(function(cat) {\n $scope.search.category = cat;\n finishEntered();\n })\n .catch(UIUtils.onError(\"REGISTRY.ERROR.LOAD_CATEGORY_FAILED\"));\n }\n else {\n finishEntered();\n }\n }\n $scope.showFab('fab-add-registry-record');\n\n };\n $scope.$on('$ionicView.enter', function(e, state) {\n // WARN: do not set by reference\n // because it can be overrided by sub controller\n return $scope.enter(e, state);\n });\n\n // Store some search options as settings defaults\n $scope.leave = function() {\n var dirty = false;\n\n csSettings.data.plugins.es.registry = csSettings.data.plugins.es.registry || {};\n csSettings.data.plugins.es.registry.defaultSearch = csSettings.data.plugins.es.registry.defaultSearch || {};\n\n // Check if location changed\n var location = $scope.search.location && $scope.search.location.trim();\n var oldLocation = csSettings.data.plugins.es.registry.defaultSearch.location;\n if (!oldLocation || (oldLocation !== location)) {\n csSettings.data.plugins.es.registry.defaultSearch = {\n location: location,\n geoPoint: location && $scope.search.geoPoint ? angular.copy($scope.search.geoPoint) : undefined\n };\n dirty = true;\n }\n\n // Check if distance changed\n var odlDistance = csSettings.data.plugins.es.geoDistance;\n if (!odlDistance || odlDistance !== $scope.search.geoDistance) {\n csSettings.data.plugins.es.geoDistance = $scope.search.geoDistance;\n dirty = true;\n }\n\n // execute with a delay, for better UI perf\n if (dirty) {\n $timeout(function() {\n csSettings.store();\n });\n }\n };\n $scope.$on('$ionicView.leave', function() {\n // WARN: do not set by reference\n // because it can be overrided by sub controller\n return $scope.leave();\n });\n\n $scope.onGeoPointChanged = function() {\n if ($scope.search.loading) return;\n\n if ($scope.search.geoPoint && $scope.search.geoPoint.lat && $scope.search.geoPoint.lon && !$scope.search.geoPoint.exact) {\n $scope.doSearch();\n $scope.updateLocationHref();\n }\n };\n $scope.$watch('search.geoPoint', $scope.onGeoPointChanged, true);\n\n $scope.resolveLocationPosition = function() {\n if ($scope.search.loadingPosition) return;\n\n $scope.search.loadingPosition = true;\n return $scope.searchPosition($scope.search.location)\n .then(function(res) {\n if (!res) {\n $scope.search.loading = false;\n $scope.search.results = undefined;\n $scope.search.total = 0;\n $scope.search.loadingPosition = false;\n $scope.search.geoPoint = undefined;\n throw 'CANCELLED';\n }\n $scope.search.geoPoint = res;\n if (res.shortName && !res.exact) {\n $scope.search.location = res.shortName;\n }\n $scope.search.loadingPosition = false;\n });\n };\n\n $scope.doGetLastRecords = function(from) {\n $scope.hidePopovers();\n\n $scope.search.text = undefined;\n return $scope.doSearch(from);\n };\n\n $scope.doSearchText = function() {\n $scope.doSearch();\n\n };\n\n $scope.doSearch = function(from) {\n $scope.search.loading = !from;\n\n // Resolve location position\n if ($scope.search.location && $scope.search.location.length >= 3 && !$scope.search.geoPoint) {\n return $scope.resolveLocationPosition()\n .then(function() {\n return $scope.doSearch(from); // Loop\n });\n }\n\n var text = $scope.search.text && $scope.search.text.trim() || '';\n $scope.search.lastRecords = !text || !text.length;\n var matches = [];\n var filters = [];\n if (text && text.length) {\n // pubkey : use a special 'term', because of 'non indexed' field\n if (BMA.regexp.PUBKEY.test(text /*case sensitive*/)) {\n filters.push({term : { pubkey: text}});\n }\n else {\n text = text.toLowerCase();\n var tags = text ? esHttp.util.parseTags(text) : undefined;\n var matchFields = [\"title\", \"description\", \"city\", \"address\"];\n matches.push({multi_match : { query: text,\n fields: matchFields,\n type: \"phrase_prefix\"\n }});\n matches.push({match : { title: {query: text, boost: 2}}});\n matches.push({prefix: {title: text}});\n matches.push({match : { description: text}});\n matches.push({\n nested: {\n path: \"category\",\n query: {\n bool: {\n filter: {\n match: { \"category.name\": text}\n }\n }\n }\n }\n });\n if (tags && tags.length) {\n filters.push({terms: {tags: tags}});\n }\n }\n }\n // issuer: use only on filter\n else if ($scope.search.issuer) {\n filters.push({term : { issuer: $scope.search.issuer}});\n }\n if ($scope.search.type) {\n filters.push({term: { type: $scope.search.type}});\n }\n if ($scope.search.category) {\n filters.push({\n nested: {\n path: \"category\",\n query: {\n bool: {\n filter: {\n term: { \"category.id\": $scope.search.category.id}\n }\n }\n }\n }\n });\n }\n\n var location = $scope.search.location && $scope.search.location.trim().toLowerCase();\n if ($scope.search.geoPoint && $scope.search.geoPoint.lat && $scope.search.geoPoint.lon) {\n\n // match location OR geo distance\n if (location && location.length) {\n var locationCity = location.split(',')[0];\n filters.push({\n or : [\n // No position defined\n {\n and: [\n {not: {exists: { field : \"geoPoint\" }}},\n {match_phrase: { city: locationCity }}\n ]\n },\n // Has position\n {geo_distance: {\n distance: $scope.search.geoDistance + $scope.geoUnit,\n geoPoint: {\n lat: $scope.search.geoPoint.lat,\n lon: $scope.search.geoPoint.lon\n }\n }}\n ]\n });\n }\n\n else {\n filters.push(\n {geo_distance: {\n distance: $scope.search.geoDistance + $scope.geoUnit,\n geoPoint: {\n lat: $scope.search.geoPoint.lat,\n lon: $scope.search.geoPoint.lon\n }\n }});\n }\n }\n\n var request = {\n highlight: {fields : {title : {}, description: {}, tags: {}}},\n from: from\n };\n if (matches.length > 0) {\n request.query = request.query || {bool: {}};\n request.query.bool.should = matches;\n // Exclude result with score=0\n request.query.bool.minimum_should_match = 1;\n }\n if (filters.length > 0) {\n request.query = request.query || {bool: {}};\n request.query.bool.filter = filters;\n }\n if ($scope.search.lastRecords) {\n request.sort = {creationTime : \"desc\"};\n }\n\n // Update href location\n $scope.updateLocationHref();\n\n // Execute the request\n return $scope.doRequest(request);\n };\n\n $scope.doRequest = function(options) {\n options = options || {};\n options.from = options.from || 0;\n options.size = options.size || defaultSearchLimit;\n if (options.size < defaultSearchLimit) options.size = defaultSearchLimit;\n $scope.search.loading = (options.from === 0);\n\n var requestId = ($scope.requestId && $scope.requestId + 1) || 1;\n $scope.requestId = requestId;\n\n return esRegistry.record.search(options)\n .then(function(res) {\n if ($scope.requestId != requestId) return; // Skip apply if not same request:\n\n if (!res || !res.hits || !res.hits.length) {\n $scope.search.results = (options.from > 0) ? $scope.search.results : [];\n $scope.search.total = (options.from > 0) ? $scope.search.total : 0;\n $scope.search.loading = false;\n $scope.search.hasMore = false;\n return;\n }\n var formatSlug = $filter('formatSlug');\n _.forEach(res.hits, function(record) {\n // Compute title for url\n record.urlTitle = formatSlug(record.title);\n });\n\n // Replace results, or append if 'show more' clicked\n if (!options.from) {\n $scope.search.results = res.hits;\n $scope.search.total = res.total;\n }\n else {\n $scope.search.results = $scope.search.results.concat(res.hits);\n }\n $scope.search.hasMore = $scope.search.results.length < res.total;\n $scope.search.loading = false;\n\n $scope.motion.show({selector: '.list .item', ink: true});\n })\n .catch(function(err) {\n $scope.search.loading = false;\n $scope.search.results = (options.from > 0) ? $scope.search.results : [];\n $scope.search.total = (options.from > 0) ? $scope.search.total : 0;\n $scope.search.hasMore = false;\n UIUtils.onError('REGISTRY.ERROR.LOOKUP_RECORDS_FAILED')(err);\n });\n };\n\n $scope.showMore= function() {\n var from = $scope.search.results ? $scope.search.results.length : 0;\n\n $scope.search.loadingMore = true;\n\n var searchFunction = ($scope.search.lastRecords) ?\n $scope.doGetLastRecords :\n $scope.doSearch;\n\n return searchFunction(from)\n .then(function() {\n $scope.search.loadingMore = false;\n $scope.$broadcast('scroll.infiniteScrollComplete');\n })\n .catch(function(err) {\n console.error(err);\n $scope.search.loadingMore = false;\n $scope.search.hasMore = false;\n $scope.$broadcast('scroll.infiniteScrollComplete');\n });\n };\n\n $scope.removeType = function() {\n $scope.search.type = null;\n $scope.doSearch();\n $scope.updateLocationHref();\n };\n\n $scope.removeCategory = function() {\n $scope.search.category = null;\n $scope.category = null;\n $scope.doSearch();\n $scope.updateLocationHref();\n };\n\n $scope.removeLocation = function() {\n $scope.search.location = null;\n $scope.search.geoPoint = null;\n $scope.doSearch();\n $scope.updateLocationHref();\n };\n\n // Update location href\n $scope.updateLocationHref = function(from) {\n // removeIf(device)\n // Skip when \"show more\"\n if (from) return;\n\n $timeout(function() {\n var text = $scope.search.text && $scope.search.text.trim();\n var location = $scope.search.location && $scope.search.location.trim();\n var stateParams = {\n location: location && location.length ? location : undefined,\n category: $scope.search.category ? $scope.search.category.id : undefined,\n last: $scope.search.lastRecords ? true : undefined,\n type: $scope.search.type ? $scope.search.type : undefined,\n lat: $scope.search.geoPoint && $scope.search.geoPoint.lat || undefined,\n lon: $scope.search.geoPoint && $scope.search.geoPoint.lon || undefined,\n d: $scope.search.geoPoint && $scope.search.geoDistance || undefined\n };\n if (text && text.match(/^#\\w+$/)) {\n stateParams.hash = text.substr(1);\n }\n else if (text && text.length){\n stateParams.q = text;\n }\n\n $location.search(stateParams).replace();\n });\n // endRemoveIf(device)\n };\n\n\n $scope.onToggleAdvanced = function() {\n if ($scope.search.entered && !$scope.search.lastRecords) {\n $scope.doSearch();\n $scope.updateLocationHref();\n }\n };\n $scope.$watch('search.advanced', $scope.onToggleAdvanced, true);\n\n $scope.toggleAdvanced = function() {\n $scope.search.advanced = !$scope.search.advanced;\n $timeout($scope.hidePopovers, 200);\n };\n\n /* -- modals -- */\n\n $scope.showRecordTypeModal = function(event) {\n $scope.hidePopovers();\n\n $timeout(function() {\n if (event.isDefaultPrevented()) return;\n\n ModalUtils.show('plugins/es/templates/registry/modal_record_type.html')\n .then(function(type){\n if (type) {\n $scope.search.type = type;\n $scope.doSearch();\n $scope.updateLocationHref();\n }\n });\n }, 350); // use timeout to allow event to be prevented in removeType()\n };\n\n $scope.showCategoryModal = function(event) {\n $timeout(function() {\n if (event.isDefaultPrevented()) return;\n\n // load categories\n esRegistry.category.all()\n .then(function (categories) {\n // open modal\n return ModalUtils.show('plugins/es/templates/common/modal_category.html', 'ESCategoryModalCtrl as ctrl',\n {categories: categories}, {focusFirstInput: true});\n })\n .then(function (cat) {\n if (cat && cat.parent) {\n $scope.search.category = cat;\n $scope.doSearch();\n $scope.updateLocationHref();\n }\n });\n }, 350); // use timeout to allow event to be prevented in removeCategory()\n };\n\n $scope.showNewPageModal = function() {\n $scope.hidePopovers();\n return esModals.showNewPage();\n };\n\n /* -- popovers -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl :'plugins/es/templates/registry/lookup_popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.filtersPopover = null;\n }\n };\n\n $scope.showFiltersPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl :'plugins/es/templates/registry/lookup_popover_filters.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.filtersPopover = popover;\n }\n });\n };\n\n $scope.hideFiltersPopover = function() {\n if ($scope.filtersPopover) {\n $scope.filtersPopover.hide();\n $scope.filtersPopover = null;\n }\n };\n\n $scope.hidePopovers = function() {\n $scope.hideActionsPopover();\n $scope.hideFiltersPopover();\n };\n\n\n // TODO: remove auto add account when done\n /* $timeout(function() {\n $scope.search.text='lavenier';\n $scope.doSearch();\n }, 400);\n */\n}\n\n\nfunction ESWalletPagesController($scope, $controller, $timeout, UIUtils, esModals, csWallet) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESRegistryLookupCtrl', {$scope: $scope}));\n\n $scope.searchTextId = undefined; // avoid focus\n\n var wallet;\n\n // Override the default enter\n $scope.enter = function(e, state) {\n if (!$scope.entered) {\n\n wallet = (state.stateParams && state.stateParams.id) ? csWallet.children.get(state.stateParams.id) : csWallet;\n if (!wallet) {\n UIUtils.alert.error('ERROR.UNKNOWN_WALLET_ID');\n return $scope.showHome();\n }\n\n return wallet.login({minData: true})\n .then(function(walletData) {\n UIUtils.loading.hide();\n $scope.search.issuer = walletData.pubkey;\n $scope.search.advanced = true;\n $timeout($scope.doSearch, 100);\n $scope.showFab('fab-wallet-add-registry-record');\n });\n }\n else {\n // Asking refresh\n if (state.stateParams && state.stateParams.refresh) {\n return $timeout($scope.doSearch, 2000 /*waiting for propagation, if deletion*/);\n }\n }\n };\n\n $scope.doUpdate = function() {\n if (!wallet || !wallet.isLogin()) return;\n $scope.search.issuer = csWallet.data.pubkey;\n $scope.search.advanced = true;\n return $scope.doSearch();\n };\n\n // Override inherited, to pass the select wallet\n $scope.showNewPageModal = function() {\n $scope.hidePopovers();\n return esModals.showNewPage({wallet: wallet});\n };\n\n}\n\n\nfunction ESRegistryRecordViewController($scope, $rootScope, $state, $q, $timeout, $ionicPopover, $ionicHistory, $translate, $controller,\n $anchorScroll, csConfig, csWallet, esRegistry, UIUtils, esHttp) {\n 'ngInject';\n\n $scope.formData = {};\n $scope.id = null;\n $scope.category = {};\n $scope.pictures = [];\n $scope.canEdit = false;\n $scope.showTransfer = false;\n $scope.loading = true;\n $scope.motion = UIUtils.motion.fadeSlideIn;\n\n // Init likes here, to be able to use in extension\n $scope.options = $scope.options || {};\n $scope.options.like = {\n kinds: ['LIKE', 'ABUSE'],\n index: 'page',\n type: 'record'\n };\n $scope.likeData = {\n likes: {},\n abuses: {}\n };\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESLikesCtrl', {$scope: $scope}));\n\n $scope.$on('$ionicView.beforeEnter', function (event, viewData) {\n // Enable back button (workaround need for navigation outside tabs - https://stackoverflow.com/a/35064602)\n viewData.enableBack = UIUtils.screen.isSmall() ? true : viewData.enableBack;\n });\n\n $scope.$on('$ionicView.enter', function(e, state) {\n if (state.stateParams && state.stateParams.id) { // Load by id\n if ($scope.loading || state.stateParams.refresh) { // prevent reload if same id (if not forced)\n $scope.load(state.stateParams.id, state.stateParams.anchor);\n }\n $scope.$broadcast('$recordView.enter', state);\n }\n else {\n $state.go('app.wot_lookup.tab_registry');\n }\n });\n\n $scope.$on('$ionicView.beforeLeave', function(event, args){\n $scope.$broadcast('$recordView.beforeLeave', args);\n });\n\n $scope.load = function(id, anchor) {\n id = id || $scope.id;\n $scope.loading = true;\n\n return $q.all([\n esRegistry.record.load(id)\n .then(function (data) {\n $scope.id= data.id;\n $scope.formData = data.record;\n //console.debug('Loading record', $scope.formData);\n $scope.canEdit = csWallet.isUserPubkey($scope.formData.issuer) || csWallet.children.hasPubkey($scope.formData.issuer);\n $scope.showTransfer = !$scope.canEdit && $scope.formData.pubkey;\n $scope.issuer = data.issuer;\n // avatar\n $scope.avatar = $scope.formData.avatar;\n $scope.avatarStyle= $scope.formData.avatar && {'background-image':'url(\"'+$scope.avatar.src+'\")'};\n\n UIUtils.loading.hide();\n $scope.loading = false;\n // Set Motion (only direct children, to exclude .lazy-load children)\n $scope.motion.show({selector: '.list > .item, .list > ng-if > .item'});\n })\n .catch(function(err) {\n // Retry (ES could have error)\n if (!$scope.secondTry) {\n $scope.secondTry = true;\n $q(function() {\n $scope.load(id);\n }, 100);\n }\n else {\n $scope.loading = false;\n if (err && err.ucode === 404) {\n UIUtils.toast.show('REGISTRY.ERROR.RECORD_NOT_EXISTS');\n $state.go('app.wot_lookup.tab_registry');\n }\n else {\n UIUtils.onError('REGISTRY.ERROR.LOAD_RECORD_FAILED')(err);\n }\n }\n }),\n\n // Load pictures\n esRegistry.record.picture.all({id: id})\n .then(function(hit) {\n\n $scope.pictures = hit._source.pictures && hit._source.pictures.reduce(function(res, pic) {\n return res.concat(esHttp.image.fromAttachment(pic.file));\n }, []);\n\n // Set Motion\n if ($scope.pictures.length > 0) {\n $scope.motion.show({\n selector: '.lazy-load .item.card-gallery',\n startVelocity: 3000\n });\n }\n })\n .catch(function() {\n $scope.pictures = [];\n }),\n\n // Load other data (from child controller)\n $timeout(function() {\n return $scope.$broadcast('$recordView.load', id, esRegistry.record.comment);\n })\n ])\n .then(function() {\n // Display items in technical parts\n $scope.motion.show({\n selector: '.lazy-load .item',\n startVelocity: 3000\n });\n\n // scroll (if comment anchor)\n if (anchor) $timeout(function() {\n $anchorScroll(anchor);\n }, 1000);\n });\n };\n\n // Edit click\n $scope.edit = function() {\n var wallet = csWallet.isUserPubkey($scope.formData.issuer) ? csWallet : csWallet.children.getByPubkey($scope.formData.issuer);\n if (!wallet) return;\n UIUtils.loading.show();\n return $state.go('app.registry_edit_record', {id: $scope.id, wallet: wallet.id});\n };\n\n $scope.delete = function() {\n $scope.hideActionsPopover();\n\n var wallet = csWallet.isUserPubkey($scope.formData.issuer) ? csWallet : csWallet.children.getByPubkey($scope.formData.issuer);\n if (!wallet) return;\n\n // translate\n var translations;\n $translate(['REGISTRY.VIEW.REMOVE_CONFIRMATION', 'REGISTRY.INFO.RECORD_REMOVED'])\n .then(function(res) {\n translations = res;\n return UIUtils.alert.confirm(res['REGISTRY.VIEW.REMOVE_CONFIRMATION']);\n })\n .then(function(confirm) {\n if (confirm) {\n esRegistry.record.remove($scope.id, {wallet: wallet})\n .then(function () {\n if (wallet.data.pages && wallet.data.pages.count) {\n wallet.data.pages.count--;\n }\n $ionicHistory.nextViewOptions({\n historyRoot: true\n });\n if (wallet.isDefault()) {\n $state.go('app.wallet_pages', {refresh: true});\n }\n else {\n $state.go('app.wallet_pages_by_id', {refresh: true, id: wallet.id});\n }\n\n UIUtils.toast.show(translations['REGISTRY.INFO.RECORD_REMOVED']);\n })\n .catch(UIUtils.onError('REGISTRY.ERROR.REMOVE_RECORD_FAILED'));\n }\n });\n };\n\n /* -- modals & popover -- */\n\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'plugins/es/templates/registry/view_popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n return true;\n };\n\n $scope.showSharePopover = function(event) {\n $scope.hideActionsPopover();\n var title = $scope.formData.title;\n // Use shareBasePath (fix #530) or rootPath (fix #390)\n var url = (csConfig.shareBaseUrl || $rootScope.rootPath) + $state.href('app.view_page', {title: title, id: $scope.id});\n // Override default position, is small screen - fix #545\n if (UIUtils.screen.isSmall()) {\n event = angular.element(document.querySelector('#registry-share-anchor-'+$scope.id)) || event;\n }\n UIUtils.popover.share(event, {\n bindings: {\n url: url,\n titleKey: 'REGISTRY.VIEW.POPOVER_SHARE_TITLE',\n titleValues: {title: title},\n time: $scope.formData.time,\n postMessage: title\n }\n });\n };\n\n}\n\nfunction ESRegistryRecordEditController($scope, $timeout, $state, $q, $ionicHistory, $focus, $translate, $controller,\n Device, UIUtils, ModalUtils, csWallet, esHttp, esRegistry) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESPositionEditCtrl', {$scope: $scope}));\n\n $scope.formData = {\n title: null,\n description: null,\n socials: [],\n geoPoint: null\n };\n\n $scope.loading = true;\n $scope.dirty = false;\n $scope.walletData = null;\n $scope.id = null;\n $scope.avatar = null;\n $scope.pictures = [];\n\n $scope.setForm = function(form) {\n $scope.form = form;\n };\n\n var wallet;\n\n $scope.$on('$ionicView.enter', function(e, state) {\n\n if ($scope.loading) {\n wallet = (state.stateParams && state.stateParams.wallet && state.stateParams.wallet != 'default') ? csWallet.children.get(state.stateParams.wallet) : csWallet;\n if (!wallet) {\n UIUtils.alert.error('ERROR.UNKNOWN_WALLET_ID');\n return $scope.showHome();\n }\n\n return wallet.login({minData: true})\n .then(function(walletData) {\n $scope.walletData = walletData;\n if (state.stateParams && state.stateParams.id) { // Load by id\n $scope.load(state.stateParams.id);\n }\n else {\n if (state.stateParams && state.stateParams.type) {\n $scope.updateView({\n record: {\n type: state.stateParams.type\n }\n });\n }\n }\n // removeIf(device)\n $focus('registry-record-title');\n // endRemoveIf(device)\n });\n }\n });\n\n $scope.$on('$stateChangeStart', function (event, next, nextParams, fromState) {\n if ($scope.dirty && !$scope.saving) {\n\n // stop the change state action\n event.preventDefault();\n\n if (!$scope.loading) {\n $scope.loading = true;\n return UIUtils.alert.confirm('CONFIRM.SAVE_BEFORE_LEAVE',\n 'CONFIRM.SAVE_BEFORE_LEAVE_TITLE', {\n cancelText: 'COMMON.BTN_NO',\n okText: 'COMMON.BTN_YES_SAVE'\n })\n .then(function(confirmSave) {\n $scope.loading = false;\n if (confirmSave) {\n $scope.form.$submitted=true;\n return $scope.save(false/*silent*/, true/*haswait debounce*/)\n .then(function(saved){\n if (saved) {\n $scope.dirty = false;\n }\n return saved; // change state only if not error\n });\n }\n else {\n $scope.dirty = false;\n return true; // ok, change state\n }\n })\n .then(function(confirmGo) {\n if (confirmGo) {\n // continue to the order state\n $ionicHistory.nextViewOptions({\n historyRoot: true\n });\n $state.go(next.name, nextParams);\n }\n })\n .catch(function(err) {\n // Silent\n });\n }\n }\n });\n\n $scope.load = function(id) {\n $scope.loading = true;\n esRegistry.record.load(id, {\n raw: true\n })\n .then(function (data) {\n if (data && data.record) {\n $scope.updateView(data);\n }\n else {\n $scope.updateView({record: {}});\n }\n })\n .catch(function(err) {\n UIUtils.loading.hide(10);\n $scope.loading = false;\n UIUtils.onError('REGISTRY.ERROR.LOAD_RECORD_FAILED')(err);\n });\n };\n\n $scope.updateView = function(data) {\n $scope.formData = data.record || {};\n $scope.id= data.id;\n\n // avatar\n $scope.avatar = $scope.formData.avatar;\n if ($scope.avatar) {\n $scope.avatarStyle = $scope.avatar && {'background-image':'url(\"'+$scope.avatar.src+'\")'};\n $scope.avatarClass = {};\n }\n else {\n $scope.avatarStyle = undefined;\n $scope.avatarClass = {};\n $scope.avatarClass['cion-page-' + $scope.formData.type] = !$scope.avatar;\n }\n\n // pictures\n $scope.pictures = data.record && data.record.pictures || [];\n delete data.record.pictures; // remove, as already stored in $scope.pictures\n\n $scope.motion.show({\n selector: '.animate-ripple .item, .card-gallery',\n startVelocity: 3000\n });\n UIUtils.loading.hide();\n\n // Update loading - done with a delay, to avoid trigger onFormDataChanged()\n $timeout(function() {\n $scope.loading = false;\n }, 1000);\n };\n\n $scope.onFormDataChanged = function() {\n if ($scope.loading) return;\n $scope.dirty = true;\n };\n $scope.$watch('formData', $scope.onFormDataChanged, true);\n\n\n\n $scope.needCategory = function() {\n return $scope.formData.type && ($scope.formData.type=='company' || $scope.formData.type=='shop');\n };\n\n $scope.save = function(silent, hasWaitDebounce) {\n $scope.form.$submitted=true;\n if($scope.saving || // avoid multiple save\n !$scope.form.$valid ||\n (($scope.formData.type === 'shop' || $scope.formData.type === 'company') && (!$scope.formData.category || !$scope.formData.category.id))) {\n return $q.reject();\n }\n\n if (!hasWaitDebounce) {\n console.debug('[ES] [page] Waiting debounce end, before saving...');\n return $timeout(function() {\n return $scope.save(silent, true);\n }, 650);\n }\n\n $scope.saving = true;\n console.debug('[ES] [page] Saving record...');\n\n var showSuccessToast = function() {\n if (!silent) {\n return $translate('REGISTRY.INFO.RECORD_SAVED')\n .then(function(message){\n UIUtils.toast.show(message);\n });\n }\n };\n\n var promise = $q.when();\n return promise\n .then(function(){\n var json = $scope.formData;\n if (!$scope.needCategory()) {\n delete json.category;\n }\n json.time = moment().utc().unix();\n\n // geo point\n if (json.geoPoint && json.geoPoint.lat && json.geoPoint.lon) {\n json.geoPoint.lat = parseFloat(json.geoPoint.lat);\n json.geoPoint.lon = parseFloat(json.geoPoint.lon);\n }\n else{\n json.geoPoint = null;\n }\n\n // Social url must be unique in socials links - Fix #306:\n if (json.socials && json.socials.length) {\n json.socials = _.uniq(json.socials, false, function(social) {\n return social.url;\n });\n }\n\n // Pictures\n json.picturesCount = $scope.pictures.length;\n if (json.picturesCount > 0) {\n json.pictures = $scope.pictures.reduce(function (res, pic) {\n return res.concat({file: esHttp.image.toAttachment(pic)});\n }, []);\n }\n else {\n json.pictures = [];\n }\n\n // Avatar\n if ($scope.avatar && $scope.avatar.src) {\n return UIUtils.image.resizeSrc($scope.avatar.src, true) // resize to avatar\n .then(function(imageSrc) {\n json.avatar = esHttp.image.toAttachment({src: imageSrc});\n return json;\n });\n }\n else {\n // Workaround to allow content deletion, because of a bug in the ES attachment-mapper:\n // get error (in ES node) : MapperParsingException[No content is provided.] - AttachmentMapper.parse(AttachmentMapper.java:471\n json.avatar = {\n _content: '',\n _content_type: ''\n };\n return json;\n }\n })\n .then(function(json){\n // Create\n if (!$scope.id) {\n return esRegistry.record.add(json, {wallet: wallet});\n }\n // Update\n return esRegistry.record.update(json, {id: $scope.id, wallet: wallet});\n })\n\n .then(function(id) {\n console.info(\"[ES] [page] Record successfully saved.\");\n if (!$scope.id && wallet.data.pages && wallet.data.pages.count) {\n csWallet.data.pages.count++;\n }\n $scope.id = $scope.id || id;\n $scope.saving = false;\n $scope.dirty = false;\n\n showSuccessToast();\n\n $ionicHistory.clearCache($ionicHistory.currentView().stateId); // clear current view\n $ionicHistory.nextViewOptions({historyRoot: true});\n return $state.go('app.view_page', {id: $scope.id, refresh: true});\n })\n\n .catch(function(err) {\n $scope.saving = false;\n UIUtils.onError('REGISTRY.ERROR.SAVE_RECORD_FAILED')(err);\n });\n };\n\n $scope.openPicturePopup = function() {\n Device.camera.getPicture()\n .then(function(imageData) {\n if (imageData) {\n $scope.pictures.push({src: \"data:image/png;base64,\" + imageData});\n }\n })\n .catch(UIUtils.onError('ERROR.TAKE_PICTURE_FAILED'));\n };\n\n $scope.rotateAvatar = function(){\n if (!$scope.avatar || !$scope.avatar.src || $scope.rotating) return;\n\n $scope.rotating = true;\n\n return UIUtils.image.rotateSrc($scope.avatar.src)\n .then(function(imageData){\n $scope.avatar.src = imageData;\n $scope.avatarStyle={'background-image':'url(\"'+imageData+'\")'};\n $scope.dirty = true;\n $scope.rotating = false;\n })\n .catch(function(err) {\n console.error(err);\n $scope.rotating = false;\n });\n };\n\n $scope.fileChanged = function(event) {\n UIUtils.loading.show();\n return $q(function(resolve, reject) {\n var file = event.target.files[0];\n UIUtils.image.resizeFile(file)\n .then(function(imageData) {\n $scope.pictures.push({src: imageData});\n UIUtils.loading.hide();\n resolve();\n });\n });\n };\n\n $scope.removePicture = function(index){\n $scope.pictures.splice(index, 1);\n };\n\n $scope.favoritePicture = function(index){\n if (index > 0) {\n var item = $scope.pictures[index];\n $scope.pictures.splice(index, 1);\n $scope.pictures.splice(0, 0, item);\n }\n };\n\n $scope.cancel = function() {\n $ionicHistory.goBack();\n };\n\n /* -- modals -- */\n $scope.showAvatarModal = function() {\n if (Device.camera.enable) {\n return Device.camera.getPicture()\n .then(function(imageData) {\n if (!imageData) return;\n $scope.avatar = {src: \"data:image/png;base64,\" + imageData};\n $scope.avatarStyle={'background-image':'url(\"'+imageData+'\")'};\n $scope.dirty = true;\n $scope.avatarClass = {};\n })\n .catch(UIUtils.onError('ERROR.TAKE_PICTURE_FAILED'));\n }\n else {\n return ModalUtils.show('plugins/es/templates/common/modal_edit_avatar.html','ESAvatarModalCtrl',\n {})\n .then(function(imageData) {\n if (!imageData) return;\n $scope.avatar = {src: imageData};\n $scope.avatarStyle={'background-image':'url(\"'+imageData+'\")'};\n $scope.dirty = true;\n $scope.avatarClass = {};\n });\n }\n };\n\n $scope.showRecordTypeModal = function() {\n ModalUtils.show('plugins/es/templates/registry/modal_record_type.html')\n .then(function(type){\n if (type) {\n $scope.formData.type = type;\n if (!$scope.avatar) {\n $scope.avatarClass['cion-page-' + type] = true;\n }\n }\n });\n };\n\n $scope.showCategoryModal = function(parameters) {\n // load categories\n esRegistry.category.all()\n .then(function(categories){\n // open modal\n return ModalUtils.show('plugins/es/templates/common/modal_category.html', 'ESCategoryModalCtrl as ctrl',\n {categories: categories}, {focusFirstInput: true});\n })\n .then(function(cat){\n if (cat && cat.parent) {\n $scope.formData.category = cat;\n }\n });\n };\n}\n","\nESViewEditProfileController.$inject = ['$scope', '$q', '$timeout', '$state', '$focus', '$translate', '$controller', '$ionicHistory', '$ionicPopover', 'UIUtils', 'csWallet', 'esHttp', 'esProfile', 'ModalUtils', 'Device'];angular.module('cesium.es.profile.controllers', ['cesium.es.services'])\n\n .config(['$stateProvider', function($stateProvider) {\n\n $stateProvider\n .state('app.edit_profile', {\n url: \"/wallet/profile/edit\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/user/edit_profile.html\",\n controller: 'ESViewEditProfileCtrl'\n }\n },\n cache: false,\n data: {\n auth: true\n }\n })\n\n .state('app.edit_profile_by_id', {\n url: \"/wallets/:id/profile/edit\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/user/edit_profile.html\",\n controller: 'ESViewEditProfileCtrl'\n }\n },\n cache: false,\n data: {\n login: true\n }\n });\n\n }])\n\n .controller('ESViewEditProfileCtrl', ESViewEditProfileController)\n\n\n;\n\nfunction ESViewEditProfileController($scope, $q, $timeout, $state, $focus, $translate, $controller,\n $ionicHistory, $ionicPopover,\n UIUtils, csWallet, esHttp, esProfile, ModalUtils, Device) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESPositionEditCtrl', {$scope: $scope}));\n\n $scope.formData = {\n title: null,\n description: null,\n socials: [],\n geoPoint: null\n };\n $scope.loading = true;\n $scope.dirty = false;\n $scope.walletData = null;\n $scope.avatar = null;\n $scope.existing = false;\n $scope.socialData = {\n url: null\n };\n $scope.socialReorder = true;\n\n var wallet;\n\n $scope.enter = function(e, state) {\n\n wallet = (state.stateParams && state.stateParams.id) ? csWallet.children.get(state.stateParams.id) : csWallet;\n if (!wallet) {\n UIUtils.alert.error('ERROR.UNKNOWN_WALLET_ID');\n return $scope.showHome();\n }\n\n $scope.walletId = wallet.id;\n\n return wallet.auth({\n minData: true\n })\n .then($scope.load)\n .catch(function(err){\n if (err == 'CANCELLED') {\n UIUtils.loading.hide(10);\n $scope.cancel();\n return;\n }\n UIUtils.onError('PROFILE.ERROR.LOAD_PROFILE_FAILED')(err);\n });\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.$on('$stateChangeStart', function (event, next, nextParams, fromState) {\n if ($scope.dirty && !$scope.saving) {\n\n // stop the change state action\n event.preventDefault();\n\n if (!$scope.loading) {\n $scope.loading = true;\n return UIUtils.alert.confirm('CONFIRM.SAVE_BEFORE_LEAVE',\n 'CONFIRM.SAVE_BEFORE_LEAVE_TITLE', {\n cancelText: 'COMMON.BTN_NO',\n okText: 'COMMON.BTN_YES_SAVE'\n })\n .then(function(confirmSave) {\n $scope.loading = false;\n if (confirmSave) {\n $scope.form.$submitted=true;\n return $scope.save(false/*silent*/, true/*haswait debounce*/)\n .then(function(saved){\n if (saved) {\n $scope.dirty = false;\n }\n return saved; // change state only if not error\n });\n }\n else {\n $scope.dirty = false;\n return true; // ok, change state\n }\n })\n .then(function(confirmGo) {\n if (confirmGo) {\n // continue to the order state\n $ionicHistory.nextViewOptions({\n historyRoot: true\n });\n $state.go(next.name, nextParams);\n }\n })\n .catch(function(err) {\n // Silent\n });\n }\n }\n });\n\n $scope.load = function(walletData) {\n $scope.loading = true; // to avoid the call of doSave()\n return esProfile.get(walletData.pubkey, {\n raw: true\n })\n .then(function(profile) {\n if (profile) {\n $scope.avatar = esHttp.image.fromAttachment(profile.source.avatar);\n $scope.existing = true;\n $scope.updateView(walletData, profile.source);\n }\n else {\n $scope.avatar = undefined;\n $scope.existing = false;\n $scope.updateView(walletData, {});\n }\n\n UIUtils.loading.hide();\n\n // Update loading - done with a delay, to avoid trigger onFormDataChanged()\n return $timeout(function() {\n $scope.loading = false;\n }, 1000);\n })\n .then(function() {\n // removeIf(device)\n $focus('profile-name');\n // endRemoveIf(device)\n })\n .catch(UIUtils.onError('PROFILE.ERROR.LOAD_PROFILE_FAILED'));\n };\n\n $scope.setForm = function(form) {\n $scope.form = form;\n };\n\n $scope.updateView = function(walletData, profile) {\n $scope.walletData = walletData;\n $scope.formData = profile;\n if (profile.avatar) {\n $scope.avatarStyle={'background-image':'url(\"'+$scope.avatar.src+'\")'};\n }\n $scope.motion.show();\n };\n\n $scope.onFormDataChanged = function() {\n if ($scope.loading) return;\n $scope.dirty = true;\n };\n $scope.$watch('formData', $scope.onFormDataChanged, true);\n\n $scope.save = function(silent, hasWaitDebounce) {\n if($scope.form.$invalid || !$scope.walletData || ($scope.saving && !hasWaitDebounce)) {\n return $q.reject();\n }\n\n if (!hasWaitDebounce) {\n $scope.saving = true;\n return $timeout(function() {\n return $scope.save(silent, true);\n }, 650);\n }\n\n console.debug('[ES] [profile] Saving user profile...');\n\n var onError = function(message) {\n return function(err) {\n $scope.saving = false;\n UIUtils.onError(message)(err);\n };\n };\n\n var updateWallet = function(formData) {\n if (formData) {\n $scope.walletData.name = formData.title;\n if ($scope.avatar) {\n $scope.walletData.avatar = $scope.avatar;\n }\n else {\n delete $scope.walletData.avatar;\n }\n\n $scope.walletData.profile = angular.copy(formData);\n $scope.walletData.profile.descriptionHtml = esHttp.util.parseAsHtml(formData.description);\n }\n };\n\n var showSuccessToast = function() {\n if (!silent) {\n return $translate('PROFILE.INFO.PROFILE_SAVED')\n .then(function(message){\n UIUtils.toast.show(message);\n });\n }\n };\n\n var doFinishSave = function(formData) {\n // Social url must be unique in socials links - Fix #306:\n if (formData.socials && formData.socials.length) {\n formData.socials = _.uniq(formData.socials, false, function(social) {\n return social.url;\n });\n }\n\n // Workaround for old data\n if (formData.position) {\n formData.position = null;\n }\n\n // Make sure to convert lat/lon to float\n if (formData.geoPoint && formData.geoPoint.lat && formData.geoPoint.lon) {\n formData.geoPoint.lat = parseFloat(formData.geoPoint.lat);\n formData.geoPoint.lon = parseFloat(formData.geoPoint.lon);\n }\n else{\n formData.geoPoint = null; // force to null, need by ES update request\n }\n\n if (!$scope.existing) {\n return esProfile.add(formData, {wallet: wallet})\n .then(function() {\n console.info(\"[ES] [profile] Successfully created.\");\n $scope.existing = true;\n $scope.saving = false;\n $scope.dirty = false;\n updateWallet(formData);\n showSuccessToast();\n return true;\n })\n .catch(onError('PROFILE.ERROR.SAVE_PROFILE_FAILED'));\n }\n else {\n return esProfile.update(formData, {id: $scope.walletData.pubkey, wallet: wallet})\n .then(function() {\n console.info(\"[ES] Profile successfully updated.\");\n $scope.saving = false;\n $scope.dirty = false;\n updateWallet(formData);\n showSuccessToast();\n return true;\n })\n .catch(onError('PROFILE.ERROR.SAVE_PROFILE_FAILED'));\n }\n }; // end of doFinishSave\n\n if ($scope.avatar && $scope.avatar.src) {\n return UIUtils.image.resizeSrc($scope.avatar.src, true) // resize to thumbnail\n .then(function(imageSrc) {\n $scope.formData.avatar = esHttp.image.toAttachment({src: imageSrc});\n return doFinishSave($scope.formData);\n });\n }\n else {\n delete $scope.formData.avatar;\n return doFinishSave($scope.formData);\n }\n };\n\n $scope.saveAndClose = function() {\n return $scope.save()\n .then(function(saved) {\n if (saved) $scope.close();\n });\n };\n\n $scope.submitAndSaveAndClose = function() {\n $scope.form.$submitted=true;\n $scope.saveAndClose();\n };\n\n $scope.cancel = function() {\n $scope.dirty = false; // force not saved\n if (wallet.isDefault()) {\n $ionicHistory.nextViewOptions({\n historyRoot: true\n });\n return $state.go('app.view_wallet');\n }\n else {\n return $state.go('app.view_wallet_by_id', {id: wallet.id});\n }\n };\n\n $scope.close = function() {\n if (wallet.isDefault()) {\n $ionicHistory.nextViewOptions({\n historyRoot: true\n });\n return $state.go('app.view_wallet', {refresh: true});\n }\n else {\n return $state.go('app.view_wallet_by_id', {refresh: true, id: wallet.id});\n }\n };\n\n $scope.showAvatarModal = function() {\n if (Device.camera.enable) {\n return Device.camera.getPicture()\n .then(function(imageData) {\n if (!imageData) return;\n $scope.avatar = {src: \"data:image/png;base64,\" + imageData};\n $scope.avatarStyle={'background-image':'url(\"'+imageData+'\")'};\n $scope.dirty = true;\n })\n .catch(UIUtils.onError('ERROR.TAKE_PICTURE_FAILED'));\n }\n else {\n return ModalUtils.show('plugins/es/templates/common/modal_edit_avatar.html','ESAvatarModalCtrl',\n {})\n .then(function(imageData) {\n if (!imageData) return;\n $scope.avatar = {src: imageData};\n $scope.avatarStyle={'background-image':'url(\"'+imageData+'\")'};\n $scope.dirty = true;\n });\n }\n };\n\n $scope.rotateAvatar = function(){\n if (!$scope.avatar || !$scope.avatar.src || $scope.rotating) return;\n\n $scope.rotating = true;\n\n return UIUtils.image.rotateSrc($scope.avatar.src)\n .then(function(imageData){\n $scope.avatar.src = imageData;\n $scope.avatarStyle={'background-image':'url(\"'+imageData+'\")'};\n $scope.dirty = true;\n $scope.rotating = false;\n })\n .catch(function(err) {\n console.error(err);\n $scope.rotating = false;\n });\n };\n\n $scope.removeProfile = function(){\n // Hide popover if need\n $scope.hideActionsPopover();\n\n return $scope.existing && wallet.auth({minData: true})\n .then(function(walletData) {\n\n UIUtils.loading.hide();\n UIUtils.alert.confirm('PROFILE.CONFIRM.DELETE', undefined, {okText: 'COMMON.BTN_DELETE'})\n .then(function(confirm) {\n if (confirm){\n\n console.debug('[ES] [profile] Deleting user profile...');\n return esProfile.remove(walletData.pubkey, {wallet: wallet})\n .then(function () {\n if (wallet.isDefault()) {\n walletData.name=null; // keep local name, on children wallets\n }\n walletData.profile = null;\n walletData.avatar = null;\n console.debug('[ES] [profile] Successfully deleted');\n $scope.dirty = false;\n return $scope.close();\n })\n .then(function() {\n return $timeout(function() {\n UIUtils.toast.show('PROFILE.INFO.PROFILE_REMOVED');\n }, 750);\n })\n .catch(UIUtils.onError('PROFILE.ERROR.REMOVE_PROFILE_FAILED'));\n }\n });\n });\n };\n\n /* -- Popover -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'plugins/es/templates/user/edit_popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n}\n\n\n","\nESMessageAbstractListController.$inject = ['$scope', '$state', '$translate', '$ionicHistory', '$ionicPopover', '$timeout', 'csWallet', 'esModals', 'UIUtils', 'esMessage'];\nESMessageInboxListController.$inject = ['$scope', '$controller'];\nESMessageOutboxListController.$inject = ['$scope', '$controller'];\nESMessageComposeController.$inject = ['$scope', '$controller'];\nESMessageComposeModalController.$inject = ['$scope', 'Modals', 'UIUtils', 'csWallet', 'esHttp', 'esMessage', 'parameters'];\nESMessageViewController.$inject = ['$scope', '$state', '$timeout', '$translate', '$ionicHistory', '$ionicPopover', 'UIUtils', 'esModals', 'esMessage', 'csWallet'];\nPopoverMessageController.$inject = ['$scope', 'UIUtils', '$state', 'csWallet', 'esHttp', 'esMessage', 'esModals', '$timeout'];angular.module('cesium.es.message.controllers', ['cesium.es.services'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n\n .state('app.user_message', {\n url: \"/user/message\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/message/lookup.html\"\n }\n }\n })\n\n .state('app.user_message.tab_inbox', {\n url: \"/inbox\",\n views: {\n 'tab_inbox': {\n controller: 'ESMessageInboxListCtrl',\n templateUrl: \"plugins/es/templates/message/tabs/tab_list.html\"\n }\n },\n data: {\n auth: true,\n minData: true,\n large: 'app.user_messages_lg_inbox'\n }\n })\n\n .state('app.user_message.tab_outbox', {\n url: \"/outbox\",\n views: {\n 'tab_outbox': {\n controller: 'ESMessageOutboxListCtrl',\n templateUrl: \"plugins/es/templates/message/tabs/tab_list.html\"\n }\n },\n data: {\n auth: true,\n minData: true,\n large: 'app.user_messages_lg_outbox'\n }\n })\n\n .state('app.user_messages_lg_inbox', {\n url: \"/user/message/lg/inbox\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/message/lookup_lg.html\",\n controller: 'ESMessageInboxListCtrl'\n }\n },\n data: {\n auth: true,\n minData: true\n }\n })\n\n .state('app.user_messages_by_id', {\n url: \"/wallets/:id/message\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/message/lookup_by_id.html\"\n }\n }\n })\n\n .state('app.user_messages_by_id.tab_inbox', {\n url: \"/inbox\",\n views: {\n 'tab_inbox': {\n controller: 'ESMessageInboxListCtrl',\n templateUrl: \"plugins/es/templates/message/tabs/tab_list.html\"\n }\n },\n data: {\n large: 'app.user_messages_lg_inbox_by_id'\n }\n })\n\n .state('app.user_messages_by_id.tab_outbox', {\n url: \"/outbox\",\n views: {\n 'tab_outbox': {\n controller: 'ESMessageOutboxListCtrl',\n templateUrl: \"plugins/es/templates/message/tabs/tab_list.html\"\n }\n },\n data: {\n large: 'app.user_messages_lg_outbox_by_id'\n }\n })\n\n .state('app.user_messages_lg_inbox_by_id', {\n url: \"/wallets/:id/message/lg/inbox\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/message/lookup_lg.html\",\n controller: 'ESMessageInboxListCtrl'\n }\n }\n })\n\n .state('app.user_messages_lg_outbox', {\n url: \"/user/message/lg/outbox\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/message/lookup_lg.html\",\n controller: 'ESMessageOutboxListCtrl'\n }\n },\n data: {\n auth: true,\n minData: true\n }\n })\n\n .state('app.user_messages_lg_outbox_by_id', {\n url: \"/wallets/:id/message/lg/outbox\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/message/lookup_lg.html\",\n controller: 'ESMessageOutboxListCtrl'\n }\n }\n })\n\n .state('app.user_new_message', {\n cache: false,\n url: \"/user/message/new?pubkey&uid&title&content&isReply\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/message/compose.html\",\n controller: 'ESMessageComposeCtrl'\n }\n }\n })\n\n .state('app.user_view_message', {\n cache: false,\n url: \"/user/message/view/:type/:messageId\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/message/view_message.html\",\n controller: 'ESMessageViewCtrl'\n }\n },\n data: {\n auth: true,\n minData: true\n }\n })\n\n .state('app.user_view_message_by_id', {\n cache: false,\n url: \"/wallets/:id/message/view/:type/:messageId\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/message/view_message.html\",\n controller: 'ESMessageViewCtrl'\n }\n }\n })\n\n ;\n }])\n\n .controller('ESMessageAbstractListCtrl', ESMessageAbstractListController)\n\n .controller('ESMessageInboxListCtrl', ESMessageInboxListController)\n\n .controller('ESMessageOutboxListCtrl', ESMessageOutboxListController)\n\n .controller('ESMessageComposeCtrl', ESMessageComposeController)\n\n .controller('ESMessageComposeModalCtrl', ESMessageComposeModalController)\n\n .controller('ESMessageViewCtrl', ESMessageViewController)\n\n .controller('PopoverMessageCtrl', PopoverMessageController)\n\n;\n\nfunction ESMessageAbstractListController($scope, $state, $translate, $ionicHistory, $ionicPopover, $timeout,\n csWallet, esModals, UIUtils, esMessage) {\n 'ngInject';\n\n var defaultSearchLimit = 40;\n var wallet;\n var selectPrevented = false;\n\n $scope.search = {\n loading: true,\n results: [],\n hasMore : false,\n loadingMore : false,\n limit: defaultSearchLimit,\n type: 'last',\n text: null,\n options: {\n }\n };\n\n $scope.fabButtonNewMessageId = undefined;\n\n $scope.enter = function(s, state) {\n // First enter\n if ($scope.search.loading) {\n wallet = (state.stateParams && state.stateParams.id) ? csWallet.children.get(state.stateParams.id) : csWallet;\n if (!wallet) {\n UIUtils.alert.error('ERROR.UNKNOWN_WALLET_ID');\n return $scope.showHome();\n }\n\n $scope.isDefaultWallet = wallet.isDefault();\n $scope.walletId = wallet.id;\n\n wallet.auth({minData: true})\n .then(function() {\n if (!$scope.entered) {\n $scope.entered = true;\n $scope.type = $scope.type || state.stateParams && state.stateParams.type || 'inbox';\n $scope.load();\n }\n\n if ($scope.fabButtonNewMessageId) {\n $scope.showFab($scope.fabButtonNewMessageId);\n }\n })\n .catch(function(err) {\n if ('CANCELLED' === err) {\n $ionicHistory.nextViewOptions({\n historyRoot: true\n });\n $scope.showHome();\n }\n });\n }\n // Not first entering: refresh the view\n else {\n $scope.updateView();\n }\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.load = function(from, size, silent) {\n\n var options = angular.copy($scope.search.options);\n options.from = options.from || from || 0;\n options.size = options.size || size || defaultSearchLimit;\n options.type = $scope.type;\n options.summary = false;\n options.filter = ($scope.search.type == 'text' && $scope.search.text && $scope.search.text.trim().length > 0) ?\n $scope.search.text : undefined;\n options.wallet = wallet;\n\n $scope.search.loading = !silent;\n return esMessage.load(options)\n .then(function(res) {\n\n if (!options.from) {\n $scope.search.results = res || [];\n }\n else if (res){\n $scope.search.results = $scope.search.results.concat(res);\n }\n\n UIUtils.loading.hide();\n $scope.search.loading = false;\n $scope.search.hasMore = ($scope.search.results && $scope.search.results.length >= $scope.search.limit);\n $scope.updateView();\n })\n .catch(function(err) {\n $scope.search.loading = false;\n if (!options.from) {\n $scope.search.results = [];\n }\n $scope.search.hasMore = false;\n UIUtils.onError('MESSAGE.ERROR.LOAD_MESSAGES_FAILED')(err);\n });\n };\n\n $scope.updateView = function() {\n if ($scope.motion && $scope.motion.ionListClass && $scope.search.results.length) {\n $scope.motion.show({selector: '.view-messages .list .item'});\n }\n $scope.$broadcast('$$rebind::rebind'); // notifier binder\n };\n\n $scope.showMore = function() {\n $scope.search.limit = $scope.search.limit || defaultSearchLimit;\n $scope.search.limit += defaultSearchLimit;\n if ($scope.search.limit < defaultSearchLimit) {\n $scope.search.limit = defaultSearchLimit;\n }\n $scope.search.loadingMore = true;\n $scope.load(\n $scope.search.results.length, // from\n $scope.search.limit,\n true /*silent*/)\n .then(function() {\n $scope.search.loadingMore = false;\n $scope.$broadcast('scroll.infiniteScrollComplete');\n });\n };\n\n $scope.markAllAsRead = function() {\n $scope.hideActionsPopover();\n if (!$scope.search.results || !$scope.search.results.length) return;\n\n UIUtils.alert.confirm('MESSAGE.CONFIRM.MARK_ALL_AS_READ')\n .then(function(confirm) {\n if (confirm) {\n esMessage.markAllAsRead()\n .then(function () {\n _.forEach($scope.search.results, function(msg){\n msg.read = true;\n });\n })\n .catch(UIUtils.onError('MESSAGE.ERROR.MARK_ALL_AS_READ_FAILED'));\n }\n });\n };\n\n $scope.delete = function(index) {\n var message = $scope.search.results[index];\n if (!message) return;\n\n UIUtils.alert.confirm('MESSAGE.CONFIRM.REMOVE')\n .then(function(confirm) {\n if (confirm) {\n esMessage.remove(message.id, $scope.type, {walletId: $scope.walletId})\n .then(function () {\n $scope.search.results.splice(index,1); // remove from messages array\n $scope.updateView();\n UIUtils.toast.show('MESSAGE.INFO.MESSAGE_REMOVED');\n })\n .catch(UIUtils.onError('MESSAGE.ERROR.REMOVE_MESSAGE_FAILED'));\n }\n });\n };\n\n $scope.deleteAll = function() {\n $scope.hideActionsPopover();\n if (!$scope.search.results || !$scope.search.results.length) return;\n\n UIUtils.alert.confirm('MESSAGE.CONFIRM.REMOVE_ALL')\n .then(function(confirm) {\n if (confirm) {\n esMessage.removeAll($scope.type, {walletId: $scope.walletId})\n .then(function () {\n $scope.search.results.splice(0,$scope.search.results.length); // reset array\n $scope.updateView();\n UIUtils.toast.show('MESSAGE.INFO.All_MESSAGE_REMOVED');\n })\n .catch(UIUtils.onError('MESSAGE.ERROR.REMOVE_All_MESSAGES_FAILED'));\n }\n });\n };\n\n $scope.doSearchLast = function() {\n $scope.search.type='last';\n $scope.search.loadingMore=false;\n $scope.search.limit = defaultSearchLimit;\n return $scope.load();\n };\n\n $scope.doSearch = function() {\n if (!$scope.search.text || $scope.search.text.length < 3) {\n return;\n }\n $scope.search.type='text';\n $scope.search.loadingMore=false;\n $scope.search.results = [];\n $scope.search.limit = defaultSearchLimit;\n\n console.debug('[message] [{0}] Searching for: {1}'.format($scope.type, $scope.search.text));\n return $scope.load();\n };\n\n\n $scope.refresh = function(silent) {\n selectPrevented = true; // Will disable select() to open the message\n return $scope.load(undefined, undefined, silent)\n .then(function() {\n selectPrevented = false;\n })\n .catch(function() {\n selectPrevented = false;\n });\n };\n\n $scope.select = function(message, event) {\n if (event.isDefaultPrevented() || $scope.search.loading || selectPrevented) return; // skip\n\n // Add a timeout, to be sure the refres action was not called before\n return $timeout(function() {\n if (selectPrevented || event.isDefaultPrevented()) return; // skip\n event.preventDefault();\n\n if ($scope.walletId === 'default') {\n return $state.go('app.user_view_message', {type: $scope.type, messageId:message.id});\n }\n else {\n return $state.go('app.user_view_message_by_id', {type: $scope.type, messageId:message.id, id: $scope.walletId});\n }\n }, 200);\n };\n\n /* -- Modals -- */\n\n $scope.showNewMessageModal = function(parameters) {\n return wallet.login({minData: true})\n .then(function() {\n UIUtils.loading.hide();\n\n parameters = parameters || {};\n parameters.wallet = $scope.walletId;\n\n return esModals.showMessageCompose(parameters)\n .then(function(id) {\n if (id) UIUtils.toast.show('MESSAGE.INFO.MESSAGE_SENT');\n });\n });\n };\n\n $scope.showReplyModal = function(index) {\n var message = $scope.search.results[index];\n if (!message) return;\n\n $translate('MESSAGE.REPLY_TITLE_PREFIX')\n .then(function (prefix) {\n var content = message.content ? message.content.replace(/^/g, ' > ') : null;\n content = content ? content.replace(/\\n/g, '\\n > ') : null;\n content = content ? content +'\\n' : null;\n return esModals.showMessageCompose({\n destPub: message.issuer,\n destUid: message.name||message.uid,\n title: prefix + message.title,\n content: content,\n isReply: true,\n wallet: $scope.walletId\n });\n })\n .then(function(sent) {\n if (sent) UIUtils.toast.show('MESSAGE.INFO.MESSAGE_SENT');\n });\n };\n\n /* -- Popover -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'plugins/es/templates/message/lookup_popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n\n /* -- watch events (delete, received, sent) -- */\n\n // Message deletion\n $scope.onMessageDelete = function(id) {\n var index = _.findIndex($scope.search.results, function(msg) {\n return msg.id == id;\n });\n if (index) {\n $scope.search.results.splice(index,1); // remove from messages array\n }\n $scope.updateView();\n };\n esMessage.api.data.on.delete($scope, $scope.onMessageDelete);\n\n // Watch user sent message\n $scope.onNewOutboxMessage = function(id) {\n if ($scope.type !== 'outbox') return;\n // Add message sent to list\n $scope.search.loading = true;\n return $timeout(function() {\n // Load the message sent\n return esMessage.get(id, $scope.type, {summary: true, wallet: wallet});\n }, 500 /*waiting ES propagation*/)\n .then(function(msg) {\n $scope.search.results.splice(0,0,msg);\n $scope.search.loading = false;\n $scope.updateView();\n })\n .catch(function() {\n $scope.loading = false;\n });\n };\n esMessage.api.data.on.sent($scope, $scope.onNewOutboxMessage);\n\n // Watch received message\n $scope.onNewInboxMessage = function(notification) {\n if ($scope.type !== 'inbox' || !$scope.entered || !wallet.isUserPubkey(notification.issuer)) return;\n // Add message sent to list\n $scope.search.loading = true;\n // Load the the message\n return esMessage.get(notification.id, $scope.type, {summary: true, wallet: wallet})\n .then(function(msg) {\n $scope.search.results.splice(0,0,msg);\n $scope.search.loading = false;\n $scope.updateView();\n })\n .catch(function() {\n $scope.search.loading = false;\n });\n };\n esMessage.api.data.on.new($scope, $scope.onNewInboxMessage);\n\n // Watch unauth\n $scope.onUnauth = function() {\n // Reset all data\n $scope.search.results = undefined;\n $scope.search.loading = false;\n $scope.entered = false;\n };\n csWallet.api.data.on.unauth($scope, $scope.onUnauth);\n\n // for DEV only\n /*$timeout(function() {\n $scope.showNewMessageModal();\n }, 900);\n */\n}\n\nfunction ESMessageInboxListController($scope, $controller) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESMessageAbstractListCtrl', {$scope: $scope}));\n\n $scope.type = 'inbox';\n $scope.fabButtonNewMessageId = 'fab-add-message-record-inbox';\n\n}\n\n\nfunction ESMessageOutboxListController($scope, $controller) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESMessageAbstractListCtrl', {$scope: $scope}));\n\n $scope.type = 'outbox';\n $scope.fabButtonNewMessageId = 'fab-add-message-record-outbox';\n}\n\nfunction ESMessageComposeController($scope, $controller) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESMessageComposeModalCtrl', {$scope: $scope, parameters: {}}));\n\n\n $scope.enter = function(e, state) {\n\n // Apply state parameters\n if (state && state.stateParams) {\n $scope.setParameters(state.stateParams);\n }\n\n // Load wallet\n return $scope.load()\n .then(UIUtils.loading.hide);\n };\n $scope.$on('$ionicView.enter',$scope.enter);\n\n $scope.cancel = function() {\n $scope.sending = false;\n $scope.showHome();\n };\n\n $scope.setForm = function(form) {\n $scope.form = form;\n };\n\n $scope.closeModal = function() {\n $scope.sending = false;\n $scope.showHome();\n };\n\n}\n\nfunction ESMessageComposeModalController($scope, Modals, UIUtils, csWallet, esHttp, esMessage, parameters) {\n 'ngInject';\n\n var wallet;\n\n $scope.formData = {\n title: null,\n content: null,\n destPub: null,\n walletId: null\n };\n $scope.destUid = null;\n $scope.destPub = null;\n $scope.isReply = false;\n $scope.enableSelectWallet = true;\n $scope.sending = false;\n\n $scope.setParameters = function(parameters) {\n if (!parameters) return;\n\n if (parameters.pubkey || parameters.destPub) {\n $scope.formData.destPub = parameters.pubkey || parameters.destPub;\n if (parameters.uid || parameters.destUid) {\n $scope.destUid = parameters.uid || parameters.destUid;\n $scope.destPub = '';\n }\n else {\n $scope.destUid = '';\n $scope.destPub = $scope.formData.destPub;\n }\n }\n\n if (parameters.title) {\n $scope.formData.title = parameters.title;\n }\n\n if (parameters.content) {\n $scope.formData.content = parameters.content;\n }\n\n $scope.isReply = parameters.isReply || false;\n\n if (parameters.wallet) {\n $scope.formData.walletId = parameters.wallet;\n }\n };\n\n // Read default parameters\n $scope.setParameters(parameters);\n\n $scope.load = function() {\n $scope.enableSelectWallet = csWallet.children.count() > 0;\n\n wallet = $scope.enableSelectWallet && ($scope.formData.walletId ? csWallet.children.get($scope.formData.walletId) : csWallet) || csWallet;\n if (!wallet.isDefault()) {\n console.debug(\"[message] Using {\" + wallet.id + \"} wallet\");\n }\n else {\n console.debug(\"[message] Using default wallet\");\n }\n\n return wallet.login({minData: true, silent: true})\n .then(function(data) {\n $scope.walletData = data;\n })\n .catch(function(err){\n if (err === 'CANCELLED') {\n $scope.cancel();\n }\n });\n };\n $scope.$on('modal.shown', $scope.load);\n\n $scope.doSend = function(forceNoContent) {\n $scope.form.$submitted=true;\n if(!$scope.form.$valid) {\n return;\n }\n\n // Ask user confirmation if no content\n if (!forceNoContent && (!$scope.formData.content || !$scope.formData.content.trim().length)) {\n return UIUtils.alert.confirm('MESSAGE.COMPOSE.CONTENT_CONFIRMATION')\n .then(function(confirm) {\n if (confirm) {\n $scope.doSend(true);\n }\n });\n }\n\n $scope.sending = true;\n UIUtils.loading.show();\n var data = {\n issuer: wallet.data.pubkey,\n recipient: $scope.formData.destPub,\n title: $scope.formData.title,\n content: $scope.formData.content,\n time: moment().utc().unix()\n };\n\n esMessage.send(data, {wallet: wallet})\n .then(function(id) {\n $scope.id=id;\n UIUtils.loading.hide();\n $scope.closeModal(id);\n })\n .catch(function(err) {\n $scope.sending = false;\n // silent, if user cancelled;\n if (err === 'CANCELLED') {\n UIUtils.loading.hide();\n return;\n }\n UIUtils.onError('MESSAGE.ERROR.SEND_MSG_FAILED')(err);\n });\n };\n\n\n $scope.cancel = function() {\n $scope.closeModal();\n };\n\n /* -- Modals -- */\n\n $scope.showWotLookupModal = function() {\n Modals.showWotLookup()\n .then(function(result){\n if (result) {\n if (result.uid) {\n $scope.destUid = result.uid;\n $scope.destPub = '';\n }\n else {\n $scope.destUid = '';\n $scope.destPub = result.pubkey;\n }\n $scope.destName = result.name || result.uid;\n $scope.formData.destPub = result.pubkey;\n // TODO focus on title field\n //$focus('');\n }\n });\n };\n\n $scope.showSelectWalletModal = function() {\n if (!$scope.enableSelectWallet) return;\n\n return Modals.showSelectWallet({\n showDefault: true,\n showBalance: false\n })\n .then(function(newWallet) {\n if (!newWallet || (wallet && wallet.id === newWallet.id)) return;\n wallet = newWallet;\n $scope.walletData = wallet.data;\n console.debug(\"[message] Using {\" + wallet.id + \"} wallet\");\n });\n };\n\n\n\n // TODO : for DEV only\n /*$timeout(function() {\n $scope.formData.destPub = 'G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU';\n $scope.formData.title = 'test';\n $scope.formData.content = 'test';\n $scope.destPub = $scope.formData.destPub;\n\n $timeout(function() {\n //$scope.doSend();\n }, 800);\n }, 100);\n */\n}\n\n\nfunction ESMessageViewController($scope, $state, $timeout, $translate, $ionicHistory, $ionicPopover,\n UIUtils, esModals, esMessage, csWallet) {\n 'ngInject';\n\n $scope.formData = {};\n $scope.id = null;\n $scope.loading = true;\n\n var wallet;\n\n $scope.$on('$ionicView.beforeEnter', function (event, viewData) {\n // Enable back button (workaround need for navigation outside tabs - https://stackoverflow.com/a/35064602)\n viewData.enableBack = UIUtils.screen.isSmall() ? true : viewData.enableBack;\n });\n\n $scope.enter = function(e, state) {\n // First enter\n if ($scope.loading) {\n\n wallet = (state.stateParams && state.stateParams.id) ? csWallet.children.get(state.stateParams.id) : csWallet;\n if (!wallet) {\n UIUtils.alert.error('ERROR.UNKNOWN_WALLET_ID');\n return $scope.showHome();\n }\n\n $scope.isDefaultWallet = wallet.isDefault();\n $scope.walletId = wallet.id;\n\n var messageId = state.stateParams && state.stateParams.messageId;\n $scope.type = state.stateParams.type || 'inbox';\n\n // No message id: redirect\n if (angular.isUndefined(messageId)) {\n $scope.goBack();\n return;\n }\n\n wallet.auth({minData: true})\n .then(function () {\n return $scope.load(messageId, $scope.type);\n })\n .then(function(message) {\n\n UIUtils.loading.hide();\n if (!message) return; // SKip\n\n $scope.updateView(message);\n $scope.showFab('fab-view-message-reply');\n\n // Mark as read\n if (!message.read) {\n $timeout(function() {\n // Message has NOT changed\n if ($scope.id === message.id) {\n esMessage.markAsRead(message, {type: $scope.type, wallet: wallet})\n .then(function() {\n console.debug(\"[message] marked as read\");\n })\n .catch(UIUtils.onError('MESSAGE.ERROR.MARK_AS_READ_FAILED'));\n }\n }, 2000); // 2s\n }\n });\n }\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.load = function(id, type) {\n type = type || 'inbox';\n return esMessage.get(id, type, {wallet: wallet})\n .catch(UIUtils.onError('MESSAGE.ERROR.LOAD_MESSAGE_FAILED'))\n .then(function(message) {\n if (!message.valid) {\n return UIUtils.alert.error(!$scope.isUserPubkey(message.recipient) ? 'MESSAGE.ERROR.USER_NOT_RECIPIENT' : 'MESSAGE.ERROR.NOT_AUTHENTICATED_MESSAGE',\n 'MESSAGE.ERROR.MESSAGE_NOT_READABLE')\n .then(function () {\n $scope.goBack(true/*clear cache*/);\n });\n }\n return message;\n });\n };\n\n $scope.updateView = function(message) {\n $scope.loading = false;\n $scope.id = message.id;\n $scope.formData = message;\n $scope.canDelete = true;\n $scope.motion.show({selector: '.view-message .list .item'});\n };\n\n $scope.delete = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n }\n\n UIUtils.alert.confirm('MESSAGE.CONFIRM.REMOVE')\n .then(function(confirm) {\n if (confirm) {\n return esMessage.remove($scope.id, $scope.type, {wallet: wallet})\n .then(function () {\n $scope.goBack(true/*clear page cache*/);\n UIUtils.toast.show('MESSAGE.INFO.MESSAGE_REMOVED');\n })\n .catch(UIUtils.onError('MESSAGE.ERROR.REMOVE_MESSAGE_FAILED'));\n }\n });\n };\n\n $scope.goBack = function(clearPageCache) {\n if (clearPageCache) {\n $ionicHistory.clearCache($ionicHistory.currentView().stateId); // clear current view\n }\n $ionicHistory.nextViewOptions({historyRoot: true});\n if ($scope.isDefaultWallet) {\n if ($scope.type) {\n $state.go('app.user_message.tab_' + $scope.type, {type: $scope.type});\n }\n }\n else {\n if ($scope.type) {\n $state.go('app.user_messages_by_id.tab_' + $scope.type, {type: $scope.type, id: $scope.walletId});\n }\n }\n };\n\n /* -- Popover -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'plugins/es/templates/message/view_popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n\n /* -- Modals -- */\n\n $scope.showReplyModal = function() {\n var recipientField = ($scope.type === 'inbox') ? 'issuer' : 'recipient';\n $translate('MESSAGE.REPLY_TITLE_PREFIX')\n .then(function (prefix) {\n var content = $scope.formData.content ? $scope.formData.content.replace(/^/g, ' > ') : null;\n content = content ? content.replace(/\\n/g, '\\n > ') : null;\n content = content ? content +'\\n' : null;\n return esModals.showMessageCompose({\n destPub: $scope.formData[recipientField],\n destUid: $scope.formData.name||$scope.formData.uid,\n title: prefix + $scope.formData.title,\n content: content,\n isReply: true,\n walletId: wallet.id\n });\n })\n .then(function(sent) {\n if (sent) {\n UIUtils.toast.show('MESSAGE.INFO.MESSAGE_SENT')\n .then(function() {\n $ionicHistory.goBack();\n });\n }\n })\n ;\n };\n}\n\nfunction PopoverMessageController($scope, UIUtils, $state, csWallet, esHttp, esMessage, esModals, $timeout) {\n 'ngInject';\n\n var defaultSearchLimit = 40;\n var wallet;\n\n $scope.search = {\n loading : true,\n results: null,\n hasMore : false,\n loadingMore : false,\n limit: defaultSearchLimit\n };\n\n $scope.$on('popover.shown', function() {\n if ($scope.search.loading) {\n // TODO manage secondary wallets\n wallet = $scope.walletId && csWallet.children.get($scope.walletId) || csWallet;\n\n /* -- wallet listeners -- */\n if (wallet.isDefault()) {\n wallet.api.data.on.logout($scope, $scope.resetData);\n esMessage.api.data.on.new($scope, $scope.onNewMessageNotification);\n }\n\n $scope.load();\n }\n });\n\n $scope.load = function(from, size) {\n var options = {};\n options.from = from || 0;\n options.size = size || defaultSearchLimit;\n return esMessage.notifications.load(options)\n .then(function(notifications) {\n if (!from) {\n $scope.search.results = notifications;\n }\n else {\n $scope.search.results = $scope.search.results.concat(notifications);\n }\n $scope.search.loading = false;\n $scope.search.hasMore = ($scope.search.results && $scope.search.results.length >= $scope.search.limit);\n $scope.updateView();\n })\n .catch(function(err) {\n $scope.search.loading = false;\n if (!from) {\n $scope.search.results = [];\n }\n $scope.search.hasMore = false;\n UIUtils.onError('MESSAGE.ERROR.LOAD_NOTIFICATIONS_FAILED')(err);\n });\n };\n\n $scope.updateView = function() {\n if ($scope.motion && $scope.search.results && $scope.search.results.length) {\n $scope.motion.show({selector: '.popover-notification .item'});\n }\n };\n\n $scope.showMore = function() {\n $scope.search.limit = $scope.search.limit || defaultSearchLimit;\n $scope.search.limit = $scope.search.limit * 2;\n if ($scope.search.limit < defaultSearchLimit) {\n $scope.search.limit = defaultSearchLimit;\n }\n $scope.search.loadingMore = true;\n $scope.load(\n $scope.search.results.length, // from\n $scope.search.limit)\n .then(function() {\n $scope.search.loadingMore = false;\n $scope.$broadcast('scroll.infiniteScrollComplete');\n });\n };\n\n // Listen notifications changes\n $scope.onNewMessageNotification = function(notification) {\n if ($scope.search.loading || $scope.search.loadingMore) return;\n\n if (!wallet.isUserPubkey(notification.issuer)) return; // skip\n\n // Prepend to list\n $scope.search.results.splice(0,0,notification);\n $scope.updateView();\n };\n\n $scope.select = function(notification) {\n if (!notification.read) notification.read = true;\n if ($scope.walletId === 'default') {\n $state.go('app.user_view_message', {messageId: notification.id});\n }\n else {\n $state.go('app.user_view_message_by_id', {messageId: notification.id, id: $scope.walletId});\n }\n $scope.closePopover(notification);\n };\n\n $scope.resetData = function() {\n if ($scope.search.loading) return;\n console.debug(\"[ES] [messages] Resetting data (settings or account may have changed)\");\n $scope.search.hasMore = false;\n $scope.search.results = [];\n $scope.search.loading = true;\n delete $scope.search.limit;\n };\n\n\n /* -- Modals -- */\n\n $scope.showNewMessageModal = function(parameters) {\n\n $scope.closePopover();\n\n $timeout(function() {\n parameters = parameters || {};\n parameters.walletId = wallet.id;\n\n esModals.showMessageCompose(parameters)\n .then(function(id) {\n if (id) UIUtils.toast.show('MESSAGE.INFO.MESSAGE_SENT');\n });\n }, 500); // Timeout need, to avoid freeze\n };\n\n /* -- listeners -- */\n\n esHttp.api.node.on.stop($scope, $scope.resetData);\n esHttp.api.node.on.start($scope, $scope.load);\n\n}\n","\nNotificationsController.$inject = ['$scope', '$ionicPopover', '$state', '$timeout', 'UIUtils', 'esHttp', 'csWallet', 'esNotification'];\nPopoverNotificationsController.$inject = ['$scope', '$timeout', '$controller', '$state', 'UIUtils', 'csWallet'];\nangular.module('cesium.es.notification.controllers', ['cesium.es.services'])\n\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n\n .state('app.view_notifications', {\n url: \"/notifications\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/notification/view_notifications.html\",\n controller: 'NotificationsCtrl'\n }\n },\n data: {\n login: true\n }\n })\n .state('app.view_notifications_by_id', {\n url: \"/wallets/:id/notifications\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/notification/view_notifications.html\",\n controller: 'NotificationsCtrl'\n }\n },\n data: {\n login: true\n }\n })\n ;\n }])\n\n .controller('NotificationsCtrl', NotificationsController)\n\n .controller('PopoverNotificationsCtrl', PopoverNotificationsController)\n\n;\n\nfunction NotificationsController($scope, $ionicPopover, $state, $timeout, UIUtils, esHttp, csWallet, esNotification) {\n 'ngInject';\n\n var defaultSearchLimit = 40;\n\n $scope.preventSelect = false;\n $scope.search = {\n loading : true,\n results: null,\n hasMore : false,\n loadingMore : false,\n limit: defaultSearchLimit,\n options: {\n codes: {\n excludes: esNotification.constants.EXCLUDED_CODES\n }\n }\n };\n $scope.listeners = [];\n\n var wallet;\n\n $scope.setWallet = function(aWallet) {\n wallet = aWallet;\n };\n\n $scope.$on('$ionicView.enter', function(e, state) {\n if ($scope.search.loading) {\n\n wallet = (state.stateParams && state.stateParams.id) ? csWallet.children.get(state.stateParams.id) : csWallet;\n if (!wallet) {\n UIUtils.alert.error('ERROR.UNKNOWN_WALLET_ID');\n return $scope.showHome();\n }\n\n wallet.login({\n minData: true\n })\n .then(function() {\n $scope.load();\n UIUtils.loading.hide();\n\n $scope.addListeners();\n\n // Reset unread counter\n return $timeout(function() {\n $scope.resetUnreadCount();\n }, 1000);\n });\n }\n });\n\n $scope.refresh = function(silent) {\n return $scope.load(undefined, undefined, silent);\n };\n\n $scope.load = function(from, size, silent) {\n // Make sure wallet is init (need by PopoverInvitationCtrl)\n wallet = wallet || csWallet;\n\n if (!wallet.data.pubkey) {\n $scope.search.loading = true;\n return;\n }\n\n $scope.search.preventSelect = true;\n\n var options = angular.copy($scope.search.options);\n options.from = options.from || from || 0;\n options.size = options.size || size || defaultSearchLimit;\n options.pubkey = wallet.data.pubkey;\n $scope.search.loading = !silent;\n return esNotification.load(options)\n .then(function(res) {\n if (!options.from) {\n $scope.search.results = res || [];\n }\n else if (res){\n $scope.search.results = $scope.search.results.concat(res);\n }\n $scope.search.loading = false;\n $scope.search.preventSelect = false;\n $scope.search.hasMore = $scope.search.results.length >= $scope.search.limit;\n $scope.updateView();\n })\n .catch(function(err) {\n $scope.search.loading = false;\n if (!options.from) {\n $scope.search.results = [];\n }\n $scope.search.preventSelect = false;\n $scope.search.hasMore = false;\n UIUtils.onError('COMMON.NOTIFICATIONS.LOAD_NOTIFICATIONS_FAILED')(err);\n });\n };\n\n $scope.updateView = function() {\n if ($scope.motion && $scope.motion.ionListClass && $scope.search.results.length) {\n $scope.motion.show({selector: '.view-notification .item'});\n }\n };\n\n $scope.markAllAsRead = function() {\n $scope.hideActionsPopover();\n\n // Make sure to be auth before doing this\n if (!wallet.isAuth()) {\n return wallet.auth().then(function(){\n UIUtils.loading.hide();\n return $scope.markAllAsRead(); // loop\n });\n }\n\n if (!$scope.search.results.length) return;\n\n UIUtils.loading.show()\n .then(function() {\n wallet.data.notifications.unreadCount = 0;\n var lastNotification = $scope.search.results[0];\n wallet.data.notifications.time = lastNotification ? lastNotification.time : 0;\n _.forEach($scope.search.results, function (item) {\n if (item.markAsRead && typeof item.markAsRead == 'function') item.markAsRead();\n });\n\n return UIUtils.loading.hide();\n });\n };\n\n $scope.resetUnreadCount = function() {\n if ($scope.search.loading || !wallet.data.notifications) {\n return $timeout($scope.resetUnreadCount, 2000);\n }\n if (!wallet.data.notifications.unreadCount || !$scope.search.results || !$scope.search.results.length) return;\n wallet.data.notifications.unreadCount = 0;\n var lastNotification = $scope.search.results[0];\n var readTime = lastNotification.time ? lastNotification.time : 0;\n if (readTime && (!wallet.data.notifications.time || wallet.data.notifications.time != readTime)) {\n wallet.data.notifications.time = readTime;\n wallet.storeData();\n }\n };\n\n $scope.select = function(event, item) {\n\n if ($scope.search.loading || event.preventDefault() || $scope.search.preventSelect) return;\n\n if (item.markAsRead && typeof item.markAsRead == 'function') {\n $timeout(item.markAsRead);\n }\n if (item.state) {\n $state.go(item.state, item.stateParams);\n }\n };\n\n $scope.showMore = function() {\n $scope.search.limit = $scope.search.limit || defaultSearchLimit;\n $scope.search.limit += defaultSearchLimit;\n if ($scope.search.limit < defaultSearchLimit) {\n $scope.search.limit = defaultSearchLimit;\n }\n $scope.search.loadingMore = true;\n $scope.load(\n $scope.search.results.length, // from\n $scope.search.limit)\n .then(function() {\n $scope.search.loadingMore = false;\n $scope.$broadcast('scroll.infiniteScrollComplete');\n });\n };\n\n // Listen notifications changes\n $scope.onNewNotification = function(notification) {\n if ($scope.search.loading || $scope.search.loadingMore) return;\n\n // Retrieve insertion index\n var nextIndex = _.findIndex($scope.search.results, function(n) {\n return notification.time > n.time;\n });\n if (nextIndex < 0) nextIndex = 0;\n\n // Update the array\n $scope.search.results.splice(nextIndex,0,notification);\n $scope.updateView();\n };\n\n $scope.resetData = function() {\n if ($scope.search.loading) return;\n console.debug(\"[ES] [notifications] Resetting data (settings or account may have changed)\");\n $scope.search.hasMore = false;\n $scope.search.results = [];\n $scope.search.loading = true;\n delete $scope.search.limit;\n };\n\n /* -- Popover -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl :'plugins/es/templates/notification/popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n\n /* -- listeners -- */\n\n $scope.addListeners = function() {\n if (!wallet) throw \"Controller wallet not set !\";\n\n $scope.listeners = [\n esHttp.api.node.on.stop($scope, $scope.resetData),\n esHttp.api.node.on.start($scope, $scope.load),\n wallet.api.data.on.logout($scope, $scope.resetData)\n ];\n\n if (wallet.isDefault()) {\n // Subscribe to new notification\n $scope.listeners.push(\n esNotification.api.data.on.new($scope, $scope.onNewNotification)\n );\n }\n };\n\n $scope.removeListeners = function() {\n _.forEach($scope.listeners, function(remove){\n remove();\n });\n $scope.listeners = [];\n };\n}\n\nfunction PopoverNotificationsController($scope, $timeout, $controller, $state,\n UIUtils, csWallet) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('NotificationsCtrl', {$scope: $scope}));\n\n // Disable list motion\n $scope.motion = null;\n\n // Set the wallet to use\n $scope.setWallet(csWallet);\n\n $scope.$on('popover.shown', function() {\n if ($scope.search.loading) {\n $scope.addListeners();\n $scope.load();\n }\n });\n\n $scope.updateView = function() {\n if (!$scope.search.results.length) return;\n\n // Set Ink\n $timeout(function() {\n UIUtils.ink({selector: '.popover-notification .item.ink'});\n }, 100);\n };\n\n $scope.$on('popover.hidden', $scope.resetUnreadCount);\n\n $scope.select = function($event, notification) {\n if ($event.preventDefault() || !notification) return; // no selection\n if (notification.markAsRead && typeof notification.markAsRead == 'function') notification.markAsRead();\n if (notification.state) {\n $state.go(notification.state, notification.stateParams);\n }\n $scope.closePopover(notification);\n };\n}\n","\nESBlockLookupController.$inject = ['$scope', '$controller', '$ionicPopover', '$location', 'UIUtils', 'esBlockchain'];\nangular.module('cesium.es.blockchain.controllers', ['cesium.es.services'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n\n .state('app.lookup_blocks_currency', {\n url: \"/currencies/:currency/blocks?q\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/blockchain/lookup.html\",\n controller: 'ESBlockLookupCtrl'\n }\n }\n })\n\n .state('app.blockchain_search', {\n url: \"/blockchain/search?q&type\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/blockchain/lookup.html\",\n controller: 'ESBlockLookupCtrl'\n }\n },\n data: {\n silentLocationChange: true\n }\n })\n ;\n }])\n\n .controller('ESBlockLookupCtrl', ESBlockLookupController)\n;\n\n\nfunction ESBlockLookupController($scope, $controller, $ionicPopover, $location, UIUtils, esBlockchain) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('BlockLookupCtrl', {$scope: $scope}));\n\n $scope.search.text = null;\n $scope.search.type = 'last';\n $scope.search.sort = undefined;\n $scope.search.asc = true;\n $scope.searchTextId = 'blockchainSearchText';\n $scope.compactMode = true;\n $scope.enableFilter = true;\n\n $scope.doSearchText = function() {\n if ((!$scope.search.text || !$scope.search.text.trim().length) &&\n (!$scope.search.filters || !$scope.search.filters.length) ) {\n return $scope.doSearchLast();\n }\n\n $scope.search.type = 'text';\n\n $scope.doSearch();\n\n // Update location href\n $location.search({q: $scope.search.query}).replace();\n };\n\n $scope.doSearchLast = function() {\n $scope.hideActionsPopover();\n\n $scope.search.type = 'last';\n $scope.search.sort = undefined;\n $scope.doSearch();\n\n $location.search({q: undefined}).replace();\n };\n\n\n // This method override the base class method\n $scope.doSearch = function(from) {\n if ($scope.search.error) return;\n\n from = angular.isDefined(from) ? from : 0;\n var promise;\n var request = {};\n\n $scope.search.loading = (from === 0);\n request.size = $scope.defaultSizeLimit;\n\n // last block\n if ($scope.search.type == 'last') {\n // Add '+1' to skip the indexed block with _id='current'\n request.from = (from === 0) ? 0 : from+1;\n // add sort\n if ($scope.search.sort) {\n request.sort = {};\n request.sort[$scope.search.sort] = !$scope.search.asc ? \"desc\" : \"asc\";\n }\n else { // default sort\n request.sort = {\n \"number\": \"desc\"\n };\n }\n request.excludeCurrent = (from === 0);\n\n promise = esBlockchain.block.search($scope.currency, request);\n }\n\n // Full text search\n else if ($scope.search.type == 'text') {\n\n // Parse text search into filters array\n var res = esBlockchain.block.parseSearchText($scope.search.text, $scope.search.filters);\n $scope.search.filters = res.filters;\n var query = $scope.search.filters.reduce(function(query, filter){\n return query + ' AND ' + filter.text;\n }, '');\n if (res.text.length) {\n query += ' AND ' + res.text;\n }\n\n $scope.search.query = query.substr(5);\n $scope.search.text = res.text;\n\n request.from = from;\n\n // add sort\n if ($scope.search.sort) {\n request.sort = $scope.search.sort + ':' + (!$scope.search.asc ? \"desc\" : \"asc\");\n }\n else { // default sort\n request.sort = \"number:desc\";\n }\n request.excludeCurrent = true;\n\n promise = esBlockchain.block.searchText($scope.currency, $scope.search.query, request);\n }\n\n var now = Date.now();\n return promise\n .then(function(result) {\n // Apply transformation need by UI (e.g add avatar and name...)\n return $scope.doPrepareResult(result.hits)\n .then(function() {\n return result;\n });\n })\n .then(function(result) {\n $scope.showPubkey = ($scope.search.sort == 'issuer');\n // Compute time only once (on first page)\n $scope.search.took = (from === 0) ? (Date.now() - now) : $scope.search.took;\n // Keep previous total, when already computed (because of current, that is excluded only in the first page)\n var total = (from === 0) ? result.total : $scope.search.total;\n $scope.doDisplayResult(result.hits, from, total);\n $scope.search.loading = false;\n })\n .catch(function(err) {\n $scope.search.error = true;\n $scope.search.loading = false;\n UIUtils.onError('BLOCKCHAIN.ERROR.SEARCH_BLOCKS_FAILED')(err)\n .then(function() {\n $scope.search.error = false;\n });\n });\n };\n\n $scope.toggleSort = function(sort){\n if ($scope.search.sort === sort && !$scope.search.asc) {\n $scope.search.asc = undefined;\n $scope.search.sort = undefined;\n }\n else {\n $scope.search.asc = ($scope.search.sort === sort) ? !$scope.search.asc : true;\n $scope.search.sort = sort;\n }\n $scope.doSearch();\n };\n\n $scope.showHelpTip = function() {\n\n };\n\n /* -- popups -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'plugins/es/templates/blockchain/lookup_popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n\n /* -- manage click -- */\n\n\n // Cancel search filter\n $scope.itemRemove = function(index) {\n $scope.search.filters.splice(index, 1);\n $scope.doSearchText();\n };\n\n //Show the query\n $scope.toggleShowQuery = function() {\n $scope.showQuery = !$scope.showQuery;\n };\n}\n\n","\nESNetworkLookupController.$inject = ['$scope', '$state', '$location', '$ionicPopover', '$window', '$translate', 'esHttp', 'UIUtils', 'csConfig', 'csSettings', 'csCurrency', 'esNetwork', 'csWot'];\nESNetworkLookupModalController.$inject = ['$scope', '$controller', 'parameters'];\nESPeerViewController.$inject = ['$scope', '$q', '$window', '$state', 'UIUtils', 'csWot', 'esHttp', 'csHttp', 'csSettings'];\nESNetworkLookupPopoverController.$inject = ['$scope', '$controller'];\nESPeerInfoPopoverController.$inject = ['$scope', '$q', 'csSettings', 'csCurrency', 'csHttp', 'esHttp'];angular.module('cesium.es.network.controllers', ['cesium.es.services'])\n\n .config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n PluginServiceProvider.extendState('app.network', {\n points: {\n 'network-buttons': {\n templateUrl: \"plugins/es/templates/network/view_network_extend.html\",\n controller: 'ESExtensionCtrl'\n },\n 'blockchain-buttons': {\n templateUrl: \"plugins/es/templates/network/view_network_extend.html\",\n controller: 'ESExtensionCtrl'\n }\n }\n })\n ;\n }\n }])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n\n .state('app.es_network', {\n url: \"/network/data?online&expert\",\n cache: false, // fix #766\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/network/view_es_network.html\",\n controller: 'ESNetworkLookupCtrl'\n }\n },\n data: {\n silentLocationChange: true\n }\n })\n\n .state('app.view_es_peer', {\n url: \"/network/data/peer/:server?ssl&tor\",\n cache: false,\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/network/view_es_peer.html\",\n controller: 'ESPeerViewCtrl'\n }\n },\n data: {\n preferHttp: true // avoid HTTPS if config has httpsMode=clever\n }\n });\n }])\n\n .controller('ESNetworkLookupCtrl', ESNetworkLookupController)\n\n .controller('ESNetworkLookupModalCtrl', ESNetworkLookupModalController)\n\n .controller('ESPeerViewCtrl', ESPeerViewController)\n\n .controller('ESNetworkLookupPopoverCtrl', ESNetworkLookupPopoverController)\n\n .controller('ESPeerInfoPopoverCtrl', ESPeerInfoPopoverController)\n\n;\n\n\nfunction ESNetworkLookupController($scope, $state, $location, $ionicPopover, $window, $translate,\n esHttp, UIUtils, csConfig, csSettings, csCurrency, esNetwork, csWot) {\n 'ngInject';\n\n $scope.networkStarted = false;\n $scope.ionItemClass = '';\n $scope.expertMode = csSettings.data.expertMode && !UIUtils.screen.isSmall();\n $scope.isHttps = ($window.location.protocol === 'https:');\n $scope.search = {\n text: '',\n loading: true,\n online: true,\n results: [],\n endpointFilter: esHttp.constants.ES_USER_API,\n sort : undefined,\n asc: true\n };\n $scope.compactMode = true;\n $scope.listeners = [];\n $scope.helptipPrefix = 'helptip-network';\n $scope.enableLocationHref = true; // can be overrided by sub-controller (e.g. popup)\n\n $scope.removeListeners = function() {\n if ($scope.listeners.length) {\n console.debug(\"[ES] [network] Closing listeners\");\n _.forEach($scope.listeners, function(remove){\n remove();\n });\n $scope.listeners = [];\n }\n };\n\n /**\n * Enter in view\n */\n $scope.enter = function(e, state) {\n if ($scope.networkStarted) return;\n $scope.networkStarted = true;\n $scope.search.loading = true;\n csCurrency.get()\n .then(function (currency) {\n if (currency) {\n $scope.node = !esHttp.node.same(currency.node.host, currency.node.port) ?\n esHttp.instance(currency.node.host, currency.node.port) : esHttp;\n if (state && state.stateParams) {\n if (state.stateParams.online === 'true') {\n $scope.search.online = true;\n }\n if (state.stateParams.expert) {\n $scope.expertMode = (state.stateParams.expert == 'true');\n }\n }\n $scope.load();\n }\n })\n .catch(function(err) {\n UIUtils.onError('ERROR.GET_CURRENCY_FAILED')(err);\n $scope.networkStarted = false;\n });\n };\n $scope.$on('$ionicParentView.enter', $scope.enter);\n\n /**\n * Leave the view\n */\n $scope.leave = function() {\n if (!$scope.networkStarted) return;\n $scope.removeListeners();\n esNetwork.close();\n $scope.networkStarted = false;\n $scope.search.loading = true;\n };\n $scope.$on('$ionicView.beforeLeave', $scope.leave);\n $scope.$on('$ionicParentView.beforeLeave', $scope.leave);\n $scope.$on('$destroy', $scope.leave);\n\n\n $scope.computeOptions = function() {\n var options = {\n filter: {\n member: (!$scope.search.type || $scope.search.type === 'member'),\n mirror: (!$scope.search.type || $scope.search.type === 'mirror'),\n endpointFilter : (angular.isDefined($scope.search.endpointFilter) ? $scope.search.endpointFilter : null),\n online: $scope.search.online && true\n },\n sort: {\n type : $scope.search.sort,\n asc : $scope.search.asc\n },\n expertMode: $scope.expertMode,\n // larger timeout when on expert mode\n timeout: csConfig.timeout && ($scope.expertMode ? (csConfig.timeout / 10) : (csConfig.timeout / 100))\n };\n return options;\n };\n\n $scope.load = function() {\n\n if ($scope.search.loading){\n // Start network scan\n esNetwork.start($scope.node, $scope.computeOptions());\n\n // Catch event on new peers\n $scope.refreshing = false;\n $scope.listeners.push(\n esNetwork.api.data.on.changed($scope, function(data){\n if (!$scope.refreshing) {\n $scope.refreshing = true;\n csWot.extendAll(data.peers)\n .then(function() {\n // Avoid to refresh if view has been leaving\n if ($scope.networkStarted) {\n $scope.updateView(data);\n }\n $scope.refreshing = false;\n });\n }\n }));\n }\n };\n\n $scope.updateView = function(data) {\n console.debug(\"[peers] Updating UI\");\n $scope.$broadcast('$$rebind::rebind'); // force data binding\n $scope.search.results = data.peers;\n $scope.search.memberPeersCount = data.memberPeersCount;\n // Always tru if network not started (e.g. after leave+renter the view)\n $scope.search.loading = !$scope.networkStarted || esNetwork.isBusy();\n if (!$scope.loading) {\n $scope.$broadcast('$$rebind::rebind'); // force data binding\n }\n if ($scope.motion && $scope.search.results && $scope.search.results.length > 0) {\n $scope.motion.show({selector: '.item-peer'});\n }\n };\n\n $scope.refresh = function() {\n // Network\n $scope.search.loading = true;\n esNetwork.loadPeers();\n };\n\n $scope.sort = function() {\n $scope.search.loading = true;\n $scope.refreshing = true;\n esNetwork.sort($scope.computeOptions());\n $scope.updateView(esNetwork.data);\n };\n\n $scope.toggleOnline = function(online){\n $scope.hideActionsPopover();\n $scope.search.online = (online !== false);\n esNetwork.close();\n $scope.search.loading = true;\n $scope.load();\n\n // Update location href\n if ($scope.enableLocationHref) {\n $location.search($scope.search.online ? {} : {online: false}).replace();\n }\n };\n\n $scope.toggleSearchEndpoint = function(endpoint){\n $scope.hideActionsPopover();\n if ($scope.search.endpointFilter === endpoint || endpoint === null) {\n $scope.search.endpointFilter = null;\n }\n else {\n $scope.search.endpointFilter = endpoint;\n }\n $scope.sort();\n };\n\n $scope.toggleSort = function(sort){\n if ($scope.search.sort === sort && !$scope.search.asc) {\n $scope.search.asc = undefined;\n $scope.search.sort = undefined;\n }\n else {\n $scope.search.asc = ($scope.search.sort === sort) ? !$scope.search.asc : true;\n $scope.search.sort = sort;\n }\n $scope.sort();\n };\n\n $scope.selectPeer = function(peer) {\n if (peer.compacted && $scope.compactMode) {\n $scope.toggleCompactMode();\n return;\n }\n\n // Skip offline\n if (!peer.online ) return;\n\n var stateParams = {server: peer.getServer()};\n if (peer.isSsl()) {\n stateParams.ssl = true;\n }\n if (peer.isTor()) {\n stateParams.tor = true;\n }\n $state.go('app.view_es_peer', stateParams);\n };\n\n $scope.$on('csView.action.refresh', function(event, context) {\n if (context === 'peers') {\n $scope.refresh();\n }\n });\n\n $scope.$on('csView.action.showActionsPopover', function(event, clickEvent) {\n $scope.showActionsPopover(clickEvent);\n });\n\n /* -- popover -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'plugins/es/templates/network/lookup_popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n\n $scope.showEndpointsPopover = function($event, peer, endpointFilter) {\n $event.preventDefault();\n $event.stopPropagation();\n\n var endpoints = peer.getEndpoints(endpointFilter);\n endpoints = (endpoints||[]).reduce(function(res, ep) {\n var bma = esHttp.node.parseEndPoint(ep);\n return res.concat({\n label: 'NETWORK.VIEW.NODE_ADDRESS',\n value: peer.getServer() + (bma.path||'')\n });\n }, []);\n if (!endpoints.length) return;\n\n // Call extension points\n UIUtils.popover.show($event, {\n templateUrl: 'templates/network/popover_endpoints.html',\n bindings: {\n titleKey: 'NETWORK.VIEW.ENDPOINTS.' + endpointFilter,\n items: endpoints\n }\n });\n };\n\n $scope.showWs2pPopover = function($event, peer) {\n $event.stopPropagation();\n\n return $translate('NETWORK.VIEW.PRIVATE_ACCESS')\n .then(function(privateAccessMessage) {\n UIUtils.popover.show($event, {\n templateUrl: 'templates/network/popover_endpoints.html',\n bindings: {\n titleKey: 'NETWORK.VIEW.ENDPOINTS.WS2P',\n valueKey: 'NETWORK.VIEW.NODE_ADDRESS',\n items: [\n {\n label: 'NETWORK.VIEW.NODE_ADDRESS',\n value: !peer.bma.private ? (peer.getServer() + (peer.bma.path||'')) : privateAccessMessage\n },\n {\n label: 'NETWORK.VIEW.WS2PID',\n value: peer.bma.ws2pid\n },\n {\n label: 'NETWORK.VIEW.POW_PREFIX',\n value: peer.powPrefix\n }]\n }\n });\n });\n };\n}\n\n\nfunction ESNetworkLookupModalController($scope, $controller, parameters) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESNetworkLookupCtrl', {$scope: $scope}));\n\n // Read parameters\n parameters = parameters || {};\n $scope.enableFilter = angular.isDefined(parameters.enableFilter) ? parameters.enableFilter : true;\n $scope.search.type = angular.isDefined(parameters.type) ? parameters.type : $scope.search.type;\n $scope.search.endpointFilter = angular.isDefined(parameters.endpointFilter) ? parameters.endpointFilter : $scope.search.endpointFilter;\n $scope.expertMode = angular.isDefined(parameters.expertMode) ? parameters.expertMode : $scope.expertMode;\n $scope.ionItemClass = parameters.ionItemClass || 'item-border-large';\n $scope.enableLocationHref = false;\n $scope.helptipPrefix = '';\n\n $scope.selectPeer = function(peer) {\n $scope.closeModal(peer);\n };\n\n $scope.$on('modal.hidden', function(){\n $scope.leave();\n });\n\n // Disable this unsed method - called by load()\n $scope.showHelpTip = function() {};\n\n // Enter the modal\n $scope.enter();\n}\n\n\nfunction ESNetworkLookupPopoverController($scope, $controller) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('NetworkLookupCtrl', {$scope: $scope}));\n\n // Read parameters\n var parameters = parameters || {};\n $scope.enableFilter = angular.isDefined(parameters.enableFilter) ? parameters.enableFilter : true;\n $scope.search.type = angular.isDefined(parameters.type) ? parameters.type : $scope.search.type;\n $scope.search.endpointFilter = angular.isDefined(parameters.endpointFilter) ? parameters.endpointFilter : $scope.search.endpointFilter;\n $scope.expertMode = angular.isDefined(parameters.expertMode) ? parameters.expertMode : $scope.expertMode;\n $scope.ionItemClass = parameters.ionItemClass || 'item-border-large';\n $scope.helptipPrefix = '';\n\n $scope.selectPeer = function(peer) {\n $scope.closePopover(peer);\n };\n\n $scope.$on('popover.hidden', function(){\n $scope.leave();\n });\n\n // Disable this unsed method - called by load()\n $scope.showHelpTip = function() {};\n\n // Enter the popover\n $scope.enter();\n}\n\nfunction ESPeerInfoPopoverController($scope, $q, csSettings, csCurrency, csHttp, esHttp) {\n 'ngInject';\n\n $scope.loading = true;\n $scope.formData = {};\n\n $scope.load = function() {\n\n $scope.loading = true;\n $scope.formData = {};\n\n return $q.all([\n // get current block\n esHttp.blockchain.current()\n .then(function(block) {\n $scope.formData.number = block.number;\n $scope.formData.medianTime = block.medianTime;\n $scope.formData.powMin = block.powMin;\n $scope.formData.useSsl = esHttp.useSsl;\n })\n .catch(function() {\n delete $scope.formData.number;\n delete $scope.formData.medianTime;\n delete $scope.formData.powMin;\n delete $scope.formData.useSsl;\n // continue\n }),\n\n // Get node current version\n esHttp.node.summary()\n .then(function(res){\n $scope.formData.version = res && res.duniter && res.duniter.version;\n $scope.formData.software = res && res.duniter && res.duniter.software;\n })\n .catch(function() {\n delete $scope.formData.version;\n delete $scope.formData.software;\n // continue\n }),\n\n // Get latest version\n esHttp.version.latest()\n .then(function(latestRelease){\n $scope.formData.latestRelease = latestRelease;\n })\n .catch(function() {\n delete $scope.formData.latestRelease;\n // continue\n })\n ])\n .then(function() {\n // Compare, to check if newer\n if ($scope.formData.latestRelease && $scope.formData.software === 'cesium-plus-pod') {\n var compare = csHttp.version.compare($scope.formData.version, $scope.formData.latestRelease.version);\n $scope.formData.isPreRelease = compare > 0;\n $scope.formData.hasNewRelease = compare < 0;\n }\n else {\n $scope.formData.isPreRelease = false;\n $scope.formData.hasNewRelease = false;\n }\n $scope.loading = false;\n $scope.$broadcast('$$rebind::rebind'); // force data binding\n });\n };\n\n // Update UI on new block\n csCurrency.api.data.on.newBlock($scope, function(block) {\n if ($scope.loading) return;\n console.debug(\"[peer info] Received new block. Reload content\");\n $scope.load();\n });\n\n // Update UI on settings changed\n csSettings.api.data.on.changed($scope, function(data) {\n if ($scope.loading) return;\n console.debug(\"[peer info] Peer settings changed. Reload content\");\n $scope.load();\n });\n\n // Load data when enter\n $scope.load();\n}\n\nfunction ESPeerViewController($scope, $q, $window, $state, UIUtils, csWot, esHttp, csHttp, csSettings) {\n 'ngInject';\n\n $scope.node = {};\n $scope.loading = true;\n $scope.isHttps = ($window.location.protocol === 'https:');\n $scope.isReachable = true;\n $scope.options = {\n document: {\n index : csSettings.data.plugins.es && csSettings.data.plugins.es.document && csSettings.data.plugins.es.document.index || 'user',\n type: csSettings.data.plugins.es && csSettings.data.plugins.es.document && csSettings.data.plugins.es.document.type || 'profile'\n }\n };\n\n $scope.$on('$ionicView.beforeEnter', function (event, viewData) {\n // Enable back button (workaround need for navigation outside tabs - https://stackoverflow.com/a/35064602)\n viewData.enableBack = UIUtils.screen.isSmall() ? true : viewData.enableBack;\n });\n\n $scope.$on('$ionicView.enter', function(e, state) {\n var isDefaultNode = !state.stateParams || !state.stateParams.server;\n var server = state.stateParams && state.stateParams.server || esHttp.server;\n var useSsl = state.stateParams && state.stateParams.ssl == \"true\" || (isDefaultNode ? esHttp.useSsl : false);\n var useTor = state.stateParams.tor == \"true\" || (isDefaultNode ? esHttp.useTor : false);\n\n return $scope.load(server, useSsl, useTor)\n .then(function() {\n return $scope.$broadcast('$csExtension.enter', e, state);\n })\n .then(function(){\n $scope.loading = false;\n })\n .catch(function() {\n $scope.loading = false;\n });\n });\n\n $scope.load = function(server, useSsl, useTor) {\n var node = {\n server: server,\n host: server,\n useSsl: useSsl,\n useTor: useTor\n };\n var serverParts = server.split(':');\n if (serverParts.length === 2) {\n node.host = serverParts[0];\n node.port = serverParts[1];\n }\n node.url = csHttp.getUrl(node.host, node.port, undefined/*path*/, node.useSsl);\n\n angular.merge($scope.node,\n useTor ?\n // For TOR, use a web2tor to access the endpoint\n esHttp.lightInstance(node.host + \".to\", 443, 443, true/*ssl*/, 60000 /*long timeout*/) :\n esHttp.lightInstance(node.host, node.port, node.useSsl),\n node);\n\n $scope.isReachable = !$scope.isHttps || useSsl;\n if (!$scope.isReachable) {\n // Get node from the default node\n return esHttp.network.peers()\n .then(function(res) {\n // find the current peer\n var peers = (res && res.peers || []).reduce(function(res, json) {\n var peer = new EsPeer(json);\n if (!peer.hasEsEndpoint()) return res;\n var ep = esHttp.node.parseEndPoint(peer.getEsEndpoints()[0]);\n if((ep.dns == node.host || ep.ipv4 == node.host || ep.ipv6 == node.host) && (\n ep.port == node.port)) {\n peer.ep = ep;\n return res.concat(peer);\n }\n return res;\n }, []);\n var peer = peers.length && peers[0];\n\n // Current node found\n if (peer) {\n $scope.node.pubkey = peer.pubkey;\n $scope.node.currency = peer.currency;\n return csWot.extend($scope.node);\n }\n else {\n console.warn('Could not get peer from /network/peers');\n }\n });\n }\n\n return $q.all([\n\n // Get node peer info\n $scope.node.network.peering.self()\n .then(function(json) {\n $scope.node.pubkey = json.pubkey;\n $scope.node.currency = json.currency;\n }),\n\n // Get node doc count\n $scope.node.record.count($scope.options.document.index, $scope.options.document.type)\n .then(function(count) {\n $scope.node.docCount = count;\n }),\n\n // Get known peers\n $scope.node.network.peers()\n .then(function(json) {\n var peers = json.peers.reduce(function (res, p) {\n var peer = new EsPeer(p);\n if (!peer.hasEsEndpoint()) return res;\n peer.online = p.status === 'UP';\n peer.blockNumber = peer.block.replace(/-.+$/, '');\n peer.ep = esHttp.node.parseEndPoint(peer.getEsEndpoints()[0]);\n peer.dns = peer.getDns();\n peer.id = peer.keyID();\n peer.server = peer.getServer();\n return res.concat(peer);\n }, []);\n\n // Extend (add uid+name+avatar)\n return csWot.extendAll([$scope.node].concat(peers))\n .then(function() {\n // Final sort\n $scope.peers = _.sortBy(peers, function(p) {\n var score = 1;\n score += 10000 * (p.online ? 1 : 0);\n score += 1000 * (p.hasMainConsensusBlock ? 1 : 0);\n score += 100 * (p.name ? 1 : 0);\n return -score;\n });\n $scope.motion.show({selector: '.item-peer'});\n });\n }),\n\n // Get current block\n $scope.node.blockchain.current()\n .then(function(json) {\n $scope.current = json;\n })\n ])\n .catch(UIUtils.onError(useTor ? \"PEER.VIEW.ERROR.LOADING_TOR_NODE_ERROR\" : \"PEER.VIEW.ERROR.LOADING_NODE_ERROR\"));\n };\n\n $scope.selectPeer = function(peer) {\n // Skip offline\n if (!peer.online ) return;\n\n var stateParams = {server: peer.getServer()};\n if (peer.isSsl()) {\n stateParams.ssl = true;\n }\n if (peer.isTor()) {\n stateParams.tor = true;\n }\n $state.go('app.view_es_peer', stateParams);\n };\n\n /* -- manage link to raw document -- */\n\n $scope.openRawPeering = function(event) {\n return $scope.openLink(event, $scope.node.url + '/network/peering?pretty');\n };\n\n $scope.openRawCurrentBlock = function(event) {\n return $scope.openLink(event, $scope.node.url + '/network/peering?pretty');\n };\n}\n","\nESGroupListController.$inject = ['$scope', 'UIUtils', '$state', 'csWallet', 'esGroup', 'ModalUtils'];\nESGroupViewController.$inject = ['$scope', '$state', '$ionicPopover', '$ionicHistory', '$translate', 'UIUtils', 'csConfig', 'esGroup', 'csWallet'];\nESGroupEditController.$inject = ['$scope', 'esGroup', 'UIUtils', '$state', '$q', 'Device', '$ionicHistory', 'ModalUtils', '$focus', 'esHttp'];angular.module('cesium.es.group.controllers', ['cesium.es.services'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n\n .state('app.groups', {\n url: \"/group?type&location\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/group/lookup.html\",\n controller: 'ESGroupListCtrl'\n }\n }\n })\n\n .state('app.add_group', {\n url: \"/group/add/:type\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/group/edit_group.html\",\n controller: 'ESGroupEditCtrl'\n }\n }\n })\n\n .state('app.edit_group', {\n url: \"/group/edit/:id\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/group/edit_group.html\",\n controller: 'ESGroupEditCtrl'\n }\n }\n })\n\n\n .state('app.view_group', {\n url: \"/group/view/:id\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/group/view_record.html\",\n controller: 'ESGroupViewCtrl'\n }\n }\n })\n\n ;\n }])\n\n .controller('ESGroupListCtrl', ESGroupListController)\n\n .controller('ESGroupViewCtrl', ESGroupViewController)\n\n .controller('ESGroupEditCtrl', ESGroupEditController)\n\n;\n\nfunction ESGroupListController($scope, UIUtils, $state, csWallet, esGroup, ModalUtils) {\n 'ngInject';\n\n var defaultSearchLimit = 40;\n\n $scope.search = {\n loading : true,\n results: null,\n type: 'last',\n hasMore : false,\n loadingMore : false,\n limit: defaultSearchLimit\n };\n $scope.enableFilter = !UIUtils.screen.isSmall();\n $scope.ionItemClass = 'item-border-large';\n\n $scope.$on('$ionicView.enter', function() {\n if ($scope.search.loading) {\n $scope.doSearch();\n }\n });\n\n $scope.doSearchText = function() {\n var text = $scope.search.text && $scope.search.text.trim();\n if (!text || !text.length) {\n return $scope.doSearchLast();\n }\n $scope.search.type='text';\n return $scope.doSearch();\n };\n\n $scope.doSearchLast = function() {\n $scope.search.type = 'last';\n return $scope.doSearch();\n };\n\n $scope.doSearch = function(from, size) {\n var options = {};\n options.from = from || 0;\n options.size = size || defaultSearchLimit;\n\n options.text = $scope.search.type == 'text' && $scope.search.text && $scope.search.text.trim();\n\n $scope.search.loading = true;\n return esGroup.record.search(options)\n .then(function(res) {\n if (!from) {\n $scope.search.results = res || [];\n }\n else if (res){\n $scope.search.results = $scope.search.results.concat(res);\n }\n $scope.search.loading = false;\n $scope.search.hasMore = $scope.search.results.length >= $scope.search.limit;\n $scope.updateView();\n })\n .catch(function(err) {\n $scope.search.loading = false;\n if (!from) {\n $scope.search.results = [];\n }\n $scope.search.hasMore = false;\n UIUtils.onError('GROUP.ERROR.SEARCH_GROUPS_FAILED')(err);\n });\n };\n\n $scope.updateView = function() {\n\n $scope.$broadcast('$$rebind::rebind'); // notify binder\n $scope.motion.show({selector: '.list.{0} .item'.format($scope.motion.ionListClass)});\n };\n\n $scope.select = function(item) {\n if (item && item.id) $state.go('app.view_group', {id: item.id});\n };\n\n $scope.showMore = function() {\n $scope.search.limit = $scope.search.limit || defaultSearchLimit;\n $scope.search.limit += defaultSearchLimit;\n if ($scope.search.limit < defaultSearchLimit) {\n $scope.search.limit = defaultSearchLimit;\n }\n $scope.search.loadingMore = true;\n $scope.load(\n $scope.search.results.length, // from\n $scope.search.limit)\n .then(function() {\n $scope.search.loadingMore = false;\n $scope.$broadcast('scroll.infiniteScrollComplete');\n });\n };\n\n $scope.resetData = function() {\n if ($scope.search.loading) return;\n console.debug(\"[ES] [group] Resetting data (settings or account may have changed)\");\n $scope.search.hasMore = false;\n $scope.search.results = [];\n $scope.search.loading = true;\n delete $scope.search.limit;\n };\n // When logout: force reload\n csWallet.api.data.on.logout($scope, $scope.resetData);\n\n /* -- modals and views -- */\n\n $scope.showNewRecordModal = function() {\n $scope.loadWallet({minData: true})\n .then(function(walletData) {\n UIUtils.loading.hide();\n $scope.walletData = walletData;\n ModalUtils.show('plugins/es/templates/group/modal_record_type.html')\n .then(function(type){\n if (type) {\n $state.go('app.add_group', {type: type});\n }\n });\n });\n };\n}\n\n\nfunction ESGroupViewController($scope, $state, $ionicPopover, $ionicHistory, $translate,\n UIUtils, csConfig, esGroup, csWallet) {\n 'ngInject';\n\n $scope.formData = {};\n $scope.id = null;\n $scope.pictures = [];\n $scope.canEdit = false;\n $scope.loading = true;\n $scope.motion = UIUtils.motion.fadeSlideIn;\n\n $scope.$on('$ionicView.enter', function(e, state) {\n if (state.stateParams && state.stateParams.id) { // Load by id\n if ($scope.loading || state.stateParams.refresh) { // prevent reload if same id (if not forced)\n $scope.load(state.stateParams.id, state.stateParams.anchor);\n }\n UIUtils.loading.hide();\n $scope.$broadcast('$recordView.enter', state);\n }\n else {\n $state.go('app.groups');\n }\n });\n\n $scope.load = function(id) {\n esGroup.record.load(id, {\n fetchPictures: true\n })\n .then(function (data) {\n $scope.id = data.id;\n $scope.formData = data.record;\n $scope.issuer= data.issuer;\n $scope.canEdit = csWallet.isUserPubkey($scope.formData.issuer) || csWallet.children.hasPubkey($scope.formData.issuer);\n\n $scope.pictures = data.record.pictures || [];\n delete data.record.pictures; // remove, as already stored in $scope.pictures\n\n // Load other data (from child controller)\n $scope.$broadcast('$recordView.load', id, esGroup.record.comment);\n\n $scope.loading = false;\n UIUtils.loading.hide();\n $scope.updateView();\n\n })\n .catch(UIUtils.onError('GROUP.ERROR.LOAD_RECORD_FAILED'));\n };\n\n $scope.updateView = function() {\n $scope.motion.show();\n };\n\n // Edit click\n $scope.edit = function() {\n UIUtils.loading.show();\n $state.go('app.edit_group', {id: $scope.id});\n };\n\n $scope.delete = function() {\n $scope.hideActionsPopover();\n\n // translate\n var translations;\n $translate(['GROUP.VIEW.REMOVE_CONFIRMATION', 'GROUP.INFO.RECORD_REMOVED'])\n .then(function(res) {\n translations = res;\n return UIUtils.alert.confirm(res['GROUP.VIEW.REMOVE_CONFIRMATION']);\n })\n .then(function(confirm) {\n if (confirm) {\n esGroup.record.remove($scope.id)\n .then(function () {\n $ionicHistory.nextViewOptions({\n historyRoot: true\n });\n $state.go('app.groups');\n UIUtils.toast.show(translations['GROUP.INFO.RECORD_REMOVED']);\n })\n .catch(UIUtils.onError('GROUP.ERROR.REMOVE_RECORD_FAILED'));\n }\n });\n };\n\n /* -- modals & popover -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'plugins/es/templates/group/view_popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n\n $scope.showSharePopover = function(event) {\n $scope.hideActionsPopover();\n\n var title = $scope.formData.title;\n // Use shareBasePath (fix #530) or rootPath (fix #390)\n var url = (csConfig.shareBaseUrl || $rootScope.rootPath) + $state.href('app.view_group', {id: $scope.id});\n // Override default position, is small screen - fix #545\n if (UIUtils.screen.isSmall()) {\n event = angular.element(document.querySelector('#group-share-anchor-'+$scope.id)) || event;\n }\n UIUtils.popover.share(event, {\n bindings: {\n url: url,\n titleKey: 'GROUP.VIEW.POPOVER_SHARE_TITLE',\n titleValues: {title: title},\n time: $scope.formData.time,\n postMessage: title\n }\n });\n };\n}\n\nfunction ESGroupEditController($scope, esGroup, UIUtils, $state, $q, Device,\n $ionicHistory, ModalUtils, $focus, esHttp) {\n 'ngInject';\n\n $scope.walletData = {};\n $scope.formData = {};\n $scope.id = null;\n $scope.pictures = [];\n $scope.loading = true;\n\n $scope.setForm = function(form) {\n $scope.form = form;\n };\n\n $scope.$on('$ionicView.enter', function(e, state) {\n $scope.loadWallet({minData: true})\n .then(function(walletData) {\n $scope.walletData = walletData;\n if (state.stateParams && state.stateParams.id) { // Load by id\n $scope.load(state.stateParams.id);\n }\n else {\n if (state.stateParams && state.stateParams.type) {\n $scope.formData.type=state.stateParams.type;\n }\n $scope.loading = false;\n UIUtils.loading.hide();\n $scope.updateView();\n }\n // removeIf(device)\n $focus('group-record-title');\n // endRemoveIf(device)\n });\n });\n\n $scope.load = function(id) {\n esGroup.record.load(id, {\n fetchPictures: true,\n html: false\n })\n .then(function (data) {\n $scope.formData = data.record;\n $scope.issuer= data.issuer;\n $scope.id= data.id;\n\n $scope.pictures = data.record.pictures || [];\n delete data.record.pictures; // remove, as already stored in $scope.pictures\n\n $scope.loading = false;\n UIUtils.loading.hide();\n $scope.updateView();\n\n })\n .catch(UIUtils.onError('GROUP.ERROR.LOAD_RECORD_FAILED'));\n };\n\n $scope.updateView = function() {\n $scope.motion.show({selector: '.list.{0} .item, .card-gallery'.format($scope.motion.ionListClass)});\n };\n\n $scope.save = function() {\n $scope.form.$submitted=true;\n if($scope.saving || // avoid multiple save\n !$scope.form.$valid ||\n ($scope.formData.type !== 'managed' && $scope.formData.type !== 'open')) {\n return;\n }\n $scope.saving = true;\n return UIUtils.loading.show()\n\n .then(function(){\n var json = $scope.formData;\n json.time = moment().utc().unix();\n\n // Resize pictures\n json.picturesCount = $scope.pictures.length;\n if (json.picturesCount > 0) {\n json.pictures = $scope.pictures.reduce(function(res, pic) {\n return res.concat({file: esHttp.image.toAttachment(pic)});\n }, []);\n return UIUtils.image.resizeSrc($scope.pictures[0].src, true) // resize avatar\n .then(function(imageSrc) {\n json.avatar = esHttp.image.toAttachment({src: imageSrc});\n return json;\n });\n }\n else {\n if (json.avatar) {\n // FIXME: this is a workaround to allow content deletion\n // Is it a bug in the ES attachment-mapper ?\n json.avatar = {\n _content: '',\n _content_type: ''\n };\n }\n json.pictures = [];\n return json;\n }\n })\n .then(function(json){\n // Create\n if (!$scope.id) {\n json.creationTime = moment().utc().unix();\n return esGroup.record.add(json);\n }\n // Update\n return esGroup.record.update(json, {id: $scope.id});\n })\n\n .then(function(id) {\n $scope.id = $scope.id || id;\n $scope.saving = false;\n $ionicHistory.clearCache($ionicHistory.currentView().stateId); // clear current view\n $ionicHistory.nextViewOptions({historyRoot: true});\n return $state.go('app.view_group', {id: $scope.id, refresh: true});\n })\n\n .catch(function(err) {\n $scope.saving = false;\n UIUtils.onError('GROUP.ERROR.SAVE_RECORD_FAILED')(err);\n });\n };\n\n $scope.openPicturePopup = function() {\n Device.camera.getPicture()\n .then(function(imageData) {\n $scope.pictures.push({src: \"data:image/png;base64,\" + imageData});\n })\n .catch(UIUtils.onError('ERROR.TAKE_PICTURE_FAILED'));\n };\n\n $scope.fileChanged = function(event) {\n UIUtils.loading.show();\n return $q(function(resolve, reject) {\n var file = event.target.files[0];\n UIUtils.image.resizeFile(file)\n .then(function(imageData) {\n $scope.pictures.push({src: imageData});\n UIUtils.loading.hide();\n resolve();\n });\n });\n };\n\n $scope.removePicture = function(index){\n $scope.pictures.splice(index, 1);\n };\n\n $scope.favoritePicture = function(index){\n if (index > 0) {\n var item = $scope.pictures[index];\n $scope.pictures.splice(index, 1);\n $scope.pictures.splice(0, 0, item);\n }\n };\n\n $scope.cancel = function() {\n $ionicHistory.goBack();\n };\n\n /* -- modals -- */\n $scope.showRecordTypeModal = function() {\n ModalUtils.show('plugins/es/templates/group/modal_record_type.html')\n .then(function(type){\n if (type) {\n $scope.formData.type = type;\n }\n });\n };\n\n}\n","\nInvitationsController.$inject = ['$scope', '$q', '$ionicPopover', '$state', '$timeout', 'UIUtils', 'csWallet', 'esHttp', 'esModals', 'esNotification', 'esInvitation'];\nPopoverInvitationController.$inject = ['$scope', '$controller', 'csWallet'];\nNewInvitationModalController.$inject = ['$scope', '$q', 'Modals', 'UIUtils', 'csWallet', 'esHttp', 'esWallet', 'esInvitation', 'parameters'];angular.module('cesium.es.invitation.controllers', ['cesium.es.services'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n\n .state('app.view_invitations', {\n url: \"/invitations?id\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/invitation/view_invitations.html\",\n controller: 'InvitationsCtrl'\n }\n },\n data: {\n auth: true\n }\n })\n\n .state('app.view_invitations_by_id', {\n url: \"/wallets/:id/invitations\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/invitation/view_invitations.html\",\n controller: 'InvitationsCtrl'\n }\n },\n data: {\n login: true\n }\n })\n ;\n }])\n\n .controller('InvitationsCtrl', InvitationsController)\n\n .controller('PopoverInvitationCtrl', PopoverInvitationController)\n\n .controller('ESNewInvitationModalCtrl', NewInvitationModalController)\n;\n\nfunction InvitationsController($scope, $q, $ionicPopover, $state, $timeout, UIUtils, csWallet,\n esHttp, esModals, esNotification, esInvitation) {\n 'ngInject';\n\n var defaultSearchLimit = esInvitation.constants.DEFAULT_LOAD_SIZE;\n\n $scope.search = {\n loading : true,\n results: null,\n hasMore : false,\n loadingMore : false,\n limit: defaultSearchLimit,\n options: {\n codes: {\n includes: esNotification.constants.INVITATION_CODES\n }\n }\n };\n\n var wallet;\n\n $scope.setWallet = function(aWallet) {\n wallet = aWallet;\n };\n\n $scope.$on('$ionicView.enter', function(e, state) {\n if ($scope.search.loading) {\n wallet = (state.stateParams && state.stateParams.id) ? csWallet.children.get(state.stateParams.id) : csWallet;\n if (!wallet) {\n UIUtils.alert.error('ERROR.UNKNOWN_WALLET_ID');\n return $scope.showHome();\n }\n\n $scope.loadWallet({\n wallet: wallet,\n minData: true\n })\n .then(function() {\n\n $scope.addListeners();\n\n if (esHttp.isAlive()) {\n $scope.load();\n\n // Reset unread counter\n $scope.resetUnreadCount();\n\n $scope.showFab('fab-new-invitation');\n }\n });\n }\n });\n\n $scope.load = function(from, size) {\n var options = angular.copy($scope.search.options);\n options.from = options.from || from || 0;\n options.size = options.size || size || defaultSearchLimit;\n\n // Make sure wallet is init (need by PopoverInvitationCtrl)\n wallet = wallet || csWallet;\n\n return esInvitation.load(options, wallet.data.keypair)\n .then(function(invitations) {\n $scope.search.results = invitations;\n $scope.search.loading = false;\n $scope.search.hasMore = ($scope.search.results && $scope.search.results.length >= $scope.search.limit);\n $scope.updateView();\n UIUtils.loading.hide();\n })\n .catch(function(err) {\n if (err === 'CANCELLED') return $scope.cancel();\n $scope.search.loading = false;\n if (!from) {\n $scope.search.results = [];\n }\n $scope.search.hasMore = false;\n UIUtils.onError('INVITATION.ERROR.LOAD_INVITATIONS_FAILED')(err);\n });\n };\n\n $scope.cancel = function() {\n\n };\n\n $scope.updateView = function() {\n if ($scope.motion && $scope.search.results && $scope.search.results.length) {\n $scope.motion.show({selector: '.view-invitation .item'});\n }\n };\n $scope.$watchCollection('search.results', $scope.updateView);\n\n $scope.showMore = function() {\n $scope.search.limit = $scope.search.limit || defaultSearchLimit;\n $scope.search.limit = $scope.search.limit * 2;\n if ($scope.search.limit < defaultSearchLimit) {\n $scope.search.limit = defaultSearchLimit;\n }\n $scope.search.loadingMore = true;\n $scope.load(\n $scope.search.results.length, // from\n $scope.search.limit)\n .then(function() {\n $scope.search.loadingMore = false;\n $scope.$broadcast('scroll.infiniteScrollComplete');\n });\n };\n\n $scope.onNewInvitation = function(invitation) {\n if ($scope.search.loading || $scope.search.loadingMore) return;\n\n // Insert the new invitation (ONLY if not already done by service. May occur when using same array instance)\n if (!$scope.search.results[0] || $scope.search.results[0] !== invitation) {\n $scope.search.results.splice(0,0,invitation);\n }\n };\n\n $scope.resetData = function() {\n if ($scope.search.loading) return;\n console.debug(\"[ES] [invitation] Resetting data (settings or account may have changed)\");\n $scope.search.hasMore = false;\n $scope.search.results = [];\n $scope.search.loading = true;\n delete $scope.search.limit;\n };\n\n $scope.resetUnreadCount = function() {\n if ($scope.search.loading || !wallet.data.invitations) {\n return $timeout($scope.resetUnreadCount, 2000);\n }\n if (!wallet.data.invitations.unreadCount) return;\n console.debug('[ES] [invitation] Resetting unread count');\n wallet.data.invitations.unreadCount = 0;\n if (!$scope.search.results || !$scope.search.results.length) return;\n var lastNotification = $scope.search.results[0];\n var readTime = lastNotification.time ? lastNotification.time : 0;\n if (readTime && (!wallet.data.invitations.readTime || wallet.data.invitations.readTime != readTime)) {\n wallet.data.invitations.readTime = readTime;\n wallet.storeData();\n }\n };\n\n $scope.deleteAll = function(confirm) {\n $scope.hideActionsPopover();\n if (!$scope.search.results.length) return;\n\n if (!confirm) {\n return UIUtils.alert.confirm('INVITATION.CONFIRM.DELETE_ALL_CONFIRMATION')\n .then(function(confirm) {\n if (confirm) return $scope.deleteAll(confirm); // recursive call\n });\n }\n\n return $q.all([\n UIUtils.loading.show(),\n esInvitation.deleteAll(wallet.data.pubkey)\n ])\n .then(function() {\n $scope.search.results.splice(0, $scope.search.results.length); // update list\n return UIUtils.loading.hide();\n })\n .catch(UIUtils.onError('INVITATION.ERROR.REMOVE_ALL_INVITATIONS_FAILED'));\n };\n\n $scope.delete = function(index) {\n var invitation = $scope.search.results[index];\n if (!invitation) return;\n\n return esInvitation.delete(invitation)\n .then(function() {\n // Remove from list (ONLY if not already done by service. May occur when using same array instance)\n if ($scope.search.results[index] && $scope.search.results[index] === invitation) {\n $scope.search.results.splice(index,1);\n }\n })\n .catch(UIUtils.onError('INVITATION.ERROR.REMOVE_INVITATION_FAILED'));\n };\n\n $scope.accept = function(invitation) {\n $scope.hideActionsPopover(); // need when PopoverInvitationController\n\n if (invitation.state) {\n $state.go(invitation.state, invitation.stateParams || {});\n }\n };\n\n /* -- Modal -- */\n\n $scope.showNewInvitationModal = function() {\n $scope.hideActionsPopover();\n\n return $timeout(function() {\n return esModals.showNewInvitation({});\n }, 500); // Timeout need, to avoid freeze\n };\n\n /* -- Popover -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'plugins/es/templates/invitation/popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n\n\n // Listeners\n $scope.addListeners = function() {\n if (!wallet) throw \"Controller wallet not set !\";\n\n $scope.listeners = [\n esHttp.api.node.on.stop($scope, $scope.resetData),\n esHttp.api.node.on.start($scope, $scope.load),\n wallet.api.data.on.logout($scope, $scope.resetData)\n ];\n\n if (wallet.isDefault()) {\n // Subscribe to new invitation\n $scope.listeners.push(\n esInvitation.api.data.on.new($scope, $scope.onNewInvitation)\n );\n }\n };\n}\n\nfunction PopoverInvitationController($scope, $controller, csWallet) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('InvitationsCtrl', {$scope: $scope}));\n\n // Disable list effects\n $scope.motion = null;\n\n // Set the wallet to use\n $scope.setWallet(csWallet);\n\n $scope.$on('popover.shown', function() {\n if ($scope.search.loading) {\n $scope.addListeners();\n $scope.load();\n }\n });\n\n $scope.updateView = function() {\n // no animation\n };\n\n $scope.$on('popover.hidden', $scope.resetUnreadCount);\n\n $scope.hideActionsPopover = function() {\n $scope.closePopover();\n };\n\n $scope.cancel = function() {\n $scope.closePopover();\n };\n}\n\n\nfunction NewInvitationModalController($scope, $q, Modals, UIUtils, csWallet, esHttp, esWallet, esInvitation, parameters) {\n 'ngInject';\n\n // Controller var\n var wallet;\n\n // Scope var\n $scope.recipients = [];\n $scope.suggestions = [];\n $scope.formData = {\n useComment: false,\n walletId: null\n };\n $scope.enableSelectWallet = true;\n\n /* -- scope functions -- */\n\n $scope.setParameters = function(parameters) {\n if (!parameters) return;\n if (!parameters.wallet || parameters.wallet === \"default\") {\n $scope.formData.walletId = csWallet.id;\n }\n else {\n $scope.formData.walletId = parameters.wallet;\n }\n };\n // Read default parameters\n $scope.setParameters(parameters);\n\n $scope.load = function() {\n $scope.enableSelectWallet = csWallet.children.count() > 0;\n\n wallet = $scope.enableSelectWallet && ($scope.formData.walletId ? csWallet.children.get($scope.formData.walletId) : csWallet) || csWallet;\n $scope.formData.walletId = wallet.id; // update the walletId (could have changed)\n if (!wallet.isDefault()) {\n console.debug(\"[transfer] Using {\" + wallet.id + \"} wallet\");\n }\n\n // Make to sure to load full wallet data (balance)\n return wallet.login({sources: true, silent: true})\n .then(function(data) {\n $scope.walletData = data;\n UIUtils.ink({selector: '.modal-invitation .ink'});\n\n if (!$scope.destPub || $scope.destUid) {\n $scope.loading = false;\n }\n else {\n // Fill the uid from the pubkey\n return csWot.extend({pubkey: $scope.destPub})\n .then(function(res) {\n $scope.destUid = res && (res.name || res.uid);\n if ($scope.destUid) {\n $scope.destPub = '';\n }\n $scope.loading = false;\n });\n }\n })\n .catch(function(err){\n if (err === 'CANCELLED') return $scope.cancel(); // close the modal\n UIUtils.onError('ERROR.LOGIN_FAILED')(err);\n });\n };\n $scope.$on('modal.shown', $scope.load);\n\n // When changing use comment\n $scope.onUseCommentChanged = function() {\n if (!$scope.formData.useComment) {\n $scope.formData.comment = null; // reset comment only when disable\n }\n };\n $scope.$watch('formData.useComment', $scope.onUseCommentChanged, true);\n\n\n $scope.removeRecipient= function(index, e) {\n $scope.recipients.splice(index, 1);\n e.preventDefault();\n };\n\n $scope.removeSuggestion = function(index, e) {\n $scope.suggestions.splice(index, 1);\n e.preventDefault();\n };\n\n $scope.cancel = function() {\n $scope.closeModal();\n };\n\n $scope.doSend = function() {\n $scope.form.$submitted=true;\n if(!$scope.form.$valid || !$scope.recipients.length || !$scope.suggestions.length) {\n return;\n }\n\n if (!wallet.isLogin()) return $scope.closeModal(); // should never happen\n\n // Make sure user is still authenticated\n return wallet.auth({silent: true})\n .then(function() {\n return $q.all([\n // Get keypair only once (if not done here, esInvitation.send() with compute it many times)\n esWallet.box.getKeypair(wallet.data.keypair),\n // Ask confirmation\n UIUtils.alert.confirm('INVITATION.CONFIRM.SEND_INVITATIONS_TO_CERTIFY', undefined, {okText: 'COMMON.BTN_SEND'})\n ]);\n })\n .then(function(res) {\n var keypair = res && res[0];\n var confirm = res && res[1];\n if (!keypair || !confirm) return;\n UIUtils.loading.show();\n var time = moment().utc().unix(); // use same date for each invitation\n var comment = $scope.formData.useComment && $scope.formData.comment && $scope.formData.comment.trim();\n return $q.all(\n $scope.recipients.reduce(function (res, recipient) {\n return res.concat($scope.suggestions.reduce(function (res, identity) {\n if (!identity.uid || !identity.pubkey) {\n console.error('Unable to send suggestion for this identity (no uid or pubkey)', identity);\n return res;\n }\n var invitation = {\n issuer: wallet.data.pubkey,\n recipient: recipient.pubkey,\n time: time,\n content: [identity.uid, identity.pubkey].join('-'),\n comment: comment\n };\n return res.concat(\n esInvitation.send(invitation, {\n wallet: wallet,\n type: 'certification'\n }));\n }, []));\n }, []))\n .then(function() {\n $scope.closeModal();\n return UIUtils.loading.hide();\n })\n .then(function() {\n UIUtils.toast.show('INVITATION.INFO.INVITATION_SENT');\n })\n .catch(UIUtils.onError('INVITATION.ERROR.SUGGEST_CERTIFICATIONS_FAILED'));\n });\n };\n\n /* -- Modals -- */\n\n $scope.showSelectRecipientModal = function(e) {\n if (e.isDefaultPrevented()) return;\n\n return Modals.showWotLookup({\n allowMultiple: true,\n enableFilter: true,\n title: 'INVITATION.NEW.RECIPIENTS_MODAL_TITLE',\n help: 'INVITATION.NEW.RECIPIENTS_MODAL_HELP',\n okText: 'COMMON.BTN_OK',\n okType: 'button-positive',\n selection: angular.copy($scope.recipients)\n })\n .then(function(res) {\n if (!res) return; // user cancel\n $scope.recipients = res;\n });\n\n };\n\n $scope.showSelectSuggestionModal = function(e) {\n if (e.isDefaultPrevented()) return;\n\n return Modals.showWotLookup({\n allowMultiple: true,\n enableFilter: true,\n title: 'INVITATION.NEW.SUGGESTION_IDENTITIES_MODAL_TITLE',\n help: 'INVITATION.NEW.SUGGESTION_IDENTITIES_MODAL_HELP',\n okText: 'COMMON.BTN_OK',\n okType: 'button-positive',\n selection: angular.copy($scope.suggestions)\n })\n .then(function(res) {\n if (!res) return; // user cancel\n $scope.suggestions = res;\n });\n };\n\n\n $scope.showSelectWalletModal = function() {\n if (!$scope.enableSelectWallet) return;\n\n return Modals.showSelectWallet()\n .then(function(wallet) {\n if (!wallet || $scope.formData.walletId === wallet.id) return;\n console.debug(\"[transfer] Using {\" + wallet.id + \"} wallet\");\n $scope.wallet = wallet;\n $scope.walletData = wallet.data;\n $scope.formData.walletId = wallet.id;\n $scope.onAmountChanged();\n });\n };\n}\n\n","\nViewSubscriptionsController.$inject = ['$scope', '$q', '$ionicHistory', 'csWot', 'csWallet', 'UIUtils', 'ModalUtils', 'esSubscription'];\nModalEmailSubscriptionsController.$inject = ['$scope', 'Modals', 'csSettings', 'esHttp', 'csWot', 'esModals', 'parameters'];angular.module('cesium.es.subscription.controllers', ['cesium.es.services'])\n\n .config(['$stateProvider', function($stateProvider) {\n\n $stateProvider\n .state('app.edit_subscriptions', {\n cache: false,\n url: \"/wallet/subscriptions\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/subscription/edit_subscriptions.html\",\n controller: 'ViewSubscriptionsCtrl'\n }\n },\n data: {\n auth: true,\n minData: true\n }\n })\n\n .state('app.edit_subscriptions_by_id', {\n cache: false,\n url: \"/wallets/:id/subscriptions\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/subscription/edit_subscriptions.html\",\n controller: 'ViewSubscriptionsCtrl'\n }\n },\n data: {\n login: true,\n minData: true\n }\n });\n\n }])\n\n .controller('ViewSubscriptionsCtrl', ViewSubscriptionsController)\n\n .controller('ModalEmailSubscriptionsCtrl', ModalEmailSubscriptionsController)\n\n;\n\nfunction ViewSubscriptionsController($scope, $q, $ionicHistory, csWot, csWallet, UIUtils, ModalUtils, esSubscription) {\n 'ngInject';\n\n $scope.loading = true;\n $scope.popupData = {}; // need for the node popup\n $scope.search = {\n results: [],\n loading: true\n };\n $scope.emailFrequencies = [\n {id: \"daily\", label: \"daily\"},\n {id: \"weekly\", label: \"weekly\"}\n ];\n\n var wallet;\n\n $scope.enter = function(e, state) {\n\n // First load\n if ($scope.loading) {\n\n wallet = (state.stateParams && state.stateParams.id) ? csWallet.children.get(state.stateParams.id) : csWallet;\n if (!wallet) {\n UIUtils.alert.error('ERROR.UNKNOWN_WALLET_ID');\n return $scope.showHome();\n }\n\n wallet.auth({minData: true})\n .then(function() {\n UIUtils.loading.hide();\n return $scope.load();\n })\n .then(function() {\n $scope.showFab('fab-add-subscription-record');\n })\n .catch(function(err){\n if (err === 'CANCELLED') {\n UIUtils.loading.hide(10);\n $scope.loading=true; // reset for force reload next time\n $ionicHistory.goBack();\n return;\n }\n UIUtils.onError('SUBSCRIPTION.ERROR.LOAD_SUBSCRIPTIONS_FAILED')(err);\n });\n }\n\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.load = function() {\n $scope.loading = true; // to avoid the call of doSave()\n return esSubscription.record.load(wallet.data.pubkey, wallet.data.keypair)\n .then(function(results) {\n // Group by type\n var groups = _.groupBy((results || []), function (record) {\n return [record.type, record.recipient].join('|');\n });\n return _.keys(groups).reduce(function (res, key) {\n var parts = key.split('|');\n return res.concat({\n type: parts[0],\n recipient: parts[1],\n items: groups[key]\n });\n }, []);\n })\n .then(function(results) {\n return csWot.extendAll(results, 'recipient');\n })\n // Display result\n .then($scope.updateView)\n .catch(function(err){\n UIUtils.loading.hide(10);\n if (err && err.ucode == 404) {\n $scope.updateView([]);\n $scope.existing = false;\n }\n else {\n UIUtils.onError('PROFILE.ERROR.LOAD_PROFILE_FAILED')(err);\n }\n });\n };\n\n $scope.updateView = function(results) {\n if (results) {\n $scope.search.results = results;\n }\n\n if ($scope.search.results && $scope.search.results.length) {\n $scope.motion.show();\n }\n $scope.search.loading = false;\n };\n\n $scope.addSubscription = function() {\n var type;\n $scope.showCategoryModal()\n .then(function(cat) {\n if (!cat) return;\n type = cat.id;\n // get subscription parameters\n if (type === 'email') {\n return $scope.showEmailModal();\n }\n else {\n UIUtils.alert.notImplemented();\n }\n })\n .then(function(record) {\n if (!record) return;\n UIUtils.loading.show();\n esSubscription.record.add(record, {wallet: wallet})\n .then($scope.addToUI)\n .then(function() {\n wallet.data.subscriptions = wallet.data.subscriptions || {count: 0};\n wallet.data.subscriptions.count++;\n UIUtils.loading.hide();\n $scope.updateView();\n })\n .catch(UIUtils.onError('SUBSCRIPTION.ERROR.ADD_SUBSCRIPTION_FAILED'));\n });\n };\n\n $scope.editSubscription = function(record) {\n\n // get subscription parameters\n var promise;\n var oldRecord = angular.copy(record);\n if (record.type === 'email') {\n promise = $scope.showEmailModal(record);\n }\n if (!promise) return;\n return promise\n .then(function(res) {\n if (!res) return;\n UIUtils.loading.show();\n record.id = oldRecord.id;\n return esSubscription.record.update(record, wallet)\n .then(function() {\n // If recipient change, update in results\n if (oldRecord.type !== record.type ||\n oldRecord.recipient !== record.recipient) {\n $scope.removeFromUI(oldRecord);\n return $scope.addToUI(record);\n }\n })\n .then(function() {\n UIUtils.loading.hide();\n $scope.updateView();\n })\n .catch(UIUtils.onError('SUBSCRIPTION.ERROR.UPDATE_SUBSCRIPTION_FAILED'));\n });\n };\n\n $scope.deleteSubscription = function(record, confirm) {\n if (!record || !record.id) return;\n\n if (!confirm) {\n return UIUtils.alert.confirm('SUBSCRIPTION.CONFIRM.DELETE_SUBSCRIPTION')\n .then(function(confirm) {\n if (confirm) return $scope.deleteSubscription(record, confirm);\n });\n }\n\n UIUtils.loading.show();\n esSubscription.record.remove(record.id, {wallet: wallet})\n .then(function() {\n wallet.data.subscriptions = wallet.data.subscriptions || {count: 1};\n wallet.data.subscriptions.count--;\n $scope.removeFromUI(record);\n UIUtils.loading.hide();\n })\n .catch(UIUtils.onError('SUBSCRIPTION.ERROR.DELETE_SUBSCRIPTION_FAILED'));\n };\n\n $scope.removeFromUI = function(record) {\n var subscriptions = _.findWhere($scope.search.results, {type: record.type, recipient: record.recipient});\n var index = _.findIndex(subscriptions.items, record);\n if (index >= 0) {\n subscriptions.items.splice(index, 1);\n }\n if (!subscriptions.items.length) {\n index = _.findIndex($scope.search.results, subscriptions);\n $scope.search.results.splice(index, 1);\n }\n };\n\n $scope.addToUI = function(record) {\n $scope.search.results = $scope.search.results || [];\n var subscriptions = _.findWhere($scope.search.results,\n {type: record.type, recipient: record.recipient});\n\n if (!subscriptions) {\n subscriptions = {type: record.type, recipient: record.recipient, items: []};\n return csWot.extendAll([subscriptions], 'recipient')\n .then(function(){\n subscriptions.items.push(record);\n $scope.search.results.push(subscriptions);\n return record;\n });\n }\n\n subscriptions.items.push(record);\n return $q.when(record);\n };\n\n /* -- modals -- */\n\n $scope.showCategoryModal = function() {\n // load categories\n return esSubscription.category.all()\n .then(function(categories){\n return ModalUtils.show('plugins/es/templates/common/modal_category.html', 'ESCategoryModalCtrl as ctrl',\n {categories : categories},\n {focusFirstInput: true}\n );\n })\n .then(function(cat){\n if (cat && cat.parent) {\n return cat;\n }\n });\n };\n\n $scope.showEmailModal = function(parameters) {\n return ModalUtils.show('plugins/es/templates/subscription/modal_email.html','ModalEmailSubscriptionsCtrl',\n parameters, {focusFirstInput: true});\n };\n}\n\n\nfunction ModalEmailSubscriptionsController($scope, Modals, csSettings, esHttp, csWot, esModals, parameters) {\n 'ngInject';\n\n $scope.frequencies = [\n {id: \"daily\", label: \"daily\"},\n {id: \"weekly\", label: \"weekly\"}\n ];\n $scope.formData = parameters || {};\n $scope.formData.content = $scope.formData.content || {};\n $scope.formData.content.frequency = $scope.formData.content.frequency || $scope.frequencies[0].id; // set to first value\n $scope.recipient = {};\n\n $scope.$on('modal.shown', function() {\n // Load recipient (uid, name, avatar...)\n if ($scope.formData.recipient) {\n $scope.recipient = {pubkey: $scope.formData.recipient};\n return csWot.extendAll([$scope.recipient]);\n }\n else {\n return esHttp.network.peering.self()\n .then(function(res){\n if (!res) return;\n $scope.formData.recipient = res.pubkey;\n $scope.recipient = {pubkey: $scope.formData.recipient};\n return csWot.extendAll([$scope.recipient]);\n });\n }\n });\n\n // Submit\n $scope.doSubmit = function() {\n $scope.form.$submitted = true;\n if (!$scope.form.$valid || !$scope.formData.content.email || !$scope.formData.content.frequency) return;\n\n var record = {\n type: 'email',\n recipient: $scope.formData.recipient,\n content: {\n email: $scope.formData.content.email,\n locale: csSettings.data.locale.id,\n frequency: $scope.formData.content.frequency\n }\n };\n $scope.closeModal(record);\n };\n\n $scope.cancel = function() {\n $scope.closeModal();\n };\n\n if (!!$scope.subscriptionForm) {\n $scope.subscriptionForm.$setPristine();\n }\n\n $scope.showNetworkLookup = function() {\n return esModals.showNetworkLookup({\n enableFilter: true,\n endpointFilter: esHttp.constants.ES_SUBSCRIPTION_API\n })\n .then(function (peer) {\n if (peer) {\n $scope.recipient = peer;\n $scope.formData.recipient = peer.pubkey;\n }\n });\n\n };\n}\n","\nESDocumentLookupController.$inject = ['$scope', '$ionicPopover', '$location', '$timeout', 'csSettings', 'csWallet', 'UIUtils', 'esHttp', 'esDocument'];\nESLastDocumentsController.$inject = ['$scope', '$controller', '$timeout', '$state', '$filter'];angular.module('cesium.es.document.controllers', ['cesium.es.services'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n\n .state('app.document_search', {\n url: \"/data/search/:index/:type?q\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/document/lookup.html\",\n controller: 'ESDocumentLookupCtrl'\n }\n },\n data: {\n silentLocationChange: true\n }\n })\n ;\n }])\n\n .controller('ESDocumentLookupCtrl', ESDocumentLookupController)\n\n .controller('ESLastDocumentsCtrl', ESLastDocumentsController)\n;\n\nfunction ESDocumentLookupController($scope, $ionicPopover, $location, $timeout,\n csSettings, csWallet, UIUtils, esHttp, esDocument) {\n 'ngInject';\n\n $scope.search = $scope.search || {\n loading: true,\n hasMore: false,\n text: undefined,\n index: 'invitation',\n type: 'certification',\n results: [],\n sort: 'time',\n asc: false,\n loadingMore: false\n };\n $scope.entered = false;\n $scope.searchTextId = 'documentSearchText';\n $scope.ionItemClass = 'item-border-large';\n $scope.defaultSizeLimit = $scope.defaultSizeLimit || (UIUtils.screen.isSmall() ? 50 : 100);\n $scope.helptipPrefix = 'helptip-document';\n $scope.compactMode = angular.isDefined($scope.compactMode) ? $scope.compactMode : true;\n $scope._source = $scope._source || [\"issuer\", \"hash\", \"time\", \"creationTime\", \"title\", \"message\"];\n $scope.showHeaders = angular.isDefined($scope.showHeaders) ? $scope.showHeaders : true;\n\n /**\n * Enter into the view\n * @param e\n * @param state\n */\n $scope.enter = function(e, state) {\n if (!$scope.entered) {\n $scope.entered = true;\n $scope.search.index = state.stateParams && state.stateParams.index || $scope.search.index;\n $scope.search.type = state.stateParams && state.stateParams.type || $scope.search.type;\n $scope.search.text = state.stateParams && state.stateParams.q || $scope.search.text;\n $scope.search.last = !$scope.search.text;\n $scope.load();\n }\n $scope.expertMode = angular.isDefined($scope.expertMode) ? $scope.expertMode : !UIUtils.screen.isSmall() && csSettings.data.expertMode;\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.computeOptions = function(offset, size) {\n var options = {\n index: $scope.search.index,\n type: $scope.search.type,\n from: offset || 0,\n size: size || $scope.defaultSizeLimit\n };\n\n // add sort\n if ($scope.search.sort) {\n options.sort = {};\n options.sort[$scope.search.sort] = (!$scope.search.asc ? \"desc\" : \"asc\");\n }\n else { // default sort\n options.sort = {time:'desc'};\n }\n\n // Included fields\n options._source = options._source || $scope._source;\n\n return options;\n };\n\n $scope.load = function(offset, size, silent) {\n if ($scope.search.error) return;\n\n var options = $scope.computeOptions(offset, size);\n\n $scope.search.loading = !silent;\n\n var searchFn = $scope.search.last ?\n esDocument.search(options) :\n esDocument.searchText($scope.search.text||'', options);\n return searchFn\n .then(function(res) {\n if (!offset) {\n $scope.search.results = res.hits;\n $scope.search.took = res.took;\n }\n else {\n $scope.search.results = $scope.search.results.concat(res.hits);\n }\n $scope.search.total = res.total;\n\n UIUtils.loading.hide();\n $scope.search.loading = false;\n $scope.search.hasMore = res.hits && res.hits.length > 0 && res.total > $scope.search.results.length;\n\n $scope.updateView();\n })\n .catch(function(err) {\n $scope.search.results = [];\n $scope.search.loading = false;\n $scope.search.error = true;\n $scope.search.hasMore = false;\n UIUtils.onError('DOCUMENT.ERROR.LOAD_DOCUMENTS_FAILED')(err)\n .then(function() {\n $scope.search.error = false;\n });\n });\n };\n\n $scope.updateView = function() {\n if ($scope.motion && $scope.search.results && $scope.search.results.length) {\n $scope.motion.show({selector: '.list .item.item-document'});\n }\n $scope.$broadcast('$$rebind::rebind'); // notify binder\n };\n\n $scope.doSearchText = function() {\n $scope.search.last = $scope.search.text ? false : true;\n return $scope.load()\n .then(function() {\n // Update location href\n $location.search({q: $scope.search.text}).replace();\n });\n };\n\n $scope.doSearchLast = function() {\n $scope.search.last = true;\n $scope.search.text = undefined;\n return $scope.load();\n };\n\n $scope.removeAll = function() {\n $scope.hideActionsPopover();\n if (!$scope.search.results || !$scope.search.results.length) return;\n\n return UIUtils.alert.confirm('DOCUMENT.CONFIRM.REMOVE_ALL')\n .then(function(confirm) {\n if (!confirm) return;\n UIUtils.loading.show();\n return esDocument.removeAll($scope.search.results)\n .then(function() {\n $scope.search.loading = false;\n return $timeout(function() {\n UIUtils.toast.show('DOCUMENT.INFO.REMOVED'); // toast\n return $scope.load();\n }, 1000 /*waiting propagation*/);\n })\n .catch(UIUtils.onError('DOCUMENT.ERROR.REMOVE_ALL_FAILED'));\n });\n };\n\n $scope.remove = function($event, index) {\n var doc = $scope.search.results[index];\n if (!doc || $event.defaultPrevented) return;\n $event.stopPropagation();\n\n UIUtils.alert.confirm('DOCUMENT.CONFIRM.REMOVE')\n .then(function(confirm) {\n if (!confirm) return;\n return esDocument.remove(doc)\n .then(function () {\n $scope.search.results.splice(index,1); // remove from messages array\n $scope.$broadcast('$$rebind::rebind'); // notify binder\n UIUtils.toast.show('DOCUMENT.INFO.REMOVED'); // toast\n })\n .catch(UIUtils.onError('MESSAGE.ERROR.REMOVE_FAILED'));\n });\n };\n\n $scope.selectDocument = function(event, doc) {\n console.debug(\"Selected document: \", doc, esHttp);\n\n var url = esHttp.getUrl('/{0}/{1}/_search?pretty&q=_id:{2}'.format(doc.index, doc.type, doc.id));\n return $scope.openLink(event, url);\n };\n\n $scope.toggleCompactMode = function() {\n $scope.compactMode = !$scope.compactMode;\n $scope.updateView();\n\n // Workaround to re-initialized the <ion-infinite-loop>\n if (!$scope.search.hasMore && $scope.search.results.length && $scope.search.type == 'last') {\n $timeout(function() {\n $scope.search.hasMore = true;\n }, 500);\n }\n };\n\n $scope.toggleSort = function(sort){\n if ($scope.search.sort === sort && !$scope.search.asc) {\n $scope.search.asc = undefined;\n $scope.search.sort = undefined;\n }\n else {\n $scope.search.asc = ($scope.search.sort === sort) ? !$scope.search.asc : true;\n $scope.search.sort = sort;\n }\n $scope.load();\n };\n\n $scope.showMore = function() {\n if ($scope.search.loading) return;\n $scope.search.loadingMore = true;\n $scope.load(\n $scope.search.results.length, // from\n $scope.defaultSizeLimit,\n true/*silent*/)\n .then(function() {\n $scope.search.loadingMore = false;\n $scope.$broadcast('scroll.infiniteScrollComplete');\n });\n };\n\n $scope.startListenChanges = function() {\n var now = Date.now();\n var source = $scope.search.index + '/' + $scope.search.type;\n var wsChanges = esHttp.websocket.changes(source);\n return wsChanges.open()\n .then(function(){\n console.debug(\"[ES] [document] Websocket opened in {0} ms\".format(Date.now()- now));\n wsChanges.on(function(change) {\n if (!$scope.search.last || !change) return; // ignore\n esDocument.fromHit(change)\n .then(function(doc) {\n if (change._operation === 'DELETE') {\n $scope.onDeleteDocument(doc);\n }\n else {\n $scope.onNewDocument(doc);\n }\n });\n });\n });\n };\n\n $scope.onNewDocument = function(document) {\n if (!$scope.search.last || $scope.search.loading) return; // skip\n console.debug(\"[ES] [document] Detected new document: \", document);\n var index = _.findIndex($scope.search.results, {id: document.id, index: document.index, type: document.type});\n if (index < 0) {\n $scope.search.total++;\n $scope.search.results.splice(0, 0, document);\n }\n else {\n document.updated = true;\n $timeout(function() {\n document.updated = false;\n }, 2000);\n $scope.search.results.splice(index, 1, document);\n }\n $scope.updateView();\n };\n\n $scope.onDeleteDocument = function(document) {\n if (!$scope.search.last || $scope.search.loading) return; // skip\n $timeout(function() {\n var index = _.findIndex($scope.search.results, {id: document.id, index: document.index, type: document.type});\n if (index < 0) return; // skip if not found\n console.debug(\"[ES] [document] Detected document deletion: \", document);\n $scope.search.results.splice(index, 1);\n $scope.search.total--;\n $scope.updateView();\n }, 750);\n };\n\n /* -- Modals -- */\n\n /* -- Popover -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'plugins/es/templates/document/lookup_popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n\n /* -- watch events -- */\n\n $scope.resetData = function() {\n if ($scope.search.loading) return;\n console.debug(\"[ES] [document] Resetting data (settings or account may have changed)\");\n // Reset all data\n $scope.search.results = [];\n $scope.search.loading = false;\n $scope.search.total = undefined;\n $scope.search.loadingMore = false;\n $scope.entered = false;\n delete $scope.search.limit;\n };\n\n csWallet.api.data.on.unauth($scope, $scope.resetData);\n\n // for DEV only\n /*$timeout(function() {\n // launch default action fo DEV\n }, 900);\n */\n}\n\n\nfunction ESLastDocumentsController($scope, $controller, $timeout, $state, $filter) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESDocumentLookupCtrl', {$scope: $scope}));\n\n $scope.search = {\n loading: true,\n hasMore: true,\n text: undefined,\n index: 'user,page,group', type: 'profile,record,comment',\n results: undefined,\n sort: 'time',\n asc: false\n };\n $scope.expertMode = false;\n $scope.defaultSizeLimit = 20;\n $scope._source = [\"issuer\", \"hash\", \"time\", \"creationTime\", \"title\", \"avatar._content_type\", \"city\", \"message\", \"record\", \"type\"];\n $scope.showHeaders = false;\n\n $scope.$on('$ionicParentView.enter', $scope.enter);\n\n $scope.selectDocument = function(event, doc) {\n if (!doc || !event || event.defaultPrevented) return;\n event.stopPropagation();\n var anchor;\n if (doc.index === \"user\" && doc.type === \"profile\") {\n $state.go('app.wot_identity', {pubkey: doc.pubkey, uid: doc.name});\n }\n else if (doc.index === \"page\" && doc.type === \"record\") {\n $state.go('app.view_page', {title: doc.title, id: doc.id});\n }\n else if (doc.index === \"page\" && doc.type === \"comment\") {\n anchor = $filter('formatHash')(doc.id);\n $state.go('app.view_page_anchor', {title: doc.title, id: doc.record, anchor: anchor});\n }\n else if (doc.index === \"group\" && doc.type === \"record\") {\n $state.go('app.view_group', {title: doc.title, id: doc.id});\n }\n else if (doc.index === \"group\" && doc.type === \"comment\") {\n anchor = $filter('formatHash')(doc.id);\n $state.go('app.view_group_anchor', {title: doc.title, id: doc.record, anchor: anchor});\n }\n else {\n console.warn(\"Click on this kind of document not implement yet!\", doc);\n }\n };\n\n // Override parent function computeOptions\n var inheritedComputeOptions = $scope.computeOptions;\n $scope.computeOptions = function(offset, size){\n // Cal inherited function\n var options = inheritedComputeOptions(offset, size);\n\n if (!options.sort || options.sort.time) {\n var side = options.sort && options.sort.time || side;\n options.sort = [\n //{'creationTime': side},\n {'time': side}\n ];\n }\n\n options._source = options._source || $scope._source;\n options.getTimeFunction = function(doc) {\n doc.time = doc.creationTime || doc.time;\n return doc.time;\n };\n return options;\n };\n\n // Listen for changes\n $timeout(function() {\n $scope.startListenChanges();\n }, 1000);\n}\n","\nESLikesController.$inject = ['$scope', '$q', '$timeout', '$translate', '$ionicPopup', 'UIUtils', 'Modals', 'csWallet', 'esHttp', 'esLike'];angular.module('cesium.es.like.controllers', ['ngResource', 'cesium.es.services'])\n\n .controller('ESLikesCtrl', ESLikesController)\n;\n\nfunction ESLikesController($scope, $q, $timeout, $translate, $ionicPopup, UIUtils, Modals, csWallet, esHttp, esLike) {\n 'ngInject';\n\n $scope.entered = false;\n $scope.abuseData = {};\n $scope.abuseLevels = [\n {value: 1, label: 'LOW'},\n {value: 2, label: 'LOW'}\n ];\n $scope.staring = false;\n $scope.options = $scope.options || {};\n $scope.options.like = $scope.options.like || {\n kinds: esLike.constants.KINDS,\n index: undefined,\n type: undefined,\n id: undefined\n };\n\n $scope.$on('$recordView.enter', function(e, state) {\n // First enter\n if (!$scope.entered) {\n $scope.entered = false;\n // Nothing to do: main controller will trigger '$recordView.load' event\n }\n // second call (e.g. if cache)\n else if ($scope.id) {\n $scope.loadLikes($scope.id);\n }\n });\n\n $scope.$on('$recordView.load', function(event, id) {\n $scope.id = id || $scope.id;\n if ($scope.id) {\n $scope.loadLikes($scope.id);\n }\n });\n\n // Init Like service\n $scope.initLikes = function() {\n if (!$scope.likeData) {\n throw new Error(\"Missing 'likeData' in scope. Cannot load likes counter\");\n }\n if (!$scope.options.like.service) {\n if (!$scope.options.like.index || !$scope.options.like.type) {\n throw new Error(\"Missing 'options.like.index' or 'options.like.type' in scope. Cannot load likes counter\");\n }\n $scope.options.like.service = esLike.instance($scope.options.like.index, $scope.options.like.type);\n }\n if (!$scope.options.like.kinds) {\n // Get scope's kinds (e.g. defined in the parent scope)\n $scope.options.like.kinds = _.filter(esLike.constants.KINDS, function (kind) {\n var key = kind.toLowerCase() + 's';\n return angular.isDefined($scope.likeData[key]);\n });\n }\n };\n\n $scope.loadLikes = function(id) {\n if (!$scope.likeData || $scope.likeData.loading) return;// Skip\n\n id = id || $scope.likeData.id;\n $scope.initLikes();\n\n var kinds = $scope.options.like.kinds || [];\n if (!kinds.length) return; // skip\n\n $scope.likeData.loading = true;\n var now = Date.now();\n console.debug(\"[ES] Loading counter of {0}... ({1})\".format(id.substring(0,8), kinds));\n\n var issuers = csWallet.isLogin() ? csWallet.pubkeys() : undefined;\n\n return $q.all(_.map(kinds, function(kind) {\n var key = kind.toLowerCase() + 's';\n return $scope.options.like.service.count(id, {issuers: issuers, kind: kind})\n .then(function (res) {\n // Store result to scope\n if ($scope.likeData[key]) {\n angular.merge($scope.likeData[key], res);\n }\n });\n }))\n .then(function () {\n $scope.likeData.id = id;\n console.debug(\"[ES] Loading counter of {0} [OK] in {1}ms\".format(id.substring(0,8), Date.now()-now));\n\n if (_.contains(kinds, 'VIEW') && !$scope.canEdit) {\n $scope.markAsView();\n }\n\n // Publish to parent scope (to be able to use it in action popover's buttons)\n if ($scope.$parent) {\n console.debug(\"[ES] [likes] Adding data and functions to parent scope\");\n $scope.$parent.toggleLike = $scope.toggleLike;\n $scope.$parent.reportAbuse = $scope.reportAbuse;\n }\n\n $scope.likeData.loading = false;\n })\n .catch(function (err) {\n console.error(err && err.message || err);\n $scope.likeData.loading = false;\n });\n };\n\n $scope.toggleLike = function(event, options) {\n $scope.initLikes();\n if (!$scope.likeData.id) throw new Error(\"Missing 'likeData.id' in scope. Cannot apply toggle\");\n\n // Make sure to be auth before continue\n if (!csWallet.isLogin()) {\n return csWallet.auth({minData: true})\n .then(function(data){\n UIUtils.loading.hide();\n if (!data) throw new Error('CANCELLED');\n options.pubkey = options.pubkey || data.pubkey;\n return $scope.toggleLike(event, options); // loop\n });\n }\n\n options = options || {};\n options.kind = options.kind && options.kind.toUpperCase() || 'LIKE';\n var key = options.kind.toLowerCase() + 's';\n\n $scope.likeData[key] = $scope.likeData[key] || {};\n\n // Avoid too many call\n if ($scope.likeData[key].loading === true || $scope.likeData.loading) {\n event.preventDefault();\n return $q.reject();\n }\n\n if (!options.pubkey) {\n if (csWallet.children.count() === 0) {\n options.pubkey = csWallet.data.pubkey;\n }\n // Select the wallet, if many\n else {\n return Modals.showSelectWallet({displayBalance: false})\n .then(function (wallet) {\n if (!wallet) throw new Error('CANCELLED');\n options.pubkey = wallet.data.pubkey;\n return $scope.toggleLike(event, options); // Loop\n });\n }\n }\n\n var wallet = csWallet.getByPubkey(options.pubkey);\n if (!wallet) return;\n\n $scope.likeData[key].loading = true;\n return wallet.auth({minData: true})\n .then(function(walletData) {\n if (!walletData) {\n UIUtils.loading.hide();\n return;\n }\n\n // Check if member account\n if (!walletData.isMember) {\n // TODO: enable this\n //throw {message: \"ERROR.ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION\"};\n }\n\n // Apply like\n options.id = $scope.likeData.id;\n return $scope.options.like.service.toggle($scope.likeData.id, options);\n })\n .then(function(delta) {\n UIUtils.loading.hide();\n if (delta !== 0) {\n $scope.likeData[key].total = ($scope.likeData[key].total || 0) + delta;\n $scope.likeData[key].wasHitByPubkey = $scope.likeData[key].wasHitByPubkey || {};\n $scope.likeData[key].wasHitByPubkey[options.pubkey] = delta > 0;\n $scope.likeData[key].wasHitCount += delta;\n }\n $timeout(function() {\n $scope.likeData[key].loading = false;\n $scope.$broadcast('$$rebind::like'); // notify binder\n }, 1000);\n })\n .catch(function(err) {\n $scope.likeData[key].loading = false;\n if (err === 'CANCELLED') throw 'CANCELLED'; // User cancelled\n console.error(err);\n UIUtils.onError('LIKE.ERROR.FAILED_TOGGLE_LIKE')(err);\n event.preventDefault();\n });\n };\n\n $scope.setAbuseForm = function(form) {\n $scope.abuseForm = form;\n };\n\n $scope.showAbuseCommentPopover = function(event) {\n return $translate(['COMMON.REPORT_ABUSE.TITLE', 'COMMON.REPORT_ABUSE.SUB_TITLE','COMMON.BTN_SEND', 'COMMON.BTN_CANCEL'])\n .then(function(translations) {\n\n UIUtils.loading.hide();\n\n return $ionicPopup.show({\n templateUrl: 'plugins/es/templates/common/popup_report_abuse.html',\n title: translations['COMMON.REPORT_ABUSE.TITLE'],\n subTitle: translations['COMMON.REPORT_ABUSE.SUB_TITLE'],\n cssClass: 'popup-report-abuse',\n scope: $scope,\n buttons: [\n {\n text: translations['COMMON.BTN_CANCEL'],\n type: 'button-stable button-clear gray'\n },\n {\n text: translations['COMMON.BTN_SEND'],\n type: 'button button-positive ink',\n onTap: function(e) {\n $scope.abuseForm.$submitted=true;\n if(!$scope.abuseForm.$valid || !$scope.abuseData.comment) {\n //don't allow the user to close unless he enters a uid\n e.preventDefault();\n } else {\n return $scope.abuseData;\n }\n }\n }\n ]\n });\n })\n .then(function(res) {\n $scope.abuseData = {};\n if (!res || !res.comment) { // user cancel\n UIUtils.loading.hide();\n return undefined;\n }\n return res;\n });\n };\n\n $scope.reportAbuse = function(event, options) {\n\n // Make sure to be auth before continue\n if (!csWallet.isLogin()) {\n return csWallet.auth({minData: true})\n .then(function(data){\n UIUtils.loading.hide();\n if (!data) throw new Error('CANCELLED');\n options.pubkey = options.pubkey || data.pubkey;\n return $scope.reportAbuse(event, options); // loop\n });\n }\n\n if (!$scope.likeData || !$scope.likeData.abuses || $scope.likeData.abuses.wasHitCount) return; // skip\n if ($scope.likeData.abuses.wasHitCount) return; // already report\n\n options = options || {};\n\n if (!options.pubkey) {\n if (csWallet.children.count() === 0) {\n options.pubkey = csWallet.data.pubkey;\n }\n // Select the wallet, if many\n else {\n return Modals.showSelectWallet({displayBalance: false})\n .then(function (wallet) {\n if (!wallet) throw 'CANCELLED';\n options.pubkey = wallet.data.pubkey;\n return $scope.reportAbuse(event, options); // Loop\n });\n }\n }\n\n var wallet = csWallet.getByPubkey(options.pubkey);\n\n // Check if member account\n if (!wallet || !wallet.isMember()) {\n UIUtils.alert.info(\"ERROR.ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION\");\n return;\n }\n\n if (!options.comment) {\n // Ask a comment\n return $scope.showAbuseCommentPopover(event)\n // Loop, with options.comment filled\n .then(function(res) {\n if (!res || !res.comment) return; // Empty comment: skip\n options.comment = res.comment;\n options.level = res.level || (res.delete && 5) || undefined;\n return $scope.reportAbuse(event, options); // Loop, with the comment\n });\n }\n\n // Send abuse report\n options.kind = 'ABUSE';\n return $scope.toggleLike(event, options)\n .then(function() {\n console.log('BEFORE display toast');\n UIUtils.toast.show('COMMON.REPORT_ABUSE.CONFIRM.SENT');\n });\n };\n\n csWallet.api.data.on.reset($scope, function() {\n _.forEach($scope.options.like.kinds||[], function(kind) {\n var key = kind.toLowerCase() + 's';\n if ($scope.likeData[key]) {\n $scope.likeData[key].wasHitByPubkey = {};\n $scope.likeData[key].wasHitCount = 0;\n }\n });\n $scope.$broadcast('$$rebind::like'); // notify binder\n }, this);\n\n}\n","\nangular.module('cesium.settings.services', ['ngApi', 'cesium.config'])\n\n.factory('csSettings', ['$rootScope', '$q', '$window', 'Api', 'localStorage', '$translate', 'csConfig', function($rootScope, $q, $window, Api, localStorage, $translate, csConfig) {\n 'ngInject';\n\n // Define app locales\n var locales = [\n {id:'en', label:'English', flag: 'us'},\n {id:'en-GB', label:'English (UK)', flag: 'gb'},\n {id:'eo-EO', label:'Esperanto', flag: 'eo'},\n {id:'fr-FR', label:'Français', flag: 'fr'},\n {id:'nl-NL', label:'Nederlands', flag: 'nl'},\n {id:'es-ES', label:'Spanish', flag: 'es'},\n {id:'it-IT', label:'Italiano', flag: 'it'}\n ];\n var fallbackLocale = csConfig.fallbackLanguage ? fixLocale(csConfig.fallbackLanguage) : 'en';\n\n // Convert browser locale to app locale (fix #140)\n function fixLocale (locale) {\n if (!locale) return fallbackLocale;\n\n // exists in app locales: use it\n if (_.findWhere(locales, {id: locale})) return locale;\n\n // not exists: reiterate with the root (e.g. 'fr-XX' -> 'fr')\n var localeParts = locale.split('-');\n if (localeParts.length > 1) {\n return fixLocale(localeParts[0]);\n }\n\n // If another locale exists with the same root: use it\n var similarLocale = _.find(locales, function(l) {\n return String.prototype.startsWith.call(l.id, locale);\n });\n if (similarLocale) return similarLocale.id;\n\n return fallbackLocale;\n }\n\n // Convert browser locale to app locale (fix #140)\n function fixLocaleWithLog (locale) {\n var fixedLocale = fixLocale(locale);\n if (locale !== fixedLocale) {\n console.debug('[settings] Fix locale [{0}] -> [{1}]'.format(locale, fixedLocale));\n }\n return fixedLocale;\n }\n\n var\n constants = {\n STORAGE_KEY: 'settings', // for version >= v1.1.0\n KEEP_AUTH_IDLE_SESSION: 9999\n },\n // Settings that user cannot change himself (only config can override this values)\n fixedSettings = {\n timeout : 4000,\n cacheTimeMs: 60000, /*1 min*/\n timeWarningExpireMembership: 2592000 * 2 /*=2 mois*/,\n timeWarningExpire: 2592000 * 3 /*=3 mois*/,\n minVersion: '1.1.0',\n sourceUrl: 'https://git.duniter.org/clients/cesium-grp/cesium',\n sourceLicenseUrl: 'https://git.duniter.org/clients/cesium-grp/cesium/-/raw/master/LICENSE',\n newIssueUrl: \"https://git.duniter.org/clients/cesium-grp/cesium/issues/new\",\n userForumUrl: \"https://forum.monnaie-libre.fr\",\n latestReleaseUrl: \"https://api.github.com/repos/duniter/cesium/releases/latest\",\n duniterLatestReleaseUrl: \"https://api.github.com/repos/duniter/duniter/releases/latest\",\n httpsMode: false\n },\n defaultSettings = angular.merge({\n useRelative: false,\n useLocalStorage: !!$window.localStorage, // override to false if no device\n useLocalStorageEncryption: false,\n persistCache: false, // disable by default (waiting resolution of issue #885)\n walletHistoryTimeSecond: 30 * 24 * 60 * 60 /*30 days*/,\n walletHistorySliceSecond: 5 * 24 * 60 * 60 /*download using 5 days slice*/,\n walletHistoryAutoRefresh: true, // override to false if device\n rememberMe: true,\n keepAuthIdle: 10 * 60,\n showUDHistory: true,\n expertMode: false,\n decimalCount: 4,\n uiEffects: true,\n blockValidityWindow: 6,\n helptip: {\n enable: true,\n installDocUrl: \"https://duniter.org/en/wiki/duniter/install/\",\n currency: 0,\n network: 0,\n wotLookup: 0,\n wot: 0,\n wotCerts: 0,\n wallet: 0,\n walletCerts: 0,\n wallets: 0,\n header: 0,\n settings: 0\n },\n currency: {\n allRules: false,\n allWotRules: false\n },\n wallet: {\n showPubkey: true,\n alertIfUnusedWallet: true\n },\n locale: {\n id: fixLocaleWithLog(csConfig.defaultLanguage || $translate.use()) // use config locale if set, or browser default\n },\n license: {\n \"en\": \"license/license_g1-en\",\n \"fr-FR\": \"license/license_g1-fr-FR\",\n \"es-ES\": \"license/license_g1-es-ES\"\n }\n },\n fixedSettings,\n csConfig),\n\n data = {},\n previousData,\n started = false,\n startPromise,\n api = new Api(this, \"csSettings\");\n\n var\n reset = function() {\n _.keys(data).forEach(function(key){\n delete data[key];\n });\n\n applyData(defaultSettings);\n\n return api.data.raisePromise.reset(data)\n .then(store);\n },\n\n getByPath = function(path, defaultValue) {\n var obj = data;\n _.each(path.split('.'), function(key) {\n obj = obj[key];\n if (angular.isUndefined(obj)) {\n obj = defaultValue;\n return; // stop\n }\n });\n\n return obj;\n },\n\n emitChangedEvent = function() {\n var hasChanged = angular.isUndefined(previousData) || !angular.equals(previousData, data);\n if (hasChanged) {\n previousData = angular.copy(data);\n return api.data.raise.changed(data);\n }\n },\n\n store = function() {\n if (!started) {\n console.debug('[setting] Waiting start finished...');\n return (startPromise || start()).then(store);\n }\n\n var promise;\n if (data.useLocalStorage) {\n // When node is temporary (fallback node): keep previous node address - issue #476\n if (data.node.temporary === true) {\n promise = localStorage.getObject(constants.STORAGE_KEY)\n .then(function(previousSettings) {\n var savedData = angular.copy(data);\n savedData.node = previousSettings && previousSettings.node || {};\n delete savedData.temporary; // never store temporary flag\n return localStorage.setObject(constants.STORAGE_KEY, savedData);\n });\n }\n else {\n promise = localStorage.setObject(constants.STORAGE_KEY, data);\n }\n }\n else {\n promise = localStorage.setObject(constants.STORAGE_KEY, null);\n }\n\n return promise\n .then(function() {\n if (data.useLocalStorage) {\n console.debug('[setting] Saved locally');\n }\n\n // Emit event on store\n return api.data.raisePromise.store(data);\n })\n\n // Emit event on store\n .then(emitChangedEvent);\n },\n\n /**\n * Apply new settings (can be partial)\n * @param newData\n */\n applyData = function(newData) {\n if (!newData) return; // skip empty\n\n var localeChanged = false;\n if (newData.locale && newData.locale.id) {\n // Fix previously stored locale (could use bad format)\n var localeId = fixLocale(newData.locale.id);\n newData.locale = _.findWhere(locales, {id: localeId});\n localeChanged = !data.locale || newData.locale.id !== data.locale.id || newData.locale.id !== $translate.use();\n }\n\n // Force some fixed settings, before merging\n _.keys(fixedSettings).forEach(function(key) {\n newData[key] = defaultSettings[key]; // This will apply fixed value (override by config.js file)\n });\n\n // Apply new settings\n angular.merge(data, newData);\n\n // Delete temporary properties, if false\n if (newData && newData.node && !newData.node.temporary || !data.node.temporary) delete data.node.temporary;\n\n // Apply the new locale (only if need)\n // will produce an event cached by onLocaleChange();\n if (localeChanged) {\n $translate.use(data.locale.id);\n }\n\n },\n\n restore = function() {\n var now = Date.now();\n\n return localStorage.getObject(constants.STORAGE_KEY)\n .then(function(storedData) {\n // No settings stored\n if (!storedData) {\n console.debug(\"[settings] No settings in local storage. Using defaults.\");\n applyData(defaultSettings);\n emitChangedEvent();\n return;\n }\n\n // Apply stored data\n applyData(storedData);\n\n console.debug('[settings] Loaded from local storage in '+(Date.now()-now)+'ms');\n emitChangedEvent();\n });\n },\n\n getLicenseUrl = function() {\n var locale = data.locale && data.locale.id || csConfig.defaultLanguage || 'en';\n return (csConfig.license) ?\n (csConfig.license[locale] ? csConfig.license[locale] : defaultSettings.license[csConfig.defaultLanguage || 'en'] || csConfig.license) : undefined;\n },\n\n getFeedUrl = function() {\n var locale = data.locale && data.locale.id || csConfig.defaultLanguage || 'en';\n return (csConfig.feed && csConfig.feed.jsonFeed) ?\n (csConfig.feed.jsonFeed[locale] ? csConfig.feed.jsonFeed[locale] : defaultSettings.feed.jsonFeed[csConfig.defaultLanguage || 'en'] || csConfig.feed) : undefined;\n },\n\n // Detect locale successful changes, then apply to vendor libs\n onLocaleChange = function() {\n var locale = $translate.use();\n console.debug('[settings] Locale ['+locale+']');\n\n // config moment lib\n try {\n moment.locale(locale.toLowerCase());\n }\n catch(err) {\n try {\n moment.locale(locale.substr(0,2));\n }\n catch(err) {\n moment.locale('en-gb');\n console.warn('[settings] Unknown local for moment lib. Using default [en]');\n }\n }\n\n // config numeral lib\n try {\n numeral.language(locale.toLowerCase());\n }\n catch(err) {\n try {\n numeral.language(locale.substring(0, 2));\n }\n catch(err) {\n numeral.language('en-gb');\n console.warn('[settings] Unknown local for numeral lib. Using default [en]');\n }\n }\n\n // Emit event\n api.locale.raise.changed(locale);\n },\n\n isStarted = function() {\n return started;\n },\n\n ready = function() {\n if (started) return $q.when();\n return startPromise || start();\n },\n\n start = function() {\n console.debug('[settings] Starting...');\n\n startPromise = localStorage.ready()\n\n // Restore\n .then(restore)\n\n // Emit ready event\n .then(function() {\n console.debug('[settings] Started');\n started = true;\n startPromise = null;\n // Emit event (used by plugins)\n api.data.raise.ready(data);\n });\n\n return startPromise;\n };\n\n $rootScope.$on('$translateChangeSuccess', onLocaleChange);\n\n api.registerEvent('data', 'reset');\n api.registerEvent('data', 'changed');\n api.registerEvent('data', 'store');\n api.registerEvent('data', 'ready');\n api.registerEvent('locale', 'changed');\n\n // Apply default settings. This is required on some browser (web or mobile - see #361)\n applyData(defaultSettings);\n\n // Default action\n //start();\n\n return {\n isStarted: isStarted,\n ready: ready,\n start: start,\n data: data,\n apply: applyData,\n getByPath: getByPath,\n reset: reset,\n store: store,\n restore: restore,\n getLicenseUrl: getLicenseUrl,\n getFeedUrl: getFeedUrl,\n defaultSettings: defaultSettings,\n // api extension\n api: api,\n locales: locales,\n constants: constants\n };\n}]);\n","\nGpCurrencyAbstractController.$inject = ['$scope', '$filter', '$ionicPopover', '$ionicHistory', '$state', 'csSettings', 'csCurrency', 'esHttp', 'UIUtils'];\nangular.module('cesium.graph.common.controllers', ['cesium.services'])\n\n .controller('GpCurrencyAbstractCtrl', GpCurrencyAbstractController)\n;\n\nfunction GpCurrencyAbstractController($scope, $filter, $ionicPopover, $ionicHistory, $state, csSettings, csCurrency, esHttp, UIUtils) {\n 'ngInject';\n\n $scope.loading = true;\n $scope.formData = $scope.formData || {\n useRelative: csSettings.data.useRelative,\n timePct: 100,\n rangeDuration: 'day',\n firstBlockTime: 0,\n scale: 'linear',\n hide: [],\n beginAtZero: true\n };\n $scope.formData.useRelative = false; /*angular.isDefined($scope.formData.useRelative) ?\n $scope.formData.useRelative : csSettings.data.useRelative;*/\n $scope.scale = 'linear';\n $scope.height = undefined;\n $scope.width = undefined;\n $scope.maintainAspectRatio = true;\n $scope.times = [];\n\n function _truncDate(time) {\n return moment.unix(time).utc().startOf($scope.formData.rangeDuration).unix();\n }\n\n $scope.enter = function (e, state) {\n if ($scope.loading) {\n\n if (state && state.stateParams) {\n // remember state, to be able to refresh location\n $scope.stateName = state && state.stateName;\n $scope.stateParams = angular.copy(state && state.stateParams||{});\n\n if (!$scope.formData.currency && state && state.stateParams && state.stateParams.currency) { // Currency parameter\n $scope.formData.currency = state.stateParams.currency;\n }\n if (state.stateParams.t) {\n $scope.formData.timePct = state.stateParams.t;\n }\n else if (state.stateParams.timePct) {\n $scope.formData.timePct = state.stateParams.timePct;\n }\n if (state.stateParams.stepUnit) {\n $scope.formData.rangeDuration = state.stateParams.stepUnit;\n }\n if (state.stateParams.scale) {\n $scope.formData.scale = state.stateParams.scale;\n }\n // Allow to hide some dataset\n if (state.stateParams.hide) {\n $scope.formData.hide = state.stateParams.hide.split(',').reduce(function(res, index){\n return res.concat(parseInt(index));\n }, []);\n }\n }\n\n // Should be override by subclasses\n $scope.init(e, state);\n\n // Make sure there is currency, or load it not\n if (!$scope.formData.currency) {\n return csCurrency.get()\n .then(function (currency) {\n $scope.formData.currency = currency ? currency.name : null;\n $scope.formData.firstBlockTime = currency ? _truncDate(currency.firstBlockTime) : 0;\n if (!$scope.formData.firstBlockTime){\n console.warn('[graph] currency.firstBlockTime not loaded ! Should have been loaded by currrency service!');\n }\n $scope.formData.currencyAge = _truncDate(moment().utc().unix()) - $scope.formData.firstBlockTime;\n\n return $scope.enter(e, state);\n });\n }\n\n $scope.load() // Should be override by subclasses\n .then(function () {\n // Update scale\n $scope.setScale($scope.formData.scale);\n // Hide some dataset by index (read from state params)\n $scope.updateHiddenDataset();\n\n $scope.loading = false;\n });\n }\n };\n $scope.$on('$csExtension.enter', $scope.enter);\n $scope.$on('$ionicParentView.enter', $scope.enter);\n\n $scope.updateLocation = function() {\n if (!$scope.stateName) return;\n\n $ionicHistory.nextViewOptions({\n disableAnimate: true,\n disableBack: true,\n historyRoot: true\n });\n\n $scope.stateParams = $scope.stateParams || {};\n $scope.stateParams.t = ($scope.formData.timePct >= 0 && $scope.formData.timePct < 100) ? $scope.formData.timePct : undefined;\n $scope.stateParams.stepUnit = $scope.formData.rangeDuration != 'day' ? $scope.formData.rangeDuration : undefined;\n $scope.stateParams.hide = $scope.formData.hide && $scope.formData.hide.length ? $scope.formData.hide.join(',') : undefined;\n $scope.stateParams.scale = $scope.formData.scale != 'linear' ?$scope.formData.scale : undefined;\n\n $state.go($scope.stateName, $scope.stateParams, {\n reload: false,\n inherit: true,\n notify: false}\n );\n };\n\n // Allow to fixe size, form a template (e.g. in a 'ng-init' tag)\n $scope.setSize = function(height, width, maintainAspectRatio) {\n $scope.height = height;\n $scope.width = width;\n $scope.maintainAspectRatio = angular.isDefined(maintainAspectRatio) ? maintainAspectRatio : $scope.maintainAspectRatio;\n };\n\n // When parent view execute a refresh action\n $scope.$on('csView.action.refresh', function(event, context) {\n if (!context || context == 'currency') {\n return $scope.load();\n }\n });\n\n $scope.init = function(e, state) {\n // Should be override by subclasses\n };\n\n $scope.load = function() {\n // Should be override by subclasses\n };\n\n $scope.toggleScale = function() {\n $scope.setScale($scope.formData.scale === 'linear' ? 'logarithmic' : 'linear');\n $scope.updateLocation();\n };\n\n $scope.setScale = function(scale) {\n $scope.hideActionsPopover();\n $scope.formData.scale = scale;\n\n if (!$scope.options || !$scope.options.scales || !$scope.options.scales.yAxes) return;\n\n var format = $filter('formatInteger');\n\n _.forEach($scope.options.scales.yAxes, function(yAxe, index) {\n yAxe.type = scale;\n yAxe.ticks = yAxe.ticks || {};\n if (scale == 'linear') {\n yAxe.ticks.beginAtZero = angular.isDefined($scope.formData.beginAtZero) ? $scope.formData.beginAtZero : true;\n delete yAxe.ticks.min;\n yAxe.ticks.callback = function(value) {\n return format(value);\n };\n }\n else {\n //yAxe.ticks.min = 0;\n delete yAxe.ticks.beginAtZero;\n delete yAxe.ticks.callback;\n yAxe.ticks.callback = function(value, index) {\n if (!value) return;\n if (Math.log10(value)%1 === 0 || Math.log10(value/3)%1 === 0) {\n return format(value);\n }\n return '';\n };\n }\n });\n };\n\n $scope.setRangeDuration = function(rangeDuration) {\n $scope.hideActionsPopover();\n if ($scope.formData && rangeDuration == $scope.formData.rangeDuration) return;\n\n $scope.formData.rangeDuration = rangeDuration;\n\n // Restore default values\n delete $scope.formData.startTime;\n delete $scope.formData.endTime;\n delete $scope.formData.rangeDurationSec;\n //$scope.formData.timePct = 100;\n\n // Reload data\n $scope.load();\n // Update location\n $scope.updateLocation();\n };\n\n $scope.updateHiddenDataset = function(datasetOverride) {\n datasetOverride = datasetOverride || $scope.datasetOverride || {};\n\n _.forEach($scope.formData.hide||[], function(index) {\n if (!datasetOverride[index]) return; // skip invalid index\n\n // Hide the dataset (stroke the legend)\n datasetOverride[index].hidden = true;\n\n // If this dataset has an yAxis, hide it (if not used elsewhere)\n var yAxisID = datasetOverride[index].yAxisID;\n var yAxe = yAxisID && $scope.options && $scope.options.scales && _.findWhere($scope.options.scales.yAxes||[], {id: yAxisID});\n if (yAxisID && yAxe) {\n var yAxisDatasetCount = _.filter(datasetOverride, function(dataset) {\n return dataset.yAxisID === yAxisID;\n }).length;\n if (yAxisDatasetCount == 1) {\n yAxe.display = false;\n }\n }\n\n });\n };\n\n $scope.onLegendClick = function(e, legendItem) {\n var index = legendItem.datasetIndex;\n var ci = this.chart;\n var meta = ci.getDatasetMeta(index);\n\n // Hide/show the dataset\n meta.hidden = meta.hidden === null? !ci.data.datasets[index].hidden : null;\n\n // Update yAxis display (if used by only ONE dataset)\n if (ci.config && ci.config.data && ci.config.data.datasets) {\n var yAxisDatasetCount = _.filter(ci.config.data.datasets, function(dataset) {\n return dataset.yAxisID && dataset.yAxisID === meta.yAxisID;\n }).length;\n if (yAxisDatasetCount === 1) {\n ci.scales[meta.yAxisID].options.display = (meta.hidden !== false);\n }\n }\n\n // We hid a dataset ... rerender the chart\n ci.update();\n\n // Update window location\n $scope.formData.hide = $scope.formData.hide||[];\n $scope.formData.hide = meta.hidden ?\n _.union($scope.formData.hide, [index]) :\n _.difference($scope.formData.hide, [index]);\n $scope.updateLocation();\n };\n\n $scope.goPreviousRange = function() {\n if ($scope.loadingRange) return;\n $scope.loadingRange = true;\n\n $scope.formData.startTime -= $scope.times.length * $scope.formData.rangeDurationSec;\n if ($scope.formData.startTime < $scope.formData.firstBlockTime) {\n $scope.formData.startTime = $scope.formData.firstBlockTime;\n }\n $scope.formData.endTime = $scope.formData.startTime + $scope.times.length * $scope.formData.rangeDurationSec;\n\n // Reload data\n $scope.load().then(function(){\n // Update location\n $scope.updateLocation();\n\n $scope.loadingRange = false;\n });\n };\n\n $scope.goNextRange = function() {\n if ($scope.loadingRange) return;\n $scope.loadingRange = true;\n $scope.formData.startTime += $scope.times.length * $scope.formData.rangeDurationSec;\n if ($scope.formData.startTime > $scope.formData.firstBlockTime + $scope.formData.currencyAge - $scope.formData.timeWindow) {\n $scope.formData.startTime = $scope.formData.firstBlockTime + $scope.formData.currencyAge - $scope.formData.timeWindow;\n }\n $scope.formData.endTime = $scope.formData.startTime + $scope.times.length * $scope.formData.rangeDurationSec;\n\n // Reload data\n $scope.load().then(function(){\n // Update location\n $scope.updateLocation();\n\n $scope.loadingRange = false;\n });\n };\n\n $scope.onRangeChanged = function() {\n if ($scope.loadingRange) return;\n $scope.loadingRange = true;\n\n $scope.formData.startTime = $scope.formData.firstBlockTime + (parseFloat($scope.formData.timePct) / 100) * ($scope.formData.currencyAge - $scope.formData.timeWindow) ;\n $scope.formData.endTime = $scope.formData.startTime + $scope.times.length * $scope.formData.rangeDurationSec;\n\n // Reload data\n $scope.load().then(function(){\n // Update location\n $scope.updateLocation();\n\n $scope.loadingRange = false;\n });\n };\n\n $scope.updateRange = function(startTime, endTime, updateTimePct) {\n updateTimePct = angular.isDefined(updateTimePct) ? updateTimePct : true;\n\n $scope.formData.startTime = startTime;\n $scope.formData.endTime = endTime;\n $scope.formData.timeWindow = $scope.formData.timeWindow || $scope.formData.endTime - $scope.formData.startTime;\n $scope.formData.rangeDurationSec = $scope.formData.rangeDurationSec || $scope.formData.timeWindow / ($scope.times.length-1);\n\n if (updateTimePct) {\n $scope.formData.timePct = Math.ceil(($scope.formData.startTime - $scope.formData.firstBlockTime) * 100 /\n ($scope.formData.currencyAge - $scope.formData.timeWindow));\n }\n };\n\n /* -- Popover -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'plugins/graph/templates/common/popover_range_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n\n}\n","\nGpBlockchainTxCountController.$inject = ['$scope', '$controller', '$q', '$state', '$filter', '$translate', 'gpData', 'gpColor'];\nGpBlockchainIssuersController.$inject = ['$scope', '$controller', '$q', '$state', '$translate', 'gpColor', 'gpData'];\nangular.module('cesium.graph.blockchain.controllers', ['chart.js', 'cesium.services', 'cesium.graph.services'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n\n .state('app.blockchain_stats', {\n url: \"/blockchain/stats?currency&stepUnit&t&hide&scale\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/graph/templates/blockchain/view_stats.html\"\n }\n }\n })\n\n .state('app.currency_blockchain_stats', {\n url: \"/:currency/blockchain/stats\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/graph/templates/blockchain/view_stats.html\"\n }\n }\n })\n ;\n }])\n\n .controller('GpBlockchainTxCountCtrl', GpBlockchainTxCountController)\n .controller('GpBlockchainIssuersCtrl', GpBlockchainIssuersController)\n;\n\n\nfunction GpBlockchainTxCountController($scope, $controller, $q, $state, $filter, $translate, gpData, gpColor) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('GpCurrencyAbstractCtrl', {$scope: $scope}));\n\n $scope.displayRightAxis = true;\n\n $scope.init = function(e, state) {\n if (state && state.stateParams) {\n\n // get the pubkey\n if (!$scope.formData.issuer && state && state.stateParams && state.stateParams.pubkey) { // Currency parameter\n $scope.formData.issuer = state.stateParams.pubkey;\n }\n }\n };\n\n $scope.load = function(updateTimePct) {\n\n var formData = $scope.formData;\n\n return $q.all([\n\n $translate($scope.formData.issuer?\n 'GRAPH.BLOCKCHAIN.TX_AMOUNT_PUBKEY_TITLE':\n 'GRAPH.BLOCKCHAIN.TX_AMOUNT_TITLE', formData),\n\n // translate i18n keys\n $translate(['GRAPH.BLOCKCHAIN.TX_AMOUNT_LABEL',\n 'GRAPH.BLOCKCHAIN.TX_COUNT_LABEL',\n 'GRAPH.BLOCKCHAIN.TX_AVG_BY_BLOCK',\n 'COMMON.DATE_PATTERN',\n 'COMMON.DATE_SHORT_PATTERN',\n 'COMMON.DATE_MONTH_YEAR_PATTERN']),\n\n // get data\n gpData.blockchain.txCount($scope.formData.currency, formData)\n ])\n .then(function(result) {\n\n var title = result[0];\n\n var translations = result[1];\n var datePatterns = {\n hour: translations['COMMON.DATE_PATTERN'],\n day: translations['COMMON.DATE_SHORT_PATTERN'],\n month: translations['COMMON.DATE_MONTH_YEAR_PATTERN']\n };\n\n result = result[2];\n\n if (!result || !result.times) return; // no data\n $scope.times = result.times;\n\n var formatInteger = $filter('formatInteger');\n var formatAmount = $filter('formatDecimal');\n $scope.currencySymbol = $filter('currencySymbolNoHtml')($scope.formData.currency, $scope.formData.useRelative);\n\n // Data\n if ($scope.formData.rangeDuration != 'hour') {\n $scope.data = [\n result.amount,\n result.count\n ];\n }\n else {\n $scope.data = [\n result.amount,\n result.count\n ];\n }\n\n // Labels\n var labelPattern = datePatterns[$scope.formData.rangeDuration];\n $scope.labels = result.times.reduce(function(res, time) {\n return res.concat(moment.unix(time).local().format(labelPattern));\n }, []);\n\n // Colors\n $scope.colors = gpColor.scale.fix(result.times.length);\n\n // Update range options with received values\n $scope.updateRange(result.times[0], result.times[result.times.length-1], updateTimePct);\n\n // Options\n $scope.options = {\n responsive: true,\n maintainAspectRatio: true,\n title: {\n display: true,\n text: title\n },\n scales: {\n yAxes: [\n {\n id: 'y-axis-amount',\n position: 'left'\n },\n {\n id: 'y-axis-count',\n display: $scope.displayRightAxis,\n position: 'right',\n gridLines: {\n drawOnChartArea: false\n }\n }\n ]\n },\n legend: {\n display: $scope.displayRightAxis,\n onClick: $scope.onLegendClick\n },\n tooltips: {\n enabled: true,\n mode: 'index',\n callbacks: {\n label: function(tooltipItems, data) {\n if (tooltipItems.datasetIndex === 0) {\n return data.datasets[tooltipItems.datasetIndex].label +\n ': ' + formatAmount(tooltipItems.yLabel) +\n ' ' + $scope.currencySymbol;\n }\n return data.datasets[tooltipItems.datasetIndex].label +\n ': ' + tooltipItems.yLabel;\n }\n }\n }\n };\n\n // Override dataset config\n $scope.datasetOverride = [\n {\n yAxisID: 'y-axis-amount',\n type: 'bar',\n label: translations['GRAPH.BLOCKCHAIN.TX_AMOUNT_LABEL'],\n hoverBackgroundColor: gpColor.rgba.calm(0.6)\n },\n {\n yAxisID: 'y-axis-count',\n type: 'line',\n label: translations['GRAPH.BLOCKCHAIN.TX_COUNT_LABEL'],\n fill: false,\n borderColor: gpColor.rgba.gray(0.5),\n borderWidth: 2,\n backgroundColor: gpColor.rgba.gray(0.5),\n pointBackgroundColor: gpColor.rgba.gray(0.5),\n pointBorderColor: gpColor.rgba.white(),\n pointHoverBackgroundColor: gpColor.rgba.gray(1),\n pointHoverBorderColor: gpColor.rgba.translucent(),\n pointRadius: 3\n }\n ];\n });\n };\n\n $scope.onChartClick = function(data, e, item) {\n if (!item) return;\n var from = $scope.times[item._index];\n var to = moment.unix(from).utc().add(1, $scope.formData.rangeDuration).unix();\n var query = '_exists_:transactions AND medianTime:>={0} AND medianTime:<{1}'.format(from, to);\n if ($scope.formData.issuer) {\n query += ' AND issuer:' + $scope.formData.issuer;\n }\n $state.go('app.blockchain_search', {q: query});\n };\n\n}\n\n\nfunction GpBlockchainIssuersController($scope, $controller, $q, $state, $translate, gpColor, gpData) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('GpCurrencyAbstractCtrl', {$scope: $scope}));\n\n $scope.load = function() {\n return $q.all([\n $translate([\n 'GRAPH.BLOCKCHAIN.BLOCKS_ISSUERS_TITLE',\n 'GRAPH.BLOCKCHAIN.BLOCKS_ISSUERS_LABEL'\n ]),\n gpData.blockchain.countByIssuer($scope.formData.currency)\n ])\n .then(function(result) {\n var translations = result[0];\n result = result[1];\n if (!result || !result.data) return;\n\n // Data\n $scope.data = result.data;\n\n // Labels\n $scope.labels = result.labels;\n\n // Data to keep (for click or label)\n $scope.blockCount = result.blockCount;\n $scope.issuers = result.issuers;\n\n // Options\n $scope.barOptions = {\n responsive: true,\n maintainAspectRatio: $scope.maintainAspectRatio,\n title: {\n display: true,\n text: translations['GRAPH.BLOCKCHAIN.BLOCKS_ISSUERS_TITLE']\n },\n scales: {\n yAxes: [{\n type: 'linear',\n ticks: {\n beginAtZero: true\n }\n }]\n }\n };\n\n // Colors\n $scope.colors = gpColor.scale.custom(result.data.length);\n\n });\n };\n\n $scope.onChartClick = function(data, e, item) {\n if (!item) return;\n var issuer = $scope.issuers[item._index];\n $state.go('app.wot_identity', issuer);\n };\n}\n","\nGpPeerViewExtendController.$inject = ['$scope', '$timeout', 'PluginService', 'esSettings', 'csCurrency', 'gpData'];\nangular.module('cesium.graph.network.controllers', ['chart.js', 'cesium.graph.services'])\n\n .config(['$stateProvider', 'PluginServiceProvider', 'csConfig', function($stateProvider, PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n\n PluginServiceProvider\n .extendState('app.network', {\n points: {\n 'blockchain-buttons': {\n templateUrl: \"plugins/graph/templates/network/view_network_extend.html\",\n controller: 'ESExtensionCtrl'\n }\n }\n })\n\n .extendState('app.view_peer', {\n points: {\n 'general': {\n templateUrl: \"plugins/graph/templates/network/view_peer_extend.html\",\n controller: 'GpPeerViewExtendCtrl'\n }\n }\n })\n\n .extendState('app.es_network', {\n points: {\n 'documents-buttons': {\n templateUrl: \"plugins/graph/templates/network/view_es_network_extend.html\",\n controller: 'ESExtensionCtrl'\n }\n }\n })\n\n .extendState('app.view_es_peer', {\n points: {\n 'general': {\n templateUrl: \"plugins/graph/templates/network/view_es_peer_extend.html\",\n controller: 'ESExtensionCtrl'\n }\n }\n })\n ;\n\n $stateProvider\n .state('app.view_peer_stats', {\n url: \"/network/peer/:pubkey/stats\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/graph/templates/network/view_peer_stats.html\",\n controller: 'GpBlockchainTxCountCtrl'\n }\n }\n });\n }\n }])\n\n .controller('GpPeerViewExtendCtrl', GpPeerViewExtendController)\n\n;\n\nfunction GpPeerViewExtendController($scope, $timeout, PluginService, esSettings, csCurrency, gpData) {\n 'ngInject';\n\n $scope.extensionPoint = PluginService.extensions.points.current.get();\n $scope.enable = esSettings.isEnable();\n $scope.loading = true;\n $scope.node = $scope.node || {};\n\n esSettings.api.state.on.changed($scope, function(enable) {\n $scope.enable = enable;\n });\n\n /**\n * Enter into the view\n * @param e\n * @param state\n */\n $scope.enter = function(e, state) {\n\n if (!$scope.node.currency && state && state.stateParams && state.stateParams.currency) { // Currency parameter\n $scope.node.currency = state.stateParams.currency;\n }\n\n // Make sure there is currency, or load if not\n if (!$scope.node.currency) {\n return csCurrency.get()\n .then(function(currency) {\n $scope.node.currency = currency ? currency.name : null;\n return $scope.enter(e, state);\n });\n }\n\n // Make sure there is pubkey, or wait for parent load to be finished\n if (!$scope.node.pubkey) {\n return $timeout(function () {\n return $scope.enter(e, state);\n }, 500);\n }\n\n // load\n return $scope.load();\n };\n $scope.$on('$csExtension.enter', $scope.enter);\n\n $scope.load = function() {\n if (!$scope.node.currency && !$scope.node.pubkey) return;\n console.info(\"[Graph] [peer] Loading blocks count for [{0}]\".format($scope.node.pubkey.substr(0, 8)));\n\n return gpData.node.blockCount($scope.node.currency, $scope.node.pubkey)\n .then(function(count) {\n $scope.blockCount = count;\n $scope.loading = false;\n });\n };\n}\n","\nGpCurrencyViewExtendController.$inject = ['$scope', 'PluginService', 'UIUtils', 'esSettings'];\nGpCurrencyMonetaryMassController.$inject = ['$scope', '$controller', '$q', '$state', '$translate', 'UIUtils', 'gpColor', 'gpData', '$filter', 'csSettings'];\nGpCurrencyDUController.$inject = ['$scope', '$q', '$controller', '$translate', 'gpColor', 'gpData', '$filter', 'UIUtils'];\nGpCurrencyMembersCountController.$inject = ['$scope', '$controller', '$q', '$state', '$translate', 'gpColor', 'gpData', '$filter'];\nangular.module('cesium.graph.currency.controllers', ['chart.js', 'cesium.graph.services', 'cesium.graph.common.controllers'])\n\n .config(['$stateProvider', 'PluginServiceProvider', 'csConfig', function($stateProvider, PluginServiceProvider, csConfig) {\n 'ngInject';\n\n $stateProvider\n .state('app.currency.tab_parameters_stats', {\n url: \"/parameters/stats\",\n views: {\n 'tab-parameters': {\n templateUrl: \"plugins/graph/templates/currency/tabs/tab_parameters_stats.html\"\n }\n }\n })\n .state('app.currency.tab_wot_stats', {\n url: \"/community/stats\",\n views: {\n 'tab-wot': {\n templateUrl: \"plugins/graph/templates/currency/tabs/tab_wot_stats.html\",\n controller: 'GpCurrencyMembersCountCtrl'\n }\n }\n })\n .state('app.currency.tab_network_stats', {\n url: \"/network/stats\",\n views: {\n 'tab-network': {\n templateUrl: \"plugins/graph/templates/currency/tabs/tab_network_stats.html\"\n }\n }\n })\n .state('app.currency.tab_blocks_stats', {\n url: \"/blocks/stats\",\n views: {\n 'tab-blocks': {\n templateUrl: \"plugins/graph/templates/currency/tabs/tab_blocks_stats.html\"\n }\n }\n })\n .state('app.currency_stats_lg', {\n url: \"/currency/stats/lg?hide&scale\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/graph/templates/currency/view_stats_lg.html\"\n }\n }\n });\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n PluginServiceProvider\n .extendStates(['app.currency_name', 'app.currency', 'app.currency_name_lg', 'app.currency_lg'], {\n points: {\n 'parameters-actual': {\n templateUrl: \"plugins/graph/templates/currency/view_currency_extend.html\",\n controller: 'GpCurrencyViewExtendCtrl'\n },\n 'wot-actual': {\n templateUrl: \"plugins/graph/templates/currency/view_currency_extend.html\",\n controller: 'GpCurrencyViewExtendCtrl'\n },\n 'network-actual': {\n templateUrl: \"plugins/graph/templates/currency/view_currency_extend.html\",\n controller: 'GpCurrencyViewExtendCtrl'\n }\n }\n })\n .extendStates(['app.currency.tab_blocks'], {\n points: {\n 'buttons': {\n templateUrl: \"plugins/graph/templates/currency/tab_blocks_extend.html\",\n controller: 'GpCurrencyViewExtendCtrl'\n }\n }\n })\n ;\n }\n }])\n\n\n .controller('GpCurrencyViewExtendCtrl', GpCurrencyViewExtendController)\n\n .controller('GpCurrencyMonetaryMassCtrl', GpCurrencyMonetaryMassController)\n\n .controller('GpCurrencyDUCtrl', GpCurrencyDUController)\n\n .controller('GpCurrencyMembersCountCtrl', GpCurrencyMembersCountController)\n;\n\nfunction GpCurrencyViewExtendController($scope, PluginService, UIUtils, esSettings) {\n 'ngInject';\n\n $scope.extensionPoint = PluginService.extensions.points.current.get();\n $scope.enable = esSettings.isEnable();\n $scope.smallscreen = UIUtils.screen.isSmall();\n\n esSettings.api.state.on.changed($scope, function(enable) {\n $scope.enable = enable;\n });\n}\n\nfunction GpCurrencyMonetaryMassController($scope, $controller, $q, $state, $translate, UIUtils, gpColor, gpData, $filter, csSettings) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('GpCurrencyAbstractCtrl', {$scope: $scope}));\n\n $scope.formData.useRelative = angular.isDefined($scope.formData.useRelative) ?\n $scope.formData.useRelative :\n csSettings.data.useRelative;\n $scope.displayShareAxis = true;\n $scope.hiddenDatasets = [];\n\n $scope.init = function(e, state) {\n // nothing to do here\n };\n\n $scope.onUseRelativeChanged = function() {\n if (!$scope.loading) {\n $scope.load();\n }\n };\n $scope.$watch('formData.useRelative', $scope.onUseRelativeChanged);\n\n var truncAmount = function(value) {\n return Math.trunc(value*100)/100;\n };\n\n $scope.load = function(from, size) {\n from = from || 0;\n size = size || 10000;\n\n return $q.all([\n $translate(['GRAPH.CURRENCY.MONETARY_MASS_TITLE',\n 'GRAPH.CURRENCY.MONETARY_MASS_LABEL',\n 'GRAPH.CURRENCY.MONETARY_MASS_SHARE_LABEL']),\n gpData.blockchain.withDividend($scope.formData.currency, {\n from: from,\n size: size\n })\n ])\n .then(function(result) {\n var translations = result[0];\n result = result[1];\n if (!result || !result.times) return;\n $scope.times = result.times;\n\n // Choose a date formatter, depending on the blocks period\n var blocksPeriod = result.times[result.times.length-1] - result.times[0];\n var formatDate;\n if (blocksPeriod < 31557600/* less than 1 year */) {\n formatDate = $filter('medianDateShort');\n }\n else {\n formatDate = $filter('formatDateMonth'); //see #683\n }\n\n var formatAmount = $filter('formatDecimal');\n $scope.currencySymbol = $filter('currencySymbolNoHtml')($scope.formData.currency, $scope.formData.useRelative);\n\n // Data: relative\n var data = [];\n if($scope.formData.useRelative) {\n\n // M/N\n data.push(\n result.blocks.reduce(function(res, block) {\n return res.concat(truncAmount(block.monetaryMass / block.dividend / block.membersCount));\n }, []));\n\n // Mass\n data.push(\n result.blocks.reduce(function(res, block) {\n return res.concat(truncAmount(block.monetaryMass / block.dividend));\n }, []));\n }\n\n // Data: quantitative\n else {\n // M/N\n data.push(\n result.blocks.reduce(function(res, block) {\n return res.concat(truncAmount(block.monetaryMass / block.membersCount / 100));\n }, []));\n\n // Mass\n data.push(\n result.blocks.reduce(function(res, block) {\n return res.concat(block.monetaryMass / 100);\n }, []));\n }\n $scope.data = data;\n\n // Labels\n $scope.labels = result.times.reduce(function(res, time) {\n return res.concat(formatDate(time));\n }, []);\n\n // Colors\n $scope.colors = gpColor.scale.fix(result.times.length);\n\n // Options\n $scope.options = {\n responsive: true,\n maintainAspectRatio: $scope.maintainAspectRatio,\n title: {\n display: true,\n text: translations['GRAPH.CURRENCY.MONETARY_MASS_TITLE']\n },\n legend: {\n display: $scope.displayShareAxis,\n onClick: $scope.onLegendClick\n },\n scales: {\n yAxes: [\n {\n id: 'y-axis-mn'\n },\n {\n id: 'y-axis-mass',\n display: $scope.displayShareAxis,\n position: 'right',\n gridLines: {\n drawOnChartArea: false\n }\n },\n\n ]\n },\n tooltips: {\n enabled: true,\n mode: 'index',\n callbacks: {\n label: function(tooltipItems, data) {\n return data.datasets[tooltipItems.datasetIndex].label +\n ': ' + formatAmount(tooltipItems.yLabel) +\n ' ' + $scope.currencySymbol;\n }\n }\n }\n };\n\n $scope.datasetOverride = [\n {\n yAxisID: 'y-axis-mn',\n type: 'line',\n label: translations['GRAPH.CURRENCY.MONETARY_MASS_SHARE_LABEL'],\n borderWidth: 2,\n pointRadius: 0,\n pointHitRadius: 4,\n pointHoverRadius: 3\n },\n {\n yAxisID: 'y-axis-mass',\n type: 'line',\n label: translations['GRAPH.CURRENCY.MONETARY_MASS_LABEL'],\n fill: false,\n showLine: true,\n borderColor: gpColor.rgba.energized(),\n borderWidth: 1,\n backgroundColor: gpColor.rgba.energized(),\n pointBackgroundColor: gpColor.rgba.energized(),\n pointBorderColor: gpColor.rgba.energized(),\n pointHoverBackgroundColor: gpColor.rgba.energized(),\n pointHoverBorderColor: gpColor.rgba.energized(),\n pointRadius: 0,\n pointHitRadius: 4,\n pointHoverRadius: 3\n }];\n\n $scope.setScale($scope.scale);\n\n // Keep only block number (need for click)\n $scope.blocks = result.blocks.reduce(function(res, block) {\n return res.concat(block.number);\n }, []);\n });\n\n };\n\n $scope.onChartClick = function(data, e, item) {\n if (!item) return;\n var number = $scope.blocks[item._index];\n $state.go('app.view_block', {number: number});\n };\n\n /* -- Popover -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'plugins/graph/templates/currency/popover_monetary_mass_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n\n}\n\n\nfunction GpCurrencyDUController($scope, $q, $controller, $translate, gpColor, gpData, $filter, UIUtils) {\n 'ngInject';\n\n $scope.formData = {\n scale: 'linear',\n beginAtZero: false\n };\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('GpCurrencyMonetaryMassCtrl', {$scope: $scope}));\n\n\n $scope.load = function(from, size) {\n from = from || 0;\n size = size || 10000;\n\n return $q.all([\n $translate([\n 'GRAPH.CURRENCY.UD_TITLE',\n 'COMMON.UNIVERSAL_DIVIDEND']),\n gpData.blockchain.withDividend($scope.formData.currency, {\n from: from,\n size: size\n })\n ])\n .then(function(result) {\n var translations = result[0];\n result = result[1];\n if (!result || !result.times) return;\n $scope.times = result.times;\n\n // Choose a date formatter, depending on the blocks period\n var blocksPeriod = result.times[result.times.length-1] - result.times[0];\n var dateFilter;\n if (blocksPeriod < 31557600/* less than 1 year */) {\n dateFilter = $filter('medianDateShort');\n }\n else {\n dateFilter = $filter('formatDateMonth');\n }\n\n var formatAmount = $filter('formatDecimal');\n $scope.currencySymbol = $filter('currencySymbolNoHtml')($scope.formData.currency, false);\n\n // Data\n $scope.data = [\n result.blocks.reduce(function(res, block) {\n return res.concat(block.dividend / 100);\n }, [])\n ];\n\n // Labels\n $scope.labels = result.times.reduce(function(res, time) {\n return res.concat(dateFilter(time));\n }, []);\n\n // Colors\n $scope.colors = result.blocks.reduce(function(res) {\n return res.concat(gpColor.rgba.calm(0.5));\n }, []);\n\n // Options\n $scope.options = {\n responsive: true,\n maintainAspectRatio: $scope.maintainAspectRatio,\n title: {\n display: true,\n text: translations['GRAPH.CURRENCY.UD_TITLE']\n },\n scales: {\n yAxes: [\n {\n id: 'y-axis-ud',\n ticks: {\n beginAtZero: $scope.formData.beginAtZero\n }\n }\n ]\n },\n tooltips: {\n enabled: true,\n mode: 'index',\n callbacks: {\n label: function(tooltipItems, data) {\n return data.datasets[tooltipItems.datasetIndex].label +\n ': ' + formatAmount(tooltipItems.yLabel) +\n ' ' + $scope.currencySymbol;\n }\n }\n }\n };\n $scope.setScale($scope.scale);\n\n $scope.datasetOverride = [\n {\n yAxisID: 'y-axis-ud',\n type: 'line',\n label: translations['COMMON.UNIVERSAL_DIVIDEND'],\n borderWidth: 2,\n pointRadius: 0,\n pointHitRadius: 4,\n pointHoverRadius: 3\n }];\n\n // Keep only block number (need for click)\n $scope.blocks = result.blocks.reduce(function(res, block) {\n return res.concat(block.number);\n }, []);\n });\n\n };\n\n /* -- Popover -- */\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'plugins/graph/templates/currency/popover_monetary_mass_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n\n}\n\n\nfunction GpCurrencyMembersCountController($scope, $controller, $q, $state, $translate, gpColor, gpData, $filter) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('GpCurrencyAbstractCtrl', {$scope: $scope}));\n\n $scope.load = function(from, size) {\n from = from || 0;\n size = size || 10000;\n\n return $q.all([\n $translate(['GRAPH.CURRENCY.MEMBERS_COUNT_TITLE', 'GRAPH.CURRENCY.MEMBERS_COUNT_LABEL']),\n gpData.blockchain.withDividend($scope.formData.currency, {\n from: from,\n size: size,\n withCurrent: true\n })\n ])\n .then(function(result) {\n var translations = result[0];\n result = result[1];\n\n if (!result || !result.times) return;\n $scope.times = result.times;\n\n // Choose a date formatter, depending on the blocks period\n var blocksPeriod = result.times[result.blocks.length-1] - result.times[0];\n var dateFilter;\n if (blocksPeriod < 31557600/* less than 1 year*/) {\n dateFilter = $filter('medianDateShort');\n }\n else {\n dateFilter = $filter('formatDateMonth');\n }\n\n // Format time\n $scope.labels = result.times.reduce(function(res, time) {\n return res.concat(dateFilter(time));\n }, []);\n\n // Members count graph: -------------------------\n $scope.options = {\n responsive: true,\n maintainAspectRatio: $scope.maintainAspectRatio,\n title: {\n display: true,\n text: translations['GRAPH.CURRENCY.MEMBERS_COUNT_TITLE']\n },\n scales: {\n xAxes: [{\n position: 'bottom'\n }],\n yAxes: [{\n id: 'y-axis-1',\n ticks: {\n beginAtZero: false\n }\n }]\n }\n };\n $scope.datasetOverride = [{\n yAxisID: 'y-axis-1',\n type: 'line',\n label: translations['GRAPH.CURRENCY.MEMBERS_COUNT_LABEL'],\n borderWidth: 2,\n pointRadius: 0,\n pointHitRadius: 4,\n pointHoverRadius: 3\n }];\n\n // Data\n $scope.data = [\n result.blocks.reduce(function(res, block) {\n return res.concat(block.membersCount);\n }, [])\n ];\n\n // Colors\n $scope.colors = gpColor.scale.fix(result.blocks.length);\n });\n };\n\n $scope.onChartClick = function(data, e, item) {\n if (!item) return;\n if (!item._index) {\n $state.go('app.view_block', {number: 0});\n return;\n }\n var from = $scope.times[item._index-1];\n var to = moment.unix(from).utc().add(1, 'day').unix();\n $state.go('app.blockchain_search', {\n q: '(_exists_:joiners OR _exists_:leavers OR _exists_:revoked OR _exists_:excluded) AND medianTime:>{0} AND medianTime:<={1}'.format(from, to)\n });\n };\n\n\n}\n","\nGpAccountBalanceController.$inject = ['$scope', '$controller', '$q', '$state', '$filter', '$translate', 'csWot', 'gpData', 'gpColor', 'csWallet'];\nGpAccountSumTxController.$inject = ['$scope', '$controller', '$filter', '$state', 'csTx', 'gpColor'];\nGpAccountCertificationController.$inject = ['$scope', '$controller', '$q', '$state', '$filter', '$translate', 'gpData', 'gpColor', 'csWallet'];\nangular.module('cesium.graph.account.controllers', ['chart.js', 'cesium.graph.services'])\n\n .config(['$stateProvider', 'PluginServiceProvider', 'csConfig', function($stateProvider, PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n\n PluginServiceProvider\n .extendState('app.view_wallet_tx', {\n points: {\n 'buttons': {\n templateUrl: \"plugins/graph/templates/account/view_wallet_tx_extend.html\",\n controller: 'ESExtensionCtrl'\n }\n }\n })\n\n .extendState('app.view_wallet_tx_by_id', {\n points: {\n 'buttons': {\n templateUrl: \"plugins/graph/templates/account/view_wallet_tx_extend.html\",\n controller: 'ESExtensionCtrl'\n }\n }\n })\n\n .extendStates(['app.wot_identity_tx_uid', 'app.wot_identity_tx_uid_lg'], {\n points: {\n 'buttons': {\n templateUrl: \"plugins/graph/templates/account/view_identity_tx_extend.html\",\n controller: 'ESExtensionCtrl'\n }\n }\n })\n ;\n\n $stateProvider\n .state('app.view_wallet_stats', {\n url: \"/wallet/stats?t&stepUnit&hide&scale\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/graph/templates/account/view_stats.html\"\n }\n },\n data: {\n auth: true\n }\n })\n\n .state('app.view_wallet_stats_by_id', {\n url: \"/wallets/:id/stats?t&stepUnit&hide&scale\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/graph/templates/account/view_stats.html\"\n }\n },\n data: {\n auth: true\n }\n })\n\n .state('app.wot_identity_stats', {\n url: \"/wot/:pubkey/stats?t&stepUnit&hide&scale\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/graph/templates/account/view_stats.html\"\n }\n }\n });\n }\n }])\n\n .controller('GpAccountBalanceCtrl', GpAccountBalanceController)\n\n .controller('GpAccountSumTxCtrl', GpAccountSumTxController)\n\n .controller('GpAccountCertificationCtrl', GpAccountCertificationController)\n;\n\nfunction GpAccountBalanceController($scope, $controller, $q, $state, $filter, $translate, csWot, gpData, gpColor, csWallet) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('GpCurrencyAbstractCtrl', {$scope: $scope}));\n\n $scope.init = function(e, state) {\n\n if (state && state.stateParams && state.stateParams.pubkey) { // Currency parameter\n $scope.formData.pubkey = state.stateParams.pubkey;\n }\n else if(csWallet.isLogin()) {\n $scope.formData.pubkey = csWallet.data.pubkey;\n }\n\n };\n\n var defaultSetScale = $scope.setScale;\n $scope.setScale = function(scale) {\n // linear scale: sent values as negative\n if (scale === 'linear') {\n $scope.data[$scope.data.length-2] = _.map($scope.data[$scope.data.length-2], function(value) {\n return -1 * Math.abs(value);\n });\n }\n // log scale: sent values as positive\n else {\n $scope.data[$scope.data.length-2] = _.map($scope.data[$scope.data.length-2], function(value) {\n return Math.abs(value);\n });\n }\n\n // call default implementation\n defaultSetScale(scale);\n };\n\n $scope.load = function(updateTimePct) {\n\n updateTimePct = angular.isDefined(updateTimePct) ? updateTimePct : true;\n\n var withUD = true;\n\n return csWot.load($scope.formData.pubkey, null/*uid*/, {cache: true})\n .then(function(identity) {\n $scope.identity = identity;\n withUD = $scope.identity.isMember || $scope.identity.wasMember;\n\n return $q.all([\n\n $translate('GRAPH.ACCOUNT.BALANCE_TITLE', $scope.formData),\n\n // translate i18n keys\n $translate(['GRAPH.ACCOUNT.UD_LABEL',\n 'GRAPH.ACCOUNT.TX_RECEIVED_LABEL',\n 'GRAPH.ACCOUNT.TX_SENT_LABEL',\n 'GRAPH.ACCOUNT.UD_ACCUMULATION_LABEL',\n 'GRAPH.ACCOUNT.TX_ACCUMULATION_LABEL',\n 'GRAPH.ACCOUNT.BALANCE_LABEL',\n 'COMMON.DATE_PATTERN',\n 'COMMON.DATE_SHORT_PATTERN',\n 'COMMON.DATE_MONTH_YEAR_PATTERN']),\n\n // get data\n gpData.blockchain.movement($scope.formData.currency, angular.copy($scope.formData, {withUD: withUD}))\n ]);\n })\n .then(function(result) {\n var title = result[0];\n var translations = result[1];\n result = result[2];\n\n if (!result || !result.times) return; // no data\n $scope.times = result.times;\n\n var formatDecimal = $filter('formatDecimal');\n $scope.currencySymbol = $filter('currencySymbolNoHtml')($scope.formData.currency, $scope.formData.useRelative);\n\n // Data\n $scope.data = [\n result.ud,\n result.received,\n result.sent,\n result.balance\n ];\n\n var datePatterns = {\n hour: translations['COMMON.DATE_PATTERN'],\n day: translations['COMMON.DATE_SHORT_PATTERN'],\n month: translations['COMMON.DATE_MONTH_YEAR_PATTERN']\n };\n // Labels\n var labelPattern = datePatterns[$scope.formData.rangeDuration];\n $scope.labels = result.times.reduce(function(res, time) {\n return res.concat(moment.unix(time).local().format(labelPattern));\n }, []);\n\n // Colors\n $scope.colors = gpColor.scale.fix(result.times.length);\n\n // Update range with received values\n $scope.updateRange(result.times[0], result.times[result.times.length-1], updateTimePct);\n\n // Options\n $scope.options = {\n responsive: true,\n maintainAspectRatio: true,\n title: {\n display: true,\n text: title\n },\n scales: {\n xAxes: [{\n stacked: true\n }],\n yAxes: [\n {\n id: 'y-axis-left',\n type: 'linear',\n position: 'left',\n stacked: true\n }\n ]\n },\n legend: {\n display: true,\n onClick: $scope.onLegendClick\n },\n tooltips: {\n enabled: true,\n mode: 'index',\n callbacks: {\n label: function(tooltipItems, data) {\n return data.datasets[tooltipItems.datasetIndex].label +\n ': ' +\n (!tooltipItems.yLabel ? '0' :\n (formatDecimal(tooltipItems.yLabel) + ' ' + $scope.currencySymbol));\n }\n }\n }\n };\n\n $scope.datasetOverride = [\n {\n yAxisID: 'y-axis-left',\n type: 'bar',\n label: translations['GRAPH.ACCOUNT.UD_LABEL'],\n backgroundColor: gpColor.rgba.energized(0.3),\n hoverBackgroundColor: gpColor.rgba.energized(0.5),\n borderWidth: 1\n },\n {\n yAxisID: 'y-axis-left',\n type: 'bar',\n label: translations['GRAPH.ACCOUNT.TX_RECEIVED_LABEL'],\n backgroundColor: gpColor.rgba.positive(0.4),\n hoverBackgroundColor: gpColor.rgba.positive(0.6),\n borderWidth: 1\n },\n {\n yAxisID: 'y-axis-left',\n type: 'bar',\n label: translations['GRAPH.ACCOUNT.TX_SENT_LABEL'],\n backgroundColor: gpColor.rgba.assertive(0.4),\n hoverBackgroundColor: gpColor.rgba.assertive(0.6),\n borderWidth: 1\n },\n {\n yAxisID: 'y-axis-left',\n type: 'line',\n label: translations['GRAPH.ACCOUNT.BALANCE_LABEL'],\n fill: 'origin',\n borderColor: gpColor.rgba.calm(0.5),\n borderWidth: 2,\n pointBackgroundColor: gpColor.rgba.calm(0.5),\n pointBorderColor: gpColor.rgba.white(),\n pointHoverBackgroundColor: gpColor.rgba.calm(1),\n pointHoverBorderColor: 'rgba(0,0,0,0)',\n pointRadius: 3,\n lineTension: 0.1\n }\n ];\n\n\n if (!withUD) {\n // remove UD\n $scope.data.splice(0,1);\n $scope.datasetOverride.splice(0,1);\n }\n else {\n // FIXME: fund why UD data not working well\n // remove UD\n /*$scope.data.splice(0,1);\n $scope.datasetOverride.splice(0,1);*/\n }\n });\n };\n\n $scope.onChartClick = function(data, e, item) {\n if (!item) return;\n var from = $scope.times[item._index];\n var to = moment.unix(from).utc().add(1, $scope.formData.rangeDuration).unix();\n var query = 'medianTime:>={0} AND medianTime:<{1}'.format(from, to);\n if ($scope.formData.pubkey) {\n query += ' AND (transactions.issuers:' + $scope.formData.pubkey + ' OR transactions.outputs:*' + $scope.formData.pubkey + ')';\n }\n $state.go('app.blockchain_search', {q: query});\n };\n}\n\n//TODO : Avoid csTx loading, switch to Elasticsearch\nfunction GpAccountSumTxController($scope, $controller, $filter, $state, csTx, gpColor) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('GpCurrencyAbstractCtrl', {$scope: $scope}));\n\n // When opening the view\n $scope.init= function(e, state) {\n\n // Get the pubkey (from URL params) and store it in the page context ($scope)\n $scope.pubkey = (state && state.stateParams && state.stateParams.pubkey);\n\n };\n\n // When opening the view\n $scope.load = function(e, state) {\n if (!$scope.pubkey) return;\n\n // Load account TX data\n return csTx.load($scope.pubkey, -1)\n .then(function(result) {\n\n if (result && result.tx && result.tx.history) {\n //Charts data\n $scope.inputChart = $scope.computeChartData(_.filter(result.tx.history, function(tx) {\n return tx.amount > 0;\n }));\n $scope.outputChart = $scope.computeChartData(_.filter(result.tx.history, function(tx) {\n return tx.amount < 0;\n }));\n }\n });\n };\n\n // Load chart data: received amount by pubkey\n $scope.computeChartData = function(txArray) {\n\n var formatPubkey = $filter('formatPubkey');\n\n // Sum TX amount, with a group by pubkey\n var sumByPubkeys = {};\n _.forEach(txArray, function (tx) {\n sumByPubkeys[tx.pubkey] = sumByPubkeys[tx.pubkey] || {\n label: tx.name || tx.uid || formatPubkey(tx.pubkey),\n pubkey: tx.pubkey,\n sum: 0\n };\n sumByPubkeys[tx.pubkey].sum += Math.abs(tx.amount);\n });\n\n // Get values (from the map), then sort (desc) on sum\n var sumItems = _.sortBy(_.values(sumByPubkeys), 'sum').reverse();\n\n // Divide total amount by 100\n _.each(sumItems, function(item) {\n item.sum = item.sum / 100;\n });\n\n // Return arrays expected by angular-chart\n return {\n data: _.pluck(sumItems, 'sum'),\n labels: _.pluck(sumItems, 'label'),\n pubkeys: _.pluck(sumItems, 'pubkey'),\n colors: gpColor.scale.custom(\n Math.max(10, sumItems.length) // avoid strange colors\n )\n };\n };\n\n $scope.onInputChartClick = function(data, e, item) {\n if (!item) return;\n var pubkey = $scope.inputChart.pubkeys[item._index];\n $state.go('app.wot_identity', {pubkey: pubkey});\n };\n\n $scope.onOutputChartClick = function(data, e, item) {\n if (!item) return;\n var pubkey = $scope.outputChart.pubkeys[item._index];\n $state.go('app.wot_identity', {pubkey: pubkey});\n };\n}\n\n\n/**\n * Graph that display received/sent certification\n */\nfunction GpAccountCertificationController($scope, $controller, $q, $state, $filter, $translate, gpData, gpColor, csWallet) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('GpCurrencyAbstractCtrl', {$scope: $scope}));\n\n $scope.init = function(e, state) {\n if (state && state.stateParams && state.stateParams.pubkey) { // Currency parameter\n $scope.formData.pubkey = state.stateParams.pubkey;\n }\n else if(csWallet.isLogin()) {\n $scope.formData.pubkey = csWallet.data.pubkey;\n }\n\n // for DEV only\n //$scope.formData.pubkey = '38MEAZN68Pz1DTvT3tqgxx4yQP6snJCQhPqEFxbDk4aE';\n };\n\n $scope.load = function(updateTimePct) {\n\n var formData = $scope.formData;\n\n return $q.all([\n\n $translate('GRAPH.ACCOUNT.CERTIFICATION_TITLE', formData),\n\n // translate i18n keys\n $translate(['GRAPH.ACCOUNT.GIVEN_CERT_LABEL',\n 'GRAPH.ACCOUNT.RECEIVED_CERT_LABEL',\n 'GRAPH.ACCOUNT.GIVEN_CERT_DELTA_LABEL',\n 'GRAPH.ACCOUNT.RECEIVED_CERT_DELTA_LABEL',\n 'COMMON.DATE_PATTERN',\n 'COMMON.DATE_SHORT_PATTERN',\n 'COMMON.DATE_MONTH_YEAR_PATTERN']),\n\n // get data\n gpData.wot.certifications(formData)\n ])\n .then(function(result) {\n\n var title = result[0];\n var translations = result[1];\n result = result[2];\n\n if (!result || !result.times) return; // no data\n $scope.times = result.times;\n\n var formatInteger = $filter('formatInteger');\n\n // Data\n $scope.data = [\n result.deltaReceived,\n result.received,\n result.deltaGiven,\n result.given\n ];\n\n // Labels\n $scope.labels = result.labels;\n\n var displayFormats = {\n hour: translations['COMMON.DATE_PATTERN'],\n day: translations['COMMON.DATE_SHORT_PATTERN'],\n month: translations['COMMON.DATE_MONTH_YEAR_PATTERN']\n };\n var displayFormat = displayFormats[$scope.formData.rangeDuration];\n // Labels\n $scope.labels = result.times.reduce(function(res, time) {\n return res.concat(moment.unix(time).local().format(displayFormat));\n }, []);\n\n // Colors\n $scope.colors = gpColor.scale.fix(result.times.length);\n\n // Update options with received values\n $scope.updateRange(result.times[0], result.times[result.times.length-1], updateTimePct);\n\n // Options\n $scope.options = {\n responsive: true,\n maintainAspectRatio: true,\n title: {\n display: true,\n text: title\n },\n scales: {\n yAxes: [\n {\n id: 'y-axis-left',\n type: 'linear',\n position: 'left'\n },\n {\n id: 'y-axis-hide',\n type: 'linear',\n display: false,\n position: 'right'\n }\n ]\n },\n legend: {\n display: true\n },\n tooltips: {\n enabled: true,\n mode: 'index',\n callbacks: {\n label: function(tooltipItems, data) {\n // Should add a '+' before value ?\n var addPlus = (tooltipItems.datasetIndex === 0 || tooltipItems.datasetIndex === 2) && tooltipItems.yLabel > 0;\n return data.datasets[tooltipItems.datasetIndex].label +\n ': ' +\n (addPlus ? '+' : '') +\n !tooltipItems.yLabel ? '0' : formatInteger(tooltipItems.yLabel);\n }\n }\n }\n };\n\n $scope.datasetOverride = [\n {\n yAxisID: 'y-axis-left',\n type: 'bar',\n label: translations['GRAPH.ACCOUNT.RECEIVED_CERT_DELTA_LABEL'],\n borderColor: gpColor.rgba.positive(0.6),\n borderWidth: 1,\n backgroundColor: gpColor.rgba.positive(0.4),\n hoverBackgroundColor: gpColor.rgba.positive(0.6)\n },\n {\n yAxisID: 'y-axis-left',\n type: 'line',\n label: translations['GRAPH.ACCOUNT.RECEIVED_CERT_LABEL'],\n fill: false,\n borderColor: gpColor.rgba.positive(0.5),\n borderWidth: 2,\n backgroundColor: gpColor.rgba.positive(1),\n pointBackgroundColor: gpColor.rgba.positive(0.5),\n pointBorderColor: gpColor.rgba.white(),\n pointHoverBackgroundColor: gpColor.rgba.positive(1),\n pointHoverBorderColor: 'rgba(0,0,0,0)',\n pointRadius: 3\n },\n {\n yAxisID: 'y-axis-left',\n type: 'bar',\n label: translations['GRAPH.ACCOUNT.GIVEN_CERT_DELTA_LABEL'],\n borderColor: gpColor.rgba.assertive(0.6),\n borderWidth: 1,\n backgroundColor: gpColor.rgba.assertive(0.4),\n hoverBackgroundColor: gpColor.rgba.assertive(0.6)\n },\n {\n yAxisID: 'y-axis-left',\n type: 'line',\n label: translations['GRAPH.ACCOUNT.GIVEN_CERT_LABEL'],\n fill: false,\n borderColor: gpColor.rgba.assertive(0.4),\n borderWidth: 2,\n backgroundColor: gpColor.rgba.assertive(1),\n pointBackgroundColor: gpColor.rgba.assertive(0.4),\n pointBorderColor: gpColor.rgba.white(),\n pointHoverBackgroundColor: gpColor.rgba.assertive(1),\n pointHoverBorderColor: 'rgba(0,0,0,0)',\n pointRadius: 3,\n lineTension: 0.1\n }\n ];\n });\n };\n\n $scope.onChartClick = function(data, e, item) {\n if (!item) return;\n var from = $scope.times[item._index];\n var to = moment.unix(from).utc().add(1, $scope.formData.rangeDuration).unix();\n var query = '_exists_:transactions AND medianTime:>={0} AND medianTime:<{1}'.format(from, to);\n if ($scope.formData.pubkey) {\n query += ' AND (transactions.issuers:' + $scope.formData.pubkey + ' OR transactions.outputs:*' + $scope.formData.pubkey + ')';\n }\n $state.go('app.blockchain_search', {q: query});\n };\n}\n","\nGpDocStatsController.$inject = ['$scope', '$state', '$controller', '$q', '$translate', 'gpColor', 'gpData', '$filter'];\nangular.module('cesium.graph.docstats.controllers', ['chart.js', 'cesium.graph.services', 'cesium.graph.common.controllers'])\n\n .config(['$stateProvider', 'PluginServiceProvider', 'csConfig', function($stateProvider, PluginServiceProvider, csConfig) {\n 'ngInject';\n\n $stateProvider\n .state('app.doc_stats_lg', {\n url: \"/network/data/stats/:server?stepUnit&t&hide&scale&useSsl&useTor\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/graph/templates/docstats/view_stats.html\",\n controller: 'GpDocStatsCtrl'\n }\n }\n })\n\n // Deprecated URL\n .state('app.doc_stats_lg_old', {\n url: \"/data/stats?stepUnit&t&hide&scale&useSsl&useTor\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/graph/templates/docstats/view_stats.html\",\n controller: 'GpDocStatsCtrl'\n }\n }\n });\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // TODO: add buttons to link with doc stats\n }\n }])\n\n\n .controller('GpDocStatsCtrl', GpDocStatsController)\n;\n\nfunction GpDocStatsController($scope, $state, $controller, $q, $translate, gpColor, gpData, $filter) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('GpCurrencyAbstractCtrl', {$scope: $scope}));\n\n $scope.formData.rangeDuration = 'month';\n\n $scope.displayRightAxis = true;\n $scope.hiddenDatasets = [];\n\n $scope.chartIdPrefix = 'docstats-chart-';\n $scope.charts = [\n\n // User count\n {\n id: 'user',\n title: 'GRAPH.DOC_STATS.USER.TITLE',\n series: [\n {\n key: 'user_profile',\n label: 'GRAPH.DOC_STATS.USER.USER_PROFILE',\n color: gpColor.rgba.royal(0.7),\n pointHoverBackgroundColor: gpColor.rgba.royal(),\n clickState: {\n name: 'app.document_search',\n params: {index:'user', type: 'profile'}\n }\n },\n {\n key: 'user_settings',\n label: 'GRAPH.DOC_STATS.USER.USER_SETTINGS',\n color: gpColor.rgba.gray(0.5),\n pointHoverBackgroundColor: gpColor.rgba.gray(),\n clickState: {\n name: 'app.document_search',\n params: {index:'user', type: 'settings'}\n }\n }\n ]\n },\n\n // User delta\n {\n id: 'user_delta',\n title: 'GRAPH.DOC_STATS.USER_DELTA.TITLE',\n series: [\n {\n key: 'user_profile_delta',\n label: 'GRAPH.DOC_STATS.USER_DELTA.USER_PROFILE',\n type: 'line',\n yAxisID: 'y-axis-delta',\n color: gpColor.rgba.royal(),\n pointHoverBackgroundColor: gpColor.rgba.royal()\n },\n {\n key: 'user_settings_delta',\n label: 'GRAPH.DOC_STATS.USER_DELTA.USER_SETTINGS',\n type: 'line',\n yAxisID: 'y-axis-delta',\n color: gpColor.rgba.gray(0.5),\n pointHoverBackgroundColor: gpColor.rgba.gray()\n }\n ]\n },\n\n // Message & Co.\n {\n id: 'message',\n title: 'GRAPH.DOC_STATS.MESSAGE.TITLE',\n series: [\n {\n key: 'message_inbox',\n label: 'GRAPH.DOC_STATS.MESSAGE.MESSAGE_INBOX',\n color: gpColor.rgba.royal(),\n pointHoverBackgroundColor: gpColor.rgba.royal(),\n clickState: {\n name: 'app.document_search',\n params: {index:'message', type: 'inbox'}\n }\n },\n {\n key: 'message_outbox',\n label: 'GRAPH.DOC_STATS.MESSAGE.MESSAGE_OUTBOX',\n color: gpColor.rgba.calm(),\n pointHoverBackgroundColor: gpColor.rgba.calm(),\n clickState: {\n name: 'app.document_search',\n params: {index:'message', type: 'outbox'}\n }\n },\n {\n key: 'invitation_certification',\n label: 'GRAPH.DOC_STATS.MESSAGE.INVITATION_CERTIFICATION',\n color: gpColor.rgba.gray(0.5),\n pointHoverBackgroundColor: gpColor.rgba.gray(),\n clickState: {\n name: 'app.document_search',\n params: {index:'invitation', type: 'certification'}\n }\n }\n ]\n },\n\n // Social Page & group\n {\n id: 'social',\n title: 'GRAPH.DOC_STATS.SOCIAL.TITLE',\n series: [\n {\n key: 'page_record',\n label: 'GRAPH.DOC_STATS.SOCIAL.PAGE_RECORD',\n color: gpColor.rgba.royal(),\n pointHoverBackgroundColor: gpColor.rgba.royal(),\n clickState: {\n name: 'app.document_search',\n params: {index:'page', type: 'record'}\n }\n },\n {\n key: 'group_record',\n label: 'GRAPH.DOC_STATS.SOCIAL.GROUP_RECORD',\n color: gpColor.rgba.calm(),\n pointHoverBackgroundColor: gpColor.rgba.calm(),\n clickState: {\n name: 'app.document_search',\n params: {index:'group', type: 'record'}\n }\n },\n {\n key: 'page_comment',\n label: 'GRAPH.DOC_STATS.SOCIAL.PAGE_COMMENT',\n color: gpColor.rgba.gray(0.5),\n pointHoverBackgroundColor: gpColor.rgba.gray(),\n clickState: {\n name: 'app.document_search',\n params: {index:'page', type: 'comment'}\n }\n }\n ]\n },\n\n // Other: deletion, doc, etc.\n {\n id: 'other',\n title: 'GRAPH.DOC_STATS.OTHER.TITLE',\n series: [\n {\n key: 'history_delete',\n label: 'GRAPH.DOC_STATS.OTHER.HISTORY_DELETE',\n color: gpColor.rgba.gray(0.5),\n pointHoverBackgroundColor: gpColor.rgba.gray(),\n clickState: {\n name: 'app.document_search',\n params: {index:'history', type: 'delete'}\n }\n }\n ]\n }\n ];\n\n var formatInteger = $filter('formatInteger');\n\n $scope.defaultChartOptions = {\n responsive: true,\n maintainAspectRatio: $scope.maintainAspectRatio,\n title: {\n display: true\n },\n legend: {\n display: true,\n onClick: $scope.onLegendClick\n },\n scales: {\n xAxes: [{\n stacked: true\n }],\n yAxes: [\n {\n id: 'y-axis',\n stacked: true\n },\n {\n id: 'y-axis-delta',\n stacked: false\n },\n {\n id: 'y-axis-delta-right',\n stacked: false,\n display: $scope.displayRightAxis,\n position: 'right',\n gridLines: {\n drawOnChartArea: false\n }\n }\n ]\n },\n tooltips: {\n enabled: true,\n mode: 'index',\n callbacks: {\n label: function(tooltipItems, data) {\n return data.datasets[tooltipItems.datasetIndex].label +\n ': ' + formatInteger(tooltipItems.yLabel);\n }\n }\n }\n };\n\n $scope.init = function(e, state) {\n if (state && state.stateParams) {\n // Manage URL parameters\n\n var server = state.stateParams && state.stateParams.server || undefined;\n if (server) {\n console.debug(\"[docstats] Will use server: \" + server);\n angular.merge($scope.formData, {\n server: state.stateParams.server,\n useSsl: state.stateParams.useSsl,\n useTor: state.stateParams.useTor\n });\n }\n }\n };\n\n $scope.load = function(updateTimePct) {\n\n return $q.all([\n // Get i18n keys (chart title, series labels, date patterns)\n $translate($scope.charts.reduce(function(res, chart) {\n return res.concat(chart.series.reduce(function(res, serie) {\n return res.concat(serie.label);\n }, [chart.title]));\n }, [\n 'COMMON.DATE_PATTERN',\n 'COMMON.DATE_SHORT_PATTERN',\n 'COMMON.DATE_MONTH_YEAR_PATTERN'\n ])),\n\n // get Data\n gpData.docstat.get($scope.formData)\n ])\n .then(function(result) {\n var translations = result[0];\n var datePatterns = {\n hour: translations['COMMON.DATE_PATTERN'],\n day: translations['COMMON.DATE_SHORT_PATTERN'],\n month: translations['COMMON.DATE_MONTH_YEAR_PATTERN']\n };\n\n result = result[1];\n if (!result || !result.times) return; // no data\n $scope.times = result.times;\n\n // Labels\n var labelPattern = datePatterns[$scope.formData.rangeDuration];\n $scope.labels = _.map(result.times, function(time) {\n return moment.unix(time).local().format(labelPattern);\n });\n\n // Update range options with received values\n $scope.updateRange(result.times[0], result.times[result.times.length-1], updateTimePct);\n\n $scope.setScale($scope.scale);\n\n // For each chart\n _.forEach($scope.charts, function(chart){\n\n // Prepare chart data\n var usedYAxisIDs = {};\n chart.data = _.map(chart.series, function(serie) {\n usedYAxisIDs[serie.yAxisID||'y-axis'] = true;\n // If 'delta' serie, then compute delta from the source serie\n if (serie.key.endsWith('_delta')) {\n var key = serie.key.substring(0, serie.key.length - '_delta'.length);\n return getDeltaFromValueArray(result[key]) || [];\n }\n return result[serie.key]||[];\n });\n\n // Options (with title)\n chart.options = angular.copy($scope.defaultChartOptions);\n chart.options.title.text = translations[chart.title];\n\n // Remove unused yAxis\n chart.options.scales.yAxes = chart.options.scales.yAxes.reduce(function(res, yAxe){\n return usedYAxisIDs[yAxe.id] ? res.concat(yAxe) : res;\n }, []);\n\n // Series datasets\n chart.datasetOverride = _.map(chart.series, function(serie) {\n return {\n yAxisID: serie.yAxisID || 'y-axis',\n type: serie.type || 'line',\n label: translations[serie.label],\n fill: serie.type !== 'line',\n borderWidth: 2,\n pointRadius: serie.type !== 'line' ? 0 : 2,\n pointHitRadius: 4,\n pointHoverRadius: 3,\n borderColor: serie.color,\n backgroundColor: serie.color,\n pointBackgroundColor: serie.color,\n pointBorderColor: serie.color,\n pointHoverBackgroundColor: serie.pointHoverBackgroundColor||serie.color,\n pointHoverBorderColor: serie.pointHoverBorderColor||gpColor.rgba.white()\n };\n });\n });\n });\n\n };\n\n $scope.onChartClick = function(data, e, item) {\n if (!item) return;\n var chart = _.find($scope.charts , function(chart) {\n return ($scope.chartIdPrefix + chart.id) === item._chart.canvas.id;\n });\n\n var serie = chart && chart.series[item._datasetIndex];\n var from = $scope.times[item._index];\n var to = moment.unix(from).utc().add(1, $scope.formData.rangeDuration).unix();\n\n if (serie && serie.clickState && serie.clickState.name) {\n var stateParams = serie.clickState.params ? angular.copy(serie.clickState.params) : {};\n\n // Compute query\n stateParams.q = 'time:>={0} AND time:<{1}'.format(from, to);\n\n return $state.go(serie.clickState.name, stateParams);\n }\n else if (serie) {\n console.debug('Click on item index={0} on range [{1},{2}]'.format(item._index, from, to));\n }\n };\n\n function getDeltaFromValueArray(values) {\n if (!values) return undefined;\n var previousValue;\n return _.map(values, function(value) {\n var newValue = (value !== undefined && previousValue !== undefined) ? (value - (previousValue || value)) : undefined;\n previousValue = value;\n return newValue;\n });\n }\n\n}\n","\nGpSynchroController.$inject = ['$scope', '$controller', '$q', '$translate', 'gpColor', 'gpData', '$filter'];\nangular.module('cesium.graph.synchro.controllers', ['chart.js', 'cesium.graph.services', 'cesium.graph.common.controllers'])\n\n .config(['$stateProvider', 'PluginServiceProvider', 'csConfig', function($stateProvider, PluginServiceProvider, csConfig) {\n 'ngInject';\n\n $stateProvider\n .state('app.doc_synchro_lg', {\n url: \"/network/data/synchro/:server?stepUnit&t&hide&scale&useSsl&useTor\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/graph/templates/synchro/view_stats.html\",\n controller: \"GpSynchroCtrl\"\n }\n }\n })\n\n // Deprecated URL\n .state('app.doc_synchro_lg_old', {\n url: \"/data/synchro?stepUnit&t&hide&scale&useSsl&useTor\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/graph/templates/synchro/view_stats.html\",\n controller: \"GpSynchroCtrl\"\n }\n }\n })\n ;\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // TODO: add buttons to link with doc stats\n }\n }])\n\n\n .controller('GpSynchroCtrl', GpSynchroController)\n;\n\nfunction GpSynchroController($scope, $controller, $q, $translate, gpColor, gpData, $filter) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('GpCurrencyAbstractCtrl', {$scope: $scope}));\n\n $scope.formData.rangeDuration = 'month';\n\n $scope.hiddenDatasets = [];\n\n $scope.charts = [\n\n // Execution: number of doc\n {\n id: 'count',\n title: 'GRAPH.SYNCHRO.COUNT.TITLE',\n series: [\n {\n key: 'inserts',\n type: 'bar',\n label: 'GRAPH.SYNCHRO.COUNT.INSERTS',\n color: gpColor.rgba.royal(),\n pointHoverBackgroundColor: gpColor.rgba.royal()\n },\n {\n key: 'updates',\n type: 'bar',\n label: 'GRAPH.SYNCHRO.COUNT.UPDATES',\n color: gpColor.rgba.calm(),\n pointHoverBackgroundColor: gpColor.rgba.calm()\n },\n {\n key: 'deletes',\n type: 'bar',\n label: 'GRAPH.SYNCHRO.COUNT.DELETES',\n color: gpColor.rgba.assertive(0.5),\n pointHoverBackgroundColor: gpColor.rgba.assertive()\n }\n ]\n },\n\n // Execution: number of peers\n {\n id: 'peer',\n title: 'GRAPH.SYNCHRO.PEER.TITLE',\n series: [\n {\n key: 'ES_USER_API',\n label: 'GRAPH.SYNCHRO.PEER.ES_USER_API',\n color: gpColor.rgba.royal(),\n pointHoverBackgroundColor: gpColor.rgba.royal()\n },\n {\n key: 'ES_SUBSCRIPTION_API',\n label: 'GRAPH.SYNCHRO.PEER.ES_SUBSCRIPTION_API',\n color: gpColor.rgba.gray(0.5),\n pointHoverBackgroundColor: gpColor.rgba.gray()\n }\n ]\n },\n\n // Execution: number of peers\n {\n id: 'performance',\n title: 'GRAPH.SYNCHRO.PERFORMANCE.TITLE',\n series: [\n {\n key: 'duration',\n type: 'bar',\n label: 'GRAPH.SYNCHRO.PERFORMANCE.DURATION',\n color: gpColor.rgba.gray(0.5),\n pointHoverBackgroundColor: gpColor.rgba.gray()\n }\n ]\n }\n ];\n\n var formatInteger = $filter('formatInteger');\n\n $scope.defaultChartOptions = {\n responsive: true,\n maintainAspectRatio: $scope.maintainAspectRatio,\n title: {\n display: true\n },\n legend: {\n display: true,\n onClick: $scope.onLegendClick\n },\n scales: {\n xAxes: [{\n stacked: true\n }],\n yAxes: [\n {\n stacked: true,\n id: 'y-axis'\n }\n ]\n },\n tooltips: {\n enabled: true,\n mode: 'index',\n callbacks: {\n label: function(tooltipItems, data) {\n return data.datasets[tooltipItems.datasetIndex].label +\n ': ' + formatInteger(tooltipItems.yLabel);\n }\n }\n }\n };\n\n $scope.init = function(e, state) {\n if (state && state.stateParams) {\n // Manage URL parameters\n var server = state.stateParams && state.stateParams.server || undefined;\n if (server) {\n console.debug(\"[synchro] Will use server: \" + server);\n angular.merge($scope.formData, state.stateParams);\n }\n }\n };\n\n $scope.load = function(updateTimePct) {\n\n return $q.all([\n // Get i18n keys (chart title, series labels, date patterns)\n $translate($scope.charts.reduce(function(res, chart) {\n return res.concat(chart.series.reduce(function(res, serie) {\n return res.concat(serie.label);\n }, [chart.title]));\n }, [\n 'COMMON.DATE_PATTERN',\n 'COMMON.DATE_SHORT_PATTERN',\n 'COMMON.DATE_MONTH_YEAR_PATTERN'\n ])),\n\n // get Data\n gpData.synchro.execution.get($scope.formData)\n ])\n .then(function(result) {\n var translations = result[0];\n var datePatterns = {\n hour: translations['COMMON.DATE_PATTERN'],\n day: translations['COMMON.DATE_SHORT_PATTERN'],\n month: translations['COMMON.DATE_MONTH_YEAR_PATTERN']\n };\n\n result = result[1];\n if (!result || !result.times) return; // no data\n $scope.times = result.times;\n\n // Labels\n var labelPattern = datePatterns[$scope.formData.rangeDuration];\n $scope.labels = result.times.reduce(function(res, time) {\n return res.concat(moment.unix(time).local().format(labelPattern));\n }, []);\n\n // Update range options with received values\n $scope.updateRange(result.times[0], result.times[result.times.length-1], updateTimePct);\n\n $scope.setScale($scope.scale);\n\n // For each chart\n _.forEach($scope.charts, function(chart){\n\n // Data\n chart.data = [];\n _.forEach(chart.series, function(serie){\n chart.data.push(result[serie.key]||[]);\n });\n\n // Options (with title)\n chart.options = angular.copy($scope.defaultChartOptions);\n chart.options.title.text = translations[chart.title];\n\n // Series datasets\n chart.datasetOverride = chart.series.reduce(function(res, serie) {\n return res.concat({\n yAxisID: 'y-axis',\n type: serie.type || 'line',\n label: translations[serie.label],\n fill: true,\n borderWidth: 2,\n pointRadius: 0,\n pointHitRadius: 4,\n pointHoverRadius: 3,\n borderColor: serie.color,\n backgroundColor: serie.color,\n pointBackgroundColor: serie.color,\n pointBorderColor: serie.color,\n pointHoverBackgroundColor: serie.pointHoverBackgroundColor||serie.color,\n pointHoverBorderColor: serie.pointHoverBorderColor||gpColor.rgba.white()\n });\n }, []);\n });\n });\n };\n}\n","\nMapEditPositionAbstractController.$inject = ['$scope', '$timeout', '$q', 'MapUtils', '$translate'];\nangular.module('cesium.map.common.controllers', ['cesium.services', 'cesium.map.services'])\n\n .controller('MapEditPositionAbstractCtrl', MapEditPositionAbstractController)\n\n;\n\n/**\n * An abstract controller, that allow to edit psotion, using a map view (e.g. used by profile and page edition)\n * @param $scope\n * @param $timeout\n * @param $q\n * @param MapUtils\n * @param $translate\n * @constructor\n */\nfunction MapEditPositionAbstractController($scope, $timeout, $q, MapUtils, $translate) {\n 'ngInject';\n\n var listeners = [];\n $scope.mapId = 'map-user-profile-' + $scope.$id;\n $scope.map = MapUtils.map({\n markers: {},\n center: {\n zoom: 13\n }\n });\n $scope.loading = true;\n $scope.mapId = $scope.mapId || 'map-abstract-' + $scope.$id; // Should have beed override by sub-controllers\n\n $scope.enter = function(e, state) {\n\n // Wait parent controller load the profile\n if (!$scope.formData || (!$scope.formData.title && !$scope.formData.geoPoint)) {\n return $timeout($scope.enter, 500);\n }\n\n $scope.loading = true;\n return $scope.load();\n };\n $scope.$on('$csExtension.enter', $scope.enter);\n $scope.$on('$ionicParentView.enter', $scope.enter);\n\n $scope.load = function() {\n\n // no position define: remove existing listener\n if (!$scope.formData.geoPoint || !$scope.formData.geoPoint.lat || !$scope.formData.geoPoint.lon) {\n _.forEach(listeners, function(listener){\n listener(); // unlisten\n });\n listeners = [];\n delete $scope.map.markers.geoPoint;\n $scope.loading = false;\n return $q.when();\n }\n\n // If no marker exists on map: create it\n if (!$scope.map.markers.geoPoint) {\n\n return $translate('MAP.PROFILE.MARKER_HELP')\n .then(function(helpText) {\n\n $scope.map.markers.geoPoint = {\n message: helpText,\n lat: parseFloat($scope.formData.geoPoint.lat),\n lng: parseFloat($scope.formData.geoPoint.lon),\n draggable: true,\n focus: true\n };\n angular.extend($scope.map.center, {\n lat: $scope.map.markers.geoPoint.lat,\n lng: $scope.map.markers.geoPoint.lng\n });\n\n // Listening changes\n var listener = $scope.$watch('map.markers.geoPoint', function() {\n if ($scope.loading) return;\n if ($scope.map.markers.geoPoint && $scope.map.markers.geoPoint.lat && $scope.map.markers.geoPoint.lng) {\n $scope.formData.geoPoint = $scope.formData.geoPoint || {};\n $scope.formData.geoPoint.lat = $scope.map.markers.geoPoint.lat;\n $scope.formData.geoPoint.lon = $scope.map.markers.geoPoint.lng;\n }\n }, true);\n listeners.push(listener);\n\n\n // Make sure map appear, if shown later\n if (!$scope.ionItemClass) {\n $scope.ionItemClass = 'done in';\n }\n\n $scope.loading = false;\n });\n }\n\n // Marker exists: update lat/lon\n else {\n $scope.map.markers.geoPoint.lat = $scope.formData.geoPoint.lat;\n $scope.map.markers.geoPoint.lng = $scope.formData.geoPoint.lon;\n }\n };\n\n\n $scope.$watch('formData.geoPoint', function() {\n if ($scope.loading) return;\n $scope.load();\n }, true);\n\n}\n","\nMapWotViewController.$inject = ['$scope', '$filter', '$templateCache', '$interpolate', '$timeout', '$location', '$translate', '$q', '$controller', 'ionicReady', 'leafletData', 'UIUtils', 'csSettings', 'csWallet', 'MapUtils', 'mapWot'];\nangular.module('cesium.map.wot.controllers', ['cesium.services', 'cesium.map.services', 'cesium.map.help.controllers'])\n\n .config(['$stateProvider', 'PluginServiceProvider', 'csConfig', function($stateProvider, PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n\n PluginServiceProvider\n\n .extendState('app.wot_lookup.tab_search', {\n points: {\n 'nav-buttons': {\n template: '<button class=\"button button-icon button-clear\" ui-sref=\"app.view_wot_map\"><i class=\"icon ion-ios-location\"></i></button>'\n }\n }\n })\n\n .extendState('app.wot_lookup_lg', {\n points: {\n 'filter-buttons': {\n templateUrl: \"plugins/map/templates/wot/lookup_lg_extend.html\",\n controller: \"ESExtensionCtrl\"\n }\n }\n });\n\n $stateProvider\n .state('app.view_wot_map', {\n url: \"/wot/map?c&center\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/map/templates/wot/view_map.html\",\n controller: 'MapWotViewCtrl'\n }\n },\n // Seems to works without cache ??\n //cache: false,\n data: {\n silentLocationChange: true\n }\n });\n }\n }])\n\n // Map view of the WOT\n .controller('MapWotViewCtrl', MapWotViewController)\n\n;\n\n\nfunction MapWotViewController($scope, $filter, $templateCache, $interpolate, $timeout, $location, $translate, $q, $controller,\n ionicReady,\n leafletData, UIUtils, csSettings, csWallet, MapUtils, mapWot) {\n 'ngInject';\n\n // Initialize the super classes and extend it.\n angular.extend(this, $controller('WotIdentityAbstractCtrl', { $scope: $scope}));\n angular.extend(this, $controller('ESWotIdentityViewCtrl', {$scope: $scope}));\n\n var\n // Create a hidden layer, to hold search markers\n markersSearchLayer,\n icons= {\n member: {\n type: 'awesomeMarker',\n icon: 'person',\n markerColor: 'blue'\n },\n pending: {\n type: 'awesomeMarker',\n icon: 'clock',\n markerColor: 'lightgreen',\n iconColor: 'gray'\n },\n wallet: {\n type: 'awesomeMarker',\n icon: 'key',\n markerColor: 'lightgray'\n }\n };\n\n $scope.loading = true;\n $scope.loadingMarker = true;\n $scope.mapId = 'map-wot-' + $scope.$id;\n\n $scope.map = MapUtils.map({\n cache: 'map-wot',\n layers: {\n overlays: {\n\n // User profile\n member: {\n type: 'featureGroup',\n name: 'MAP.WOT.VIEW.LAYER.MEMBER',\n visible: true\n },\n pending: {\n type: 'featureGroup',\n name: 'MAP.WOT.VIEW.LAYER.PENDING',\n visible: true\n },\n wallet: {\n type: 'featureGroup',\n name: 'MAP.WOT.VIEW.LAYER.WALLET',\n visible: true\n }\n }\n },\n bounds: {},\n markers: {},\n loading: true\n }, $scope.mapId);\n\n // Variables for marker\n $scope.showDescription = false;\n ionicReady().then(function() {\n $scope.enableDescription = !UIUtils.screen.isSmall() && ionic.Platform.grade.toLowerCase() === 'a';\n if (!$scope.enableDescription) {\n console.debug(\"[map] [wot] Disable profile description.\", ionic.Platform.grade);\n }\n });\n\n $scope.$on('$ionicView.beforeEnter', function (event, viewData) {\n // Enable back button (workaround need for navigation outside tabs - https://stackoverflow.com/a/35064602)\n viewData.enableBack = UIUtils.screen.isSmall() ? true : viewData.enableBack;\n });\n\n $scope.enter = function(e, state) {\n\n if ($scope.loading) {\n\n UIUtils.loading.show({\n noBackdrop: true // avoid a too long release\n });\n if (state.stateParams && state.stateParams.c) {\n var cPart = state.stateParams.c.split(':');\n $scope.map.center.lat = parseFloat(cPart[0]);\n $scope.map.center.lng = parseFloat(cPart[1]);\n $scope.map.center.zoom = parseInt(cPart[2]);\n }\n\n $scope.$watch(\"map.center\", function() {\n if (!$scope.loading) {\n return $timeout(function() {\n $scope.updateLocationHref();\n }, 300);\n }\n }, true);\n\n // Load the map (and init if need)\n var now = Date.now();\n $scope.loadMap()\n .then($scope.load)\n .then(function() {\n console.debug(\"[map] [wot] Loaded in \"+ (Date.now() - now) +\"ms\");\n\n $scope.showHelpTip();\n });\n }\n else {\n // Make sure to have previous center coordinate defined in the location URL\n $scope.updateLocationHref();\n $scope.showHelpTip();\n }\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.loadMap = function() {\n return $q.all([\n $translate(['COMMON.BTN_HELP_TOUR_SCREEN', 'COMMON.BTN_REFRESH', 'MAP.COMMON.BTN_LOCALIZE_ME']),\n leafletData.getMap($scope.mapId)\n ]).then(function(res) {\n var translations = res[0];\n var map = res[1];\n if (!$scope.map.loading) return map; // already loaded\n\n if (!UIUtils.screen.isSmall()) {\n // Add a start tour button\n L.easyButton({\n position: 'topright', // inherited from L.Control -- the corner it goes in\n type: 'replace', // set to animate when you're comfy with css\n leafletClasses: true, // use leaflet classes to style the button?\n states:[{ // specify different icons and responses for your button\n stateName: 'show-help-tour',\n onClick: $scope.startHelpTour,\n title: translations['COMMON.BTN_HELP_TOUR_SCREEN'],\n icon: 'icon ion-easel'\n }]\n }\n ).addTo(map);\n\n // Add a refresh button\n L.easyButton({\n position: 'topright', // inherited from L.Control -- the corner it goes in\n type: 'replace', // set to animate when you're comfy with css\n leafletClasses: true, // use leaflet classes to style the button?\n states:[{ // specify different icons and responses for your button\n stateName: 'refresh',\n onClick: function(btn, map){\n return $scope.load(map);\n },\n title: translations['COMMON.BTN_REFRESH'],\n icon: 'icon ion-refresh'\n }]\n }\n ).addTo(map);\n }\n\n // Add loading control\n L.Control.loading({\n position: 'topright',\n separate: true\n }).addTo(map);\n\n // Add localize me control\n MapUtils.control.localizeMe({\n title: translations['MAP.COMMON.BTN_LOCALIZE_ME']\n })\n .addTo(map);\n\n // Add search control\n markersSearchLayer = L.layerGroup({visible: false});\n var searchTip = $interpolate($templateCache.get('plugins/map/templates/wot/item_search_tooltip.html'));\n MapUtils.control.search({\n layer: markersSearchLayer,\n propertyName: 'title',\n buildTip: function (text, val) {\n return searchTip(val.layer.options);\n },\n moveToLocation: function(lnglat, title, map) {\n if(this.options.zoom)\n this._map.setView(lnglat, this.options.zoom);\n else\n this._map.panTo(lnglat);\n var popupMarkerId = lnglat.layer && lnglat.layer.options && lnglat.layer.options.popupMarkerId;\n $timeout(function(){\n var popupMarker = popupMarkerId && _.find(map._layers, function(layer) {\n return (layer.options && layer.options.id === popupMarkerId);\n });\n if (popupMarker) popupMarker.openPopup();\n }, 400);\n },\n firstTipSubmit: true,\n tooltipLimit: 50\n }).addTo(map);\n\n // Add marker cluster layer\n var extractMarkerLayer = function(marker) {\n return marker.options && marker.options.layer;\n };\n var markerClusterLayer = L.markerClusterGroup({\n disableClusteringAtZoom: MapUtils.constants.LOCALIZE_ZOOM,\n maxClusterRadius: 65,\n showCoverageOnHover: false,\n iconCreateFunction: function (cluster) {\n var countByLayer = _.countBy(cluster.getAllChildMarkers(), extractMarkerLayer);\n var markerColor = countByLayer.member ? 'blue' : (countByLayer.pending ? 'lightgreen' : 'lightgray');\n var childCount = cluster.getChildCount();\n var className = 'marker-cluster ' + markerColor + ' marker-cluster-';\n if (childCount < 10) {\n className += 'small';\n } else if (childCount < 100) {\n className += 'medium';\n } else {\n className += 'large';\n }\n return L.divIcon({ html: '<div><span>' + childCount + '</span></div>', className: className, iconSize: new L.Point(40, 40) });\n }\n });\n map.eachLayer(function(layer) {\n // Add capabilities of 'featureGroup.subgroup', if layer is a group\n if (layer.addLayer){\n angular.extend(layer, L.featureGroup.subGroup(markerClusterLayer));\n }\n });\n markerClusterLayer.addTo(map);\n\n // Bind map with options (e.g. to received overlays visibility updates)\n // Cache no more need, as view is not cached\n //MapUtils.cache.bind($scope, $scope.mapId, $scope.map);\n\n $scope.map.loading = false;\n\n return map;\n });\n };\n\n // Load markers data\n $scope.load = function(map) {\n if (!map) {\n return leafletData.getMap($scope.mapId)\n // loop with the map object\n .then($scope.load);\n }\n\n $scope.loading = true;\n // Show loading indicator\n map.fire('dataloading');\n\n var options = {\n fields: {\n description: $scope.enableDescription\n }\n };\n\n // add bounding box\n if ($scope.map.bounds) {\n // FIXME - this is not working well\n //options.bounds = angular.copy($scope.map.bounds);\n //delete options.bounds.options;\n }\n\n // Load wot data, from service\n return mapWot.load(options)\n\n .then(function(res) {\n var markers = {};\n\n // Clean search layer\n markersSearchLayer.clearLayers();\n\n if (res && res.length) {\n\n var formatPubkey = $filter('formatPubkey');\n var markerTemplate = $templateCache.get('plugins/map/templates/wot/popup_marker.html');\n\n _.forEach(res, function (hit) {\n var type = hit.pending ? 'pending' : (hit.uid ? 'member' : 'wallet');\n var shortPubkey = formatPubkey(hit.pubkey);\n var id = hit.index + '_' + (hit.id || (hit.uid ? (hit.uid + ':' + hit.pubkey) : hit.pubkey)).replace(/-/g, '_');\n var marker = {\n layer: type,\n icon: icons[type],\n opacity: hit.uid ? 1 : 0.7,\n title: hit.name + ' | ' + shortPubkey,\n lat: hit.geoPoint.lat,\n lng: hit.geoPoint.lon,\n getMessageScope: function () {\n var scope = $scope.$new();\n scope.loadingMarker = true;\n scope.formData = {};\n scope.$applyAsync(function() {\n scope.formData = {\n pubkey: hit.pubkey,\n uid: hit.uid,\n name: hit.name,\n profile: hit\n };\n scope.loadingMarker = false;\n });\n return scope;\n },\n focus: false,\n message: markerTemplate,\n id: id\n };\n markers[id] = marker;\n\n // Create a search marker (will be hide)\n var searchText = hit.name + ((hit.uid && hit.uid != hit.name) ? (' | ' + hit.uid) : '') + ' | ' + shortPubkey;\n var searchMarker = angular.merge({\n type: type,\n opacity: 0,\n icon: L.divIcon({\n className: type + ' ng-hide',\n iconSize: L.point(0, 0)\n })\n }, {title: searchText, pubkey: hit.pubkey, uid: hit.uid, name: hit.name, pending: hit.pending, popupMarkerId: id});\n markersSearchLayer.addLayer(new L.Marker({\n lat: hit.geoPoint.lat,\n lng: hit.geoPoint.lon\n },\n searchMarker));\n });\n }\n\n $scope.map.markers = markers;\n\n return $timeout(function(){\n $scope.loading = false;\n\n // hide loading indicator\n map.fire('dataload');\n\n UIUtils.loading.hide();\n });\n })\n .catch(function(err) {\n $scope.map.markers = {};\n $scope.loading = false;\n UIUtils.onError('MAP.WOT.ERROR.LOAD_POSITION_FAILED')(err);\n });\n };\n\n // Update the browser location, to be able to refresh the page\n $scope.updateLocationHref = function(centerHash) {\n // removeIf(device)\n var params = $location.search() || {};\n if (!params.c || !MapUtils.center.isDefault($scope.map.center)) {\n centerHash = centerHash || '{0}:{1}:{2}'.format($scope.map.center.lat.toFixed(4), $scope.map.center.lng.toFixed(4), $scope.map.center.zoom);\n $location.search({c: centerHash}).replace();\n }\n // endRemoveIf(device)\n };\n\n /* -- help tip -- */\n\n // Show help tour\n $scope.startHelpTour = function() {\n return $scope.showHelpTip(0, true);\n };\n\n // Show help tip\n $scope.showHelpTip = function(index, isTour) {\n if (!isTour && !csWallet.isLogin()) return;\n\n index = angular.isDefined(index) ? index :\n (angular.isNumber(csSettings.data.helptip.mapwot) ? csSettings.data.helptip.mapwot : 0);\n isTour = angular.isDefined(isTour) ? isTour : false;\n\n if (index < 0 || index > 2/*max steps*/) return;\n\n // Create a new scope for the tour controller\n var helptipScope = $scope.createHelptipScope(isTour, 'MapHelpTipCtrl');\n if (!helptipScope) return; // could be undefined, if a global tour already is already started\n\n // Set isTour and mapId\n helptipScope.tour = isTour;\n helptipScope.mapId = $scope.mapId;\n\n return helptipScope.startMapWotTour(index, false)\n .then(function(endIndex) {\n helptipScope.$destroy();\n csSettings.data.helptip.mapwot = angular.isNumber(csSettings.data.helptip.mapwot) ?\n Math.max(endIndex, csSettings.data.helptip.mapwot) :\n endIndex;\n csSettings.store();\n });\n };\n}\n","\nMapRegistryViewController.$inject = ['$scope', '$filter', '$templateCache', '$interpolate', '$timeout', '$location', '$translate', '$q', 'ionicReady', 'leafletData', 'UIUtils', 'csSettings', 'csWallet', 'MapUtils', 'mapRegistry'];\nMapPageEditController.$inject = ['$scope', '$controller'];\nangular.module('cesium.map.registry.controllers', ['cesium.services', 'cesium.map.services', 'cesium.map.help.controllers', 'cesium.map.common.controllers'])\n\n .config(['$stateProvider', 'PluginServiceProvider', 'csConfig', function($stateProvider, PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n\n PluginServiceProvider\n\n .extendState('app.wot_lookup.tab_registry', {\n points: {\n 'nav-buttons': {\n template: '<button class=\"button button-icon button-clear\" ui-sref=\"app.view_registry_map\"><i class=\"icon ion-ios-location\"></i></button>'\n }\n }\n })\n\n .extendState('app.registry_lookup_lg', {\n points: {\n 'filter-buttons': {\n templateUrl: \"plugins/map/templates/registry/lookup_lg_extend.html\"\n }\n }\n })\n\n .extendState('app.registry_edit_record', {\n points: {\n 'after-position': {\n templateUrl: 'plugins/map/templates/common/edit_position_extend.html',\n controller: 'MapPageEditCtrl'\n }\n }\n });\n\n $stateProvider\n .state('app.view_registry_map', {\n url: \"/wot/pagemap?c&center\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/map/templates/registry/view_map.html\",\n controller: 'MapRegistryViewCtrl'\n }\n },\n // Seems to works without cache ??\n //cache: false,\n data: {\n silentLocationChange: true\n }\n });\n }\n }])\n\n // Map view of the registry\n .controller('MapRegistryViewCtrl', MapRegistryViewController)\n\n .controller('MapPageEditCtrl', MapPageEditController)\n;\n\n\nfunction MapRegistryViewController($scope, $filter, $templateCache, $interpolate, $timeout, $location, $translate, $q,\n ionicReady, leafletData,\n UIUtils, csSettings, csWallet, MapUtils, mapRegistry) {\n 'ngInject';\n\n var\n // Create a hidden layer, to hold search markers\n markersSearchLayer,\n icons= {\n shop: {\n type: 'awesomeMarker',\n icon: 'page-shop',\n markerColor: 'blue'\n },\n company: {\n type: 'awesomeMarker',\n icon: 'page-company',\n markerColor: 'blue'\n },\n association: {\n type: 'awesomeMarker',\n icon: 'page-association',\n markerColor: 'lightgreen',\n iconColor: 'gray'\n },\n institution: {\n type: 'awesomeMarker',\n icon: 'page-institution',\n markerColor: 'lightgray'\n }\n };\n\n $scope.loading = true;\n $scope.loadingMarker = true;\n $scope.mapId = 'map-registry-' + $scope.$id;\n\n $scope.map = MapUtils.map({\n cache: 'map-registry',\n layers: {\n overlays: {\n // Pages\n shop: {\n type: 'featureGroup',\n name: 'MAP.REGISTRY.VIEW.LAYER.SHOP',\n visible: true\n },\n company: {\n type: 'featureGroup',\n name: 'MAP.REGISTRY.VIEW.LAYER.COMPANY',\n visible: true\n },\n association: {\n type: 'featureGroup',\n name: 'MAP.REGISTRY.VIEW.LAYER.ASSOCIATION',\n visible: true\n },\n institution: {\n type: 'featureGroup',\n name: 'MAP.REGISTRY.VIEW.LAYER.INSTITUTION',\n visible: true\n }\n }\n },\n bounds: {},\n markers: {},\n loading: true\n }, $scope.mapId);\n\n // Variables for marker\n $scope.formData = {};\n $scope.showDescription = false;\n ionicReady().then(function() {\n $scope.enableDescription = !UIUtils.screen.isSmall() && ionic.Platform.grade.toLowerCase() === 'a';\n if (!$scope.enableDescription) {\n console.debug(\"[map] [wot] Disable profile description.\", ionic.Platform.grade);\n }\n });\n\n $scope.$on('$ionicView.beforeEnter', function (event, viewData) {\n // Enable back button (workaround need for navigation outside tabs - https://stackoverflow.com/a/35064602)\n viewData.enableBack = UIUtils.screen.isSmall() ? true : viewData.enableBack;\n });\n\n $scope.enter = function(e, state) {\n\n if ($scope.loading) {\n if (state.stateParams && state.stateParams.c) {\n var cPart = state.stateParams.c.split(':');\n $scope.map.center.lat = parseFloat(cPart[0]);\n $scope.map.center.lng = parseFloat(cPart[1]);\n $scope.map.center.zoom = parseInt(cPart[2]);\n }\n\n $scope.$watch(\"map.center\", function() {\n if (!$scope.loading) {\n return $timeout(function() {\n $scope.updateLocationHref();\n }, 300);\n }\n }, true);\n\n // Load the map (and init if need)\n $scope.loadMap()\n .then(function() {\n if (csWallet.isLogin()) {\n $scope.showHelpTip();\n }\n return $scope.load();\n });\n }\n else {\n // Make sure to have previous center coordinate defined in the location URL\n $scope.updateLocationHref();\n if (csWallet.isLogin()) {\n $scope.showHelpTip();\n }\n }\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.loadMap = function() {\n return $q.all([\n $translate(['COMMON.BTN_HELP_TOUR_SCREEN', 'COMMON.BTN_REFRESH', 'MAP.COMMON.BTN_LOCALIZE_ME']),\n leafletData.getMap($scope.mapId)\n ]).then(function(res) {\n var translations = res[0];\n var map = res[1];\n if (!$scope.map.loading) return map; // already loaded\n\n if (!UIUtils.screen.isSmall()) {\n\n // Add a refresh button\n L.easyButton({\n position: 'topright', // inherited from L.Control -- the corner it goes in\n type: 'replace', // set to animate when you're comfy with css\n leafletClasses: true, // use leaflet classes to style the button?\n states:[{ // specify different icons and responses for your button\n stateName: 'refresh',\n onClick: function(btn, map){\n return $scope.load(map);\n },\n title: translations['COMMON.BTN_REFRESH'],\n icon: 'icon ion-refresh'\n }]\n }\n ).addTo(map);\n }\n\n // Add loading control\n L.Control.loading({\n position: 'topright',\n separate: true\n }).addTo(map);\n\n // Add localize me control\n MapUtils.control.localizeMe({\n title: translations['MAP.COMMON.BTN_LOCALIZE_ME']\n })\n .addTo(map);\n\n // Add search control\n markersSearchLayer = L.layerGroup({visible: false});\n var searchTip = $interpolate($templateCache.get('plugins/map/templates/registry/item_search_tooltip.html'));\n MapUtils.control.search({\n layer: markersSearchLayer,\n propertyName: 'title',\n buildTip: function (text, val) {\n return searchTip(val.layer.options);\n },\n moveToLocation: function(lnglat, title, map) {\n if(this.options.zoom)\n this._map.setView(lnglat, this.options.zoom);\n else\n this._map.panTo(lnglat);\n var popupMarkerId = lnglat.layer && lnglat.layer.options && lnglat.layer.options.popupMarkerId;\n $timeout(function(){\n var popupMarker = popupMarkerId && _.find(map._layers, function(layer) {\n return (layer.options && layer.options.id === popupMarkerId);\n });\n if (popupMarker) popupMarker.openPopup();\n }, 400);\n },\n firstTipSubmit: true,\n tooltipLimit: 50\n }).addTo(map);\n\n // Add marker cluster layer\n var extractMarkerLayer = function(marker) {\n return marker.options && marker.options.layer;\n };\n var markerClusterLayer = L.markerClusterGroup({\n disableClusteringAtZoom: MapUtils.constants.LOCALIZE_ZOOM,\n maxClusterRadius: 65,\n showCoverageOnHover: false,\n iconCreateFunction: function (cluster) {\n var countByLayer = _.countBy(cluster.getAllChildMarkers(), extractMarkerLayer);\n var markerColor = countByLayer.shop||countByLayer.company ? 'blue' : (countByLayer.association ? 'lightgreen' : 'lightgray');\n var childCount = cluster.getChildCount();\n var className = 'marker-cluster ' + markerColor + ' marker-cluster-';\n if (childCount < 10) {\n className += 'small';\n } else if (childCount < 100) {\n className += 'medium';\n } else {\n className += 'large';\n }\n return L.divIcon({ html: '<div><span>' + childCount + '</span></div>', className: className, iconSize: new L.Point(40, 40) });\n }\n });\n map.eachLayer(function(layer) {\n // Add capabilities of 'featureGroup.subgroup', if layer is a group\n if (layer.addLayer){\n angular.extend(layer, L.featureGroup.subGroup(markerClusterLayer));\n }\n });\n markerClusterLayer.addTo(map);\n\n // Bind map with options (e.g. to received overlays visibility updates)\n // Cache no more need, as view is not cached\n //MapUtils.cache.bind($scope, $scope.mapId, $scope.map);\n\n $scope.map.loading = false;\n return map;\n });\n };\n\n // Load markers data\n $scope.load = function(map) {\n if (!map) {\n return leafletData.getMap($scope.mapId)\n // loop with the map object\n .then($scope.load);\n }\n\n $scope.loading = true;\n // Show loading indicator\n map.fire('dataloading');\n\n var options = {\n fields: {\n description: $scope.enableDescription\n }\n };\n\n // Load wot data, from service\n return mapRegistry.load(options)\n\n .then(function(res) {\n var markers = {};\n\n // Clean search layer\n markersSearchLayer.clearLayers();\n\n if (res && res.length) {\n\n var formatPubkey = $filter('formatPubkey');\n var pageMarkerTemplate = $templateCache.get('plugins/map/templates/registry/popup_marker.html');\n\n _.forEach(res, function (hit) {\n var shortPubkey = formatPubkey(hit.pubkey);\n var id = hit.index + '_' + (hit.id).replace(/-/g, '_');\n var marker = {\n layer: hit.type,\n icon: icons[hit.type],\n opacity: 1,\n title: hit.name + ' | ' + shortPubkey,\n lat: hit.geoPoint.lat,\n lng: hit.geoPoint.lon,\n getMessageScope: function () {\n var scope = $scope.$new();\n scope.loadingMarker = true;\n scope.formData = {};\n scope.$applyAsync(function() {\n angular.extend(scope.formData, hit);\n scope.loadingMarker = false;\n });\n return scope;\n },\n focus: false,\n message: pageMarkerTemplate,\n id: id\n };\n markers[id] = marker;\n\n // Create a search marker (will be hide)\n var searchText = hit.name + ' | ' + shortPubkey;\n var searchMarker = angular.merge({\n type: hit.type,\n opacity: 0,\n icon: L.divIcon({\n className: hit.type + ' ng-hide',\n iconSize: L.point(0, 0)\n })\n }, {title: searchText, pubkey: hit.pubkey, name: hit.name, popupMarkerId: id});\n markersSearchLayer.addLayer(new L.Marker({\n lat: hit.geoPoint.lat,\n lng: hit.geoPoint.lon\n },\n searchMarker));\n });\n }\n\n $scope.map.markers = markers;\n\n $scope.loading = false;\n\n // hide loading indicator\n map.fire('dataload');\n })\n .catch(function(err) {\n $scope.map.markers = {};\n $scope.loading = false;\n UIUtils.onError('MAP.WOT.ERROR.LOAD_POSITION_FAILED')(err);\n });\n };\n\n // Update the browser location, to be able to refresh the page\n $scope.updateLocationHref = function(centerHash) {\n // removeIf(device)\n var params = $location.search() || {};\n if (!params.c || !MapUtils.center.isDefault($scope.map.center)) {\n centerHash = centerHash || '{0}:{1}:{2}'.format($scope.map.center.lat.toFixed(4), $scope.map.center.lng.toFixed(4), $scope.map.center.zoom);\n $location.search({c: centerHash}).replace();\n }\n // endRemoveIf(device)\n };\n\n // removeIf(device)\n // Update the browser location, to be able to refresh the page\n // FIXME: not need, should be removed\n $scope.$on(\"centerUrlHash\", function(event, centerHash) {\n if (!$scope.loading) {\n\n return $timeout(function() {\n $scope.updateLocationHref(centerHash);\n }, 300);\n }\n });\n // endRemoveIf(device)\n\n\n /* -- help tip -- */\n\n // Show help tour\n $scope.startHelpTour = function() {\n return $scope.showHelpTip(0, true);\n };\n\n // Show help tip\n $scope.showHelpTip = function(index, isTour) {\n index = angular.isDefined(index) ? index :\n (angular.isNumber(csSettings.data.helptip.mapwot) ? csSettings.data.helptip.mapwot : 0);\n isTour = angular.isDefined(isTour) ? isTour : false;\n\n if (index < 0 || index > 2/*max steps*/) return;\n\n // Create a new scope for the tour controller\n var helptipScope = $scope.createHelptipScope(isTour, 'MapHelpTipCtrl');\n if (!helptipScope) return; // could be undefined, if a global tour already is already started\n\n // Set isTour and mapId\n helptipScope.tour = isTour;\n helptipScope.mapId = $scope.mapId;\n\n return helptipScope.startMapWotTour(index, false)\n .then(function(endIndex) {\n helptipScope.$destroy();\n csSettings.data.helptip.mapwot = angular.isNumber(csSettings.data.helptip.mapwot) ?\n Math.max(endIndex, csSettings.data.helptip.mapwot) :\n endIndex;\n csSettings.store();\n });\n };\n}\n\n\nfunction MapPageEditController($scope, $controller) {\n 'ngInject';\n\n $scope.mapId = 'map-page-' + $scope.$id;\n\n // Initialize the super classes and extend it.\n angular.extend(this, $controller('MapEditPositionAbstractCtrl', { $scope: $scope}));\n}\n","\nMapProfileEditController.$inject = ['$scope', '$controller'];\nangular.module('cesium.map.user.controllers', ['cesium.services', 'cesium.map.services', 'cesium.map.common.controllers'])\n\n .config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n\n PluginServiceProvider\n\n .extendState('app.edit_profile', {\n points: {\n 'after-position': {\n templateUrl: 'plugins/map/templates/common/edit_position_extend.html',\n controller: 'MapProfileEditCtrl'\n }\n }\n })\n\n .extendState('app.edit_profile_by_id', {\n points: {\n 'after-position': {\n templateUrl: 'plugins/map/templates/common/edit_position_extend.html',\n controller: 'MapProfileEditCtrl'\n }\n }\n });\n }\n }])\n\n .controller('MapProfileEditCtrl', MapProfileEditController);\n\n\nfunction MapProfileEditController($scope, $controller) {\n 'ngInject';\n\n $scope.mapId = 'map-profile-' + $scope.$id;\n\n // Initialize the super classes and extend it.\n angular.extend(this, $controller('MapEditPositionAbstractCtrl', { $scope: $scope}));\n}\n","\nMapHelpTipController.$inject = ['$scope', '$controller'];\nangular.module('cesium.map.help.controllers', ['cesium.services'])\n\n .controller('MapHelpTipCtrl', MapHelpTipController)\n;\n\n\n/* ----------------------------\n* Help Tip\n* ---------------------------- */\nfunction MapHelpTipController($scope, $controller) {\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('HelpTipCtrl', {$scope: $scope}));\n\n $scope.mapId = undefined; // should be set by caller controllers\n\n /**\n * Features tour on map WOT\n * @returns {*}\n */\n $scope.startMapWotTour = function(startIndex, hasNext) {\n\n var steps = [\n\n function(){\n return $scope.showHelpTip('helptip-map-wot', {\n bindings: {\n content: 'MAP.HELP.TIP.WOT',\n icon: {\n position: 'center',\n glyph: 'ion-information-circled'\n }\n }\n });\n },\n\n function(){\n return $scope.showHelpTip(null, {\n selector: '#{0} .leaflet-control-search'.format($scope.mapId),\n bindings: {\n content: 'MAP.HELP.TIP.WOT_BTN_SEARCH',\n icon: {\n position: 'center'\n }\n }\n });\n },\n\n function () {\n return $scope.showHelpTip(null, {\n selector: '#{0} .leaflet-control-layers'.format($scope.mapId),\n bindings: {\n content: 'MAP.HELP.TIP.WOT_BTN_LAYERS',\n icon: {\n position: 'right'\n },\n hasNext: hasNext\n }\n });\n }\n ];\n\n // Launch steps\n return $scope.executeStep('mapwot', steps, startIndex);\n };\n}\n","\nangular.module('cesium.platform', ['ngIdle', 'cesium.config', 'cesium.services'])\n\n // Translation i18n\n .config(['$translateProvider', 'csConfig', function ($translateProvider, csConfig) {\n 'ngInject';\n\n $translateProvider\n .uniformLanguageTag('bcp47')\n .determinePreferredLanguage()\n // Cela fait bugger les placeholder (pb d'affichage des accents en FR)\n //.useSanitizeValueStrategy('sanitize')\n .useSanitizeValueStrategy(null)\n .fallbackLanguage([csConfig.fallbackLanguage ? csConfig.fallbackLanguage : 'en'])\n .useLoaderCache(true);\n }])\n\n .config(['$httpProvider', 'csConfig', function($httpProvider, csConfig) {\n 'ngInject';\n\n // Set default timeout\n $httpProvider.defaults.timeout = !!csConfig.timeout ? csConfig.timeout : 300000 /* default timeout */;\n\n //Enable cross domain calls\n $httpProvider.defaults.useXDomain = true;\n\n //Remove the header used to identify ajax call that would prevent CORS from working\n delete $httpProvider.defaults.headers.common['X-Requested-With'];\n\n }])\n\n .config(['$compileProvider', 'csConfig', function($compileProvider, csConfig) {\n 'ngInject';\n\n $compileProvider.debugInfoEnabled(csConfig.debug === true);\n\n // Fix issue #893\n // See https://stackoverflow.com/questions/31859257/firefox-addon-using-angularjs-ng-src-not-working\n $compileProvider.imgSrcSanitizationWhitelist(/^\\s*(filesystem:resource|resource|moz-extension|chrome-extension|file|data):/);\n }])\n\n .config(['$animateProvider', function($animateProvider) {\n 'ngInject';\n\n $animateProvider.classNameFilter( /\\banimate-/ );\n }])\n\n // Configure cache (used by HTTP requests) default options\n .config(['CacheFactoryProvider', 'csConfig', function (CacheFactoryProvider, csConfig) {\n 'ngInject';\n\n angular.extend(CacheFactoryProvider.defaults, {\n // Fixed options:\n recycleFreq: 60 * 1000, // Scan expired items every 1min\n storagePrefix: 'caches.', // Override storage key prefix\n capacity: 100, // Force to use a LRU cache, to avoid size exceed max\n\n // Options overwritten by the csCache service:\n maxAge: csConfig.cacheTimeMs || 60 * 1000, // from config if exists, or 1min\n storageMode: 'memory' // Do NOT use local Storage by default\n });\n }])\n\n // Configure screen size detection\n .config(['screenmatchConfigProvider', function(screenmatchConfigProvider) {\n 'ngInject';\n\n screenmatchConfigProvider.config.rules = 'bootstrap';\n }])\n\n .config(['$ionicConfigProvider', function($ionicConfigProvider) {\n 'ngInject';\n\n // JS scrolling need for iOs (see http://blog.ionic.io/native-scrolling-in-ionic-a-tale-in-rhyme/)\n var enableJsScrolling = ionic.Platform.isIOS();\n $ionicConfigProvider.scrolling.jsScrolling(enableJsScrolling);\n\n // Configure the view cache\n $ionicConfigProvider.views.maxCache(5);\n }])\n\n .config(['IdleProvider', 'csConfig', function(IdleProvider, csConfig) {\n 'ngInject';\n\n IdleProvider.idle(csConfig.logoutIdle||10*60/*10min*/);\n IdleProvider.timeout(csConfig.logoutTimeout||15); // display warning during 15s\n }])\n\n .factory('$exceptionHandler', ['$log', function($log) {\n 'ngInject';\n\n return function(exception, cause) {\n if (cause) $log.error(exception, cause);\n else $log.error(exception);\n };\n }])\n\n\n .factory('csPlatform', ['ionicReady', '$rootScope', '$q', '$state', '$translate', '$timeout', 'UIUtils', 'BMA', 'Device', 'csHttp', 'csConfig', 'csCache', 'csSettings', 'csCurrency', 'csWallet', function (ionicReady, $rootScope, $q, $state, $translate, $timeout, UIUtils,\n BMA, Device, csHttp, csConfig, csCache, csSettings, csCurrency, csWallet) {\n\n 'ngInject';\n var\n fallbackNodeIndex = 0,\n defaultSettingsNode,\n started = false,\n startPromise,\n listeners,\n removeChangeStateListener;\n\n // Fix csConfig values\n csConfig.demo = csConfig.demo === true || csConfig.demo === 'true' || false;\n csConfig.readonly = csConfig.readonly === true || csConfig.readonly === 'true' || false;\n\n function disableChangeState() {\n if (removeChangeStateListener) return; // make sure to call this once\n\n var remove = $rootScope.$on('$stateChangeStart', function (event, next, nextParams, fromState) {\n if (!event.defaultPrevented && next.name !== 'app.home' && next.name !== 'app.settings') {\n event.preventDefault();\n if (startPromise) {\n startPromise.then(function() {\n $state.go(next.name, nextParams);\n });\n }\n else {\n UIUtils.loading.hide();\n }\n }\n });\n\n // store remove listener function\n removeChangeStateListener = remove;\n }\n\n function enableChangeState() {\n if (removeChangeStateListener) removeChangeStateListener();\n removeChangeStateListener = null;\n }\n\n // Alert user if node not reached - fix issue #\n function checkBmaNodeAlive(alive) {\n if (alive) return true;\n\n // Remember the default node\n defaultSettingsNode = defaultSettingsNode || csSettings.data.node;\n\n var fallbackNode = csSettings.data.fallbackNodes && fallbackNodeIndex < csSettings.data.fallbackNodes.length && csSettings.data.fallbackNodes[fallbackNodeIndex++];\n if (!fallbackNode) {\n throw 'ERROR.CHECK_NETWORK_CONNECTION';\n }\n var newServer = fallbackNode.host + ((!fallbackNode.port && fallbackNode.port != 80 && fallbackNode.port != 443) ? (':' + fallbackNode.port) : '');\n\n // Skip is same as actual node\n if (BMA.node.same(fallbackNode)) {\n console.debug('[platform] Skipping fallback node [{0}]: same as actual node'.format(newServer));\n return checkBmaNodeAlive(); // loop (= go to next node)\n }\n\n // Try to get summary\n return csHttp.get(fallbackNode.host, fallbackNode.port, '/node/summary', fallbackNode.port==443 || BMA.node.forceUseSsl)()\n .catch(function(err) {\n console.error('[platform] Could not reach fallback node [{0}]: skipping'.format(newServer));\n // silent, but return no result (will loop to the next fallback node)\n })\n .then(function(res) {\n if (!res) return checkBmaNodeAlive(); // Loop\n\n // Force to show port/ssl, if this is the only difference\n var messageParam = {old: BMA.server, new: newServer};\n if (messageParam.old === messageParam.new) {\n if (BMA.port != fallbackNode.port) {\n messageParam.new += ':' + fallbackNode.port;\n }\n else if (BMA.useSsl == false && (fallbackNode.useSsl || fallbackNode.port==443)) {\n messageParam.new += ' (SSL)';\n }\n }\n\n return $translate('CONFIRM.USE_FALLBACK_NODE', messageParam)\n .then(function(msg) {\n return UIUtils.alert.confirm(msg);\n })\n .then(function (confirm) {\n if (!confirm) return;\n\n // Only change BMA node in settings\n csSettings.data.node = fallbackNode;\n\n // Add a marker, for UI\n csSettings.data.node.temporary = true;\n\n csHttp.cache.clear();\n\n // loop\n return BMA.copy(fallbackNode)\n .then(checkBmaNodeAlive);\n });\n });\n }\n\n function isStarted() {\n return started;\n }\n\n function getLatestRelease() {\n var latestRelease = csSettings.data.latestReleaseUrl && csHttp.uri.parse(csSettings.data.latestReleaseUrl);\n if (latestRelease) {\n return csHttp.getWithCache(latestRelease.host, latestRelease.protocol === 'https:' ? 443 : latestRelease.port, \"/\" + latestRelease.pathname, undefined, csCache.constants.LONG)()\n .then(function (json) {\n if (json && json.name && json.tag_name && json.html_url) {\n return {\n version: json.name,\n url: json.html_url,\n isNewer: (csHttp.version.compare(csConfig.version, json.name) < 0)\n };\n }\n })\n .catch(function(err) {\n // silent (just log it)\n console.error('[platform] Failed to get Cesium latest version', err);\n })\n ;\n }\n return $q.when();\n }\n\n function addListeners() {\n listeners = [\n // Listen if node changed\n BMA.api.node.on.restart($rootScope, restart, this)\n ];\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function ready() {\n if (started) return $q.when();\n return startPromise || start();\n }\n\n function restart() {\n console.debug('[platform] restarting csPlatform');\n return stop()\n .then(function () {\n return $timeout(start, 200);\n });\n }\n\n function start() {\n\n // Avoid change state\n disableChangeState();\n\n // We use 'ionicReady()' instead of '$ionicPlatform.ready()', because this one is callable many times\n startPromise = ionicReady()\n\n .then($q.all([\n // Load device\n Device.ready(),\n\n // Start settings\n csSettings.ready()\n ]))\n\n // Load BMA\n .then(function(){\n return BMA.ready().then(checkBmaNodeAlive);\n })\n\n // Load currency\n .then(csCurrency.ready)\n\n // Trying to restore wallet\n .then(csWallet.ready)\n\n .then(function(){\n enableChangeState();\n addListeners();\n startPromise = null;\n started = true;\n })\n .catch(function(err) {\n startPromise = null;\n started = false;\n if($state.current.name !== $rootScope.errorState) {\n $state.go($rootScope.errorState, {error: 'peer'});\n }\n throw err;\n });\n\n return startPromise;\n }\n\n function stop() {\n if (!started) return $q.when();\n removeListeners();\n\n csWallet.stop();\n csCurrency.stop();\n BMA.stop();\n\n return $timeout(function() {\n enableChangeState();\n started = false;\n startPromise = null;\n }, 500);\n }\n\n return {\n disableChangeState: disableChangeState,\n isStarted: isStarted,\n ready: ready,\n restart: restart,\n start: start,\n stop: stop,\n version: {\n latest: getLatestRelease\n }\n };\n }])\n\n .run(['$rootScope', '$state', '$window', '$urlRouter', 'ionicReady', '$ionicPlatform', '$ionicHistory', 'Device', 'UIUtils', '$ionicConfig', 'PluginService', 'csPlatform', 'csWallet', 'csSettings', 'csConfig', 'csCurrency', function($rootScope, $state, $window, $urlRouter, ionicReady, $ionicPlatform, $ionicHistory,\n Device, UIUtils, $ionicConfig, PluginService, csPlatform, csWallet, csSettings, csConfig, csCurrency) {\n 'ngInject';\n\n // Allow access to service data, from HTML templates\n $rootScope.config = csConfig;\n $rootScope.settings = csSettings.data;\n $rootScope.currency = csCurrency.data;\n $rootScope.device = Device;\n $rootScope.errorState = 'app.home';\n $rootScope.smallscreen = UIUtils.screen.isSmall();\n\n // Compute the root path\n var hashIndex = $window.location.href.indexOf('#');\n $rootScope.rootPath = (hashIndex !== -1) ? $window.location.href.substr(0, hashIndex) : $window.location.href;\n console.debug('[app] Root path is [' + $rootScope.rootPath + ']');\n\n // removeIf(device)\n // -- Automatic redirection to HTTPS\n if ((csConfig.httpsMode === true || csConfig.httpsMode == 'true' ||csConfig.httpsMode === 'force') &&\n $window.location.protocol !== 'https:') {\n $rootScope.$on('$stateChangeStart', function (event, next, nextParams, fromState) {\n var path = 'https' + $rootScope.rootPath.substr(4) + $state.href(next, nextParams);\n if (csConfig.httpsModeDebug) {\n console.debug('[app] [httpsMode] --- Should redirect to: ' + path);\n // continue\n }\n else {\n $window.location.href = path;\n }\n });\n }\n // endRemoveIf(device)\n\n // We use 'ionicReady()' instead of '$ionicPlatform.ready()', because this one is callable many times\n ionicReady().then(function() {\n\n // Keyboard\n if (Device.keyboard.enable) {\n // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard\n // for form inputs)\n Device.keyboard.hideKeyboardAccessoryBar(true);\n\n // iOS: do not push header up when opening keyboard\n // (see http://ionicframework.com/docs/api/page/keyboard/)\n if (ionic.Platform.isIOS()) {\n Device.keyboard.disableScroll(true);\n }\n }\n\n // Ionic Platform Grade is not A, disabling views transitions\n if (ionic.Platform.grade.toLowerCase() !== 'a') {\n console.info('[app] Disabling UI effects, because plateform\\'s grade is [' + ionic.Platform.grade + ']');\n UIUtils.setEffects(false);\n }\n\n // Status bar style\n if (window.StatusBar) {\n console.debug(\"[app] Status bar plugin enable\");\n }\n\n // Get latest release\n csPlatform.version.latest()\n .then(function(release) {\n if (release && release.isNewer) {\n console.info('[app] New release detected [{0}]'.format(release.version));\n $rootScope.newRelease = release;\n }\n else {\n console.info('[app] Current version [{0}] is the latest release'.format(csConfig.version));\n }\n });\n\n // Prevent BACK button to exit without confirmation\n $ionicPlatform.registerBackButtonAction(function(event) {\n if ($ionicHistory.backView()) {\n return $ionicHistory.goBack();\n }\n event.preventDefault();\n return UIUtils.alert.confirm('CONFIRM.EXIT_APP')\n .then(function (confirm) {\n if (!confirm) return; // user cancelled\n ionic.Platform.exitApp();\n });\n }, 100);\n\n // Make sure platform is started\n return csPlatform.ready();\n });\n }])\n;\n\n// Workaround to add \"\".startsWith() if not present\nif (typeof String.prototype.startsWith !== 'function') {\n console.debug(\"Adding String.prototype.startsWith() -> was missing on this platform\");\n String.prototype.startsWith = function(prefix, position) {\n return this.indexOf(prefix, position) === 0;\n };\n}\n\n// Workaround to add \"\".startsWith() if not present\nif (typeof String.prototype.trim !== 'function') {\n console.debug(\"Adding String.prototype.trim() -> was missing on this platform\");\n // Make sure we trim BOM and NBSP\n var rtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n String.prototype.trim = function() {\n return this.replace(rtrim, '');\n };\n}\n\n// Workaround to add Math.trunc() if not present - fix #144\nif (Math && typeof Math.trunc !== 'function') {\n console.debug(\"Adding Math.trunc() -> was missing on this platform\");\n Math.trunc = function(number) {\n return parseInt((number - 0.5).toFixed());\n };\n}\n\n// Workaround to add \"\".format() if not present\nif (typeof String.prototype.format !== 'function') {\n console.debug(\"Adding String.prototype.format() -> was missing on this platform\");\n String.prototype.format = function() {\n var args = arguments;\n return this.replace(/{(\\d+)}/g, function(match, number) {\n return typeof args[number] != 'undefined' ? args[number] : match;\n });\n };\n}\n","\nangular.module('cesium.network.services', ['ngApi', 'cesium.currency.services', 'cesium.http.services'])\n\n.factory('csNetwork', ['$rootScope', '$q', '$interval', '$timeout', '$window', 'csConfig', 'BMA', 'csHttp', 'csCurrency', 'Api', function($rootScope, $q, $interval, $timeout, $window, csConfig, BMA, csHttp, csCurrency, Api) {\n 'ngInject';\n\n var\n interval,\n constants = {\n UNKNOWN_BUID: -1,\n MAX_BLOCK_OFFSET: 1000\n },\n isHttpsMode = $window.location.protocol === 'https:',\n api = new Api(this, \"csNetwork\"),\n\n data = {\n bma: null,\n listeners: [],\n loading: true,\n peers: [],\n filter: {\n member: true,\n mirror: true,\n endpoint: null,\n online: false,\n bma: false,\n ssl: undefined,\n tor: undefined\n },\n sort:{\n type: null,\n asc: true,\n compact: true\n },\n groupBy: 'pubkey',\n expertMode: false,\n knownBlocks: [],\n mainBlock: null,\n minOnlineBlockNumber: 0,\n uidsByPubkeys: null,\n searchingPeersOnNetwork: false,\n difficulties: null,\n ws2pHeads: null,\n timeout: csConfig.timeout\n },\n\n // Return the block uid\n buid = function(block) {\n return block && [block.number, block.hash].join('-');\n },\n\n resetData = function() {\n data.bma = null;\n data.listeners = [];\n data.peers.splice(0);\n data.filter = {\n member: true,\n mirror: true,\n endpoint: null,\n online: true,\n bma: false,\n ssl: undefined,\n tor: undefined\n };\n data.sort = {\n type: null,\n asc: true\n };\n data.groupBy = 'pubkey';\n data.expertMode = false;\n data.memberPeersCount = 0;\n data.knownBlocks = [];\n data.mainBlock = null;\n data.minOnlineBlockNumber = 0;\n data.uidsByPubkeys = {};\n data.loading = true;\n data.searchingPeersOnNetwork = false;\n data.difficulties = null;\n data.ws2pHeads = null;\n data.timeout = csConfig.timeout;\n },\n\n hasPeers = function() {\n return data.peers && data.peers.length > 0;\n },\n\n getPeers = function() {\n return data.peers;\n },\n\n isBusy = function() {\n return data.loading;\n },\n\n getKnownBlocks = function() {\n return data.knownBlocks;\n },\n\n // Load WS2P heads\n loadW2spHeads = function() {\n return data.bma.network.ws2p.heads()\n .then(function (res) {\n data.ws2pHeads = res.heads ? res.heads.reduce(function (res, hit) {\n if (hit.message && hit.sig) {\n try {\n var head = new Ws2pMessage(hit.message);\n res[[head.pubkey, head.ws2pid].join('-')] = head;\n }\n catch(err) {\n // just log, then ignore\n console.error('[network] Ignoring WS2P head.', err && err.message || err);\n }\n }\n return res;\n }, {}) : {};\n })\n .catch(function(err) {\n // When too many request, retry in 3s\n if (err && err.ucode == BMA.errorCodes.HTTP_LIMITATION) {\n return $timeout(function() {\n return loadW2spHeads();\n }, 3000);\n }\n console.error(err); // can occur on duniter v1.6\n data.ws2pHeads = {};\n });\n },\n\n // Load personal difficulties\n loadDifficulties = function() {\n return data.bma.blockchain.stats.difficulties()\n .then(function (res) {\n data.difficulties = res.levels ? res.levels.reduce(function (res, hit) {\n if (hit.uid && hit.level) res[hit.uid] = hit.level;\n return res;\n }, {}) : {};\n })\n .catch(function(err) {\n // When too many request, retry in 3s\n if (err && err.ucode == BMA.errorCodes.HTTP_LIMITATION) {\n return $timeout(function() {\n return loadDifficulties();\n }, 3000);\n }\n console.error(err);\n data.difficulties = {};\n });\n },\n\n loadPeers = function() {\n data.peers = [];\n data.searchingPeersOnNetwork = true;\n data.loading = true;\n data.bma = data.bma || BMA;\n var newPeers = [];\n\n if (interval) {\n $interval.cancel(interval);\n }\n\n interval = $interval(function() {\n // not same job instance\n if (newPeers.length) {\n flushNewPeersAndSort(newPeers);\n }\n else if (data.loading && !data.searchingPeersOnNetwork) {\n data.loading = false;\n $interval.cancel(interval);\n // The peer lookup end, we can make a clean final report\n sortPeers(true/*update main buid*/);\n\n console.debug('[network] Finish: {0} peers found.'.format(data.peers.length));\n }\n }, 1000);\n\n var initJobs = [\n // Load uids\n data.bma.wot.member.uids()\n .then(function(uids) {\n data.uidsByPubkeys = uids;\n })\n .catch(function(err) {\n console.error(err);\n data.uidsByPubkeys = {};\n }),\n\n // Load WS2P heads\n loadW2spHeads()\n ];\n\n // Get difficulties (expert mode only)\n if (data.expertMode) {\n initJobs.push(loadDifficulties());\n }\n\n return $q.all(initJobs)\n .then(function() {\n return data.bma && data.bma.network.peers();\n })\n .then(function(res){\n if (!res || !res.peers || !res.peers.length) return;\n\n // If filter online peers\n if (data.filter.online) {\n var jobs = [];\n _.forEach(res.peers, function(json) {\n // Exclude, if not UP or on a too old block\n if (json.status !== 'UP') return;\n json.blockNumber = json.block && parseInt(json.block.split('-')[0]);\n if (json.blockNumber && json.blockNumber < data.minOnlineBlockNumber) {\n console.debug(\"[network] Exclude a too old peer document, on pubkey {0}\".format(json.pubkey.substring(0,6)));\n return;\n }\n\n jobs.push(addOrRefreshPeerFromJson(json, newPeers));\n\n // Mark WS2P\n _.forEach(json.endpoints||[], function(ep) {\n if (ep.startsWith('WS2P')) {\n var key = json.pubkey + '-' + ep.split(' ')[1];\n if (data.ws2pHeads[key]) {\n data.ws2pHeads[key].hasEndpoint = true;\n }\n }\n });\n });\n\n // Add private WS2P endpoints\n var privateWs2pHeads = _.values(data.ws2pHeads);\n if (privateWs2pHeads && privateWs2pHeads.length) {\n var privateEPCount = 0;\n //console.debug(\"[http] Found WS2P endpoints without endpoint:\", data.ws2pHeads);\n _.forEach(privateWs2pHeads, function(head) {\n\n if (!head.hasEndPoint) {\n var currentNumber = head.buid && parseInt(head.buid.split('-')[0]);\n // Exclude if on a too old block\n if (currentNumber && currentNumber < data.minOnlineBlockNumber) {\n console.debug(\"[network] Exclude a too old WS2P message, on pubkey {0}\".format(head.pubkey.substring(0,6)));\n return;\n }\n\n var peer = new Peer({\n buid: head.buid,\n currentNumber: currentNumber,\n pubkey: head.pubkey,\n version: head.version,\n powPrefix: head.powPrefix,\n online: true,\n uid: data.uidsByPubkeys[head.pubkey],\n bma: {\n useWs2p: true,\n private: true,\n ws2pid: head.ws2pid\n },\n endpoints: [\n // fake endpoint\n 'WS2P ' + head.ws2pid\n ]\n });\n peer.id = peer.keyID();\n if (peer.uid && data.expertMode && data.difficulties) {\n peer.difficulty = data.difficulties[peer.uid];\n }\n if (applyPeerFilter(peer)) {\n newPeers.push(peer);\n privateEPCount++;\n }\n }\n });\n\n if (privateEPCount) {\n console.debug(\"[http] Found {0} WS2P endpoints without endpoint (private ?)\".format(privateEPCount));\n }\n }\n\n if (jobs.length) return $q.all(jobs);\n }\n\n // If filter offline peers\n else {\n return $q.all(_(res && res.peers || []).reduce(function(res, json) {\n return res.concat(addOrRefreshPeerFromJson(json, newPeers));\n }, []));\n }\n })\n .then(function(){\n data.searchingPeersOnNetwork = false;\n })\n .catch(function(err){\n console.error(err);\n data.searchingPeersOnNetwork = false;\n });\n },\n\n /**\n * Apply filter on a peer. (peer uid should have been filled BEFORE)\n */\n applyPeerFilter = function(peer) {\n // no filter\n if (!data.filter) return true;\n\n // Filter member and mirror\n if ((data.filter.member && !data.filter.mirror && !peer.uid) ||\n (data.filter.mirror && !data.filter.member && peer.uid)) {\n return false;\n }\n\n // Filter on endpoint\n if (data.filter.endpoint && !peer.hasEndpoint(data.filter.endpoint)) {\n return false;\n }\n\n // Filter on status\n if ((data.filter.online && peer.status !== 'UP' && peer.oldBlock) || (!data.filter.online && peer.status === 'UP' && !peer.oldBlock)) {\n return false;\n }\n\n // Filter on bma\n if (angular.isDefined(data.filter.bma) && peer.isBma() != data.filter.bma) {\n return false;\n }\n\n // Filter on ws2p\n if (angular.isDefined(data.filter.ws2p) && peer.isWs2p() != data.filter.ws2p) {\n return false;\n }\n\n // Filter on ssl\n if (angular.isDefined(data.filter.ssl) && peer.isSsl() != data.filter.ssl) {\n return false;\n }\n\n // Filter on tor\n if (angular.isDefined(data.filter.tor) && peer.isTor() != data.filter.tor) {\n return false;\n }\n\n return true;\n },\n\n addOrRefreshPeerFromJson = function(json, list) {\n list = list || data.newPeers;\n\n // Analyze the peer document, and exclude using the online filter\n json.blockNumber = json.block && parseInt(json.block.split('-')[0]);\n json.oldBlock = (json.status === 'UP' && json.blockNumber && json.blockNumber < data.minOnlineBlockNumber);\n\n var peers = createPeerEntities(json);\n var hasUpdates = false;\n\n var jobs = peers.reduce(function(jobs, peer) {\n var existingPeer = _.findWhere(data.peers, {id: peer.id});\n var existingMainBuid = existingPeer ? existingPeer.buid : null;\n var existingOnline = existingPeer ? existingPeer.online : false;\n\n return jobs.concat(\n refreshPeer(peer)\n .then(function (refreshedPeer) {\n if (existingPeer) {\n // remove existing peers, when reject or offline\n if (!refreshedPeer || (refreshedPeer.online !== data.filter.online && data.filter.online !== 'all')) {\n var existingIndex = data.peers.indexOf(existingPeer);\n if (existingIndex !== -1) {\n console.debug('[network] Peer [{0}] removed (cause: {1})'.format(peer.server, !refreshedPeer ? 'filtered' : (refreshedPeer.online ? 'UP' : 'DOWN')));\n data.peers.splice(existingIndex, 1);\n hasUpdates = true;\n }\n }\n else if (refreshedPeer.buid !== existingMainBuid){\n console.debug('[network] {0} endpoint [{1}] new current block'.format(\n refreshedPeer.bma && (refreshedPeer.bma.useBma ? 'BMA' : 'WS2P') || 'null',\n refreshedPeer.server));\n hasUpdates = true;\n }\n else if (existingOnline !== refreshedPeer.online){\n console.debug('[network] {0} endpoint [{1}] is now {2}'.format(\n refreshedPeer.bma && (refreshedPeer.bma.useBma ? 'BMA' : 'WS2P') || 'null',\n refreshedPeer.server,\n refreshedPeer.online ? 'UP' : 'DOWN'));\n hasUpdates = true;\n }\n else {\n console.debug(\"[network] {0} endpoint [{1}] unchanged\".format(\n refreshedPeer.bma && (refreshedPeer.bma.useBma ? 'BMA' : 'WS2P') || 'null',\n refreshedPeer.server));\n }\n }\n else if (refreshedPeer && (refreshedPeer.online === data.filter.online || data.filter.online === 'all')) {\n console.debug(\"[network] {0} endpoint [{1}] is {2}\".format(\n refreshedPeer.bma && (refreshedPeer.bma.useBma ? 'BMA' : 'WS2P') || 'null',\n refreshedPeer.server,\n refreshedPeer.online ? 'UP' : 'DOWN'\n ));\n list.push(refreshedPeer);\n hasUpdates = true;\n }\n })\n );\n }, []);\n return (jobs.length === 1 ? jobs[0] : $q.all(jobs))\n .then(function() {\n return hasUpdates;\n });\n },\n\n createPeerEntities = function(json, ep) {\n if (!json) return [];\n var peer = new Peer(json);\n\n // Read bma endpoints\n if (!ep) {\n var endpointsAsString = peer.getEndpoints();\n if (!endpointsAsString) return []; // no BMA\n\n var endpoints = endpointsAsString.reduce(function (res, epStr) {\n var ep = BMA.node.parseEndPoint(epStr);\n return ep ? res.concat(ep) : res;\n }, []);\n\n // recursive call, on each endpoint\n if (endpoints.length > 1) {\n return endpoints.reduce(function (res, ep) {\n return res.concat(createPeerEntities(json, ep));\n }, []);\n }\n else {\n // if only one endpoint: use it and continue\n ep = endpoints[0];\n }\n }\n peer.bma = ep;\n peer.server = peer.getServer();\n peer.dns = peer.getDns();\n peer.buid = peer.buid || peer.block;\n peer.blockNumber = peer.buid && parseInt(peer.buid.split('-')[0]);\n peer.uid = peer.pubkey && data.uidsByPubkeys[peer.pubkey];\n peer.id = peer.keyID();\n return [peer];\n },\n\n refreshPeer = function(peer) {\n\n // Apply filter\n if (!applyPeerFilter(peer)) return $q.when();\n\n if (!data.filter.online || (!data.filter.online && peer.status === 'DOWN') || !peer.getHost() /*fix #537*/) {\n peer.online = false;\n return $q.when(peer);\n }\n\n if (peer.bma.useWs2p && data.ws2pHeads) {\n var ws2pHeadKey = [peer.pubkey, peer.bma.ws2pid].join('-');\n var head = data.ws2pHeads[ws2pHeadKey];\n delete data.ws2pHeads[ws2pHeadKey];\n if (head) {\n peer.buid = head.buid;\n peer.currentNumber=head.buid && parseInt(head.buid.split('-')[0]);\n peer.version = head.version;\n peer.powPrefix = head.powPrefix;\n }\n peer.online = !!peer.buid;\n\n if (peer.uid && data.expertMode && data.difficulties) {\n peer.difficulty = data.difficulties[peer.uid];\n }\n\n return $q.when(peer);\n }\n\n // Cesium running in SSL: Do not try to access not SSL node,\n if (!peer.bma.useWs2p && isHttpsMode && !peer.bma.useSsl) {\n peer.online = (peer.status === 'UP');\n peer.buid = constants.UNKNOWN_BUID;\n delete peer.version;\n\n if (peer.uid && data.expertMode && data.difficulties) {\n peer.difficulty = data.difficulties[peer.uid];\n }\n\n return $q.when(peer);\n }\n\n // Do not try to access TOR or WS2P endpoints\n if (peer.bma.useTor || peer.bma.useWs2p) {\n peer.online = (peer.status === 'UP');\n peer.buid = constants.UNKNOWN_BUID;\n delete peer.version;\n\n if (peer.uid && data.expertMode && data.difficulties) {\n peer.difficulty = data.difficulties[peer.uid];\n }\n return $q.when(peer);\n }\n\n peer.api = peer.api || BMA.lightInstance(peer.getHost(), peer.getPort(), peer.isSsl(), data.timeout);\n\n // Get current block\n return peer.api.blockchain.current(false/*no cache*/)\n .then(function(block) {\n if (!block) throw new Error('Wrong response for /blockchain/current (empty)');\n peer.currentNumber = block.number;\n peer.online = true;\n peer.buid = buid(block);\n peer.medianTime = block.medianTime;\n if (data.knownBlocks.indexOf(peer.buid) === -1) {\n data.knownBlocks.push(peer.buid);\n }\n return peer;\n })\n .catch(function(err) {\n // Special case for currency init (root block not exists): use fixed values\n if (err && err.ucode == BMA.errorCodes.NO_CURRENT_BLOCK) {\n peer.online = true;\n peer.buid = buid({number:0, hash: BMA.constants.ROOT_BLOCK_HASH});\n peer.difficulty = 0;\n return peer;\n }\n if (!peer.secondTry) {\n var bma = peer.bma || peer.getBMA();\n if (bma.dns && peer.server.indexOf(bma.dns) === -1) {\n // try again, using DNS instead of IPv4 / IPV6\n peer.secondTry = true;\n peer.api = BMA.lightInstance(bma.dns, bma.port, bma.useSsl);\n return refreshPeer(peer); // recursive call\n }\n }\n\n peer.buid = null;\n peer.blockNumber = null;\n peer.currentNumber = null;\n peer.online=false;\n peer.uid = data.uidsByPubkeys[peer.pubkey];\n return peer;\n })\n .then(function(peer) {\n // Exit if offline, or not expert mode or too small device\n if (!data.filter.online || !peer || !peer.online || !data.expertMode) return peer;\n var jobs = [];\n\n // Get hardship (only for a member peer)\n if (peer.uid) {\n jobs.push(peer.api.blockchain.stats.hardship({pubkey: peer.pubkey})\n .then(function (res) {\n peer.difficulty = res ? res.level : null;\n })\n .catch(function() {\n peer.difficulty = null; // continue\n }));\n }\n\n // Get Version\n jobs.push(peer.api.node.summary()\n .then(function(res){\n peer.software = res && res.duniter && res.duniter.software || undefined;\n peer.version = res && res.duniter && res.duniter.version || '?';\n })\n .catch(function() {\n peer.software = undefined;\n peer.version = '?'; // continue\n }));\n\n return $q.all(jobs)\n .then(function(){\n return peer;\n });\n });\n },\n\n flushNewPeersAndSort = function(newPeers, updateMainBuid) {\n newPeers = newPeers || data.newPeers;\n if (!newPeers.length) return;\n var ids = _.map(data.peers, function(peer){\n return peer.id;\n });\n var hasUpdates = false;\n var newPeersAdded = 0;\n _.forEach(newPeers.splice(0), function(peer) {\n if (!ids[peer.id]) {\n data.peers.push(peer);\n ids[peer.id] = peer;\n hasUpdates = true;\n newPeersAdded++;\n }\n });\n if (hasUpdates) {\n console.debug('[network] Flushing {0} new peers...'.format(newPeersAdded));\n sortPeers(updateMainBuid);\n }\n },\n\n computeScoreAlphaValue = function(value, nbChars, asc) {\n if (!value) return 0;\n var score = 0;\n value = value.toLowerCase();\n if (nbChars > value.length) {\n nbChars = value.length;\n }\n score += value.charCodeAt(0);\n for (var i=1; i < nbChars; i++) {\n score += Math.pow(0.001, i) * value.charCodeAt(i);\n }\n return asc ? (1000 - score) : score;\n },\n\n sortPeers = function(updateMainBuid) {\n // Construct a map of buid, with peer count and medianTime\n var buids = {};\n data.memberPeersCount = 0;\n _.forEach(data.peers, function(peer){\n if (peer.buid) {\n var buid = buids[peer.buid];\n if (!buid || !buid.medianTime) {\n buid = {\n buid: peer.buid,\n medianTime: peer.medianTime,\n count: 0\n };\n buids[peer.buid] = buid;\n }\n // If not already done, try to fill medianTime (need to compute consensusBlockDelta)\n else if (!buid.medianTime && peer.medianTime) {\n buid.medianTime = peer.medianTime;\n }\n if (buid.buid !== constants.UNKNOWN_BUID) {\n buid.count++;\n }\n }\n data.memberPeersCount += peer.uid ? 1 : 0;\n });\n var mainBlock = data.mainBlock;\n if (data.filter.online) {\n // Compute pct of use, per buid\n _.forEach(_.values(buids), function(buid) {\n buid.pct = buid.count * 100 / data.peers.length;\n });\n mainBlock = _.max(buids, function(obj) {\n return obj.count;\n });\n _.forEach(data.peers, function(peer){\n peer.hasMainConsensusBlock = peer.buid === mainBlock.buid;\n peer.hasConsensusBlock = peer.buid && !peer.hasMainConsensusBlock && buids[peer.buid].count > 1;\n if (peer.hasConsensusBlock) {\n peer.consensusBlockDelta = buids[peer.buid].medianTime - mainBlock.medianTime;\n }\n });\n }\n data.peers = _.uniq(data.peers, false, function(peer) {\n return peer.id;\n });\n data.peers = _.sortBy(data.peers, function(peer) {\n var score = 0;\n if (data.sort.type) {\n score += (data.sort.type === 'uid' ? computeScoreAlphaValue(peer.uid||peer.pubkey, 3, data.sort.asc) : 0);\n score += (data.sort.type === 'api') &&\n ((peer.isWs2p() && (data.sort.asc ? 1 : -1) || 0) +\n (peer.hasEndpoint('ES_USER_API') && (data.sort.asc ? 0.01 : -0.01) || 0) +\n (peer.isSsl() && (data.sort.asc ? 0.75 : -0.75) || 0)) || 0;\n score += (data.sort.type === 'difficulty' ? (peer.difficulty ? (data.sort.asc ? (10000-peer.difficulty) : peer.difficulty): 0) : 0);\n score += (data.sort.type === 'current_block' ? (peer.currentNumber ? (data.sort.asc ? (1000000000 - peer.currentNumber) : peer.currentNumber) : 0) : 0);\n }\n score = (10000000000 * score);\n score += (1000000000 * (peer.online ? 1 : 0));\n score += (100000000 * (peer.hasMainConsensusBlock ? 1 : 0));\n score += (1000000 * (peer.hasConsensusBlock ? buids[peer.buid].pct : 0));\n if (data.expertMode) {\n score += (100 * (peer.difficulty ? (10000-peer.difficulty) : 0));\n score += (1 * (peer.uid ? computeScoreAlphaValue(peer.uid, 2, true) : 0));\n score += (0.001 * (!peer.uid ? computeScoreAlphaValue(peer.pubkey, 3, true) : 0));\n }\n else {\n score += (100 * (peer.uid ? computeScoreAlphaValue(peer.uid, 2, true) : 0));\n score += (0.001 * (!peer.uid ? computeScoreAlphaValue(peer.pubkey, 3, true) : 0));\n }\n score += (0.00001 * (peer.isBma() ? (peer.isSsl() ? 1 : 0.5) :0)); // If many endpoints: BMAS first, then BMA\n\n peer.score = score;\n\n return -score;\n });\n\n if (data.groupBy) {\n var previousPeer;\n data.peers.forEach(function(peer) {\n peer.compacted = (previousPeer && peer[data.groupBy] && peer[data.groupBy] === previousPeer[data.groupBy]);\n previousPeer = peer;\n });\n }\n\n // Raise event on new main block\n if (updateMainBuid && mainBlock && mainBlock.buid && (!data.mainBlock || data.mainBlock.buid !== mainBlock.buid)) {\n data.mainBlock = mainBlock;\n api.data.raise.mainBlockChanged(mainBlock);\n }\n\n // Raise event when changed\n api.data.raise.changed(data); // raise event\n },\n\n removeListeners = function() {\n _.forEach(data.listeners, function(remove){\n remove();\n });\n data.listeners = [];\n },\n\n addListeners = function() {\n data.listeners = [\n\n // Listen for new block\n data.bma.websocket.block().onListener(function(block) {\n if (!block || data.loading) return;\n var buid = [block.number, block.hash].join('-');\n if (data.knownBlocks.indexOf(buid) === -1) {\n console.debug('[network] Receiving block: ' + buid.substring(0, 20));\n data.knownBlocks.push(buid);\n // If first block: do NOT refresh peers (will be done in start() method)\n var skipRefreshPeers = data.knownBlocks.length === 1;\n if (!skipRefreshPeers) {\n data.loading = true;\n // We wait 2s when a new block is received, just to wait for network propagation\n $timeout(function() {\n console.debug('[network] new block received by WS: will refresh peers');\n loadPeers();\n }, 2000, false /*invokeApply*/);\n }\n }\n }),\n\n // Listen for new peer\n data.bma.websocket.peer().onListener(function(json) {\n if (!json || data.loading) return;\n var newPeers = [];\n addOrRefreshPeerFromJson(json, newPeers)\n .then(function(hasUpdates) {\n if (!hasUpdates) return;\n if (newPeers.length>0) {\n flushNewPeersAndSort(newPeers, true);\n }\n else {\n console.debug('[network] [ws] Peers updated received');\n sortPeers(true);\n }\n });\n })\n ];\n },\n\n sort = function(options) {\n options = options || {};\n data.filter = options.filter ? angular.merge(data.filter, options.filter) : data.filter;\n data.sort = options.sort ? angular.merge(data.sort, options.sort) : data.sort;\n sortPeers(false);\n },\n\n start = function(bma, options) {\n options = options || {};\n return BMA.ready()\n .then(function() {\n close();\n\n data.bma = bma || BMA;\n data.filter = options.filter ? angular.merge(data.filter, options.filter) : data.filter;\n data.sort = options.sort ? angular.merge(data.sort, options.sort) : data.sort;\n data.expertMode = angular.isDefined(options.expertMode) ? options.expertMode : data.expertMode;\n data.timeout = angular.isDefined(options.timeout) ? options.timeout : csConfig.timeout;\n\n // Init a min block number\n data.minOnlineBlockNumber = data.mainBlock && data.mainBlock.buid && (parseInt(data.mainBlock.buid.split('-')[0]) - constants.MAX_BLOCK_OFFSET) || undefined;\n if (data.minOnlineBlockNumber === undefined) {\n return csCurrency.blockchain.current(true/*use cache*/)\n .then(function(current) {\n data.minOnlineBlockNumber = current.number - constants.MAX_BLOCK_OFFSET;\n });\n }\n })\n .then(function() {\n console.info('[network] Starting network from [{0}]'.format(bma.server));\n var now = Date.now();\n\n addListeners();\n\n return loadPeers()\n .then(function(peers){\n console.debug('[network] Started in '+(Date.now() - now)+'ms');\n return peers;\n });\n });\n },\n\n close = function() {\n if (data.bma) {\n console.info('[network-service] Stopping...');\n removeListeners();\n resetData();\n }\n },\n\n isStarted = function() {\n return !data.bma;\n },\n\n $q_started = function(callback) {\n if (!isStarted()) { // start first\n return start()\n .then(function() {\n return $q(callback);\n });\n }\n else {\n return $q(callback);\n }\n },\n\n getMainBlockUid = function() {\n return $q_started(function(resolve, reject){\n resolve (data.mainBuid);\n });\n },\n\n // Get peers on the main consensus blocks\n getTrustedPeers = function() {\n return $q_started(function(resolve, reject){\n resolve(data.peers.reduce(function(res, peer){\n return (peer.hasMainConsensusBlock && peer.uid) ? res.concat(peer) : res;\n }, []));\n });\n }\n ;\n\n // Register extension points\n api.registerEvent('data', 'changed');\n api.registerEvent('data', 'mainBlockChanged');\n api.registerEvent('data', 'rollback');\n\n return {\n data: data,\n start: start,\n close: close,\n hasPeers: hasPeers,\n getPeers: getPeers,\n sort: sort,\n getTrustedPeers: getTrustedPeers,\n getKnownBlocks: getKnownBlocks,\n getMainBlockUid: getMainBlockUid,\n loadPeers: loadPeers,\n isBusy: isBusy,\n // api extension\n api: api\n };\n}]);\n","//var Base58, Base64, scrypt_module_factory = null, nacl_factory = null;\n\nangular.module('cesium.crypto.services', ['cesium.utils.services'])\n\n .factory('CryptoUtils', ['$q', '$timeout', 'ionicReady', function($q, $timeout, ionicReady) {\n 'ngInject';\n\n /**\n * CryptoAbstract, abstract class with useful methods\n * @type {number}\n */\n function CryptoAbstractService() {\n this.loaded = false;\n var that = this;\n\n this.copy = function(source) {\n _.forEach(_.keys(source), function(key) {\n that[key] = source[key];\n });\n };\n\n this.isLoaded = function() {\n return this.loaded;\n };\n\n this.util = this.util || {};\n\n /**\n * Converts an array buffer to a string\n *\n * @private\n * @param {ArrayBuffer} buf The buffer to convert\n * @param {Function} callback The function to call when conversion is complete\n */\n this.util.array_to_string = function(buf, callback) {\n var bb = new Blob([new Uint8Array(buf)]);\n var f = new FileReader();\n f.onload = function(e) {\n callback(e.target.result);\n };\n f.readAsText(bb);\n };\n }\n\n CryptoAbstractService.prototype.constants = {\n crypto_sign_BYTES: 64,\n crypto_secretbox_NONCEBYTES: 24,\n crypto_box_MACBYTES: 16,\n SEED_LENGTH: 32, // Length of the key\n SCRYPT_PARAMS:{\n SIMPLE: {\n N: 2048,\n r: 8,\n p: 1,\n memory: -1 // default\n },\n DEFAULT: {\n N: 4096,\n r: 16,\n p: 1,\n memory: -1 // default\n },\n }\n };\n\n CryptoAbstractService.prototype.async_load_base58 = function(on_ready) {\n var that = this;\n if (Base58 !== null){return on_ready(Base58);}\n else {$timeout(function(){that.async_load_base58(on_ready);}, 100);}\n };\n\n CryptoAbstractService.prototype.async_load_scrypt = function(on_ready, options) {\n var that = this;\n if (scrypt_module_factory !== null){scrypt_module_factory(on_ready, options);}\n else {$timeout(function(){that.async_load_scrypt(on_ready, options);}, 100);}\n };\n\n CryptoAbstractService.prototype.async_load_nacl_js = function(on_ready, options) {\n var that = this;\n if (nacl_factory !== null) {nacl_factory.instantiate(on_ready, options);}\n else {$timeout(function(){that.async_load_nacl_js(on_ready, options);}, 100);}\n };\n\n CryptoAbstractService.prototype.async_load_base64 = function(on_ready) {\n var that = this;\n if (Base64 !== null) {on_ready(Base64);}\n else {$timeout(function(){that.async_load_base64(on_ready);}, 100);}\n };\n\n CryptoAbstractService.prototype.async_load_sha256 = function(on_ready) {\n var that = this;\n if (sha256 !== null){return on_ready(sha256);}\n else {$timeout(function(){that.async_load_sha256(on_ready);}, 100);}\n };\n\n CryptoAbstractService.prototype.seed_from_signSk = function(signSk) {\n var seed = new Uint8Array(this.constants.SEED_LENGTH);\n for (var i = 0; i < seed.length; i++) seed[i] = signSk[i];\n return seed;\n };\n\n // Web crypto API - see https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API\n var crypto = window.crypto || window.msCrypto || window.Crypto;\n if (crypto && crypto.getRandomValues) {\n CryptoAbstractService.prototype.crypto = crypto;\n CryptoAbstractService.prototype.util = {};\n CryptoAbstractService.prototype.util.random_nonce = function() {\n var nonce = new Uint8Array(crypto_secretbox_NONCEBYTES);\n this.crypto.getRandomValues(nonce);\n return $q.when(nonce);\n };\n }\n\n function FullJSServiceFactory() {\n this.id = 'FullJS';\n\n // libraries handlers\n this.scrypt = null;\n this.nacl = null;\n this.base58 = null;\n this.base64 = null;\n var that = this;\n\n this.util = this.util || {};\n this.util.decode_utf8 = function (s) {\n var i, d = unescape(encodeURIComponent(s)), b = new Uint8Array(d.length);\n for (i = 0; i < d.length; i++) b[i] = d.charCodeAt(i);\n return b;\n };\n this.util.encode_utf8 = function (s) {\n return that.nacl.encode_utf8(s);\n };\n this.util.encode_base58 = function (a) { // TODO : move to abstract factory\n return that.base58.encode(a);\n };\n this.util.decode_base58 = function (a) { // TODO : move to abstract factory\n var i;\n var d = that.base58.decode(a);\n var b = new Uint8Array(d.length);\n for (i = 0; i < d.length; i++) b[i] = d[i];\n return b;\n };\n this.util.decode_base64 = function (a) {\n return that.base64.decode(a);\n };\n this.util.encode_base64 = function (b) {\n return that.base64.encode(b);\n };\n\n this.util.hash_sha256 = function (message) {\n return $q(function (resolve) {\n var msg = that.util.decode_utf8(message);\n var hash = that.nacl.to_hex(that.nacl.crypto_hash_sha256(msg));\n resolve(hash.toUpperCase());\n });\n };\n this.util.random_nonce = function () {\n if (that.crypto && that.crypto.getRandomValues) {\n var nonce = new Uint8Array(that.constants.crypto_secretbox_NONCEBYTES);\n that.crypto.getRandomValues(nonce);\n return $q.when(nonce);\n }\n else {\n return $q.when(that.nacl.crypto_box_random_nonce());\n }\n };\n this.util.crypto_hash_sha256 = function(msg_int8) {\n return that.nacl.crypto_hash_sha256(msg_int8);\n };\n this.util.crypto_scrypt = function(password, salt, N, r, p, seedLength) {\n\n return $q(function(resolve, reject) {\n try {\n var seed = that.scrypt.crypto_scrypt(\n password,\n salt,\n N,\n r,\n p,\n seedLength);\n resolve(seed);\n }\n catch(err) {\n reject(err);\n }\n });\n };\n\n /**\n * Compute the box key pair, from a sign key pair\n */\n this.box_keypair_from_sign = function (signKeyPair) {\n if (signKeyPair.boxSk && signKeyPair.boxPk) return $q.when(signKeyPair);\n return $q(function (resolve, reject) {\n try {\n // TODO: waiting for a new version of js-nacl, with missing functions expose\n //resolve(that.nacl.crypto_box_keypair_from_sign_sk(signKeyPair.signSk);\n\n resolve(crypto_box_keypair_from_sign_sk(signKeyPair.signSk));\n }\n catch(err) {\n reject(err);\n }\n });\n };\n\n /**\n * Compute the box public key, from a sign public key\n */\n this.box_pk_from_sign = function (signPk) {\n return $q(function(resolve, reject) {\n try {\n // TODO: waiting for a new version of js-nacl, with missing functions expose\n //resolve(that.nacl.crypto_box_pk_from_sign_pk(signPk));\n\n resolve(crypto_box_pk_from_sign_pk(signPk));\n }\n catch(err) {\n reject(err);\n }\n });\n };\n\n this.box_sk_from_sign = function (signSk) {\n return $q(function(resolve, reject) {\n try {\n // TODO: waiting for a new version of js-nacl, with missing functions expose\n //resolve(that.nacl.crypto_box_sk_from_sign_sk(signSk));\n resolve(crypto_box_sk_from_sign_sk(signSk));\n }\n catch(err) {\n reject(err);\n }\n });\n };\n\n /**\n * Encrypt a message, from a key pair\n */\n this.box = function(message, nonce, recipientPk, senderSk) {\n return $q(function (resolve, reject) {\n if (!message) {\n resolve(message);\n return;\n }\n var messageBin = that.nacl.encode_utf8(message);\n if (typeof recipientPk === \"string\") {\n recipientPk = that.util.decode_base58(recipientPk);\n }\n\n try {\n var ciphertextBin = that.nacl.crypto_box(messageBin, nonce, recipientPk, senderSk);\n var ciphertext = that.util.encode_base64(ciphertextBin);\n resolve(ciphertext);\n }\n catch (err) {\n reject(err);\n }\n });\n };\n\n /**\n * Decrypt a message, from a key pair\n */\n this.box_open = function (cypherText, nonce, senderPk, recipientSk) {\n return $q(function (resolve, reject) {\n if (!cypherText) {\n resolve(cypherText);\n return;\n }\n\n var ciphertextBin = that.util.decode_base64(cypherText);\n if (typeof senderPk === \"string\") {\n senderPk = that.util.decode_base58(senderPk);\n }\n\n try {\n var message = that.nacl.crypto_box_open(ciphertextBin, nonce, senderPk, recipientSk);\n resolve(that.nacl.decode_utf8(message));\n }\n catch (err) {\n reject(err);\n }\n\n });\n };\n\n /**\n * Create key pairs (sign and box), from salt+password (Scrypt auth)\n */\n this.scryptKeypair = function(salt, password, scryptParams) {\n return that.util.crypto_scrypt(\n that.util.encode_utf8(password),\n that.util.encode_utf8(salt),\n scryptParams && scryptParams.N || that.constants.SCRYPT_PARAMS.DEFAULT.N,\n scryptParams && scryptParams.r || that.constants.SCRYPT_PARAMS.DEFAULT.r,\n scryptParams && scryptParams.p || that.constants.SCRYPT_PARAMS.DEFAULT.p,\n that.constants.SEED_LENGTH)\n .then(function(seed){\n var signKeypair = that.nacl.crypto_sign_seed_keypair(seed);\n var boxKeypair = that.nacl.crypto_box_seed_keypair(seed);\n return {\n signPk: signKeypair.signPk,\n signSk: signKeypair.signSk,\n boxPk: boxKeypair.boxPk,\n boxSk: boxKeypair.boxSk\n };\n });\n };\n\n /**\n * Create key pairs from a seed\n */\n this.seedKeypair = function(seed) {\n return $q(function(resolve, reject) {\n var signKeypair = that.nacl.crypto_sign_seed_keypair(seed);\n var boxKeypair = that.nacl.crypto_box_seed_keypair(seed);\n resolve({\n signPk: signKeypair.signPk,\n signSk: signKeypair.signSk,\n boxPk: boxKeypair.boxPk,\n boxSk: boxKeypair.boxSk\n });\n });\n };\n\n /**\n * Get sign pk from salt+password (scrypt auth)\n */\n this.scryptSignPk = function(salt, password, scryptParams) {\n return $q(function(resolve, reject) {\n try {\n var seed = that.scrypt.crypto_scrypt(\n that.util.encode_utf8(password),\n that.util.encode_utf8(salt),\n scryptParams && scryptParams.N || that.constants.SCRYPT_PARAMS.DEFAULT.N,\n scryptParams && scryptParams.r || that.constants.SCRYPT_PARAMS.DEFAULT.r,\n scryptParams && scryptParams.p || that.constants.SCRYPT_PARAMS.DEFAULT.p,\n that.constants.SEED_LENGTH);\n var signKeypair = that.nacl.crypto_sign_seed_keypair(seed);\n resolve(signKeypair.signPk);\n }\n catch(err) {\n reject(err);\n }\n });\n };\n\n /**\n * Verify a signature of a message, for a pubkey\n */\n this.verify = function (message, signature, pubkey) {\n return $q(function(resolve, reject) {\n var msg = that.util.decode_utf8(message);\n var sig = that.util.decode_base64(signature);\n var pub = that.util.decode_base58(pubkey);\n var sm = new Uint8Array(that.constants.crypto_sign_BYTES + msg.length);\n var i;\n for (i = 0; i < that.constants.crypto_sign_BYTES; i++) sm[i] = sig[i];\n for (i = 0; i < msg.length; i++) sm[i+that.constants.crypto_sign_BYTES] = msg[i];\n\n // Call to verification lib...\n var verified = that.nacl.crypto_sign_open(sm, pub) !== null;\n resolve(verified);\n });\n };\n\n /**\n * Sign a message, from a key pair\n */\n this.sign = function(message, keypair) {\n return $q(function(resolve, reject) {\n var m = that.util.decode_utf8(message);\n var sk = keypair.signSk;\n var signedMsg = that.nacl.crypto_sign(m, sk);\n var sig = new Uint8Array(that.constants.crypto_sign_BYTES);\n for (var i = 0; i < sig.length; i++) sig[i] = signedMsg[i];\n var signature = that.base64.encode(sig);\n resolve(signature);\n });\n };\n\n this.load = function() {\n var deferred = $q.defer();\n var naclOptions = {};\n var scryptOptions = {};\n if (ionic.Platform.grade.toLowerCase()!='a') {\n console.info('Reduce NaCl memory to 16mb, because plateform grade is not [a] but [{0}]'.format(ionic.Platform.grade));\n naclOptions.requested_total_memory = 16 * 1048576; // 16 Mo\n }\n var loadedLib = 0;\n var checkAllLibLoaded = function() {\n loadedLib++;\n if (loadedLib === 4) {\n that.loaded = true;\n deferred.resolve();\n }\n };\n this.async_load_nacl_js(function(lib) {\n that.nacl = lib;\n checkAllLibLoaded();\n }, naclOptions);\n this.async_load_scrypt(function(lib) {\n that.scrypt = lib;\n that.scrypt.requested_total_memory = scryptOptions.requested_total_memory;\n checkAllLibLoaded();\n }, scryptOptions);\n this.async_load_base58(function(lib) {\n that.base58 = lib;\n checkAllLibLoaded();\n });\n that.async_load_base64(function(lib) {\n that.base64 = lib;\n checkAllLibLoaded();\n });\n return deferred.promise;\n };\n\n // Shortcuts\n this.util.hash = that.util.hash_sha256;\n this.box = {\n keypair: {\n fromSignKeypair: that.box_keypair_from_sign,\n skFromSignSk: that.box_sk_from_sign,\n pkFromSignPk: that.box_pk_from_sign\n },\n pack: that.box,\n open: that.box_open\n };\n\n /*--\n start WORKAROUND - Publish missing functions (see PR js-nacl: https://github.com/tonyg/js-nacl/pull/54)\n -- */\n\n function crypto_box_keypair_from_sign_sk(sk) {\n var ska = check_injectBytes(\"crypto_box_keypair_from_sign_sk\", \"sk\", sk,\n that.nacl.nacl_raw._crypto_sign_secretkeybytes());\n var skb = new Target(that.nacl.nacl_raw._crypto_box_secretkeybytes());\n check(\"_crypto_sign_ed25519_sk_to_curve25519\",\n that.nacl.nacl_raw._crypto_sign_ed25519_sk_to_curve25519(skb.address, ska));\n FREE(ska);\n return that.nacl.crypto_box_keypair_from_raw_sk(skb.extractBytes());\n }\n\n function crypto_box_pk_from_sign_pk(pk) {\n var pka = check_injectBytes(\"crypto_box_pk_from_sign_pk\", \"pk\", pk,\n that.nacl.nacl_raw._crypto_sign_publickeybytes());\n var pkb = new Target(that.nacl.nacl_raw._crypto_box_publickeybytes());\n check(\"_crypto_sign_ed25519_pk_to_curve25519\",\n that.nacl.nacl_raw._crypto_sign_ed25519_pk_to_curve25519(pkb.address, pka));\n FREE(pka);\n return pkb.extractBytes();\n }\n\n function crypto_box_sk_from_sign_sk(sk) {\n var ska = check_injectBytes(\"crypto_box_sk_from_sign_sk\", \"sk\", sk,\n that.nacl.nacl_raw._crypto_sign_secretkeybytes());\n var skb = new Target(that.nacl.nacl_raw._crypto_box_secretkeybytes());\n check(\"_crypto_sign_ed25519_sk_to_curve25519\",\n that.nacl.nacl_raw._crypto_sign_ed25519_sk_to_curve25519(skb.address, ska));\n FREE(ska);\n return skb.extractBytes();\n }\n\n function check_length(function_name, what, thing, expected_length) {\n if (thing.length !== expected_length) {\n throw {message: \"nacl.\" + function_name + \" expected \" +\n expected_length + \"-byte \" + what + \" but got length \" + thing.length};\n }\n }\n\n function check(function_name, result) {\n if (result !== 0) {\n throw {message: \"nacl_raw.\" + function_name + \" signalled an error\"};\n }\n }\n\n function check_injectBytes(function_name, what, thing, expected_length, leftPadding) {\n check_length(function_name, what, thing, expected_length);\n return injectBytes(thing, leftPadding);\n }\n\n function injectBytes(bs, leftPadding) {\n var p = leftPadding || 0;\n var address = MALLOC(bs.length + p);\n that.nacl.nacl_raw.HEAPU8.set(bs, address + p);\n for (var i = address; i < address + p; i++) {\n that.nacl.nacl_raw.HEAPU8[i] = 0;\n }\n return address;\n }\n\n function MALLOC(nbytes) {\n var result = that.nacl.nacl_raw._malloc(nbytes);\n if (result === 0) {\n throw {message: \"malloc() failed\", nbytes: nbytes};\n }\n return result;\n }\n\n function FREE(pointer) {\n that.nacl.nacl_raw._free(pointer);\n }\n\n function free_all(addresses) {\n for (var i = 0; i < addresses.length; i++) {\n FREE(addresses[i]);\n }\n }\n\n function extractBytes(address, length) {\n var result = new Uint8Array(length);\n result.set(that.nacl.nacl_raw.HEAPU8.subarray(address, address + length));\n return result;\n }\n\n function Target(length) {\n this.length = length;\n this.address = MALLOC(length);\n }\n\n Target.prototype.extractBytes = function (offset) {\n var result = extractBytes(this.address + (offset || 0), this.length - (offset || 0));\n FREE(this.address);\n this.address = null;\n return result;\n };\n\n /*--\n end of WORKAROUND\n -- */\n\n }\n FullJSServiceFactory.prototype = new CryptoAbstractService();\n\n\n /* -----------------------------------------------------------------------------------------------------------------\n * Service that use Cordova MiniSodium plugin\n * ----------------------------------------------------------------------------------------------------------------*/\n\n /***\n * Factory for crypto, using Cordova plugin\n */\n function CordovaServiceFactory() {\n\n this.id = 'MiniSodium';\n\n // libraries handlers\n this.nacl = null; // the cordova plugin\n this.base58= null;\n this.sha256= null;\n var that = this;\n\n // functions\n this.util = this.util || {};\n this.util.decode_utf8 = function(s) {\n return that.nacl.to_string(s);\n };\n this.util.encode_utf8 = function(s) {\n return that.nacl.from_string(s);\n };\n this.util.encode_base58 = function(a) {\n return that.base58.encode(a);\n };\n this.util.decode_base58 = function(a) {\n var i;\n var d = that.base58.decode(a);\n var b = new Uint8Array(d.length);\n for (i = 0; i < d.length; i++) b[i] = d[i];\n return b;\n };\n this.util.decode_base64 = function (a) {\n return that.nacl.from_base64(a);\n };\n this.util.encode_base64 = function (b) {\n return that.nacl.to_base64(b);\n };\n this.util.hash_sha256 = function(message) {\n return $q.when(that.sha256(message).toUpperCase());\n };\n this.util.random_nonce = function() {\n var nonce = new Uint8Array(that.constants.crypto_secretbox_NONCEBYTES);\n that.crypto.getRandomValues(nonce);\n return $q.when(nonce);\n };\n this.util.crypto_hash_sha256 = function (message) {\n return that.nacl.from_hex(that.sha256(message));\n };\n\n this.util.crypto_scrypt = function(password, salt, N, r, p, seedLength) {\n var deferred = $q.defer();\n that.nacl.crypto_pwhash_scryptsalsa208sha256_ll(\n password,\n salt,\n N,\n r,\n p,\n seedLength,\n function (err, seed) {\n if (err) { deferred.reject(err); return;}\n deferred.resolve(seed);\n }\n );\n return deferred.promise;\n };\n\n /**\n * Create key pairs (sign and box), from salt+password (Scrypt), using cordova\n */\n this.scryptKeypair = function(salt, password, scryptParams) {\n var deferred = $q.defer();\n\n that.nacl.crypto_pwhash_scryptsalsa208sha256_ll(\n that.nacl.from_string(password),\n that.nacl.from_string(salt),\n scryptParams && scryptParams.N || that.constants.SCRYPT_PARAMS.DEFAULT.N,\n scryptParams && scryptParams.r || that.constants.SCRYPT_PARAMS.DEFAULT.r,\n scryptParams && scryptParams.p || that.constants.SCRYPT_PARAMS.DEFAULT.p,\n that.constants.SEED_LENGTH,\n function (err, seed) {\n if (err) { deferred.reject(err); return;}\n\n that.nacl.crypto_sign_seed_keypair(seed, function (err, signKeypair) {\n if (err) { deferred.reject(err); return;}\n var result = {\n signPk: signKeypair.pk,\n signSk: signKeypair.sk\n };\n that.box_keypair_from_sign(result)\n .then(function(boxKeypair) {\n result.boxPk = boxKeypair.pk;\n result.boxSk = boxKeypair.sk;\n deferred.resolve(result);\n })\n .catch(function(err) {\n deferred.reject(err);\n });\n });\n\n }\n );\n\n return deferred.promise;\n };\n\n /**\n * Create key pairs from a seed\n */\n this.seedKeypair = function(seed) {\n var deferred = $q.defer();\n\n that.nacl.crypto_sign_seed_keypair(seed, function (err, signKeypair) {\n if (err) { deferred.reject(err); return;}\n deferred.resolve({\n signPk: signKeypair.pk,\n signSk: signKeypair.sk\n });\n });\n return deferred.promise;\n };\n\n\n /**\n * Get sign PK from salt+password (Scrypt), using cordova\n */\n this.scryptSignPk = function(salt, password, scryptParams) {\n var deferred = $q.defer();\n\n that.nacl.crypto_pwhash_scryptsalsa208sha256_ll(\n that.nacl.from_string(password),\n that.nacl.from_string(salt),\n scryptParams && scryptParams.N || that.constants.SCRYPT_PARAMS.DEFAULT.N,\n scryptParams && scryptParams.r || that.constants.SCRYPT_PARAMS.DEFAULT.r,\n scryptParams && scryptParams.p || that.constants.SCRYPT_PARAMS.DEFAULT.p,\n that.constants.SEED_LENGTH,\n function (err, seed) {\n if (err) { deferred.reject(err); return;}\n\n that.nacl.crypto_sign_seed_keypair(seed, function (err, signKeypair) {\n if (err) { deferred.reject(err); return;}\n deferred.resolve(signKeypair.pk);\n });\n\n }\n );\n\n return deferred.promise;\n };\n\n /**\n * Verify a signature of a message, for a pubkey\n */\n this.verify = function (message, signature, pubkey) {\n var deferred = $q.defer();\n that.nacl.crypto_sign_verify_detached(\n that.nacl.from_base64(signature),\n that.nacl.from_string(message),\n that.nacl.from_base64(pubkey),\n function(err, verified) {\n if (err) { deferred.reject(err); return;}\n deferred.resolve(verified);\n });\n return deferred.promise;\n };\n\n /**\n * Sign a message, from a key pair\n */\n this.sign = function(message, keypair) {\n var deferred = $q.defer();\n\n that.nacl.crypto_sign(\n that.nacl.from_string(message), // message\n keypair.signSk, // sk\n function(err, signedMsg) {\n if (err) { deferred.reject(err); return;}\n var sig;\n if (signedMsg.length > that.constants.crypto_sign_BYTES) {\n sig = new Uint8Array(that.constants.crypto_sign_BYTES);\n for (var i = 0; i < sig.length; i++) sig[i] = signedMsg[i];\n }\n else {\n sig = signedMsg;\n }\n var signature = that.nacl.to_base64(sig);\n deferred.resolve(signature);\n });\n\n return deferred.promise;\n };\n\n /**\n * Compute the box key pair, from a sign key pair\n */\n this.box_keypair_from_sign = function(signKeyPair) {\n if (signKeyPair.boxSk && signKeyPair.boxPk) return $q.when(signKeyPair);\n var deferred = $q.defer();\n var result = {};\n that.nacl.crypto_sign_ed25519_pk_to_curve25519(signKeyPair.signPk, function(err, boxPk) {\n if (err) { deferred.reject(err); return;}\n result.boxPk = boxPk;\n if (result.boxSk) deferred.resolve(result);\n });\n that.nacl.crypto_sign_ed25519_sk_to_curve25519(signKeyPair.signSk, function(err, boxSk) {\n if (err) { deferred.reject(err); return;}\n result.boxSk = boxSk;\n if (result.boxPk) deferred.resolve(result);\n });\n\n return deferred.promise;\n };\n\n /**\n * Compute the box public key, from a sign public key\n */\n this.box_pk_from_sign = function(signPk) {\n var deferred = $q.defer();\n that.nacl.crypto_sign_ed25519_pk_to_curve25519(signPk, function(err, boxPk) {\n if (err) { deferred.reject(err); return;}\n deferred.resolve(boxPk);\n });\n return deferred.promise;\n };\n\n /**\n * Compute the box secret key, from a sign secret key\n */\n this.box_sk_from_sign = function(signSk) {\n var deferred = $q.defer();\n that.nacl.crypto_sign_ed25519_sk_to_curve25519(signSk, function(err, boxSk) {\n if (err) { deferred.reject(err); return;}\n deferred.resolve(boxSk);\n });\n return deferred.promise;\n };\n\n /**\n * Encrypt a message, from a key pair\n */\n this.box = function(message, nonce, recipientPk, senderSk) {\n if (!message) {\n return $q.reject('No message');\n }\n var deferred = $q.defer();\n\n var messageBin = that.nacl.from_string(message);\n if (typeof recipientPk === \"string\") {\n recipientPk = that.util.decode_base58(recipientPk);\n }\n\n that.nacl.crypto_box_easy(messageBin, nonce, recipientPk, senderSk, function(err, ciphertextBin) {\n if (err) { deferred.reject(err); return;}\n var ciphertext = that.util.encode_base64(ciphertextBin);\n //console.debug('Encrypted message: ' + ciphertext);\n deferred.resolve(ciphertext);\n });\n return deferred.promise;\n };\n\n /**\n * Decrypt a message, from a key pair\n */\n this.box_open = function(cypherText, nonce, senderPk, recipientSk) {\n if (!cypherText) {\n return $q.reject('No cypherText');\n }\n var deferred = $q.defer();\n\n var ciphertextBin = that.nacl.from_base64(cypherText);\n if (typeof senderPk === \"string\") {\n senderPk = that.util.decode_base58(senderPk);\n }\n\n // Avoid crash if content has not the minimal length - Fix #346\n if (ciphertextBin.length < that.constants.crypto_box_MACBYTES) {\n deferred.reject('Invalid cypher content length');\n return;\n }\n\n that.nacl.crypto_box_open_easy(ciphertextBin, nonce, senderPk, recipientSk, function(err, message) {\n if (err) { deferred.reject(err); return;}\n that.util.array_to_string(message, function(result) {\n //console.debug('Decrypted text: ' + result);\n deferred.resolve(result);\n });\n });\n\n return deferred.promise;\n };\n\n this.load = function() {\n var deferred = $q.defer();\n if (!window.plugins || !window.plugins.MiniSodium) {\n deferred.reject(\"Cordova plugin 'MiniSodium' not found. Please load Full JS implementation instead.\");\n }\n else {\n that.nacl = window.plugins.MiniSodium;\n\n var loadedLib = 0;\n var checkAllLibLoaded = function() {\n loadedLib++;\n if (loadedLib == 2) {\n that.loaded = true;\n deferred.resolve();\n }\n };\n that.async_load_base58(function(lib) {\n that.base58 = lib;\n checkAllLibLoaded();\n });\n that.async_load_sha256(function(lib) {\n that.sha256 = lib;\n checkAllLibLoaded();\n });\n }\n\n return deferred.promise;\n };\n\n // Shortcuts\n this.util.hash = that.util.hash_sha256;\n this.box = {\n keypair: {\n fromSignKeypair: that.box_keypair_from_sign,\n skFromSignSk: that.box_sk_from_sign,\n pkFromSignPk: that.box_pk_from_sign\n },\n pack: that.box,\n open: that.box_open\n };\n }\n CordovaServiceFactory.prototype = new CryptoAbstractService();\n\n /* -----------------------------------------------------------------------------------------------------------------\n * Create service instance\n * ----------------------------------------------------------------------------------------------------------------*/\n\n\n var service = new CryptoAbstractService();\n\n var isDevice = true;\n // removeIf(android)\n // removeIf(ios)\n isDevice = false;\n // endRemoveIf(ios)\n // endRemoveIf(android)\n\n //console.debug(\"[crypto] Created CryptotUtils service. device=\" + isDevice);\n\n ionicReady().then(function() {\n console.debug('[crypto] Starting...');\n var now = Date.now();\n\n var serviceImpl;\n\n // Use Cordova plugin implementation, when exists\n if (isDevice && window.plugins && window.plugins.MiniSodium && crypto && crypto.getRandomValues) {\n console.debug('[crypto] Loading \\'MiniSodium\\' implementation...');\n serviceImpl = new CordovaServiceFactory();\n }\n else {\n console.debug('[crypto] Loading \\'FullJS\\' implementation...');\n serviceImpl = new FullJSServiceFactory();\n }\n\n // Load (async lib)\n serviceImpl.load()\n .catch(function(err) {\n console.error(err);\n throw err;\n })\n .then(function() {\n service.copy(serviceImpl);\n console.debug('[crypto] Loaded \\'{0}\\' implementation in {1}ms'.format(service.id, Date.now() - now));\n });\n\n });\n\n return service;\n }])\n\n\n /* -----------------------------\n Crypto advanced service for Cesium\n */\n\n .factory('csCrypto', ['$q', '$rootScope', '$timeout', 'CryptoUtils', 'UIUtils', 'Modals', function($q, $rootScope, $timeout, CryptoUtils, UIUtils, Modals) {\n 'ngInject';\n\n function test(regexpContent) {\n return new RegExp(regexpContent);\n }\n\n function xor(a, b) {\n var length = Math.max(a.length, b.length);\n var buffer = new Uint8Array(length);\n for (var i = 0; i < length; ++i) {\n buffer[i] = a[i] ^ b[i];\n }\n return buffer;\n }\n\n function concat_Uint8Array( buffer1, buffer2 ) {\n var tmp = new Uint8Array( buffer1.byteLength + buffer2.byteLength );\n tmp.set( new Uint8Array( buffer1 ), 0 );\n tmp.set( new Uint8Array( buffer2 ), buffer1.byteLength );\n return tmp;\n }\n\n var constants = {\n WIF: {\n DATA_LENGTH: 35\n },\n EWIF: {\n SALT_LENGTH: 4,\n DERIVED_HALF_LENGTH: 16,\n DATA_LENGTH: 39,\n SCRYPT_PARAMS: {\n N: 16384,\n r: 8,\n p: 8\n }\n },\n REGEXP: {\n PUBKEY: '[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{43,44}',\n SECKEY: '[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{86,88}',\n FILE: {\n TYPE_LINE: '^Type: ([a-zA-Z0-9]+)\\n',\n VERSION: 'Version: ([0-9]+)\\n',\n PUB: '[Pp]ub: ([123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{43,44})\\n',\n SEC: '[Ss]ec: ([123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{86,88})(\\n|$)',\n DATA: '[Dd]ata: ([123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+)(\\n|$)'\n }\n }\n },\n regexp = {\n FILE: {\n TYPE_LINE: test(constants.REGEXP.FILE.TYPE_LINE),\n VERSION: test(constants.REGEXP.FILE.VERSION),\n PUB: test(constants.REGEXP.FILE.PUB),\n SEC: test(constants.REGEXP.FILE.SEC),\n DATA: test(constants.REGEXP.FILE.DATA)\n }\n },\n errorCodes = {\n BAD_PASSWORD: 3001,\n BAD_CHECKSUM: 3002\n };\n\n /* -- keyfile -- */\n\n function readKeyFile(file, options) {\n\n if (file && file.content) {\n return parseKeyFileContent(file.content, options);\n }\n\n return $q(function(resolve, reject) {\n if (!file) {\n return reject('Argument [file] is missing');\n }\n\n //console.debug('[crypto] [keypair] reading file: ', file);\n var reader = new FileReader();\n reader.onload = function (event) {\n parseKeyFileContent(event.target.result, options)\n .then(resolve)\n .catch(reject);\n };\n reader.readAsText(file, 'utf8');\n });\n }\n\n function parseKeyFileContent(content, options) {\n\n if (!content) return $q.reject('Argument [content] is missing');\n\n options = options || {};\n options.withSecret = angular.isDefined(options.withSecret) ? options.withSecret : false;\n options.defaultType = options.defaultType || 'PubSec';\n\n var matches;\n\n var typeMatch = regexp.FILE.TYPE_LINE.exec(content);\n\n // If no Type field: add default type\n var type = typeMatch && typeMatch[1];\n if (!type && options.defaultType) {\n return parseKeyFileContent('Type: {0}\\n{1}'.format(options.defaultType, content), options);\n }\n\n // Type: PubSec\n if (type == 'PubSec') {\n\n // Read Pub field\n matches = regexp.FILE.PUB.exec(content);\n if (!matches) return $q.reject('Missing [pub] field in file, or invalid public key value');\n var signKeypair = {\n signPk: CryptoUtils.base58.decode(matches[1])\n };\n if (!options.withSecret) return $q.resolve(signKeypair);\n\n // Read Sec field\n matches= regexp.FILE.SEC.exec(content);\n if (!matches) return $q.reject('Missing [sec] field in file, or invalid secret key value');\n signKeypair.signSk = CryptoUtils.base58.decode(matches[1]);\n return $q.resolve(signKeypair);\n }\n\n // Type: WIF or EWIF\n else if (type == 'WIF' || type == 'EWIF') {\n matches = regexp.FILE.DATA.exec(content);\n if (!matches) {\n return $q.reject('Missing [Data] field in file. This is required for WIF or EWIF format');\n }\n\n return parseWIF_or_EWIF(matches[1], {\n type: type,\n password: options.password\n })\n .then(function(signKeypair) {\n return signKeypair && !options.withSecret ? {signPk: signKeypair.signPk} : signKeypair;\n });\n }\n\n // Type: unknown\n if (options.defaultType) {\n return $q.reject('Bad file format: missing Type field');\n }\n else {\n return $q.reject('Bad file format, unknown type [' + type + ']');\n }\n }\n\n\n /**\n *\n * @param data_base58\n * @param options\n * @returns {*}\n */\n function parseWIF_or_EWIF(data_base58, options) {\n options = options || {};\n\n var data_int8 = data_base58 && CryptoUtils.base58.decode(data_base58);\n if (!data_int8 || data_int8.length != constants.EWIF.DATA_LENGTH && data_int8.length != constants.WIF.DATA_LENGTH) {\n return $q.reject('Invalid WIF or EWIF format (invalid bytes count).');\n }\n\n // Detect the type from the first byte\n options.type = options.type || (data_int8[0] == 1 && 'WIF') || (data_int8[0] == 2 && 'EWIF');\n\n // Type: WIF\n if (options.type == 'WIF') {\n return parseWIF_v1(data_base58);\n }\n\n // Type: EWIF\n if (options.type == 'EWIF') {\n\n // If not set, resolve password using the given callback\n if (typeof options.password == \"function\") {\n //console.debug(\"[crypto] [EWIF] Executing 'options.password()' to resolve the password...\");\n options.password = options.password();\n if (!options.password) {\n return $q.reject({message: \"Invalid callback result for 'options.password()': must return a promise or a string.\"});\n }\n }\n\n // If password is a promise, get the result then read data\n if (typeof options.password === \"object\" && options.password.then) {\n return options.password.then(function(password) {\n if (!password) throw 'CANCELLED';\n return parseEWIF_v1(data_base58, password);\n });\n }\n\n // If password is a valid string, read data\n if (typeof options.password == \"string\") {\n return parseEWIF_v1(data_base58, options.password);\n }\n\n return $q.reject({message: 'Invalid EWIF options.password. Waiting a callback function, a promise or a string.'});\n }\n\n // Unknown type\n return $q.reject({message: 'Invalid WIF or EWIF format: unknown first byte identifier.'});\n }\n\n\n function parseWIF_v1(wif_base58) {\n var wif_int8 = CryptoUtils.util.decode_base58(wif_base58);\n\n // Check identifier byte = 0x01\n if (wif_int8[0] != 1) {\n return $q.reject({message: 'Invalid WIF v1 format: expected [0x01] as first byte'});\n }\n\n // Check length\n if (wif_int8.length != constants.WIF.DATA_LENGTH) {\n return $q.reject({message: 'Invalid WIF v1 format: Data must be a '+constants.WIF.DATA_LENGTH+' bytes array, encoded in base 58.'});\n }\n\n var wif_int8_no_checksum = wif_int8.slice(0, -2),\n seed = wif_int8.slice(1, -2),\n checksum = wif_int8.slice(-2);\n\n // Compute expected checksum\n var expectedChecksum = CryptoUtils.util.crypto_hash_sha256(CryptoUtils.util.crypto_hash_sha256(wif_int8_no_checksum)).slice(0,2);\n if (CryptoUtils.util.encode_base58(checksum) != CryptoUtils.util.encode_base58(expectedChecksum)) {\n $q.reject({message: 'Invalid WIF format: bad checksum'});\n }\n\n // Generate keypair from seed\n return CryptoUtils.seedKeypair(seed);\n }\n\n function parseEWIF_v1(ewif_base58, password) {\n var ewif_int8 = CryptoUtils.util.decode_base58(ewif_base58);\n\n // Check identifier byte = 0x02\n if (ewif_int8[0] != 2) {\n return $q.reject({message: 'Invalid EWIF v1 format: Expected [0x02] as first byte'});\n }\n\n // Check length\n if (ewif_int8.length != constants.EWIF.DATA_LENGTH) {\n return $q.reject({message: 'Invalid EWIF v1 format: Expected {0} bytes, encoded in base 58.'.format(constants.EWIF.DATA_LENGTH)});\n }\n\n var ewif_int8_no_checksum = ewif_int8.slice(0,-2);\n var checksum = ewif_int8.slice(-2);\n var salt = ewif_int8.slice(1,5);\n var encryptedhalf1 = ewif_int8.slice(5,21);\n var encryptedhalf2 = ewif_int8.slice(21,37);\n\n // Retrieve the scrypt_seed\n return CryptoUtils.util.crypto_scrypt(\n CryptoUtils.util.encode_utf8(password),\n salt,\n constants.EWIF.SCRYPT_PARAMS.N,\n constants.EWIF.SCRYPT_PARAMS.r,\n constants.EWIF.SCRYPT_PARAMS.p,\n 64)\n\n // Compute the final seed\n .then(function(scrypt_seed) {\n\n var derivedhalf1 = scrypt_seed.slice(0, 32);\n var derivedhalf2 = scrypt_seed.slice(32, 64);\n\n //AES\n var aesEcb = new aesjs.ModeOfOperation.ecb(derivedhalf2);\n var decryptedhalf1 = aesEcb.decrypt(encryptedhalf1);\n var decryptedhalf2 = aesEcb.decrypt(encryptedhalf2);\n\n decryptedhalf1 = new Uint8Array(decryptedhalf1);\n decryptedhalf2 = new Uint8Array(decryptedhalf2);\n\n //xor\n var seed1 = xor(decryptedhalf1, derivedhalf1.slice(0, 16));\n var seed2 = xor(decryptedhalf2, derivedhalf1.slice(16, 32));\n var seed = concat_Uint8Array(seed1, seed2);\n\n return seed;\n })\n\n // Get the keypair, from the seed\n .then(CryptoUtils.seedKeypair)\n\n // Do some controls\n .then(function(keypair) {\n\n // Check salt\n var expectedSalt = CryptoUtils.util.crypto_hash_sha256(CryptoUtils.util.crypto_hash_sha256(keypair.signPk)).slice(0,4);\n if(CryptoUtils.util.encode_base58(salt) !== CryptoUtils.util.encode_base58(expectedSalt)) {\n throw {ucode: errorCodes.BAD_PASSWORD, message: 'ACCOUNT.SECURITY.KEYFILE.ERROR.BAD_PASSWORD'};\n }\n\n // Check checksum\n var expectedChecksum = CryptoUtils.util.crypto_hash_sha256(CryptoUtils.util.crypto_hash_sha256(ewif_int8_no_checksum)).slice(0,2);\n if (CryptoUtils.util.encode_base58(checksum) != CryptoUtils.util.encode_base58(expectedChecksum)) {\n throw {ucode: errorCodes.BAD_CHECKSUM, message: 'ACCOUNT.SECURITY.KEYFILE.ERROR.BAD_CHECKSUM'};\n }\n\n return keypair;\n });\n }\n\n\n function wif_v1_from_keypair(keypair) {\n\n var seed = CryptoUtils.seed_from_signSk(keypair.signSk);\n if (!seed || seed.byteLength !== CryptoUtils.constants.SEED_LENGTH)\n throw \"Bad see format. Expected {0} bytes\".format(CryptoUtils.constants.SEED_LENGTH);\n\n var fi = new Uint8Array(1);\n fi[0] = 0x01;\n var seed_fi = concat_Uint8Array(fi, seed);\n\n // checksum\n var checksum = CryptoUtils.util.crypto_hash_sha256(CryptoUtils.util.crypto_hash_sha256(seed_fi)).slice(0,2);\n\n var wif_int8 = concat_Uint8Array(seed_fi, checksum);\n return $q.when(CryptoUtils.util.encode_base58(wif_int8));\n }\n\n function ewif_v1_from_keypair(keypair, password) {\n\n var seed = CryptoUtils.seed_from_signSk(keypair.signSk);\n if (!seed || seed.byteLength !== CryptoUtils.constants.SEED_LENGTH)\n return $q.reject({message: \"Bad see format. Expected {0} bytes\".format(CryptoUtils.constants.SEED_LENGTH)});\n\n // salt\n var salt = CryptoUtils.util.crypto_hash_sha256(CryptoUtils.util.crypto_hash_sha256(keypair.signPk)).slice(0,4);\n\n // scrypt_seed\n return CryptoUtils.util.crypto_scrypt(\n CryptoUtils.util.encode_utf8(password),\n salt,\n constants.EWIF.SCRYPT_PARAMS.N,\n constants.EWIF.SCRYPT_PARAMS.r,\n constants.EWIF.SCRYPT_PARAMS.p,\n 64)\n .then(function(scrypt_seed) {\n var derivedhalf1 = scrypt_seed.slice(0,32);\n var derivedhalf2 = scrypt_seed.slice(32,64);\n\n //XOR & AES\n var seed1_xor_derivedhalf1_1 = xor(seed.slice(0,16), derivedhalf1.slice(0,16));\n var seed2_xor_derivedhalf1_2 = xor(seed.slice(16,32), derivedhalf1.slice(16,32));\n\n var aesEcb = new aesjs.ModeOfOperation.ecb(derivedhalf2);\n var encryptedhalf1 = aesEcb.encrypt(seed1_xor_derivedhalf1_1);\n var encryptedhalf2 = aesEcb.encrypt(seed2_xor_derivedhalf1_2);\n\n encryptedhalf1 = new Uint8Array(encryptedhalf1);\n encryptedhalf2 = new Uint8Array(encryptedhalf2);\n\n // concatenate ewif\n var ewif_int8 = new Uint8Array(1);\n ewif_int8[0] = 0x02;\n ewif_int8 = concat_Uint8Array(ewif_int8,salt);\n ewif_int8 = concat_Uint8Array(ewif_int8,encryptedhalf1);\n ewif_int8 = concat_Uint8Array(ewif_int8,encryptedhalf2);\n\n var checksum = CryptoUtils.util.crypto_hash_sha256(CryptoUtils.util.crypto_hash_sha256(ewif_int8)).slice(0,2);\n ewif_int8 = concat_Uint8Array(ewif_int8,checksum);\n\n return CryptoUtils.util.encode_base58(ewif_int8);\n });\n }\n\n function generateKeyFileContent(keypair, options) {\n options = options || {};\n options.type = options.type || \"PubSec\";\n\n switch(options.type) {\n\n // PubSec\n case \"PubSec\" :\n return $q.resolve(\n \"Type: PubSec\\n\" +\n \"Version: 1\\n\" +\n \"pub: \" + CryptoUtils.base58.encode(keypair.signPk) + \"\\n\" +\n \"sec: \" + CryptoUtils.base58.encode(keypair.signSk) + \"\\n\");\n\n // WIF - v1\n case \"WIF\" :\n return wif_v1_from_keypair(keypair)\n .then(function(data) {\n return \"Type: WIF\\n\" +\n \"Version: 1\\n\" +\n \"Data: \" + data + \"\\n\";\n });\n\n // EWIF - v1\n case \"EWIF\" :\n\n if (!options.password) return $q.reject({message: 'Missing EWIF options.password.'});\n\n // If not set, resolve password using the given callback\n if (options.password && typeof options.password == \"function\") {\n console.debug(\"[crypto] [EWIF] Executing 'options.password()' to resolve the password...\");\n options.password = options.password();\n if (!options.password) {\n return $q.reject({message: \"Invalid callback result for 'options.password()': must return a promise or a string.\"});\n }\n }\n\n // If password is a promise, get the result then read data\n if (options.password && typeof options.password == \"object\" && options.password.then) {\n return options.password.then(function(password) {\n if (!password) throw 'CANCELLED';\n // Recursive call, with the string password in options\n return generateKeyFileContent(keypair, angular.merge({}, options, {password: password}));\n });\n }\n\n // If password is a valid string, read data\n if (options.password && typeof options.password == \"string\") {\n return ewif_v1_from_keypair(keypair, options.password)\n .then(function(data) {\n return \"Type: EWIF\\n\" +\n \"Version: 1\\n\" +\n \"Data: \" + data + \"\\n\";\n });\n }\n\n return $q.reject({message: 'Invalid EWIF options.password. Waiting a callback function, a promise or a string.'});\n\n default:\n return $q.reject({message: \"Unknown keyfile format: \" + options.type});\n }\n }\n\n\n\n /* -- usefull methods -- */\n\n function pkChecksum(pubkey) {\n var signPk_int8 = CryptoUtils.util.decode_base58(pubkey);\n return CryptoUtils.util.encode_base58(CryptoUtils.util.crypto_hash_sha256(CryptoUtils.util.crypto_hash_sha256(signPk_int8))).substring(0,3);\n }\n\n /* -- box (pack/unpack a record) -- */\n\n function getBoxKeypair(keypair) {\n if (!keypair) {\n throw new Error('Missing keypair');\n }\n if (keypair.boxPk && keypair.boxSk) {\n return $q.when(keypair);\n }\n\n return $q.all([\n CryptoUtils.box.keypair.skFromSignSk(keypair.signSk),\n CryptoUtils.box.keypair.pkFromSignPk(keypair.signPk)\n ])\n .then(function(res) {\n return {\n boxSk: res[0],\n boxPk: res[1]\n };\n });\n }\n\n function packRecordFields(record, keypair, recipientFieldName, cypherFieldNames, nonce) {\n\n recipientFieldName = recipientFieldName || 'recipient';\n if (!record[recipientFieldName]) {\n return $q.reject({message:'ES_WALLET.ERROR.RECIPIENT_IS_MANDATORY'});\n }\n\n cypherFieldNames = cypherFieldNames || 'content';\n if (typeof cypherFieldNames == 'string') {\n cypherFieldNames = [cypherFieldNames];\n }\n\n // Work on a copy, to keep the original record (as it could be use again - fix #382)\n record = angular.copy(record);\n\n // Get recipient\n var recipientPk = CryptoUtils.util.decode_base58(record[recipientFieldName]);\n\n return $q.all([\n getBoxKeypair(keypair),\n CryptoUtils.box.keypair.pkFromSignPk(recipientPk),\n nonce ? $q.when(nonce) : CryptoUtils.util.random_nonce()\n ])\n .then(function(res) {\n //var senderSk = res[0];\n var boxKeypair = res[0];\n var senderSk = boxKeypair.boxSk;\n var boxRecipientPk = res[1];\n var nonce = res[2];\n\n return $q.all(\n cypherFieldNames.reduce(function(res, fieldName) {\n if (!record[fieldName]) return res; // skip undefined fields\n return res.concat(\n CryptoUtils.box.pack(record[fieldName], nonce, boxRecipientPk, senderSk)\n );\n }, []))\n\n .then(function(cypherTexts){\n // Replace field values with cypher texts\n var i = 0;\n _.forEach(cypherFieldNames, function(cypherFieldName) {\n if (!record[cypherFieldName]) {\n // Force undefined fields to be present in object\n // This is better for ES storage, that always works on lazy update mode\n record[cypherFieldName] = null;\n }\n else {\n record[cypherFieldName] = cypherTexts[i++];\n }\n });\n\n // Set nonce\n record.nonce = CryptoUtils.util.encode_base58(nonce);\n\n return record;\n });\n });\n }\n\n function openRecordFields(records, keypair, issuerFieldName, cypherFieldNames) {\n\n issuerFieldName = issuerFieldName || 'issuer';\n cypherFieldNames = cypherFieldNames || 'content';\n if (typeof cypherFieldNames == 'string') {\n cypherFieldNames = [cypherFieldNames];\n }\n\n var now = Date.now();\n var issuerBoxPks = {}; // a map used as cache\n\n var jobs = [getBoxKeypair(keypair)];\n return $q.all(records.reduce(function(jobs, message) {\n var issuer = message[issuerFieldName];\n if (!issuer) {throw 'Record has no ' + issuerFieldName;}\n if (issuerBoxPks[issuer]) return res;\n return jobs.concat(\n CryptoUtils.box.keypair.pkFromSignPk(CryptoUtils.util.decode_base58(issuer))\n .then(function(issuerBoxPk) {\n issuerBoxPks[issuer] = issuerBoxPk; // fill box pk cache\n }));\n }, jobs))\n .then(function(res){\n var boxKeypair = res[0];\n return $q.all(records.reduce(function(jobs, record) {\n var issuerBoxPk = issuerBoxPks[record[issuerFieldName]];\n var nonce = CryptoUtils.util.decode_base58(record.nonce);\n record.valid = true;\n\n return jobs.concat(\n cypherFieldNames.reduce(function(res, cypherFieldName) {\n if (!record[cypherFieldName]) return res;\n return res.concat(CryptoUtils.box.open(record[cypherFieldName], nonce, issuerBoxPk, boxKeypair.boxSk)\n .then(function(text) {\n record[cypherFieldName] = text;\n })\n .catch(function(err){\n console.error(err);\n console.warn('[ES] [crypto] a record may have invalid cypher ' + cypherFieldName);\n record.valid = false;\n }));\n }, []));\n }, []));\n })\n .then(function() {\n console.debug('[ES] [crypto] All record decrypted in ' + (Date.now() - now) + 'ms');\n return records;\n });\n\n }\n\n function parseKeyFileData(data, options){\n options = options || {};\n options.withSecret = angular.isDefined(options.withSecret) ? options.withSecret : true;\n options.silent = angular.isDefined(options.withSecret) ? options.silent : false;\n options.password = function() {\n return UIUtils.loading.hide(100)\n .then(function() {\n return Modals.showPassword({\n title: 'ACCOUNT.SECURITY.KEYFILE.PASSWORD_POPUP.TITLE',\n subTitle: 'ACCOUNT.SECURITY.KEYFILE.PASSWORD_POPUP.HELP',\n error: options.error,\n scope: options.scope\n });\n })\n .then(function(password) {\n // Timeout is need to force popup to be hide\n return $timeout(function() {\n if (password) UIUtils.loading.show();\n return password;\n }, 150);\n });\n };\n\n if (!options.silent) {\n UIUtils.loading.show();\n }\n\n return parseWIF_or_EWIF(data, options)\n .then(function(res){\n return res;\n })\n .catch(function(err) {\n if (err && err === 'CANCELLED') return;\n if (err && err.ucode == errorCodes.BAD_PASSWORD) {\n // recursive call\n return parseKeyFileData(data, {withSecret: options.withSecret, error: 'ACCOUNT.SECURITY.KEYFILE.ERROR.BAD_PASSWORD'});\n }\n console.error(\"[crypto] Unable to parse as WIF or EWIF format: \" + (err && err.message || err));\n throw err; // rethrow\n });\n }\n\n // exports\n return {\n errorCodes: errorCodes,\n constants: constants,\n // copy CryptoUtils\n util: angular.extend({\n pkChecksum: pkChecksum\n }, CryptoUtils.util),\n keyfile: {\n read: readKeyFile,\n parseData: parseKeyFileData,\n generateContent: generateKeyFileContent\n },\n box: {\n getKeypair: getBoxKeypair,\n pack: packRecordFields,\n open: openRecordFields\n }\n };\n }])\n;\n","// var qrcode;\n\nangular.module('cesium.utils.services', ['angular-fullscreen-toggle'])\n\n// Replace the '$ionicPlatform.ready()', to enable multiple calls\n// See http://stealthcode.co/multiple-calls-to-ionicplatform-ready/\n.factory('ionicReady', ['$ionicPlatform', function($ionicPlatform) {\n 'ngInject';\n\n var readyPromise;\n\n return function () {\n if (!readyPromise) {\n readyPromise = $ionicPlatform.ready();\n }\n return readyPromise;\n };\n}])\n\n.factory('UIUtils', ['$ionicLoading', '$ionicPopup', '$ionicConfig', '$ionicHistory', '$translate', '$q', 'ionicMaterialInk', 'ionicMaterialMotion', '$window', '$timeout', 'Fullscreen', '$ionicPopover', '$state', '$rootScope', 'screenmatch', function($ionicLoading, $ionicPopup, $ionicConfig, $ionicHistory, $translate, $q,\n ionicMaterialInk, ionicMaterialMotion, $window, $timeout, Fullscreen,\n $ionicPopover, $state, $rootScope, screenmatch) {\n 'ngInject';\n\n\n var\n loadingTextCache=null,\n CONST = {\n MAX_HEIGHT: 480,\n MAX_WIDTH: 640,\n THUMB_MAX_HEIGHT: 200,\n THUMB_MAX_WIDTH: 200\n },\n data = {\n smallscreen: screenmatch.bind('xs, sm', $rootScope)\n },\n exports,\n raw = {}\n ;\n\n function alertError(err, subtitle) {\n if (!err) {\n return $q.when(); // Silent\n }\n\n return $q(function(resolve) {\n $translate([err, 'ERROR.POPUP_TITLE', 'ERROR.UNKNOWN_ERROR', 'COMMON.BTN_OK'].concat(subtitle ? [subtitle] : []))\n .then(function (translations) {\n var message = err.message || translations[err];\n return $ionicPopup.show({\n template: '<p>' + (message || translations['ERROR.UNKNOWN_ERROR']) + '</p>',\n title: translations['ERROR.POPUP_TITLE'],\n subTitle: subtitle && translations[subtitle] || undefined,\n buttons: [\n {\n text: '<b>'+translations['COMMON.BTN_OK']+'</b>',\n type: 'button-assertive',\n onTap: function(e) {\n resolve(e);\n }\n }\n ]\n });\n });\n });\n }\n\n function alertInfo(message, subtitle, options) {\n if (!message) return $q.reject(\"Missing 'message' argument\");\n options = options || {};\n options.cssClass = options.cssClass || 'info';\n options.okText = options.okText || 'COMMON.BTN_OK';\n\n return $q(function(resolve) {\n $translate([message, 'INFO.POPUP_TITLE', options.okText].concat(subtitle ? [subtitle] : []))\n .then(function (translations) {\n $ionicPopup.show({\n template: '<p>' + translations[message] + '</p>',\n title: translations['INFO.POPUP_TITLE'],\n subTitle: subtitle && translations[subtitle] || undefined,\n cssClass: options.cssClass,\n buttons: [\n {\n text: translations[options.okText],\n type: 'button-positive',\n onTap: function(e) {\n resolve(e);\n }\n }\n ]\n });\n });\n });\n }\n\n function alertNotImplemented() {\n return alertInfo('INFO.FEATURES_NOT_IMPLEMENTED');\n }\n\n function alertDemo() {\n return $translate([\"MODE.DEMO.FEATURE_NOT_AVAILABLE\", \"MODE.DEMO.INSTALL_HELP\"])\n .then(function(translations) {\n var message = translations[\"MODE.DEMO.FEATURE_NOT_AVAILABLE\"] + \"<br/><br/>\" + translations[\"MODE.DEMO.INSTALL_HELP\"];\n return alertInfo(message, undefined, {cssClass: 'large'});\n });\n }\n\n function askConfirm(message, title, options) {\n title = title || 'CONFIRM.POPUP_TITLE';\n\n options = options || {};\n options.cssClass = options.cssClass || 'confirm';\n options.okText = options.okText || 'COMMON.BTN_OK';\n options.cancelText = options.cancelText || 'COMMON.BTN_CANCEL';\n\n return $translate([message, title, options.cancelText, options.okText])\n .then(function (translations) {\n return $ionicPopup.confirm({\n template: translations[message],\n cssClass: options.cssClass,\n title: translations[title],\n cancelText: translations[options.cancelText],\n cancelType: options.cancelType,\n okText: translations[options.okText],\n okType: options.okType\n });\n });\n }\n\n function hideLoading(timeout){\n if (timeout) {\n return $timeout(function(){\n return $ionicLoading.hide();\n }, timeout);\n }\n else {\n return $ionicLoading.hide();\n }\n }\n\n function showLoading(options) {\n if (!loadingTextCache) {\n return $translate('COMMON.LOADING')\n .then(function(translation){\n loadingTextCache = translation;\n return showLoading(options);\n });\n }\n options = options || {};\n options.template = options.template||loadingTextCache;\n\n return $ionicLoading.show(options);\n }\n\n function updateLoading(options) {\n return $ionicLoading._getLoader().then(function(loader) {\n if (!loader || !loader.isShown) return;\n // Translate template (if exists)\n if (options && options.template) {\n return $translate(options && options.template)\n .then(function(template) {\n options.template = template;\n return loader;\n });\n }\n })\n .then(function(loader) {\n if (loader && loader.isShown) return showLoading(options);\n });\n }\n\n function showToast(message, duration, position) {\n if (!message) return $q.reject(\"Missing 'message' argument\");\n duration = duration || 'short';\n position = position || 'bottom';\n\n return $translate([message])\n .then(function(translations){\n\n // removeIf(device)\n // Use the $ionicLoading toast.\n // First, make sure to convert duration in number\n if (typeof duration == 'string') {\n if (duration == 'short') {\n duration = 2000;\n }\n else {\n duration = 5000;\n }\n }\n return $ionicLoading.show({ template: translations[message], noBackdrop: true, duration: duration });\n // endRemoveIf(device)\n });\n }\n\n function onError(msg, reject/*optional*/) {\n return function(err) {\n var fullMsg = msg;\n var subtitle;\n if (!!err && !!err.message) {\n fullMsg = err.message;\n subtitle = msg;\n }\n else if (!msg){\n fullMsg = err;\n }\n // If reject has been given, use it\n if (!!reject) {\n reject(fullMsg);\n }\n // If just a user cancellation: silent\n else if (fullMsg === 'CANCELLED') {\n return hideLoading(10); // timeout, to avoid bug on transfer (when error on reference)\n }\n\n // Otherwise, log to console and display error\n else {\n hideLoading(10); // timeout, to avoid bug on transfer (when error on reference)\n return alertError(fullMsg, subtitle);\n }\n };\n }\n\n function isSmallScreen() {\n return data.smallscreen.active;\n }\n\n function selectElementText(el) {\n if (el.value || el.type == \"text\" || el.type == \"textarea\") {\n // Source: http://stackoverflow.com/questions/14995884/select-text-on-input-focus\n if ($window.getSelection && !$window.getSelection().toString()) {\n el.setSelectionRange(0, el.value.length);\n }\n }\n else {\n if (el.childNodes && el.childNodes.length > 0) {\n selectElementText(el.childNodes[0]);\n }\n else {\n // See http://www.javascriptkit.com/javatutors/copytoclipboard.shtml\n var range = $window.document.createRange(); // create new range object\n range.selectNodeContents(el); // set range to encompass desired element text\n var selection = $window.getSelection(); // get Selection object from currently user selected text\n selection.removeAllRanges(); // unselect any user selected text (if any)\n selection.addRange(range); // add range to Selection object to select it\n }\n }\n }\n\n function getSelectionText(){\n var selectedText = \"\";\n if (window.getSelection){ // all modern browsers and IE9+\n selectedText = $window.getSelection().toString();\n }\n return selectedText;\n }\n\n function imageOnLoadResize(resolve, reject, thumbnail) {\n return function(event) {\n var width = event.target.width,\n height = event.target.height,\n maxWidth = (thumbnail ? CONST.THUMB_MAX_WIDTH : CONST.MAX_WIDTH),\n maxHeight = (thumbnail ? CONST.THUMB_MAX_HEIGHT : CONST.MAX_HEIGHT)\n ;\n\n var canvas = document.createElement(\"canvas\");\n var ctx;\n\n // Thumbnail: resize and crop (to the expected size)\n if (thumbnail) {\n\n // landscape\n if (width > height) {\n width *= maxHeight / height;\n height = maxHeight;\n }\n\n // portrait\n else {\n height *= maxWidth / width;\n width = maxWidth;\n }\n canvas.width = maxWidth;\n canvas.height = maxHeight;\n ctx = canvas.getContext(\"2d\");\n var xoffset = Math.trunc((maxWidth - width) / 2 + 0.5);\n var yoffset = Math.trunc((maxHeight - height) / 2 + 0.5);\n ctx.drawImage(event.target,\n xoffset, // x1\n yoffset, // y1\n maxWidth + -2 * xoffset, // x2\n maxHeight + -2 * yoffset // y2\n );\n }\n\n // Resize, but keep the full image\n else {\n\n // landscape\n if (width > height) {\n if (width > maxWidth) {\n height *= maxWidth / width;\n width = maxWidth;\n }\n }\n\n // portrait\n else {\n if (height > maxHeight) {\n width *= maxHeight / height;\n height = maxHeight;\n }\n }\n\n canvas.width = width;\n canvas.height = height;\n ctx = canvas.getContext(\"2d\");\n\n // Resize the whole image\n ctx.drawImage(event.target, 0, 0, canvas.width, canvas.height);\n }\n\n var dataurl = canvas.toDataURL();\n\n canvas.remove();\n\n resolve(dataurl);\n };\n }\n\n function resizeImageFromFile(file, thumbnail) {\n var img = document.createElement(\"img\");\n return $q(function(resolve, reject) {\n\n if (file) {\n var reader = new FileReader();\n reader.onload = function(event){\n img.onload = imageOnLoadResize(resolve, reject, thumbnail);\n img.src = event.target.result;\n };\n reader.readAsDataURL(file);\n }\n else {\n reject('no file to resize');\n }\n })\n .then(function(dataurl) {\n img.remove();\n return dataurl;\n })\n ;\n }\n\n function resizeImageFromSrc(imageSrc, thumbnail) {\n var img = document.createElement(\"img\");\n return $q(function(resolve, reject) {\n img.onload = imageOnLoadResize(resolve, reject, thumbnail);\n img.src = imageSrc;\n })\n .then(function(data){\n img.remove();\n return data;\n });\n }\n\n function imageOnLoadRotate(resolve, reject) {\n var deg = Math.PI / 180;\n var angle = 90 * deg;\n return function(event) {\n var width = event.target.width;\n var height = event.target.height;\n var maxWidth = CONST.MAX_WIDTH;\n var maxHeight = CONST.MAX_HEIGHT;\n\n if (width > height) {\n if (width > maxWidth) {\n height *= maxWidth / width;\n width = maxWidth;\n }\n } else {\n if (height > maxHeight) {\n width *= maxHeight / height;\n height = maxHeight;\n }\n }\n\n var canvas = document.createElement(\"canvas\");\n canvas.width = height;\n canvas.height = width;\n\n var ctx = canvas.getContext(\"2d\");\n ctx.rotate(angle);\n ctx.drawImage(event.target, 0, (-1) * canvas.width);\n\n var dataurl = canvas.toDataURL();\n\n canvas.remove();\n\n resolve(dataurl);\n };\n }\n\n function rotateFromSrc(imageSrc, angle) {\n var img = document.createElement(\"img\");\n return $q(function(resolve, reject) {\n img.onload = imageOnLoadRotate(resolve, reject, angle);\n img.src = imageSrc;\n })\n .then(function(data){\n img.remove();\n return data;\n });\n }\n\n function showPopover(event, options) {\n\n var deferred = $q.defer();\n\n options = options || {};\n options.templateUrl = options.templateUrl ? options.templateUrl : 'templates/common/popover_copy.html';\n options.scope = options.scope || $rootScope;\n options.scope.popovers = options.scope.popovers || {};\n options.autoselect = options.autoselect || false;\n options.autoremove = angular.isDefined(options.autoremove) ? options.autoremove : true;\n options.backdropClickToClose = angular.isDefined(options.backdropClickToClose) ? options.backdropClickToClose : true;\n options.focusFirstInput = angular.isDefined(options.focusFirstInput) ? options.focusFirstInput : false;\n\n var _show = function(popover) {\n popover = popover || options.scope.popovers[options.templateUrl];\n popover.isResolved=false;\n popover.deferred=deferred;\n popover.options=options;\n // Fill the popover scope\n if (options.bindings) {\n angular.merge(popover.scope, options.bindings);\n }\n $timeout(function() { // This is need for Firefox\n popover.show(event)\n .then(function() {\n var element;\n // Auto select text\n if (options.autoselect) {\n element = document.querySelectorAll(options.autoselect)[0];\n if (element) {\n if ($window.getSelection && !$window.getSelection().toString()) {\n element.setSelectionRange(0, element.value.length);\n element.focus();\n }\n else {\n element.focus();\n }\n }\n }\n else {\n // Auto focus on a element\n if (options.autofocus) {\n element = document.querySelectorAll(options.autofocus)[0];\n if (element) element.focus();\n }\n }\n\n popover.scope.$parent.$emit('popover.shown');\n\n // Callback 'afterShow'\n if (options.afterShow) options.afterShow(popover);\n });\n });\n };\n\n var _cleanup = function(popover) {\n popover = popover || options.scope.popovers[options.templateUrl];\n if (popover) {\n delete options.scope.popovers[options.templateUrl];\n // Remove the popover\n popover.remove()\n // Workaround for issue #244\n // See also https://github.com/driftyco/ionic-v1/issues/71\n // and https://github.com/driftyco/ionic/issues/9069\n .then(function() {\n var bodyEl = angular.element($window.document.querySelectorAll('body')[0]);\n bodyEl.removeClass('popover-open');\n });\n }\n };\n\n var popover = options.scope.popovers[options.templateUrl];\n if (!popover) {\n\n $ionicPopover.fromTemplateUrl(options.templateUrl, {\n scope: options.scope,\n backdropClickToClose: options.backdropClickToClose\n })\n .then(function (popover) {\n popover.isResolved = false;\n\n popover.scope.closePopover = function(result) {\n var autoremove = popover.options && popover.options.autoremove;\n if (popover.options) delete popover.options.autoremove; // remove to avoid to trigger 'popover.hidden'\n popover.hide()\n .then(function() {\n if (autoremove) {\n return _cleanup(popover);\n }\n })\n .then(function() {\n if (popover.deferred) {\n popover.deferred.resolve(result);\n }\n delete popover.deferred;\n delete popover.options;\n });\n };\n\n // Execute action on hidden popover\n popover.scope.$on('popover.hidden', function() {\n if (popover.options && popover.options.afterHidden) {\n popover.options.afterHidden();\n }\n if (popover.options && popover.options.autoremove) {\n _cleanup(popover);\n }\n });\n\n // Cleanup the popover when hidden\n options.scope.$on('$remove', function() {\n if (popover.deferred) {\n popover.deferred.resolve();\n }\n _cleanup();\n });\n\n options.scope.popovers[options.templateUrl] = popover;\n _show(popover);\n });\n }\n else {\n _show(popover);\n }\n\n return deferred.promise;\n }\n\n function showCopyPopover(event, value) {\n var rows = value && value.indexOf('\\n') >= 0 ? value.split('\\n').length : 1;\n return showPopover(event, {\n templateUrl: 'templates/common/popover_copy.html',\n bindings: {\n value: value,\n rows: rows\n },\n autoselect: '.popover-copy ' + (rows <= 1 ? 'input' : 'textarea')\n });\n }\n\n function showSharePopover(event, options) {\n options = options || {};\n options.templateUrl = options.templateUrl ? options.templateUrl : 'templates/common/popover_share.html';\n options.autoselect = options.autoselect || '.popover-share input';\n options.bindings = options.bindings || {};\n options.bindings.value = options.bindings.value || options.bindings.url ||\n $state.href($state.current, $state.params, {absolute: true});\n options.bindings.postUrl = options.bindings.postUrl || options.bindings.value;\n options.bindings.postMessage = options.bindings.postMessage || '';\n options.bindings.titleKey = options.bindings.titleKey || 'COMMON.POPOVER_SHARE.TITLE';\n return showPopover(event, options);\n }\n\n function showHelptip(id, options) {\n var element = (typeof id == 'string') && id ? $window.document.getElementById(id) : id;\n if (!id && !element && options.selector) {\n element = $window.document.querySelector(options.selector);\n }\n\n options = options || {};\n var deferred = options.deferred || $q.defer();\n\n if(element && !options.timeout) {\n if (options.preAction) {\n element[options.preAction]();\n }\n options.templateUrl = options.templateUrl ? options.templateUrl : 'templates/common/popover_helptip.html';\n options.autofocus = options.autofocus || '#helptip-btn-ok';\n options.bindings = options.bindings || {};\n options.bindings.icon = options.bindings.icon || {};\n options.bindings.icon.position = options.bindings.icon.position || false;\n options.bindings.icon.glyph = options.bindings.icon.glyph ||\n (options.bindings.icon.position && options.bindings.icon.position.startsWith('bottom-') ? 'ion-arrow-down-c' :'ion-arrow-up-c');\n options.bindings.icon.class = options.bindings.icon.class || 'calm icon ' + options.bindings.icon.glyph;\n options.bindings.tour = angular.isDefined(options.bindings.tour) ? options.bindings.tour : false;\n showPopover(element, options)\n .then(function(result){\n if (options.postAction) {\n element[options.postAction]();\n }\n deferred.resolve(result);\n })\n .catch(function(err){\n if (options.postAction) {\n element[options.postAction]();\n }\n deferred.reject(err);\n });\n }\n else {\n\n // Do timeout if ask\n if (options.timeout) {\n var timeout = options.timeout;\n options.retryTimeout = options.retryTimeout || timeout;\n delete options.timeout;\n options.deferred = deferred;\n $timeout(function () {\n showHelptip(id, options);\n }, timeout);\n }\n\n // No element: reject\n else if (angular.isDefined(options.retry) && !options.retry) {\n\n if (options.onError === 'continue') {\n $timeout(function () {\n deferred.resolve(true);\n });\n }\n else {\n $timeout(function () {\n deferred.reject(\"[helptip] element now found: \" + id);\n });\n }\n }\n\n // Retry until element appears\n else {\n options.retry = angular.isUndefined(options.retry) ? 2 : (options.retry-1);\n options.deferred = deferred;\n $timeout(function() {\n showHelptip(id, options);\n }, options.timeout || options.retryTimeout || 100);\n }\n }\n\n return deferred.promise;\n }\n\n function showFab(id, timeout) {\n if (!timeout) {\n timeout = 900;\n }\n $timeout(function () {\n // Could not use 'getElementById', because it return only once element,\n // but many fabs can have the same id (many view could be loaded at the same time)\n var fabs = document.getElementsByClassName('button-fab');\n _.forEach(fabs, function(fab){\n if (fab.id == id) {\n fab.classList.toggle('on', true);\n }\n });\n }, timeout);\n }\n\n function hideFab(id, timeout) {\n if (!timeout) {\n timeout = 10;\n }\n $timeout(function () {\n // Could not use 'getElementById', because it return only once element,\n // but many fabs can have the same id (many view could be loaded at the same time)\n var fabs = document.getElementsByClassName('button-fab');\n _.forEach(fabs, function(fab){\n if (fab.id == id) {\n fab.classList.toggle('on', false);\n }\n });\n }, timeout);\n }\n\n function motionDelegate(delegate, ionListClass) {\n var motionTimeout = isSmallScreen() ? 100 : 10;\n var defaultSelector = '.list.{0} .item, .list .{0} .item'.format(ionListClass, ionListClass);\n return {\n ionListClass: ionListClass,\n show: function(options) {\n options = options || {};\n options.selector = options.selector || defaultSelector;\n options.ink = angular.isDefined(options.ink) ? options.ink : true;\n options.startVelocity = options.startVelocity || (isSmallScreen() ? 1100 : 3000);\n return $timeout(function(){\n\n // Display ink effect (no selector need)\n if (options.ink) exports.ink();\n\n // Display the delegated motion effect\n delegate(options);\n }, options.timeout || motionTimeout);\n }\n };\n }\n\n function setEffects(enable) {\n if (exports.motion.enable === enable) return; // same\n console.debug('[UI] [effects] ' + (enable ? 'Enable' : 'Disable'));\n\n exports.motion.enable = enable;\n if (enable) {\n $ionicConfig.views.transition('platform');\n angular.merge(exports.motion, raw.motion);\n }\n else {\n $ionicConfig.views.transition('none');\n var nothing = {\n class: undefined,\n show: function(){}\n };\n angular.merge(exports.motion, {\n enable : false,\n default: nothing,\n fadeSlideIn: nothing,\n fadeSlideInRight: nothing,\n panInLeft: nothing,\n pushDown: nothing,\n ripple: nothing,\n slideUp: nothing,\n fadeIn: nothing,\n toggleOn: toggleOn,\n toggleOff: toggleOff\n });\n $rootScope.motion = nothing;\n }\n $ionicHistory.clearCache();\n }\n\n raw.motion = {\n enable: true,\n default: motionDelegate(ionicMaterialMotion.ripple, 'animate-ripple'),\n blinds: motionDelegate(ionicMaterialMotion.blinds, 'animate-blinds'),\n fadeSlideIn: motionDelegate(ionicMaterialMotion.fadeSlideIn, 'animate-fade-slide-in'),\n fadeSlideInRight: motionDelegate(ionicMaterialMotion.fadeSlideInRight, 'animate-fade-slide-in-right'),\n panInLeft: motionDelegate(ionicMaterialMotion.panInLeft, 'animate-pan-in-left'),\n pushDown: motionDelegate(ionicMaterialMotion.pushDown, 'push-down'),\n ripple: motionDelegate(ionicMaterialMotion.ripple, 'animate-ripple'),\n slideUp: motionDelegate(ionicMaterialMotion.slideUp, 'slide-up'),\n fadeIn: motionDelegate(function(options) {\n toggleOn(options);\n }, 'fade-in'),\n toggleOn: toggleOn,\n toggleOff: toggleOff\n };\n\n function createQRCodeObj(text, typeNumber,\n errorCorrectionLevel, mode, mb) {\n\n mb = mb || 'default'; // default | SJIS | UTF-8\n qrcode.stringToBytes = qrcode.stringToBytesFuncs[mb];\n\n var qr = qrcode(typeNumber || 4, errorCorrectionLevel || 'M');\n qr.addData(text, mode);\n qr.make();\n\n return qr;\n }\n\n /**\n * Create a QRCode as an <svg> tag\n * @param text\n * @param typeNumber\n * @param errorCorrectionLevel\n * @param mode\n * @param mb multibyte ? value: 'default' | 'SJIS' | 'UTF-8'\n * @returns {string}\n */\n function getSvgQRCode(text, typeNumber,\n errorCorrectionLevel, mode, mb) {\n\n var qr = createQRCodeObj(text, typeNumber, errorCorrectionLevel, mode, mb);\n return qr.createSvgTag();\n }\n\n /**\n * Create a QRCode as an <img> tag\n * @param text\n * @param typeNumber\n * @param errorCorrectionLevel\n * @param mode\n * @param mb multibyte ? value: 'default' | 'SJIS' | 'UTF-8'\n * @returns {string}\n */\n function getImgQRCode(text, typeNumber,\n errorCorrectionLevel, mode, mb) {\n\n var qr = createQRCodeObj(text, typeNumber, errorCorrectionLevel, mode, mb);\n return qr.createImgTag();\n }\n\n function toggleOn(options, timeout) {\n // We have a single option, so it may be passed as a string or property\n if (typeof options === 'string') {\n options = {\n selector: options\n };\n }\n\n // Fail early & silently log\n var isInvalidSelector = typeof options.selector === 'undefined' || options.selector === '';\n\n if (isInvalidSelector) {\n console.error('invalid toggleOn selector');\n return false;\n }\n\n $timeout(function () {\n var elements = document.querySelectorAll(options.selector);\n if (elements) _.forEach(elements, function(element){\n element.classList.toggle('on', true);\n });\n }, timeout || 100);\n }\n\n function toggleOff(options, timeout) {\n // We have a single option, so it may be passed as a string or property\n if (typeof options === 'string') {\n options = {\n selector: options\n };\n }\n\n // Fail early & silently log\n var isInvalidSelector = typeof options.selector === 'undefined' || options.selector === '';\n\n if (isInvalidSelector) {\n console.error('invalid toggleOff selector');\n return false;\n }\n\n $timeout(function () {\n var elements = document.querySelectorAll(options.selector);\n if (elements) _.forEach(elements, function(element){\n element.classList.toggle('on', false);\n });\n }, timeout || 900);\n }\n\n exports = {\n alert: {\n error: alertError,\n info: alertInfo,\n confirm: askConfirm,\n notImplemented: alertNotImplemented,\n demo: alertDemo\n },\n loading: {\n show: showLoading,\n hide: hideLoading,\n update: updateLoading\n },\n toast: {\n show: showToast\n },\n onError: onError,\n screen: {\n isSmall: isSmallScreen,\n fullscreen: Fullscreen\n },\n ink: ionicMaterialInk.displayEffect,\n motion: raw.motion,\n setEffects: setEffects,\n qrcode: {\n svg: getSvgQRCode,\n img: getImgQRCode\n },\n fab: {\n show: showFab,\n hide: hideFab\n },\n popover: {\n show: showPopover,\n copy: showCopyPopover,\n share: showSharePopover,\n helptip: showHelptip\n },\n selection: {\n select: selectElementText,\n get: getSelectionText\n },\n image: {\n resizeFile: resizeImageFromFile,\n resizeSrc: resizeImageFromSrc,\n rotateSrc: rotateFromSrc\n },\n raw: raw\n };\n\n return exports;\n}])\n\n\n// See http://plnkr.co/edit/vJQXtsZiX4EJ6Uvw9xtG?p=preview\n.factory('$focus', ['$timeout', '$window', function($timeout, $window) {\n 'ngInject';\n\n return function(id) {\n // timeout makes sure that it is invoked after any other event has been triggered.\n // e.g. click events that need to run before the focus or\n // inputs elements that are in a disabled state but are enabled when those events\n // are triggered.\n $timeout(function() {\n var element = $window.document.getElementById(id);\n if(element)\n element.focus();\n });\n };\n}])\n\n;\n","angular.module('cesium.cache.services', ['angular-cache'])\n\n.factory('csCache', ['$rootScope', '$http', '$window', 'csSettings', 'CacheFactory', function($rootScope, $http, $window, csSettings, CacheFactory) {\n 'ngInject';\n\n var\n constants = {\n VERY_LONG: 54000000, /*15 days*/\n LONG: 1 * 60 * 60 * 1000 /*1 hour*/,\n MEDIUM: 5 * 60 * 1000 /*5 min*/,\n SHORT: csSettings.defaultSettings.cacheTimeMs // around 1min\n },\n storageMode = getSettingsStorageMode(),\n cacheNames = []\n ;\n\n function getSettingsStorageMode(settings) {\n settings = settings || csSettings.data;\n return settings && settings.useLocalStorage && settings.persistCache && $window.localStorage ? 'localStorage' : 'memory';\n }\n\n function getCacheOptions(options) {\n options = options || {};\n options.storageMode = getSettingsStorageMode();\n options.deleteOnExpire = (options.storageMode === 'localStorage' || options.onExpire) ? 'aggressive' : 'passive';\n options.cacheFlushInterval = options.deleteOnExpire === 'passive' ?\n (60 * 60 * 1000) : // If passive mode, remove all items every hour\n null;\n return options;\n }\n\n function getOrCreateCache(prefix, maxAge, onExpire){\n prefix = prefix || '';\n maxAge = maxAge || constants.SHORT;\n var cacheName = prefix + ((maxAge / 1000) + 's');\n\n // If onExpire fn, generate a new cache key\n var cache;\n if (onExpire && typeof onExpire == 'function') {\n var counter = 1;\n while (CacheFactory.get(cacheName + counter)) {\n counter++;\n }\n cacheName = cacheName + counter;\n }\n else {\n cache = CacheFactory.get(cacheName);\n }\n\n // Add to cache names map\n if (!cacheNames[cacheName]) cacheNames[cacheName] = true;\n\n // Already exists: use it\n if (cache) return cache;\n\n // Not exists yet: create a new cache\n var options = getCacheOptions({\n maxAge: maxAge,\n onExpire: onExpire || null\n });\n console.debug(\"[cache] Creating cache {{0}} with {storageMode: {1}}...\".format(cacheName, options.storageMode));\n return CacheFactory.createCache(cacheName, options);\n }\n\n function clearAllCaches() {\n console.debug(\"[cache] Cleaning all caches...\");\n _.forEach(_.keys(cacheNames), function(cacheName) {\n var cache = CacheFactory.get(cacheName);\n if (cache) {\n cache.removeAll();\n }\n });\n }\n\n function clearFromPrefix(cachePrefix) {\n _.forEach(_.keys(cacheNames), function(cacheName) {\n if (cacheName.startsWith(cachePrefix)) {\n var cache = CacheFactory.get(cacheName);\n if (cache) {\n cache.removeAll();\n }\n }\n });\n }\n\n function onSettingsChanged(settings) {\n var newStorageMode = getSettingsStorageMode(settings);\n var hasChanged = (newStorageMode !== storageMode);\n if (hasChanged) {\n storageMode = newStorageMode;\n console.debug(\"[cache] Updating caches with {storageMode: {0}}\".format(storageMode));\n _.forEach(_.keys(cacheNames), function(cacheName) {\n var cache = CacheFactory.get(cacheName);\n if (cache) {\n cache.setOptions(getCacheOptions(), true);\n }\n });\n }\n }\n\n function addListeners() {\n listeners = [\n // Listen if node changed\n csSettings.api.data.on.changed($rootScope, onSettingsChanged, this)\n ];\n }\n\n addListeners();\n\n return {\n get: getOrCreateCache,\n clear: clearFromPrefix,\n clearAll: clearAllCaches,\n constants: constants\n };\n}])\n;\n","angular.module('cesium.modal.services', ['cesium.utils.services'])\n\n// Useful for modal with no controller\n.controller('EmptyModalCtrl', function () {\n 'ngInject';\n\n})\n\n.controller('AboutModalCtrl', ['$scope', 'csConfig', 'UIUtils', 'csHttp', 'filterTranslations', function ($scope, csConfig, UIUtils, csHttp, filterTranslations) {\n 'ngInject';\n\n $scope.openLink = function(event, uri, options) {\n options = options || {};\n\n // If unable to open, just copy value\n options.onError = function() {\n return UIUtils.popover.copy(event, uri);\n };\n\n return csHttp.uri.open(uri, options);\n };\n\n // Change UTC date into user date\n $scope.buildDate = moment(csConfig.build).format(filterTranslations.DATE_PATTERN || 'YYYY-MM-DD HH:mm');\n}])\n\n.factory('ModalUtils', ['$ionicModal', '$rootScope', '$q', '$injector', '$controller', '$timeout', 'Device', function($ionicModal, $rootScope, $q, $injector, $controller, $timeout, Device) {\n 'ngInject';\n\n\n function _evalController(ctrlName) {\n var result = {\n isControllerAs: false,\n controllerName: '',\n propName: ''\n };\n var fragments = (ctrlName || '').trim().split(/\\s+/);\n result.isControllerAs = fragments.length === 3 && (fragments[1] || '').toLowerCase() === 'as';\n if (result.isControllerAs) {\n result.controllerName = fragments[0];\n result.propName = fragments[2];\n } else {\n result.controllerName = ctrlName;\n }\n\n return result;\n }\n\n function DefaultModalController($scope, deferred, parameters) {\n\n $scope.deferred = deferred || $q.defer();\n $scope.resolved = false;\n\n $scope.openModal = function () {\n return $scope.modal.show();\n };\n\n $scope.hideModal = function () {\n return $scope.modal.hide();\n };\n\n $scope.closeModal = function (result) {\n $scope.resolved = true;\n\n return $scope.modal.remove()\n .then(function() {\n // Workaround modal-open not removed\n document.body.classList.remove('modal-open');\n $scope.deferred.resolve(result);\n return result;\n });\n };\n\n\n // Useful method for modal with forms\n $scope.setForm = function (form, propName) {\n if (propName) {\n $scope[propName] = form;\n }\n else {\n $scope.form = form;\n }\n };\n\n // Useful method for modal to get input parameters\n $scope.getParameters = function () {\n return parameters;\n };\n\n $scope.$on('modal.hidden', function () {\n // If not resolved yet: send result\n // (after animation out)\n if (!$scope.resolved) {\n $scope.resolved = true;\n\n $timeout(function() {\n $scope.deferred.resolve();\n return $scope.modal.remove().then(function() {\n // Workaround modal-open not removed\n document.body.classList.remove('modal-open');\n });\n }, ($scope.modal.hideDelay || 320) + 20);\n }\n });\n }\n\n function show(templateUrl, controller, parameters, options) {\n var deferred = $q.defer();\n\n options = options ? options : {} ;\n options.animation = options.animation || 'slide-in-up';\n\n var focusFirstInput = false;\n // removeIf(device)\n focusFirstInput = angular.isDefined(options.focusFirstInput) ? options.focusFirstInput : false;\n // endRemoveIf(device)\n options.focusFirstInput = focusFirstInput;\n\n // If modal has a controller\n if (controller) {\n // If a controller defined, always use a new scope\n options.scope = options.scope ? options.scope.$new() : $rootScope.$new();\n DefaultModalController.call({}, options.scope, deferred, parameters);\n\n // Invoke the controller on this new scope\n var locals = { '$scope': options.scope, 'parameters': parameters };\n var ctrlEval = _evalController(controller);\n var ctrlInstance = $controller(controller, locals);\n if (ctrlEval.isControllerAs) {\n ctrlInstance.openModal = options.scope.openModal;\n ctrlInstance.closeModal = options.scope.closeModal;\n }\n }\n\n $ionicModal.fromTemplateUrl(templateUrl, options)\n .then(function (modal) {\n if (controller) {\n // Set modal into the controller's scope\n modal.scope.$parent.modal = modal;\n }\n else {\n var scope = modal.scope;\n // Define default scope functions\n DefaultModalController.call({}, scope, deferred, parameters);\n // Set modal\n scope.modal = modal;\n }\n\n // Show the modal\n return modal.show();\n },\n function (err) {\n deferred.reject(err);\n });\n\n return deferred.promise;\n }\n\n return {\n show: show\n };\n}])\n\n.factory('Modals', ['$rootScope', '$translate', '$ionicPopup', '$timeout', 'ModalUtils', 'UIUtils', function($rootScope, $translate, $ionicPopup, $timeout, ModalUtils, UIUtils) {\n 'ngInject';\n\n function showTransfer(parameters) {\n var useDigitKeyboard = UIUtils.screen.isSmall();\n return ModalUtils.show('templates/wallet/modal_transfer.html','TransferModalCtrl',\n parameters, {\n focusFirstInput: !useDigitKeyboard\n });\n }\n\n function showLogin(parameters) {\n return ModalUtils.show('templates/login/modal_login.html','LoginModalCtrl',\n parameters, {focusFirstInput: true, backdropClickToClose: false});\n }\n\n function showWotLookup(parameters) {\n return ModalUtils.show('templates/wot/modal_lookup.html','WotLookupModalCtrl',\n parameters || {}, {focusFirstInput: true});\n }\n\n function showNetworkLookup(parameters) {\n return ModalUtils.show('templates/network/modal_network.html', 'NetworkLookupModalCtrl',\n parameters, {focusFirstInput: true});\n }\n\n function showAbout(parameters) {\n return ModalUtils.show('templates/modal_about.html','AboutModalCtrl',\n parameters);\n }\n\n function showAccountSecurity(parameters) {\n return ModalUtils.show('templates/wallet/modal_security.html', 'WalletSecurityModalCtrl',\n parameters);\n }\n\n function showJoin(parameters) {\n return ModalUtils.show('templates/join/modal_choose_account_type.html','JoinChooseAccountTypeModalCtrl',\n parameters)\n .then(function(res){\n if (!res) return;\n return (res.accountType == 'member') ?\n showJoinMember(res) :\n showJoinWallet(res);\n });\n }\n\n function showJoinMember(parameters) {\n return ModalUtils.show('templates/join/modal_join_member.html','JoinModalCtrl',\n parameters);\n }\n\n function showJoinWallet(parameters) {\n return ModalUtils.show('templates/join/modal_join_wallet.html','JoinModalCtrl',\n parameters);\n }\n\n function showHelp(parameters) {\n return ModalUtils.show('templates/help/modal_help.html','HelpModalCtrl',\n parameters);\n }\n\n function showLicense(parameters) {\n return ModalUtils.show('templates/currency/modal_license.html','CurrencyLicenseModalCtrl',\n parameters);\n }\n\n function showSelectPubkeyIdentity(parameters) {\n return ModalUtils.show('templates/wot/modal_select_pubkey_identity.html', 'WotSelectPubkeyIdentityModalCtrl',\n parameters);\n }\n\n function showSelectWallet(parameters) {\n return ModalUtils.show('templates/wallet/list/modal_wallets.html','WalletSelectModalCtrl',\n parameters);\n }\n\n function showPassword(options) {\n options = options || {};\n options.title = options.title || 'COMMON.SET_PASSWORD_TITLE';\n options.subTitle = options.subTitle || 'COMMON.SET_PASSWORD_SUBTITLE';\n var scope = options.scope ? options.scope.$new() : $rootScope.$new();\n scope.formData = {password: undefined};\n scope.setForm = function(form) {\n scope.form=form;\n };\n scope.submit = function(e) {\n scope.form.$submitted=true;\n if (e && e.preventDefault) e.preventDefault();\n if(scope.form.$valid && scope.formData.password) {\n options.popup.close(scope.formData.password);\n }\n };\n\n scope.error = options.error || undefined;\n\n // Choose password popup\n return $translate([options.title, options.subTitle, 'COMMON.BTN_OK', 'COMMON.BTN_CANCEL'])\n .then(function (translations) {\n options.popup = $ionicPopup.show({\n templateUrl: 'templates/common/popup_password.html',\n title: translations[options.title],\n subTitle: translations[options.subTitle],\n scope: scope,\n buttons: [\n { text: translations['COMMON.BTN_CANCEL'] },\n { text: translations['COMMON.BTN_OK'],\n type: 'button-positive',\n onTap: scope.submit\n }\n ]\n });\n return options.popup;\n });\n\n }\n\n return {\n showTransfer: showTransfer,\n showLogin: showLogin,\n showWotLookup: showWotLookup,\n showNetworkLookup: showNetworkLookup,\n showAbout: showAbout,\n showJoin: showJoin,\n showJoinMember: showJoinMember,\n showJoinWallet: showJoinWallet,\n showHelp: showHelp,\n showAccountSecurity: showAccountSecurity,\n showLicense: showLicense,\n showSelectPubkeyIdentity: showSelectPubkeyIdentity,\n showSelectWallet: showSelectWallet,\n showPassword: showPassword\n };\n\n}])\n\n.factory('csPopovers', ['$rootScope', '$translate', '$ionicPopup', '$timeout', 'UIUtils', '$controller', function($rootScope, $translate, $ionicPopup, $timeout, UIUtils, $controller) {\n 'ngInject';\n\n function showSelectWallet(event, options) {\n options = options || {};\n\n var parameters = options.parameters || {};\n delete options.parameters;\n\n var scope = options.scope && options.scope.$new() || $rootScope.$new(true);\n options.scope = scope;\n options.templateUrl = 'templates/wallet/list/popover_wallets.html';\n options.autoremove = true;\n\n // Initialize the popover controller, with parameters\n angular.extend(this, $controller('WalletSelectPopoverCtrl', {$scope: options.scope, parameters: parameters}));\n\n var afterShowSaved = options.afterShow;\n options.afterShow = function(popover) {\n\n // Add a missing method, to close the popover\n scope.closePopover = function(res) {\n popover.scope.closePopover(res);\n };\n\n // Execute default afterShow fn, if any\n if (afterShowSaved) afterShowSaved(popover);\n };\n // Show the popover\n return UIUtils.popover.show(event, options)\n .then(function(res) {\n // Then destroy the scope\n scope.$destroy();\n return res;\n });\n }\n\n return {\n showSelectWallet: showSelectWallet\n };\n\n }]);\n","angular.module('cesium.http.services', ['cesium.cache.services'])\n\n.factory('csHttp', ['$http', '$q', '$timeout', '$window', 'csSettings', 'csCache', 'Device', function($http, $q, $timeout, $window, csSettings, csCache, Device) {\n 'ngInject';\n\n var timeout = csSettings.data.timeout;\n\n var\n sockets = [],\n defaultCachePrefix = 'csHttp-',\n allCachePrefixes = {};\n\n if (!timeout) {\n timeout=4000; // default\n }\n\n function getServer(host, port) {\n // Remove port if 80 or 443\n return !host ? null : (host + (port && port != 80 && port != 443 ? ':' + port : ''));\n }\n\n function getUrl(host, port, path, useSsl) {\n var protocol = (port == 443 || useSsl) ? 'https' : 'http';\n return protocol + '://' + getServer(host, port) + (path ? path : '');\n }\n\n function getWsUrl(host, port, path, useSsl) {\n var protocol = (port == 443 || useSsl) ? 'wss' : 'ws';\n return protocol + '://' + getServer(host, port) + (path ? path : '');\n }\n\n function processError(reject, data, url, status) {\n if (data && data.message) {\n reject(data);\n }\n else {\n if (status == 403) {\n reject({ucode: 403, message: 'Resource is forbidden' + (url ? ' ('+url+')' : '')});\n }\n else if (status == 404) {\n reject({ucode: 404, message: 'Resource not found' + (url ? ' ('+url+')' : '')});\n }\n else if (url) {\n console.error('[http] Get HTTP error {status: ' + status + '} on [' + url + ']');\n reject('Error while requesting [' + url + ']');\n }\n else {\n reject('Unknown error from node');\n }\n }\n }\n\n function prepare(url, params, config, callback) {\n var pkeys = [], queryParams = {}, newUri = url;\n if (typeof params === 'object') {\n pkeys = _.keys(params);\n }\n\n _.forEach(pkeys, function(pkey){\n var prevURI = newUri;\n newUri = newUri.replace(':' + pkey, params[pkey]);\n if (prevURI === newUri) {\n queryParams[pkey] = params[pkey];\n }\n });\n config.params = queryParams;\n return callback(newUri, config);\n }\n\n function getResource(host, port, path, useSsl, forcedTimeout) {\n // Make sure host is defined - fix #537\n if (!host) {\n return $q.reject('[http] invalid URL from host: ' + host);\n }\n var url = getUrl(host, port, path, useSsl);\n return function(params) {\n return $q(function(resolve, reject) {\n var config = {\n timeout: forcedTimeout || timeout,\n responseType: 'json'\n };\n\n prepare(url, params, config, function(url, config) {\n $http.get(url, config)\n .success(function(data, status, headers, config) {\n resolve(data);\n })\n .error(function(data, status, headers, config) {\n processError(reject, data, url, status);\n });\n });\n });\n };\n }\n\n function getResourceWithCache(host, port, path, useSsl, maxAge, autoRefresh, forcedTimeout, cachePrefix) {\n var url = getUrl(host, port, path, useSsl);\n cachePrefix = cachePrefix || defaultCachePrefix;\n maxAge = maxAge || csCache.constants.LONG;\n allCachePrefixes[cachePrefix] = true;\n\n //console.debug('[http] will cache ['+url+'] ' + maxAge + 'ms' + (autoRefresh ? ' with auto-refresh' : ''));\n\n return function(params) {\n return $q(function(resolve, reject) {\n var config = {\n timeout: forcedTimeout || timeout,\n responseType: 'json'\n };\n if (autoRefresh) { // redo the request if need\n config.cache = csCache.get(cachePrefix, maxAge, function (key, value, done) {\n console.debug('[http] Refreshing cache for {{0}} '.format(key));\n $http.get(key, config)\n .success(function (data) {\n config.cache.put(key, data);\n if (done) done(key, data);\n });\n });\n }\n else {\n config.cache = csCache.get(cachePrefix, maxAge);\n }\n\n prepare(url, params, config, function(url, config) {\n $http.get(url, config)\n .success(function(data) {\n resolve(data);\n })\n .error(function(data, status) {\n processError(reject, data, url, status);\n });\n });\n });\n };\n }\n\n function postResource(host, port, path, useSsl, forcedTimeout) {\n var url = getUrl(host, port, path, useSsl);\n return function(data, params) {\n return $q(function(resolve, reject) {\n var config = {\n timeout: forcedTimeout || timeout,\n headers : {'Content-Type' : 'application/json;charset=UTF-8'}\n };\n\n prepare(url, params, config, function(url, config) {\n $http.post(url, data, config)\n .success(function(data) {\n resolve(data);\n })\n .error(function(data, status) {\n processError(reject, data, url, status);\n });\n });\n });\n };\n }\n\n function ws(host, port, path, useSsl, timeout) {\n if (!path) {\n console.error('calling csHttp.ws without path argument');\n throw 'calling csHttp.ws without path argument';\n }\n var uri = getWsUrl(host, port, path, useSsl);\n timeout = timeout || csSettings.data.timeout;\n\n function _waitOpen(self) {\n if (!self.delegate) {\n throw new Error('Websocket {0} was closed!'.format(uri));\n }\n if (self.delegate.readyState == 1) {\n return $q.when(self.delegate);\n }\n if (self.delegate.readyState == 3) {\n return $q.reject('Unable to connect to websocket ['+self.delegate.url+']');\n }\n\n if (self.waitDuration >= timeout) {\n self.waitRetryDelay = self.waitRetryDelay && Math.min(self.waitRetryDelay + 2000, 30000) || 2000; // add 2 seconds, until 30s)\n console.debug(\"[http] Will retry websocket [{0}] in {1}s...\".format(self.path, Math.round(self.waitRetryDelay/1000)));\n }\n else if (Math.round(self.waitDuration / 1000) % 10 === 0){\n console.debug('[http] Waiting websocket ['+self.path+']...');\n }\n\n return $timeout(function(){\n self.waitDuration += self.waitRetryDelay;\n return _waitOpen(self);\n }, self.waitRetryDelay);\n }\n\n function _open(self, callback, params) {\n if (!self.delegate) {\n self.path = path;\n self.callbacks = [];\n self.waitDuration = 0;\n self.waitRetryDelay = 200;\n\n prepare(uri, params, {}, function(uri) {\n self.delegate = new WebSocket(uri);\n self.delegate.onerror = function(e) {\n self.delegate.readyState=3;\n };\n self.delegate.onmessage = function(e) {\n var obj = JSON.parse(e.data);\n _.forEach(self.callbacks, function(callback) {\n callback(obj);\n });\n };\n self.delegate.onopen = function(e) {\n console.debug('[http] Listening on websocket ['+self.path+']...');\n sockets.push(self);\n self.delegate.openTime = Date.now();\n };\n self.delegate.onclose = function(closeEvent) {\n\n // Remove from sockets arrays\n var index = _.findIndex(sockets, function(socket){return socket.path === self.path;});\n if (index >= 0) {\n sockets.splice(index,1);\n }\n\n // If close event comes from Cesium\n if (self.delegate.closing) {\n self.delegate = null;\n }\n\n // If unexpected close event, reopen the socket (fix #535)\n else {\n if (self.delegate.openTime) {\n console.debug('[http] Unexpected close of websocket [{0}] (open {1} ms ago): re-opening...', path, (Date.now() - self.delegate.openTime));\n\n // Force new connection\n self.delegate = null;\n\n // Loop, but without the already registered callback\n _open(self, null, params);\n }\n else if (closeEvent) {\n console.debug('[http] Unexpected close of websocket [{0}]: error code: '.format(path), closeEvent && closeEvent.code || closeEvent);\n\n // Force new connection\n self.delegate = null;\n\n // Loop, but without the already registered callback\n _open(self, null, params);\n }\n }\n };\n });\n }\n\n if (callback) self.callbacks.push(callback);\n return _waitOpen(self);\n }\n\n function _close(self) {\n if (self.delegate) {\n self.delegate.closing = true;\n console.debug('[http] Closing websocket ['+self.path+']...');\n self.delegate.close();\n self.callbacks = [];\n if (self.onclose) self.onclose();\n }\n }\n\n function _remove(self, callback) {\n self.callbacks = _.reject(self.callbacks, function(item) {\n return item === callback;\n });\n if (!self.callbacks.length) {\n _close(self);\n }\n }\n\n return {\n open: function(params) {\n return _open(this, null, params);\n },\n on: function(callback, params) {\n return _open(this, callback, params);\n },\n onListener: function(callback, params) {\n var self = this;\n _open(self, callback, params);\n return function() {\n _remove(self, callback);\n };\n },\n send: function(data) {\n var self = this;\n return _waitOpen(self)\n .then(function(){\n if (self.delegate) self.delegate.send(data);\n });\n },\n close: function() {\n var self = this;\n _close(self);\n },\n isClosed: function() {\n var self = this;\n return !self.delegate || self.delegate.closing;\n }\n };\n }\n\n function closeAllWs() {\n if (sockets.length > 0) {\n console.debug('[http] Closing all websocket...');\n _.forEach(sockets, function(sock) {\n sock.close();\n });\n sockets = []; // Reset socks list\n }\n }\n\n // See doc : https://gist.github.com/jlong/2428561\n function parseUri(uri) {\n var protocol;\n if (uri.startsWith('duniter://')) {\n protocol = 'duniter';\n uri = uri.replace('duniter://', 'http://');\n }\n\n var parser = document.createElement('a');\n parser.href = uri;\n\n var pathname = parser.pathname;\n if (pathname && pathname.startsWith('/')) {\n pathname = pathname.substring(1);\n }\n\n var result = {\n protocol: protocol ? protocol : parser.protocol,\n hostname: parser.hostname,\n host: parser.host,\n port: parser.port,\n username: parser.username,\n password: parser.password,\n pathname: pathname,\n search: parser.search,\n hash: parser.hash\n };\n parser.remove();\n return result;\n }\n\n /**\n * Open a URI (url, email, phone, ...)\n * @param event\n * @param link\n * @param type\n */\n function openUri(uri, options) {\n options = options || {};\n\n if (!uri.startsWith('http://') && !uri.startsWith('https://')) {\n var parts = parseUri(uri);\n\n if (!parts.protocol && options.type) {\n parts.protocol = (options.type == 'email') ? 'mailto:' :\n ((options.type == 'phone') ? 'tel:' : '');\n uri = parts.protocol + uri;\n }\n\n // On desktop, open into external tool\n if (parts.protocol == 'mailto:' && Device.isDesktop()) {\n try {\n nw.Shell.openExternal(uri);\n return;\n }\n catch(err) {\n console.error(\"[http] Failed not open 'mailto:' URI into external tool.\");\n }\n }\n\n // Check if device is enable, on special tel: or mailto: protocole\n var validProtocol = (parts.protocol == 'mailto:' || parts.protocol == 'tel:') && Device.enable;\n if (!validProtocol) {\n if (options.onError && typeof options.onError == 'function') {\n options.onError(uri);\n }\n return;\n }\n }\n\n // Note: If device enable, then target=_system will use InAppBrowser cordova plugin\n var openTarget = (options.target || (Device.enable ? '_system' : '_blank'));\n\n // If desktop, try to open into external browser\n if (openTarget === '_blank' || openTarget === '_system' && Device.isDesktop()) {\n try {\n nw.Shell.openExternal(uri);\n return;\n }\n catch(err) {\n console.error(\"[http] Failed not open URI into external browser.\");\n }\n }\n\n // If desktop, should always open in new window (no tabs)\n var openOptions;\n if (openTarget === '_blank' && Device.isDesktop()) {\n\n if (nw && nw.Shell) {\n nw.Shell.openExternal(uri);\n return false;\n }\n // Override default options\n openOptions= \"location=1,titlebar=1,status=1,menubar=1,toolbar=1,resizable=1,scrollbars=1\";\n // Add width/height\n if ($window.screen && $window.screen.width && $window.screen.height) {\n openOptions += \",width={0},height={1}\".format(Math.trunc($window.screen.width/2), Math.trunc($window.screen.height/2));\n }\n }\n\n var win = $window.open(uri,\n openTarget,\n openOptions);\n\n // Center the opened window\n if (openOptions && $window.screen && $window.screen.width && $window.screen.height) {\n win.moveTo($window.screen.width/2/2, $window.screen.height/2/2);\n win.focus();\n }\n\n }\n\n // Get time in second (UTC)\n function getDateNow() {\n return moment().utc().unix();\n }\n\n function isPositiveInteger(x) {\n // http://stackoverflow.com/a/1019526/11236\n return /^\\d+$/.test(x);\n }\n\n /**\n * Compare two software version numbers (e.g. 1.7.1)\n * Returns:\n *\n * 0 if they're identical\n * negative if v1 < v2\n * positive if v1 > v2\n * Nan if they in the wrong format\n *\n * E.g.:\n *\n * assert(version_number_compare(\"1.7.1\", \"1.6.10\") > 0);\n * assert(version_number_compare(\"1.7.1\", \"1.7.10\") < 0);\n *\n * \"Unit tests\": http://jsfiddle.net/ripper234/Xv9WL/28/\n *\n * Taken from http://stackoverflow.com/a/6832721/11236\n */\n function compareVersionNumbers(v1, v2){\n var v1parts = v1.split('.');\n var v2parts = v2.split('.');\n\n // First, validate both numbers are true version numbers\n function validateParts(parts) {\n for (var i = 0; i < parts.length; ++i) {\n if (!isPositiveInteger(parts[i])) {\n return false;\n }\n parts[i] = parseInt(parts[i]);\n }\n return true;\n }\n if (!validateParts(v1parts) || !validateParts(v2parts)) {\n return NaN;\n }\n\n for (var i = 0; i < v1parts.length; ++i) {\n if (v2parts.length === i) {\n return 1;\n }\n\n if (v1parts[i] === v2parts[i]) {\n continue;\n }\n if (v1parts[i] > v2parts[i]) {\n return 1;\n }\n return -1;\n }\n\n if (v1parts.length != v2parts.length) {\n return -1;\n }\n\n return 0;\n }\n\n function isVersionCompatible(minVersion, actualVersion) {\n console.debug('[http] Checking actual version [{0}] is compatible with min expected version [{1}]'.format(actualVersion, minVersion));\n return compareVersionNumbers(minVersion, actualVersion) <= 0;\n }\n\n function clearCache(cachePrefix) {\n cachePrefix = cachePrefix || defaultCachePrefix;\n console.debug(\"[http] Cleaning cache {prefix: '{0}'}...\".format(cachePrefix));\n csCache.clear(cachePrefix);\n }\n\n function clearAllCache() {\n console.debug('[http] Cleaning all caches...');\n _.keys(allCachePrefixes).forEach(function(cachePrefix) {\n csCache.clear(cachePrefix);\n });\n }\n\n return {\n get: getResource,\n getWithCache: getResourceWithCache,\n post: postResource,\n ws: ws,\n closeAllWs: closeAllWs,\n getUrl : getUrl,\n getServer: getServer,\n uri: {\n parse: parseUri,\n open: openUri\n },\n date: {\n now: getDateNow\n },\n version: {\n compare: compareVersionNumbers,\n isCompatible: isVersionCompatible\n },\n cache: angular.merge({\n clear: clearCache,\n clearAll: clearAllCache\n }, csCache.constants)\n };\n}])\n;\n","var App, nw;\n\nangular.module('cesium.desktop.services', ['cesium.device.services', 'cesium.settings.services'])\n\n .factory('csDesktop', ['$rootScope', 'Device', function($rootScope, Device) {\n 'ngInject';\n\n if (!Device.isDesktop()) return;\n\n console.info(\"Starting desktop mode...\");\n }]);\n","angular.module('cesium.storage.services', [ 'cesium.config'])\n\n\n .factory('sessionStorage', ['$window', '$q', function($window, $q) {\n 'ngInject';\n\n var\n exports = {\n storage: $window.sessionStorage || {}\n };\n\n exports.put = function(key, value) {\n exports.storage[key] = value;\n return $q.when();\n };\n\n exports.get = function(key, defaultValue) {\n return $q.when(exports.storage[key] || defaultValue);\n };\n\n exports.setObject = function(key, value) {\n exports.storage[key] = JSON.stringify(value);\n return $q.when();\n };\n\n exports.getObject = function(key) {\n return $q.when(JSON.parse(exports.storage[key] || 'null'));\n };\n\n return exports;\n }])\n\n .factory('localStorage', ['$window', '$q', '$log', 'sessionStorage', function($window, $q, $log, sessionStorage) {\n 'ngInject';\n\n var\n appName = \"Cesium\",\n started = false,\n startPromise,\n isDevice = true, // default for device (override later)\n exports = {\n standard: {\n storage: null\n },\n secure: {\n storage: null\n }\n };\n\n // removeIf(device)\n // Use this workaround to avoid to wait ionicReady() event\n isDevice = false;\n // endRemoveIf(device)\n\n /* -- Use standard browser implementation -- */\n\n exports.standard.put = function(key, value) {\n if (angular.isDefined(value) && value != null) {\n exports.standard.storage[key] = value;\n }\n else {\n exports.standard.storage.removeItem(key);\n }\n return $q.when();\n };\n\n exports.standard.remove = function(key, value) {\n exports.standard.storage.removeItem(key);\n return $q.when();\n };\n\n exports.standard.get = function(key, defaultValue) {\n return $q.when(exports.standard.storage[key] || defaultValue);\n };\n\n exports.standard.setObject = function(key, value) {\n exports.standard.storage[key] = JSON.stringify(value);\n return $q.when();\n };\n\n exports.standard.getObject = function(key) {\n return $q.when(JSON.parse(exports.standard.storage[key] || 'null'));\n };\n\n /* -- Use secure storage (using a cordova plugin) -- */\n\n // Set a value to the secure storage (or remove if value is not defined)\n exports.secure.put = function(key, value) {\n return $q(function(resolve, reject) {\n if (value !== undefined && value !== null) {\n exports.secure.storage.set(\n function (key) {\n resolve();\n },\n function (err) {\n $log.error(err);\n reject(err);\n },\n key, value);\n }\n // Remove\n else {\n exports.secure.storage.remove(\n function () {\n resolve();\n },\n function (err) {\n $log.error(err);\n resolve(); // Error = not found\n },\n key);\n }\n });\n };\n\n // Get a value from the secure storage\n exports.secure.get = function(key, defaultValue) {\n return $q(function(resolve, reject) {\n exports.secure.storage.get(\n function (value) {\n if (!value && defaultValue) {\n resolve(defaultValue);\n }\n else {\n resolve(value);\n }\n },\n function (err) {\n $log.error(err);\n resolve(); // Error = not found\n },\n key);\n });\n };\n\n // Set a object to the secure storage\n exports.secure.setObject = function(key, value) {\n $log.debug(\"[storage] Setting object into secure storage, using key=\" + key);\n return $q(function(resolve, reject){\n exports.secure.storage.set(\n resolve,\n reject,\n key,\n value ? JSON.stringify(value) : undefined);\n });\n };\n\n // Get a object from the secure storage\n exports.secure.getObject = function(key) {\n $log.debug(\"[storage] Getting object from secure storage, using key=\" + key);\n return $q(function(resolve, reject){\n exports.secure.storage.get(\n function(value) {resolve(JSON.parse(value||'null'));},\n function(err) {\n $log.error(err);\n resolve(); // Error = not found\n },\n key);\n });\n };\n\n function initStandardStorage() {\n // use local browser storage\n if ($window.localStorage) {\n console.debug('[storage] Starting {local} storage...');\n exports.standard.storage = $window.localStorage;\n // Set standard storage as default\n _.forEach(_.keys(exports.standard), function(key) {\n exports[key] = exports.standard[key];\n });\n }\n\n // Fallback to session storage (localStorage could have been disabled on some browser)\n else {\n console.debug('[storage] Starting {session} storage...');\n // Set standard storage as default\n _.forEach(_.keys(sessionStorage), function(key) {\n exports[key] = sessionStorage[key];\n });\n }\n return $q.when();\n }\n\n function initSecureStorage() {\n console.debug('[storage] Starting {secure} storage...');\n // Set secure storage as default\n _.forEach(_.keys(exports.secure), function(key) {\n exports[key] = exports.secure[key];\n });\n\n var deferred = $q.defer();\n\n // No secure storage plugin: fall back to standard storage\n if (!cordova.plugins || !cordova.plugins.SecureStorage) {\n initStandardStorage();\n deferred.resolve();\n }\n else {\n\n exports.secure.storage = new cordova.plugins.SecureStorage(\n function () {\n deferred.resolve();\n },\n function (err) {\n console.error('[storage] Could not use secure storage. Will use standard.', err);\n initStandardStorage();\n deferred.resolve();\n },\n appName);\n }\n return deferred.promise;\n }\n\n exports.isStarted = function() {\n return started;\n };\n\n exports.ready = function() {\n if (started) return $q.when();\n return startPromise || start();\n };\n\n function start() {\n if (startPromise) return startPromise;\n\n var now = Date.now();\n\n // Use Cordova secure storage plugin\n if (isDevice) {\n startPromise = initSecureStorage();\n }\n\n // Use default browser local storage\n else {\n startPromise = initStandardStorage();\n }\n\n return startPromise\n .then(function() {\n console.debug('[storage] Started in ' + (Date.now() - now) + 'ms');\n started = true;\n startPromise = null;\n });\n }\n\n // default action\n start();\n\n return exports;\n }])\n\n\n;\n","var App;\n\nangular.module('cesium.device.services', ['cesium.utils.services', 'cesium.settings.services'])\n\n .factory('Device', ['$rootScope', '$translate', '$ionicPopup', '$q', 'ionicReady', function($rootScope, $translate, $ionicPopup, $q,\n ionicReady) {\n 'ngInject';\n\n var\n CONST = {\n MAX_HEIGHT: 400,\n MAX_WIDTH: 400\n },\n exports = {\n // workaround to quickly no is device or not (even before the ready() event)\n enable: true\n },\n cache = {},\n started = false,\n startPromise;\n\n // removeIf(device)\n // workaround to quickly no is device or not (even before the ready() event)\n exports.enable = false;\n // endRemoveIf(device)\n\n function getPicture(options) {\n if (!exports.camera.enable) {\n return $q.reject(\"Camera not enable. Please call 'ionicReady()' once before use (e.g in app.js).\");\n }\n\n // Options is the sourceType by default\n if (options && (typeof options === \"string\")) {\n options = {\n sourceType: options\n };\n }\n options = options || {};\n\n // Make sure a source type has been given (if not, ask user)\n if (angular.isUndefined(options.sourceType)) {\n return $translate(['SYSTEM.PICTURE_CHOOSE_TYPE', 'SYSTEM.BTN_PICTURE_GALLERY', 'SYSTEM.BTN_PICTURE_CAMERA'])\n .then(function(translations){\n return $ionicPopup.show({\n title: translations['SYSTEM.PICTURE_CHOOSE_TYPE'],\n buttons: [\n {\n text: translations['SYSTEM.BTN_PICTURE_GALLERY'],\n type: 'button',\n onTap: function(e) {\n return navigator.camera.PictureSourceType.PHOTOLIBRARY;\n }\n },\n {\n text: translations['SYSTEM.BTN_PICTURE_CAMERA'],\n type: 'button button-positive',\n onTap: function(e) {\n return navigator.camera.PictureSourceType.CAMERA;\n }\n }\n ]\n })\n .then(function(sourceType){\n console.info('[camera] User select sourceType:' + sourceType);\n options.sourceType = sourceType;\n return exports.camera.getPicture(options);\n });\n });\n }\n\n options.quality = options.quality || 50;\n options.destinationType = options.destinationType || navigator.camera.DestinationType.DATA_URL;\n options.encodingType = options.encodingType || navigator.camera.EncodingType.PNG;\n options.targetWidth = options.targetWidth || CONST.MAX_WIDTH;\n options.targetHeight = options.targetHeight || CONST.MAX_HEIGHT;\n return $cordovaCamera.getPicture(options);\n }\n\n function scan(n) {\n if (!exports.enable) {\n return $q.reject(\"Barcode scanner not enable. Please call 'ionicReady()' once before use (e.g in app.js).\");\n }\n var deferred = $q.defer();\n cordova.plugins.barcodeScanner.scan(\n function(result) {\n if (!result.cancelled) {\n console.debug('[device] barcode scanner scan: ' + result.text);\n deferred.resolve(result.text); // make sure to convert into String\n }\n else {\n console.debug('[device] barcode scanner scan: CANCELLED');\n deferred.resolve();\n }\n },\n function(err) {\n console.error('[device] Error while using barcode scanner: ' + err);\n deferred.reject(err);\n },\n n);\n return deferred.promise;\n }\n\n function copy(text, callback) {\n if (!exports.enable) {\n return $q.reject('Device disabled');\n }\n var deferred = $q.defer();\n $cordovaClipboard\n .copy(text)\n .then(function () {\n // success\n if (callback) {\n callback();\n }\n deferred.resolve();\n }, function () {\n // error\n deferred.reject({message: 'ERROR.COPY_CLIPBOARD'});\n });\n return deferred.promise;\n }\n\n exports.clipboard = {copy: copy};\n exports.camera = {\n getPicture : getPicture,\n scan: function(n){\n console.warn('Deprecated use of Device.camera.scan(). Use Device.barcode.scan() instead');\n return scan(n);\n }\n };\n exports.barcode = {\n enable : false,\n scan: scan\n };\n exports.keyboard = {\n enable: false,\n close: function() {\n if (!exports.keyboard.enable) return;\n cordova.plugins.Keyboard.close();\n }\n };\n\n // Numerical keyboard - fix #30\n exports.keyboard.digit = {\n settings: {\n bindModel: function(modelScope, modelPath, settings) {\n settings = settings || {};\n modelScope = modelScope || $rootScope;\n var getModelValue = function() {\n return (modelPath||'').split('.').reduce(function(res, path) {\n return res ? res[path] : undefined;\n }, modelScope);\n };\n var setModelValue = function(value) {\n var paths = (modelPath||'').split('.');\n var property = paths.length && paths[paths.length-1];\n paths.reduce(function(res, path) {\n if (path == property) {\n res[property] = value;\n return;\n }\n return res[path];\n }, modelScope);\n };\n\n settings.animation = settings.animation || 'pop';\n settings.action = settings.action || function(number) {\n setModelValue((getModelValue() ||'') + number);\n };\n if (settings.decimal) {\n settings.decimalSeparator = settings.decimalSeparator || '.';\n settings.leftButton = {\n html: '<span>.</span>',\n action: function () {\n var text = getModelValue() || '';\n // only one '.' allowed\n if (text.indexOf(settings.decimalSeparator) >= 0) return;\n // Auto add zero when started with '.'\n if (!text.trim().length) {\n text = '0';\n }\n setModelValue(text + settings.decimalSeparator);\n }\n };\n }\n settings.rightButton = settings.rightButton || {\n html: '<i class=\"icon ion-backspace-outline\"></i>',\n action: function() {\n var text = getModelValue();\n if (text && text.length) {\n text = text.slice(0, -1);\n setModelValue(text);\n }\n }\n };\n return settings;\n }\n }\n };\n\n exports.isIOS = function() {\n return !!navigator.userAgent.match(/iPhone | iPad | iPod/i) || ionic.Platform.isIOS();\n };\n\n exports.isOSX = function() {\n return !!navigator.userAgent.match(/Macintosh/i) || ionic.Platform.is(\"osx\");\n };\n\n exports.isDesktop = function() {\n if (!angular.isDefined(cache.isDesktop)) {\n try {\n // Should have NodeJs and NW\n cache.isDesktop = !exports.enable && !!process && !!nw && !!nw.App;\n } catch (err) {\n cache.isDesktop = false;\n }\n }\n return cache.isDesktop;\n };\n\n exports.isWeb = function() {\n return !exports.enable && !exports.isDesktop();\n };\n\n exports.ready = function() {\n if (started) return $q.when();\n return startPromise || exports.start();\n };\n\n exports.start = function() {\n\n startPromise = ionicReady()\n .then(function(){\n\n exports.enable = window.cordova && cordova && cordova.plugins;\n\n if (exports.enable){\n exports.camera.enable = !!navigator.camera;\n exports.keyboard.enable = cordova && cordova.plugins && !!cordova.plugins.Keyboard;\n exports.barcode.enable = cordova && cordova.plugins && !!cordova.plugins.barcodeScanner && !exports.isOSX();\n exports.clipboard.enable = cordova && cordova.plugins && !!cordova.plugins.clipboard;\n\n if (exports.keyboard.enable) {\n angular.extend(exports.keyboard, cordova.plugins.Keyboard);\n }\n\n console.debug('[device] Ionic platform ready, with [camera: {0}] [barcode scanner: {1}] [keyboard: {2}] [clipboard: {3}]'\n .format(exports.camera.enable, exports.barcode.enable, exports.keyboard.enable, exports.clipboard.enable));\n\n if (cordova.InAppBrowser) {\n console.debug('[device] Enabling InAppBrowser');\n }\n }\n else {\n console.debug('[device] Ionic platform ready - no device detected.');\n }\n\n started = true;\n startPromise = null;\n });\n\n return startPromise;\n };\n\n return exports;\n }])\n\n ;\n","\nangular.module('cesium.currency.services', ['ngApi', 'cesium.bma.services'])\n\n.factory('csCurrency', ['$rootScope', '$q', '$timeout', 'BMA', 'Api', 'csSettings', function($rootScope, $q, $timeout, BMA, Api, csSettings) {\n 'ngInject';\n\n var\n constants = {\n // Avoid to many call on well known currencies\n WELL_KNOWN_CURRENCIES: {\n g1: {\n firstBlockTime: 1488987127,\n medianTimeOffset: 3600\n }\n }\n },\n\n data = {},\n started = false,\n startPromise,\n listeners,\n api = new Api(this, \"csCurrency\");\n\n function powBase(amount, base) {\n return base <= 0 ? amount : amount * Math.pow(10, base);\n }\n\n function resetData() {\n data.name = null;\n data.parameters = null;\n data.firstBlockTime = null;\n data.membersCount = null;\n data.cache = {};\n data.node = BMA;\n data.currentUD = null;\n data.medianTimeOffset = 0;\n started = false;\n startPromise = undefined;\n api.data.raise.reset(data);\n }\n\n function loadData() {\n\n // Load currency from default node\n return $q.all([\n\n // get parameters\n loadParameters()\n .then(function(parameters) {\n // load first block info\n return loadFirstBlock(parameters.currency);\n }),\n\n // get current UD\n loadCurrentUD(),\n\n // call extensions\n api.data.raisePromise.load(data)\n ])\n .catch(function(err) {\n resetData();\n throw err;\n });\n }\n\n function loadParameters() {\n return BMA.blockchain.parameters()\n .then(function(res){\n data.name = res.currency;\n data.parameters = res;\n data.medianTimeOffset = res.avgGenTime * res.medianTimeBlocks / 2;\n return res;\n });\n }\n\n function loadFirstBlock(currencyName) {\n // Well known currencies\n if (constants.WELL_KNOWN_CURRENCIES[currencyName]){\n angular.merge(data, constants.WELL_KNOWN_CURRENCIES[currencyName]);\n return $q.when();\n }\n\n return BMA.blockchain.block({block:0})\n .then(function(json) {\n // Need by graph plugin\n data.firstBlockTime = json.medianTime;\n })\n .catch(function(err) {\n // Special case, when currency not started yet\n if (err && err.ucode === BMA.errorCodes.BLOCK_NOT_FOUND) {\n data.firstBlockTime = 0;\n data.initPhase = true;\n console.warn('[currency] Blockchain not launched: Enable init phase mode');\n return;\n }\n throw err;\n });\n }\n\n function loadCurrentUD() {\n return BMA.blockchain.stats.ud()\n .then(function(res) {\n // Special case for currency init\n if (!res.result.blocks.length) {\n data.currentUD = data.parameters ? data.parameters.ud0 : -1;\n return data.currentUD ;\n }\n return _safeLoadCurrentUD(res, res.result.blocks.length - 1);\n })\n .catch(function(err) {\n data.currentUD = null;\n throw err;\n });\n }\n\n /**\n * Load the last UD, with a workaround if last block with UD is not found in the node\n * @param res\n * @param blockIndex\n * @returns {*}\n * @private\n */\n function _safeLoadCurrentUD(res, blockIndex) {\n // Special case for currency init\n if (!res.result.blocks.length || blockIndex < 0) {\n data.currentUD = data.parameters ? data.parameters.ud0 : -1;\n return data.currentUD ;\n }\n else {\n var lastBlockWithUD = res.result.blocks[blockIndex];\n return BMA.blockchain.block({ block: lastBlockWithUD })\n .then(function(block){\n data.currentUD = powBase(block.dividend, block.unitbase);\n return data.currentUD;\n })\n .catch(function(err) {\n console.error(\"[currency] Unable to load last block with UD, with number {0}\".format(lastBlockWithUD));\n if (blockIndex > 0) {\n console.error(\"[currency] Retrying to load UD from a previous block...\");\n return _safeLoadCurrentUD(res, blockIndex-1);\n }\n data.currentUD = null;\n throw err;\n });\n }\n }\n\n function getData() {\n\n if (started) { // load only once\n return $q.when(data);\n }\n\n // Previous load not finished: return the existing promise - fix #452\n return startPromise || start();\n }\n\n function getDataField(field) {\n return function() {\n if (started) { // load only once\n return $q.when(data[field]);\n }\n\n // Previous load not finished: return the existing promise - fix #452\n return startPromise || start() // load only once\n .then(function(){\n return data[field];\n });\n };\n }\n\n function onBlock(json) {\n var block = new Block(json);\n block.cleanData(); // Remove unused content (arrays...) and keep items count\n\n //console.debug('[currency] Received new block', block);\n console.debug('[currency] Received new block {' + block.number + '-' + block.hash + '}');\n\n data.currentBlock = block;\n data.currentBlock.receivedAt = moment().utc().unix();\n\n data.medianTime = block.medianTime;\n data.membersCount = block.membersCount;\n\n // Update UD\n if (block.dividend) {\n data.currentUD = block.dividend;\n }\n\n // Dispatch to extensions\n api.data.raise.newBlock(block);\n }\n\n function addListeners() {\n listeners = [\n // Listen if node changed\n BMA.api.node.on.restart($rootScope, restart, this),\n // open web socket on block\n BMA.websocket.block().onListener(onBlock)\n ];\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function ready() {\n if (started) return $q.when(data);\n return (startPromise || start());\n }\n\n function stop() {\n console.debug('[currency] Stopping...');\n removeListeners();\n resetData();\n }\n\n function restart() {\n stop();\n return $timeout(start, 200);\n }\n\n function start(bmaAlive) {\n if (startPromise) return startPromise;\n if (started) return $q.when(data);\n\n if (!bmaAlive) {\n return BMA.ready()\n .then(function(alive) {\n if (alive) return start(alive); // Loop\n return $timeout(start, 500); // Loop, after a delay, because BMA node seems to be not alive...\n });\n }\n\n console.debug('[currency] Starting...');\n var now = Date.now();\n\n startPromise = BMA.ready()\n .then(function(started) {\n if (started) return true;\n return $timeout(function() {return start(true);}, 500);\n })\n\n // Load data\n .then(loadData)\n\n // Emit ready event\n .then(function() {\n addListeners();\n\n console.debug('[currency] Started in ' + (Date.now() - now) + 'ms');\n\n started = true;\n startPromise = null;\n\n // Emit event (used by plugins)\n api.data.raise.ready(data);\n })\n .then(function(){\n return data;\n });\n\n return startPromise;\n }\n\n var currentBlockField = getDataField('currentBlock');\n\n function getCurrent(cache) {\n // Get field (and make sure service is started)\n return currentBlockField()\n\n .then(function(currentBlock) {\n\n var now = moment().utc().unix();\n\n if (cache) {\n if (currentBlock && currentBlock.receivedAt && (now - currentBlock.receivedAt) < 60/*1min*/) {\n //console.debug('[currency] Use current block #'+ currentBlock.number +' from cache (age='+ (now - currentBlock.receivedAt) + 's)');\n return currentBlock;\n }\n\n if (!currentBlock) {\n // Should never occur, if websocket /ws/block works !\n console.warn('[currency] No current block in cache: get it from network. Websocket [/ws/block] may not be started ?');\n }\n }\n\n return BMA.blockchain.current(false)\n .catch(function(err){\n // Special case for currency init (root block not exists): use fixed values\n if (err && err.ucode == BMA.errorCodes.NO_CURRENT_BLOCK) {\n return {number: 0, hash: BMA.constants.ROOT_BLOCK_HASH, medianTime: now};\n }\n throw err;\n })\n .then(function(current) {\n data.currentBlock = current;\n data.currentBlock.receivedAt = now;\n return current;\n });\n });\n }\n\n function getLastValidBlock() {\n if (csSettings.data.blockValidityWindow <= 0) {\n return getCurrent(true);\n }\n\n return getCurrent(true)\n .then(function(current) {\n var number = current.number - csSettings.data.blockValidityWindow;\n return (number > 0) ? BMA.blockchain.block({block: number}) : current;\n });\n }\n\n // Get time in second (UTC - medianTimeOffset)\n function getDateNow() {\n return moment().utc().unix() - (data.medianTimeOffset || constants.WELL_KNOWN_CURRENCIES.g1.medianTimeOffset);\n }\n\n // TODO register new block event, to get new UD value\n\n // Register extension points\n api.registerEvent('data', 'ready');\n api.registerEvent('data', 'load');\n api.registerEvent('data', 'reset');\n api.registerEvent('data', 'newBlock');\n\n // init data\n resetData();\n\n // Default action\n //start();\n\n return {\n ready: ready,\n start: start,\n stop: stop,\n data: data,\n get: getData,\n name: getDataField('name'),\n parameters: getDataField('parameters'),\n currentUD: getDataField('currentUD'),\n medianTimeOffset: getDataField('medianTimeOffset'),\n blockchain: {\n current: getCurrent,\n lastValid: getLastValidBlock\n },\n date: {\n now: getDateNow\n },\n // api extension\n api: api,\n // deprecated methods\n default: function() {\n console.warn('[currency] \\'csCurrency.default()\\' has been DEPRECATED - Please use \\'csCurrency.get()\\' instead.');\n return getData();\n }\n };\n}]);\n","//var Base58, Base64, scrypt_module_factory = null, nacl_factory = null;\n\nangular.module('cesium.bma.services', ['ngApi', 'cesium.http.services', 'cesium.settings.services'])\n\n.factory('BMA', ['$q', '$window', '$rootScope', '$timeout', 'csCrypto', 'Api', 'Device', 'UIUtils', 'csConfig', 'csSettings', 'csCache', 'csHttp', function($q, $window, $rootScope, $timeout, csCrypto, Api, Device, UIUtils, csConfig, csSettings, csCache, csHttp) {\n 'ngInject';\n\n function BMA(host, port, useSsl, useCache) {\n\n var\n id = (!host ? 'default' : '{0}:{1}'.format(host, (port || (useSsl ? '443' : '80')))), // Unique id of this instance\n cachePrefix = \"BMA-\",\n pubkey = \"[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{43,44}\",\n // TX output conditions\n SIG = \"SIG\\\\((\" + pubkey + \")\\\\)\",\n XHX = 'XHX\\\\(([A-F0-9]{1,64})\\\\)',\n CSV = 'CSV\\\\(([0-9]{1,8})\\\\)',\n CLTV = 'CLTV\\\\(([0-9]{1,10})\\\\)',\n OUTPUT_FUNCTION = SIG+'|'+XHX+'|'+CSV+'|'+CLTV,\n OUTPUT_OPERATOR = '(&&)|(\\\\|\\\\|)',\n OUTPUT_FUNCTIONS = OUTPUT_FUNCTION+'([ ]*' + OUTPUT_OPERATOR + '[ ]*' + OUTPUT_FUNCTION +')*',\n OUTPUT_OBJ = 'OBJ\\\\(([0-9]+)\\\\)',\n OUTPUT_OBJ_OPERATOR = OUTPUT_OBJ + '[ ]*' + OUTPUT_OPERATOR + '[ ]*' + OUTPUT_OBJ,\n REGEX_ENDPOINT_PARAMS = \"( ([a-z_][a-z0-9-_.ğĞ]*))?( ([0-9.]+))?( ([0-9a-f:]+))?( ([0-9]+))( (.+))?\",\n api = {\n BMA: 'BASIC_MERKLED_API',\n BMAS: 'BMAS',\n WS2P: 'WS2P',\n BMATOR: 'BMATOR',\n WS2PTOR: 'WS2PTOR'\n },\n regexp = {\n USER_ID: \"[0-9a-zA-Z-_]+\",\n CURRENCY: \"[0-9a-zA-Z-_]+\",\n PUBKEY: pubkey,\n PUBKEY_WITH_CHECKSUM: \"(\" + pubkey +\"):([123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{3})\",\n COMMENT: \"[ a-zA-Z0-9-_:/;*\\\\[\\\\]()?!^\\\\+=@&~#{}|\\\\\\\\<>%.]*\",\n INVALID_COMMENT_CHARS: \"[^ a-zA-Z0-9-_:/;*\\\\[\\\\]()?!^\\\\+=@&~#{}|\\\\\\\\<>%.]*\",\n // duniter://[uid]:[pubkey]@[host]:[port]\n URI_WITH_AT: \"duniter://(?:([A-Za-z0-9_-]+):)?(\"+pubkey+\"@([a-zA-Z0-9-.]+.[ a-zA-Z0-9-_:/;*?!^\\\\+=@&~#|<>%.]+)\",\n URI_WITH_PATH: \"duniter://([a-zA-Z0-9-.]+.[a-zA-Z0-9-_:.]+)/(\"+pubkey+\")(?:/([A-Za-z0-9_-]+))?\",\n BMA_ENDPOINT: api.BMA + REGEX_ENDPOINT_PARAMS,\n BMAS_ENDPOINT: api.BMAS + REGEX_ENDPOINT_PARAMS,\n WS2P_ENDPOINT: api.WS2P + \" ([a-f0-9]{8})\"+ REGEX_ENDPOINT_PARAMS,\n BMATOR_ENDPOINT: api.BMATOR + \" ([a-z0-9-_.]*|[0-9.]+|[0-9a-f:]+.onion)(?: ([0-9]+))?\",\n WS2PTOR_ENDPOINT: api.WS2PTOR + \" ([a-f0-9]{8}) ([a-z0-9-_.]*|[0-9.]+|[0-9a-f:]+.onion)(?: ([0-9]+))?(?: (.+))?\"\n },\n errorCodes = {\n REVOCATION_ALREADY_REGISTERED: 1002,\n HTTP_LIMITATION: 1006,\n IDENTITY_SANDBOX_FULL: 1007,\n NO_MATCHING_IDENTITY: 2001,\n UID_ALREADY_USED: 2003,\n NO_MATCHING_MEMBER: 2004,\n NO_IDTY_MATCHING_PUB_OR_UID: 2021,\n WRONG_SIGNATURE_MEMBERSHIP: 2006,\n MEMBERSHIP_ALREADY_SEND: 2007,\n NO_CURRENT_BLOCK: 2010,\n BLOCK_NOT_FOUND: 2011,\n SOURCE_ALREADY_CONSUMED: 2015,\n TX_INPUTS_OUTPUTS_NOT_EQUAL: 2024,\n TX_OUTPUT_SUM_NOT_EQUALS_PREV_DELTAS: 2025,\n TX_ALREADY_PROCESSED: 2030\n },\n constants = {\n PROTOCOL_VERSION: 10,\n ROOT_BLOCK_HASH: 'E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855',\n LIMIT_REQUEST_COUNT: 5, // simultaneous async request to a Duniter node\n LIMIT_REQUEST_DELAY: 1000, // time (in ms) to wait between to call of a rest request\n regexp: regexp,\n api: api\n },\n listeners,\n that = this;\n\n that.raw = {\n getByPath: {},\n postByPath: {},\n wsByPath: {}\n };\n that.api = new Api(this, 'BMA-' + id);\n that.started = false;\n that.init = init;\n\n // Allow to force SSL connection with port different from 443\n that.forceUseSsl = (csConfig.httpsMode === 'true' || csConfig.httpsMode === true || csConfig.httpsMode === 'force') ||\n ($window.location && $window.location.protocol === 'https:') ? true : false;\n if (that.forceUseSsl) {\n console.debug('[BMA] Enable SSL (forced by config or detected in URL)');\n }\n\n if (host) init(host, port, useSsl);\n that.useCache = angular.isDefined(useCache) ? useCache : true; // need here because used in get() function\n\n function init(host, port, useSsl) {\n if (that.started) that.stop();\n that.alive = false;\n\n // Use settings as default, if exists\n if (csSettings.data && csSettings.data.node) {\n host = host || csSettings.data.node.host;\n port = port || csSettings.data.node.port;\n\n useSsl = angular.isDefined(useSsl) ? useSsl : (port == 443 || csSettings.data.node.useSsl || that.forceUseSsl);\n }\n\n if (!host) {\n return; // could not init yet\n }\n that.host = host;\n that.port = port || 80;\n that.useSsl = angular.isDefined(useSsl) ? useSsl : (that.port == 443 || that.forceUseSsl);\n that.server = csHttp.getServer(host, port);\n that.url = csHttp.getUrl(host, port, ''/*path*/, useSsl);\n }\n\n function exact(regexpContent) {\n return new RegExp(\"^\" + regexpContent + \"$\");\n }\n\n function test(regexpContent) {\n return new RegExp(regexpContent);\n }\n\n function closeWs() {\n if (!that.raw) return;\n\n console.warn('[BMA] Closing all websockets...');\n _.keys(that.raw.wsByPath||{}).forEach(function(key) {\n var sock = that.raw.wsByPath[key];\n sock.close();\n });\n that.raw.wsByPath = {};\n }\n\n function cleanCache() {\n console.debug(\"[BMA] Cleaning cache {prefix: '{0}'}...\".format(cachePrefix));\n csCache.clear(cachePrefix);\n\n // Clean raw requests by path cache\n that.raw.getByPath = {};\n that.raw.postByPath = {};\n that.raw.wsByPath = {};\n }\n\n function get(path, cacheTime) {\n\n cacheTime = that.useCache && cacheTime || 0 /* no cache*/ ;\n var requestKey = path + (cacheTime ? ('#'+cacheTime) : '');\n\n var getRequestFn = function(params) {\n\n if (!that.started) {\n if (!that._startPromise) {\n console.warn('[BMA] Trying to get [{0}] before start(). Waiting...'.format(path));\n }\n return that.ready().then(function() {\n return getRequestFn(params);\n });\n }\n\n var request = that.raw.getByPath[requestKey];\n if (!request) {\n if (cacheTime) {\n request = csHttp.getWithCache(that.host, that.port, path, that.useSsl, cacheTime, null, null, cachePrefix);\n }\n else {\n request = csHttp.get(that.host, that.port, path, that.useSsl);\n }\n that.raw.getByPath[requestKey] = request;\n }\n var execCount = 1;\n return request(params)\n .catch(function(err){\n // If node return too many requests error\n if (err && err.ucode === exports.errorCodes.HTTP_LIMITATION) {\n // If max number of retry not reach\n if (execCount <= exports.constants.LIMIT_REQUEST_COUNT) {\n if (execCount === 1) {\n console.warn(\"[BMA] Too many HTTP requests: Will wait then retry...\");\n // Update the loading message (if exists)\n UIUtils.loading.update({template: \"COMMON.LOADING_WAIT\"});\n }\n // Wait 1s then retry\n return $timeout(function() {\n execCount++;\n return request(params);\n }, exports.constants.LIMIT_REQUEST_DELAY);\n }\n }\n throw err;\n });\n };\n\n return getRequestFn;\n }\n\n function post(path) {\n var postRequest = function(obj, params) {\n if (!that.started) {\n if (!that._startPromise) {\n console.error('[BMA] Trying to post [{0}] before start()...'.format(path));\n }\n return that.ready().then(function() {\n return postRequest(obj, params);\n });\n }\n\n var request = that.raw.postByPath[path];\n if (!request) {\n request = csHttp.post(that.host, that.port, path, that.useSsl);\n that.raw.postByPath[path] = request;\n }\n return request(obj, params);\n };\n\n return postRequest;\n }\n\n function ws(path) {\n return function() {\n var sock = that.raw.wsByPath[path];\n if (!sock || sock.isClosed()) {\n sock = csHttp.ws(that.host, that.port, path, that.useSsl);\n\n // When close, remove from cache\n sock.onclose = function() {\n delete that.raw.wsByPath[path];\n };\n\n that.raw.wsByPath[path] = sock;\n }\n return sock;\n };\n }\n\n that.isAlive = function(node) {\n node = node || that;\n // WARN:\n // - Cannot use previous get() function, because\n // node can be !=that, or not be started yet\n // - Do NOT use cache here\n return csHttp.get(node.host, node.port, '/node/summary', node.useSsl)()\n .then(function(json) {\n var software = json && json.duniter && json.duniter.software;\n var isCompatible = true;\n\n // Check duniter min version\n if (software === 'duniter' && json.duniter.version) {\n isCompatible = csHttp.version.isCompatible(csSettings.data.minVersion, json.duniter.version);\n }\n // TODO: check version of other software (DURS, Juniter, etc.)\n else {\n console.debug('[BMA] Unknown node software [{0} v{1}]: could not check compatibility.'.format(software || '?', json.duniter.version || '?'));\n }\n if (!isCompatible) {\n console.error('[BMA] Incompatible node [{0} v{1}]: expected at least v{2}'.format(software, json.duniter.version, csSettings.data.minVersion));\n }\n return isCompatible;\n })\n .catch(function() {\n return false;\n });\n };\n\n function isSameNode(node2) {\n node2 = node2 || {};\n node2.useSsl = angular.isDefined(node2.useSsl) ? node2.useSsl : (node2.port && node2.port == 443);\n // Same host\n return that.host === node2.host &&\n // Same port\n ((!that.port && !node2.port2) || (that.port == node2.port2||80)) &&\n // Same useSsl\n (that.useSsl === node2.useSsl);\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function addListeners() {\n listeners = [\n // Listen if node changed\n csSettings.api.data.on.changed($rootScope, onSettingsChanged, this)\n ];\n }\n\n function onSettingsChanged(settings) {\n // Wait 1s (because settings controller can have restart the service), then copy the settings node\n $timeout(function() {\n exports.copy(settings.node);\n }, 1000);\n }\n\n that.isStarted = function() {\n return that.started;\n };\n\n that.ready = function() {\n if (that.started) return $q.when(that.alive);\n return (that._startPromise || that.start());\n };\n\n that.start = function() {\n if (that._startPromise) return that._startPromise;\n if (that.started) return $q.when(that.alive);\n\n if (!that.host) {\n return csSettings.ready()\n .then(function() {\n that.init();\n\n // Always enable cache\n that.useCache = true;\n\n return that.start(); // recursive call\n });\n }\n\n console.debug(\"[BMA] Starting {0} {ssl: {1})...\".format(that.server, that.useSsl));\n var now = Date.now();\n\n that._startPromise = $q.all([\n csSettings.ready(),\n that.isAlive()\n ])\n .then(function(res) {\n that.alive = res[1];\n if (!that.alive) {\n console.error(\"[BMA] Could not start {0} : unreachable\".format(that.server));\n that.started = true;\n delete that._startPromise;\n return false;\n }\n\n // Add listeners\n if (!listeners || !listeners.length) {\n addListeners();\n }\n console.debug('[BMA] Started in '+(Date.now()-now)+'ms');\n\n that.api.node.raise.start();\n that.started = true;\n delete that._startPromise;\n return true;\n });\n return that._startPromise;\n };\n\n that.stop = function() {\n if (!that.started && !that._startPromise) return $q.when(); // Skip multiple call\n\n console.debug('[BMA] Stopping...');\n\n removeListeners();\n delete that._startPromise;\n\n if (that.alive) {\n closeWs();\n cleanCache();\n that.alive = false;\n that.started = false;\n that.api.node.raise.stop();\n }\n else {\n that.started = false;\n }\n return $q.when();\n };\n\n that.restart = function() {\n that.stop();\n return $timeout(that.start, 200)\n .then(function(alive) {\n if (alive) {\n that.api.node.raise.restart();\n }\n return alive;\n });\n };\n\n that.api.registerEvent('node', 'start');\n that.api.registerEvent('node', 'stop');\n that.api.registerEvent('node', 'restart');\n\n var exports = {\n errorCodes: errorCodes,\n constants: constants,\n regexp: {\n USER_ID: exact(regexp.USER_ID),\n COMMENT: exact(regexp.COMMENT),\n PUBKEY: exact(regexp.PUBKEY),\n PUBKEY_WITH_CHECKSUM: exact(regexp.PUBKEY_WITH_CHECKSUM),\n CURRENCY: exact(regexp.CURRENCY),\n URI: exact(regexp.URI),\n BMA_ENDPOINT: exact(regexp.BMA_ENDPOINT),\n BMAS_ENDPOINT: exact(regexp.BMAS_ENDPOINT),\n WS2P_ENDPOINT: exact(regexp.WS2P_ENDPOINT),\n BMATOR_ENDPOINT: exact(regexp.BMATOR_ENDPOINT),\n WS2PTOR_ENDPOINT: exact(regexp.WS2PTOR_ENDPOINT),\n // TX output conditions\n TX_OUTPUT_SIG: exact(SIG),\n TX_OUTPUT_FUNCTION: test(OUTPUT_FUNCTION),\n TX_OUTPUT_OBJ_OPERATOR_AND: test(OUTPUT_OBJ + '([ ]*&&[ ]*(' + OUTPUT_OBJ + '))+'),\n TX_OUTPUT_OBJ_OPERATOR_OR: test(OUTPUT_OBJ + '([ ]*\\\\|\\\\|[ ]*(' + OUTPUT_OBJ + '))+'),\n TX_OUTPUT_OBJ: test(OUTPUT_OBJ),\n TX_OUTPUT_OBJ_OPERATOR: test(OUTPUT_OBJ_OPERATOR),\n TX_OUTPUT_OBJ_PARENTHESIS: test('\\\\(('+OUTPUT_OBJ+')\\\\)'),\n TX_OUTPUT_FUNCTIONS: test(OUTPUT_FUNCTIONS)\n },\n node: {\n summary: get('/node/summary', csCache.constants.LONG),\n same: isSameNode,\n forceUseSsl: that.forceUseSsl\n },\n network: {\n peering: {\n self: get('/network/peering'),\n peers: get('/network/peering/peers')\n },\n peers: get('/network/peers'),\n ws2p: {\n info: get('/network/ws2p/info'),\n heads: get('/network/ws2p/heads')\n }\n },\n wot: {\n lookup: get('/wot/lookup/:search'),\n certifiedBy: get('/wot/certified-by/:pubkey', csCache.constants.SHORT),\n certifiersOf: get('/wot/certifiers-of/:pubkey', csCache.constants.SHORT),\n member: {\n all: get('/wot/members', csCache.constants.LONG),\n pending: get('/wot/pending', csCache.constants.SHORT)\n },\n requirements: function(params, cache) {\n // No cache by default\n if (cache !== true) return exports.raw.wot.requirements(params);\n return exports.raw.wot.requirementsWithCache(params);\n },\n add: post('/wot/add'),\n certify: post('/wot/certify'),\n revoke: post('/wot/revoke')\n },\n blockchain: {\n parameters: get('/blockchain/parameters', csCache.constants.VERY_LONG),\n block: get('/blockchain/block/:block', csCache.constants.SHORT),\n blocksSlice: get('/blockchain/blocks/:count/:from'),\n current: function(cache) {\n // No cache by default\n return (cache !== true) ? exports.raw.blockchain.current() : exports.raw.blockchain.currentWithCache();\n },\n membership: post('/blockchain/membership'),\n stats: {\n ud: get('/blockchain/with/ud', csCache.constants.MEDIUM),\n tx: get('/blockchain/with/tx'),\n newcomers: get('/blockchain/with/newcomers', csCache.constants.MEDIUM),\n hardship: get('/blockchain/hardship/:pubkey'),\n difficulties: get('/blockchain/difficulties')\n }\n },\n tx: {\n sources: get('/tx/sources/:pubkey', csCache.constants.SHORT),\n process: post('/tx/process'),\n history: {\n all: function(params) {\n return exports.raw.tx.history.all(params)\n .then(function(res) {\n res.history = res.history || {};\n // Clean sending and pendings, because already returned by tx/history/:pubkey/pending\n res.history.sending = [];\n res.history.pendings = [];\n return res;\n });\n },\n times: function(params, cache) {\n // No cache by default\n return ((cache !== true) ? exports.raw.tx.history.times(params) : exports.raw.tx.history.timesWithCache(params))\n .then(function(res) {\n res.history = res.history || {};\n // Clean sending and pendings, because already returned by tx/history/:pubkey/pending\n res.history.sending = [];\n res.history.pendings = [];\n return res;\n });\n },\n blocks: get('/tx/history/:pubkey/blocks/:from/:to', csCache.constants.LONG),\n pending: get('/tx/history/:pubkey/pending')\n }\n },\n ud: {\n history: get('/ud/history/:pubkey')\n },\n uri: {},\n version: {},\n raw: {\n blockchain: {\n currentWithCache: get('/blockchain/current', csCache.constants.SHORT),\n current: get('/blockchain/current')\n },\n wot: {\n requirementsWithCache: get('/wot/requirements/:pubkey', csCache.constants.LONG),\n requirements: get('/wot/requirements/:pubkey')\n },\n tx: {\n history: {\n timesWithCache: get('/tx/history/:pubkey/times/:from/:to', csCache.constants.LONG),\n times: get('/tx/history/:pubkey/times/:from/:to'),\n all: get('/tx/history/:pubkey')\n }\n },\n }\n };\n\n exports.tx.parseUnlockCondition = function(unlockCondition) {\n\n //console.debug('[BMA] Parsing unlock condition: {0}.'.format(unlockCondition));\n var convertedOutput = unlockCondition;\n var treeItems = [];\n var treeItem;\n var treeItemId;\n var childrenContent;\n var childrenMatches;\n var functions = {};\n\n // Parse functions, then replace with an 'OBJ()' generic function, used to build a object tree\n var matches = exports.regexp.TX_OUTPUT_FUNCTION.exec(convertedOutput);\n while(matches) {\n treeItem = {};\n treeItemId = 'OBJ(' + treeItems.length + ')';\n treeItem.type = convertedOutput.substr(matches.index, matches[0].indexOf('('));\n treeItem.value = matches[1] || matches[2] || matches[3] || matches[4]; // get value from regexp OUTPUT_FUNCTION\n treeItems.push(treeItem);\n\n functions[treeItem.type] = functions[treeItem.type]++ || 1;\n\n convertedOutput = convertedOutput.replace(matches[0], treeItemId);\n matches = exports.regexp.TX_OUTPUT_FUNCTION.exec(convertedOutput);\n }\n\n var loop = true;\n while(loop) {\n // Parse AND operators\n matches = exports.regexp.TX_OUTPUT_OBJ_OPERATOR_AND.exec(convertedOutput);\n loop = !!matches;\n while (matches) {\n treeItem = {};\n treeItemId = 'OBJ(' + treeItems.length + ')';\n treeItem.type = 'AND';\n treeItem.children = [];\n treeItems.push(treeItem);\n\n childrenContent = matches[0];\n childrenMatches = exports.regexp.TX_OUTPUT_OBJ.exec(childrenContent);\n while(childrenMatches) {\n\n treeItem.children.push(treeItems[childrenMatches[1]]);\n childrenContent = childrenContent.replace(childrenMatches[0], '');\n childrenMatches = exports.regexp.TX_OUTPUT_OBJ.exec(childrenContent);\n }\n\n convertedOutput = convertedOutput.replace(matches[0], treeItemId);\n matches = exports.regexp.TX_OUTPUT_OBJ_OPERATOR_AND.exec(childrenContent);\n }\n\n // Parse OR operators\n\n matches = exports.regexp.TX_OUTPUT_OBJ_OPERATOR_OR.exec(convertedOutput);\n loop = loop || !!matches;\n while (matches) {\n treeItem = {};\n treeItemId = 'OBJ(' + treeItems.length + ')';\n treeItem.type = 'OR';\n treeItem.children = [];\n treeItems.push(treeItem);\n\n childrenContent = matches[0];\n childrenMatches = exports.regexp.TX_OUTPUT_OBJ.exec(childrenContent);\n while(childrenMatches) {\n treeItem.children.push(treeItems[childrenMatches[1]]);\n childrenContent = childrenContent.replace(childrenMatches[0], '');\n childrenMatches = exports.regexp.TX_OUTPUT_OBJ.exec(childrenContent);\n }\n\n convertedOutput = convertedOutput.replace(matches[0], treeItemId);\n matches = exports.regexp.TX_OUTPUT_OBJ_OPERATOR_AND.exec(convertedOutput);\n }\n\n // Remove parenthesis\n matches = exports.regexp.TX_OUTPUT_OBJ_PARENTHESIS.exec(convertedOutput);\n loop = loop || !!matches;\n while (matches) {\n convertedOutput = convertedOutput.replace(matches[0], matches[1]);\n matches = exports.regexp.TX_OUTPUT_OBJ_PARENTHESIS.exec(convertedOutput);\n }\n }\n\n functions = _.keys(functions);\n if (functions.length === 0) {\n console.error('[BMA] Unparseable unlock condition: ', output);\n return;\n }\n console.debug('[BMA] Unlock conditions successfully parsed:', treeItem);\n return {\n unlockFunctions: functions,\n unlockTree: treeItem\n };\n };\n\n exports.node.parseEndPoint = function(endpoint, epPrefix) {\n // Try BMA\n var matches = exports.regexp.BMA_ENDPOINT.exec(endpoint);\n if (matches) {\n return {\n \"dns\": matches[2] || '',\n \"ipv4\": matches[4] || '',\n \"ipv6\": matches[6] || '',\n \"port\": matches[8] || 80,\n \"useSsl\": matches[8] && matches[8] == 443,\n \"path\": matches[10],\n \"useBma\": true\n };\n }\n // Try BMAS\n matches = exports.regexp.BMAS_ENDPOINT.exec(endpoint);\n if (matches) {\n return {\n \"dns\": matches[2] || '',\n \"ipv4\": matches[4] || '',\n \"ipv6\": matches[6] || '',\n \"port\": matches[8] || 80,\n \"useSsl\": true,\n \"path\": matches[10],\n \"useBma\": true\n };\n }\n // Try BMATOR\n matches = exports.regexp.BMATOR_ENDPOINT.exec(endpoint);\n if (matches) {\n return {\n \"dns\": matches[1] || '',\n \"port\": matches[2] || 80,\n \"useSsl\": false,\n \"useTor\": true,\n \"useBma\": true\n };\n }\n // Try WS2P\n matches = exports.regexp.WS2P_ENDPOINT.exec(endpoint);\n if (matches) {\n return {\n \"ws2pid\": matches[1] || '',\n \"dns\": matches[3] || '',\n \"ipv4\": matches[5] || '',\n \"ipv6\": matches[7] || '',\n \"port\": matches[9] || 80,\n \"useSsl\": matches[9] && matches[9] == 443,\n \"path\": matches[11] || '',\n \"useWs2p\": true\n };\n }\n // Try WS2PTOR\n matches = exports.regexp.WS2PTOR_ENDPOINT.exec(endpoint);\n if (matches) {\n return {\n \"ws2pid\": matches[1] || '',\n \"dns\": matches[2] || '',\n \"port\": matches[3] || 80,\n \"path\": matches[4] || '',\n \"useSsl\": false,\n \"useTor\": true,\n \"useWs2p\": true\n };\n }\n\n // Use generic match\n if (epPrefix) {\n matches = exact(epPrefix + REGEX_ENDPOINT_PARAMS).exec(endpoint);\n if (matches) {\n return {\n \"dns\": matches[2] || '',\n \"ipv4\": matches[4] || '',\n \"ipv6\": matches[6] || '',\n \"port\": matches[8] || 80,\n \"useSsl\": matches[8] && matches[8] == 443,\n \"path\": matches[10],\n \"useBma\": false\n };\n }\n }\n\n };\n\n exports.copy = function(otherNode) {\n\n var server = csHttp.getUrl(otherNode.host, otherNode.port, ''/*path*/, otherNode.useSsl);\n var hasChanged = (server !== that.url);\n if (hasChanged) {\n var wasStarted = that.started;\n if (wasStarted) that.stop();\n that.init(otherNode.host, otherNode.port, otherNode.useSsl, that.useCache/*keep original value*/);\n if (wasStarted) {\n return $timeout(function () {\n return that.start()\n .then(function (alive) {\n if (alive) {\n that.api.node.raise.restart();\n }\n return alive;\n });\n }, 200); // Wait stop finished\n }\n }\n };\n\n exports.wot.member.uids = function() {\n return exports.wot.member.all()\n .then(function(res){\n return res.results.reduce(function(res, member){\n res[member.pubkey] = member.uid;\n return res;\n }, {});\n });\n };\n\n exports.wot.member.get = function(pubkey) {\n return exports.wot.member.uids()\n .then(function(memberUidsByPubkey){\n var uid = memberUidsByPubkey[pubkey];\n return {\n pubkey: pubkey,\n uid: (uid ? uid : null)\n };\n });\n };\n\n exports.wot.member.getByUid = function(uid) {\n return exports.wot.member.all()\n .then(function(res){\n return _.findWhere(res.results, {uid: uid});\n });\n };\n\n /**\n * Return all expected blocks\n * @param blockNumbers a rray of block number\n */\n exports.blockchain.blocks = function(blockNumbers){\n return exports.raw.getHttpRecursive(exports.blockchain.block, 'block', blockNumbers);\n };\n\n /**\n * Return all expected blocks\n * @param blockNumbers a rray of block number\n */\n exports.network.peering.peersByLeaves = function(leaves){\n return exports.raw.getHttpRecursive(exports.network.peering.peers, 'leaf', leaves, 0, 10);\n };\n\n exports.raw.getHttpRecursive = function(httpGetRequest, paramName, paramValues, offset, size) {\n offset = angular.isDefined(offset) ? offset : 0;\n size = size || exports.constants.LIMIT_REQUEST_COUNT;\n return $q(function(resolve, reject) {\n var result = [];\n var jobs = [];\n _.each(paramValues.slice(offset, offset+size), function(paramValue) {\n var requestParams = {};\n requestParams[paramName] = paramValue;\n jobs.push(\n httpGetRequest(requestParams)\n .then(function(res){\n if (!res) return;\n result.push(res);\n })\n );\n });\n\n $q.all(jobs)\n .then(function() {\n if (offset < paramValues.length - 1) {\n $timeout(function() {\n exports.raw.getHttpRecursive(httpGetRequest, paramName, paramValues, offset+size, size)\n .then(function(res) {\n if (!res || !res.length) {\n resolve(result);\n return;\n }\n\n resolve(result.concat(res));\n })\n .catch(function(err) {\n reject(err);\n });\n }, exports.constants.LIMIT_REQUEST_DELAY);\n }\n else {\n resolve(result);\n }\n })\n .catch(function(err){\n if (err && err.ucode === exports.errorCodes.HTTP_LIMITATION) {\n resolve(result);\n }\n else {\n reject(err);\n }\n });\n });\n };\n\n exports.raw.getHttpWithRetryIfLimitation = function(exec) {\n return exec()\n .catch(function(err){\n // When too many request, retry in 3s\n if (err && err.ucode == exports.errorCodes.HTTP_LIMITATION) {\n return $timeout(function() {\n // retry\n return exports.raw.getHttpWithRetryIfLimitation(exec);\n }, exports.constants.LIMIT_REQUEST_DELAY);\n }\n });\n };\n\n exports.blockchain.lastUd = function() {\n return exports.blockchain.stats.ud()\n .then(function(res) {\n if (!res.result.blocks || !res.result.blocks.length) {\n return null;\n }\n var lastBlockWithUD = res.result.blocks[res.result.blocks.length - 1];\n return exports.blockchain.block({block: lastBlockWithUD})\n .then(function(block){\n return (block.unitbase > 0) ? block.dividend * Math.pow(10, block.unitbase) : block.dividend;\n });\n });\n };\n\n exports.uri.parse = function(uri) {\n return $q(function(resolve, reject) {\n var pubkey;\n\n // If pubkey: not need to parse\n if (exact(regexp.PUBKEY).test(uri)) {\n resolve({\n pubkey: uri\n });\n }\n // If pubkey+checksum\n else if (exact(regexp.PUBKEY_WITH_CHECKSUM).test(uri)) {\n console.debug(\"[BMA.parse] Detecting a pubkey with checksum: \" + uri);\n var matches = exports.regexp.PUBKEY_WITH_CHECKSUM.exec(uri);\n pubkey = matches[1];\n var checksum = matches[2];\n console.debug(\"[BMA.parse] Detecting a pubkey {\"+pubkey+\"} with checksum {\" + checksum + \"}\");\n var expectedChecksum = csCrypto.util.pkChecksum(pubkey);\n console.debug(\"[BMA.parse] Expecting checksum for pubkey is {\" + expectedChecksum + \"}\");\n if (checksum != expectedChecksum) {\n reject( {message: 'ERROR.PUBKEY_INVALID_CHECKSUM'});\n }\n else {\n resolve({\n pubkey: pubkey\n });\n }\n }\n else if(uri.startsWith('duniter://')) {\n var parser = csHttp.uri.parse(uri),\n uid,\n currency = parser.host.indexOf('.') === -1 ? parser.host : null,\n host = parser.host.indexOf('.') !== -1 ? parser.host : null;\n if (parser.username) {\n if (parser.password) {\n uid = parser.username;\n pubkey = parser.password;\n }\n else {\n pubkey = parser.username;\n }\n }\n if (parser.pathname) {\n var paths = parser.pathname.split('/');\n var pathCount = !paths ? 0 : paths.length;\n var index = 0;\n if (!currency && pathCount > index) {\n currency = paths[index++];\n }\n if (!pubkey && pathCount > index) {\n pubkey = paths[index++];\n }\n if (!uid && pathCount > index) {\n uid = paths[index++];\n }\n if (pathCount > index) {\n reject( {message: 'Bad Duniter URI format. Invalid path (incomplete or redundant): '+ parser.pathname}); return;\n }\n }\n\n if (!currency){\n if (host) {\n csHttp.get(host + '/blockchain/parameters')()\n .then(function(parameters){\n resolve({\n uid: uid,\n pubkey: pubkey,\n host: host,\n currency: parameters.currency\n });\n })\n .catch(function(err) {\n console.error(err);\n reject({message: 'Could not get node parameter. Currency could not be retrieve'});\n });\n }\n else {\n reject({message: 'Bad Duniter URI format. Missing currency name (or node address).'}); return;\n }\n }\n else {\n if (!host) {\n resolve({\n uid: uid,\n pubkey: pubkey,\n currency: currency\n });\n }\n\n // Check if currency are the same (between node and uri)\n return csHttp.get(host + '/blockchain/parameters')()\n .then(function(parameters){\n if (parameters.currency !== currency) {\n reject( {message: \"Node's currency [\"+parameters.currency+\"] does not matched URI's currency [\"+currency+\"].\"}); return;\n }\n resolve({\n uid: uid,\n pubkey: pubkey,\n host: host,\n currency: currency\n });\n })\n .catch(function(err) {\n console.error(err);\n reject({message: 'Could not get node parameter. Currency could not be retrieve'});\n });\n }\n }\n else {\n console.debug(\"[BMA.parse] Could not parse URI: \" + uri);\n reject({message: 'ERROR.UNKNOWN_URI_FORMAT'});\n }\n })\n\n // Check values against regex\n .then(function(result) {\n if (!result) return;\n if (result.pubkey && !(exact(regexp.PUBKEY).test(result.pubkey))) {\n throw {message: \"Invalid pubkey format [\" + result.pubkey + \"]\"};\n }\n if (result.uid && !(exact(regexp.USER_ID).test(result.uid))) {\n throw {message: \"Invalid uid format [\" + result.uid + \"]\"};\n }\n if (result.currency && !(exact(regexp.CURRENCY).test(result.currency))) {\n throw {message: \"Invalid currency format [\"+result.currency+\"]\"};\n }\n return result;\n });\n };\n\n // Define get latest release (or fake function is no URL defined)\n var duniterLatestReleaseUrl = csSettings.data.duniterLatestReleaseUrl && csHttp.uri.parse(csSettings.data.duniterLatestReleaseUrl);\n exports.raw.getLatestRelease = duniterLatestReleaseUrl ?\n csHttp.getWithCache(duniterLatestReleaseUrl.host,\n duniterLatestReleaseUrl.port,\n \"/\" + duniterLatestReleaseUrl.pathname,\n /*useSsl*/ (+(duniterLatestReleaseUrl.port) === 443 || duniterLatestReleaseUrl.protocol === 'https:' || that.forceUseSsl),\n csCache.constants.LONG\n ) :\n // No URL define: use a fake function\n function() {\n return $q.when();\n };\n\n exports.version.latest = function() {\n return exports.raw.getLatestRelease()\n .then(function (json) {\n if (!json) return;\n if (json.name && json.html_url) {\n return {\n version: json.name,\n url: json.html_url\n };\n }\n if (json.tag_name && json.html_url) {\n return {\n version: json.tag_name.substring(1),\n url: json.html_url\n };\n }\n })\n .catch(function(err) {\n // silent (just log it)\n console.error('[BMA] Failed to get Duniter latest version', err);\n });\n };\n\n exports.websocket = {\n block: ws('/ws/block'),\n peer: ws('/ws/peer'),\n close : closeWs\n };\n\n angular.merge(that, exports);\n }\n\n var service = new BMA();\n\n service.instance = function(host, port, useSsl, useCache) {\n useCache = angular.isDefined(useCache) ? useCache : false; // No cache by default\n return new BMA(host, port, useSsl, useCache);\n };\n\n service.lightInstance = function(host, port, useSsl, timeout) {\n port = port || 80;\n useSsl = angular.isDefined(useSsl) ? useSsl : (port == 443);\n return {\n host: host,\n port: port,\n useSsl: useSsl,\n url: csHttp.getUrl(host, port, ''/*no path*/, useSsl),\n node: {\n summary: csHttp.getWithCache(host, port, '/node/summary', useSsl, csCache.constants.MEDIUM, false/*autoRefresh*/, timeout)\n },\n network: {\n peering: {\n self: csHttp.get(host, port, '/network/peering', useSsl, timeout)\n },\n peers: csHttp.get(host, port, '/network/peers', useSsl, timeout)\n },\n blockchain: {\n current: csHttp.get(host, port, '/blockchain/current', useSsl, timeout),\n stats: {\n hardship: csHttp.get(host, port, '/blockchain/hardship/:pubkey', useSsl, timeout)\n }\n }\n };\n };\n\n // default action\n //service.start();\n\n return service;\n}])\n\n;\n","\nangular.module('cesium.wot.services', ['ngApi', 'cesium.bma.services', 'cesium.crypto.services', 'cesium.utils.services',\n 'cesium.settings.services'])\n\n.factory('csWot', ['$rootScope', '$q', '$timeout', 'BMA', 'Api', 'CacheFactory', 'UIUtils', 'csConfig', 'csCurrency', 'csSettings', 'csCache', function($rootScope, $q, $timeout, BMA, Api, CacheFactory, UIUtils, csConfig, csCurrency, csSettings, csCache) {\n 'ngInject';\n\n\n var\n api = new Api(this, \"csWot\"),\n cachePrefix = 'csWot-',\n identityCache = csCache.get(cachePrefix + 'idty-', csCache.constants.MEDIUM),\n requirementsCache = csCache.get(cachePrefix + 'requirements-', csCache.constants.MEDIUM),\n\n // Add id, and remove duplicated id\n _addUniqueIds = function(idties) {\n var idtyKeys = {};\n return idties.reduce(function(res, idty) {\n idty.id = idty.id || idty.uid + '-' + idty.pubkey;\n if (!idtyKeys[idty.id]) {\n idtyKeys[idty.id] = true;\n return res.concat(idty);\n }\n return res;\n }, []);\n },\n\n _sortAndSliceIdentities = function(idties, offset, size) {\n offset = offset || 0;\n\n // Add unique ids\n idties = _addUniqueIds(idties);\n\n // Sort by block and\n idties = _.sortBy(idties, function(idty){\n var score = 1;\n score += (1000000 * (idty.block));\n score += (10 * (900 - idty.uid.toLowerCase().charCodeAt(0)));\n return -score;\n });\n if (angular.isDefined(size) && idties.length > size) {\n idties = idties.slice(offset, offset+size); // limit if more than expected size\n }\n\n\n return idties;\n },\n\n _sortCertifications = function(certifications) {\n certifications = _.sortBy(certifications, function(cert){\n var score = 1;\n score += (1000000000000 * (cert.expiresIn ? cert.expiresIn : 0));\n score += (10000000 * (cert.isMember ? 1 : 0));\n score += (10 * (cert.block ? cert.block : 0));\n return -score;\n });\n return certifications;\n },\n\n _resetRequirements = function(data) {\n data.requirements = {\n loaded: false,\n meta: {},\n hasSelf: false,\n needSelf: true,\n needMembership: true,\n canMembershipOut: false,\n needRenew: false,\n pendingMembership: false,\n isMember: false,\n wasMember: false,\n certificationCount: 0,\n needCertifications: false,\n needCertificationCount: 0,\n willNeedCertificationCount: 0,\n alternatives: undefined\n };\n data.blockUid = null;\n data.isMember = false;\n data.sigDate = null;\n data.hasSelf = false;\n },\n\n _fillRequirements = function(requirements, currencyParameters) {\n // Add useful custom fields\n requirements.hasSelf = !!requirements.meta.timestamp;\n requirements.needSelf = !requirements.hasSelf || requirements.meta.invalid;\n requirements.wasMember = angular.isDefined(requirements.wasMember) ? requirements.wasMember : false; // Compat with Duniter 0.9\n requirements.needMembership = (!requirements.revoked && requirements.membershipExpiresIn <= 0 && requirements.membershipPendingExpiresIn <= 0 && !requirements.wasMember);\n requirements.needRenew = (!requirements.needMembership && !requirements.revoked &&\n requirements.membershipExpiresIn <= csSettings.data.timeWarningExpireMembership &&\n requirements.membershipPendingExpiresIn <= 0) ||\n (requirements.wasMember && !requirements.revoked && requirements.membershipExpiresIn === 0 &&\n requirements.membershipPendingExpiresIn === 0);\n requirements.canMembershipOut = (!requirements.revoked && requirements.membershipExpiresIn > 0);\n requirements.pendingMembership = (!requirements.revoked && requirements.membershipExpiresIn <= 0 && requirements.membershipPendingExpiresIn > 0);\n requirements.isMember = (!requirements.revoked && requirements.membershipExpiresIn > 0);\n requirements.blockUid = requirements.meta.timestamp;\n // Force certification count to 0, is not a member yet - fix #269\n requirements.certificationCount = ((requirements.isMember || (requirements.wasMember && !requirements.expired)) && requirements.certifications) ? requirements.certifications.length : 0;\n requirements.willExpireCertificationCount = requirements.certifications ? requirements.certifications.reduce(function(count, cert){\n return count + (cert.expiresIn <= csSettings.data.timeWarningExpire ? 1 : 0);\n }, 0) : 0;\n requirements.willExpire = requirements.willExpireCertificationCount > 0;\n requirements.pendingRevocation = !requirements.revoked && !!requirements.revocation_sig;\n //requirements.outdistanced = requirements.outdistanced; // outdistanced is always present in requirement - see #777\n\n // Fix pending certifications count - Fix #624\n if (!requirements.isMember && !requirements.wasMember) {\n var certifiers = _.union(\n _.pluck(requirements.pendingCerts || [], 'from'),\n _.pluck(requirements.certifications || [], 'from')\n );\n requirements.pendingCertificationCount = _.size(certifiers);\n }\n else {\n requirements.pendingCertificationCount = angular.isDefined(requirements.pendingCerts) ? requirements.pendingCerts.length : 0 ;\n }\n\n // Compute\n requirements.needCertificationCount = (!requirements.needSelf && (requirements.certificationCount < currencyParameters.sigQty)) ?\n (currencyParameters.sigQty - requirements.certificationCount) : 0;\n requirements.willNeedCertificationCount = (!requirements.needMembership && !requirements.needCertificationCount &&\n (requirements.certificationCount - requirements.willExpireCertificationCount) < currencyParameters.sigQty) ?\n (currencyParameters.sigQty - requirements.certificationCount + requirements.willExpireCertificationCount) : 0;\n\n // Mark as loaded - need by csWallet.isDataLoaded()\n requirements.loaded = true;\n\n\n return requirements;\n },\n\n _fillIdentitiesMeta = function(identities) {\n if (!identities) return $q.when(identities);\n\n var blocks = [];\n _.forEach(identities, function(identity) {\n var blockUid = identity.meta.timestamp.split('-', 2);\n identity.meta.number = parseInt(blockUid[0]);\n identity.meta.hash = blockUid[1];\n identity.meta.sig = identity.meta.sig || identity.sig;\n delete identity.sig;\n blocks.push(identity.meta.number);\n });\n\n // Get identities blocks, to fill self and revocation time\n return BMA.blockchain.blocks(_.uniq(blocks))\n .then(function(blocks) {\n _.forEach(identities, function(identity) {\n var block = _.findWhere(blocks, {number: identity.meta.number});\n identity.meta.time = block && block.medianTime;\n\n // Check if self has been done on a valid block\n if (block && identity.meta.number !== 0 && identity.meta.hash !== block.hash) {\n identity.meta.invalid = true;\n }\n });\n\n return identities;\n })\n .catch(function(err){\n // Special case for currency init (root block not exists): use now\n if (err && err.ucode == BMA.errorCodes.BLOCK_NOT_FOUND) {\n _.forEach(identities, function(identity) {\n if (identity.number === 0) {\n identity.meta.time = moment().utc().unix();\n }\n });\n return identities;\n }\n else {\n throw err;\n }\n });\n },\n\n loadRequirements = function(inputData, withCache) {\n if (!inputData || (!inputData.pubkey && !inputData.uid)) return $q.when(inputData);\n\n var cacheKey = inputData.pubkey||inputData.uid;\n var data = (withCache !== false) ? requirementsCache.get(cacheKey) : null;\n if (data) {\n console.debug(\"[wot] Requirements \" + cacheKey + \" found in cache\");\n // Update data with cache\n angular.merge(inputData, data);\n return $q.when(data);\n }\n data = {pubkey: inputData.pubkey, uid: inputData.uid};\n\n // Alert user, when request is too long (> 2s)\n $timeout(function() {\n if (!data.requirements || !data.requirements.loaded) UIUtils.loading.update({template: \"COMMON.LOADING_WAIT\"});\n }, 2000);\n\n var now = Date.now();\n return $q.all([\n // Get currency\n csCurrency.get(),\n\n // Get requirements\n BMA.wot.requirements({pubkey: data.pubkey||data.uid}, false/*no cache*/)\n .then(function(res) {\n return _fillIdentitiesMeta(res && res.identities);\n })\n ])\n .then(function(res){\n var currency = res[0];\n var identities = res[1];\n\n if (!identities || !identities.length) return;\n\n // Sort to select the best identity\n if (identities.length > 1) {\n // Select the best identity, by sorting using this order\n // - same wallet uid\n // - is member\n // - has a pending membership\n // - is not expired (in sandbox)\n // - is not outdistanced\n // - if has certifications\n // max(count(certification)\n // else\n // max(membershipPendingExpiresIn) = must recent membership\n identities = _.sortBy(identities, function(idty) {\n var score = 0;\n score += (1000000000000* ((data.uid && idty.uid === data.uid) ? 1 : 0));\n score += (100000000000 * (!idty.meta.invalid ? 1 : 0));\n score += (10000000000 * ((data.blockUid && idty.meta.timestamp && idty.meta.timestamp === data.blockUid) ? 1 : 0));\n score += (1000000000 * (idty.membershipExpiresIn > 0 ? 1 : 0));\n score += (100000000 * (idty.membershipPendingExpiresIn > 0 ? 1 : 0));\n score += (10000000 * (!idty.expired ? 1 : 0));\n score += (1000000 * (!idty.outdistanced ? 1 : 0));\n score += (100000 * (idty.wasMember ? 1 : 0));\n var certCount = !idty.expired && idty.certifications ? idty.certifications.length : 0;\n score += (1 * (certCount ? certCount : 0));\n score += (1 * (!certCount && idty.membershipPendingExpiresIn > 0 ? idty.membershipPendingExpiresIn/1000 : 0));\n return -score;\n });\n console.debug('[wot] Found {0} identities (in requirements). Will selected the best one'.format(identities.length));\n }\n\n // Select the first identity\n data.requirements = _fillRequirements(identities[0], currency.parameters);\n\n // Copy some useful properties into data\n data.pubkey = data.requirements.pubkey;\n data.uid = data.requirements.uid;\n data.isMember = data.requirements.isMember;\n data.blockUid = data.requirements.meta && data.requirements.meta.timestamp;\n data.hasSelf = data.requirements.hasSelf;\n data.sigDate = data.requirements.meta && data.requirements.meta.time;\n\n // Prepare alternatives identities if any\n if (!data.requirements.isMember && !data.requirements.wasMember && identities.length > 1) {\n data.requirements.alternatives = identities.splice(1);\n _.forEach(data.requirements.alternatives, function(requirements) {\n _fillRequirements(requirements, currency.parameters);\n });\n }\n\n /// Save to cache\n requirementsCache.put(cacheKey, data);\n\n angular.merge(inputData, data); // Update the input data\n\n console.debug(\"[wot] Requirements for '{0}' loaded in {1}ms\".format((data.pubkey && data.pubkey.substring(0,8))||data.uid, Date.now() - now));\n\n return inputData;\n })\n .catch(function(err) {\n data.requirements = {loaded: true}; // Mark has loaded - need by the previous $timeout\n _resetRequirements(inputData);\n // If not a member: continue\n if (!!err &&\n (err.ucode == BMA.errorCodes.NO_MATCHING_MEMBER ||\n err.ucode == BMA.errorCodes.NO_IDTY_MATCHING_PUB_OR_UID)) {\n inputData.requirements.loaded = true;\n return inputData;\n }\n throw err;\n });\n },\n\n loadIdentityByLookup = function(pubkey, uid) {\n var data = {\n pubkey: pubkey,\n uid: uid,\n hasSelf: false\n };\n return BMA.wot.lookup({ search: pubkey||uid })\n .then(function(res){\n var identities = res.results.reduce(function(idties, res) {\n return idties.concat(res.uids.reduce(function(uids, idty) {\n var blockUid = idty.meta.timestamp.split('-', 2);\n var blockNumber = parseInt(blockUid[0]);\n return uids.concat({\n uid: idty.uid,\n pubkey: res.pubkey,\n meta: {\n timestamp: idty.meta.timestamp,\n number: blockNumber,\n hash: blockUid[1],\n sig: idty.self\n },\n revoked: idty.revoked,\n revoked_on: idty.revoked_on\n });\n }, []));\n }, []);\n\n // Fill identities meta (self)\n return _fillIdentitiesMeta(identities)\n .then(function(identities) {\n return {\n identities: identities,\n results: res.results\n };\n });\n })\n .then(function(res){\n var identities = res.identities;\n\n // Sort identities if need\n if (identities.length > 1) {\n // Select the best identity, by sorting using this order\n // - valid block\n // - same given uid\n // - not revoked\n // - max(block_number)\n res.identities = _.sortBy(identities, function(idty) {\n var score = 0;\n score += (100000000000 * ((data.uid && idty.uid === data.uid) ? 1 : 0));\n score += (10000000000 * (!idty.meta.invalid ? 1 : 0));\n score += (1000000000 * ((data.blockUid && idty.meta.timestamp && idty.meta.timestamp === data.blockUid) ? 1 : 0));\n score += (100000000 * (!idty.revoked ? 1 : 0));\n score += (1 * (idty.meta.number ? idty.meta.number : 0) / 1000);\n return -score;\n });\n console.debug('[wot] Found {0} identities (in lookup). Will selected the best one'.format(identities.length));\n }\n\n // Prepare alternatives identities\n _.forEach(identities, function(idty) {\n idty.hasSelf = !!(idty.uid && idty.meta.timestamp && idty.meta.sig);\n });\n\n // Select the first identity\n data.requirements = identities[0];\n\n // Copy some useful properties into data\n data.pubkey = data.requirements.pubkey;\n data.uid = data.requirements.uid;\n data.blockUid = data.requirements.meta && data.requirements.meta.timestamp;\n data.hasSelf = data.requirements.hasSelf;\n data.sigDate = data.requirements.meta && data.requirements.meta.time;\n\n if (identities.length > 1) {\n data.requirements.alternatives = identities.splice(1);\n }\n\n // Store additional data (e.g. certs)\n data.lookup = {};\n\n // Store received certifications (can be usefull later)\n var certPubkeys = {};\n data.lookup.certifications = (res.results || []).reduce(function(certsMap, res) {\n return res.uids.reduce(function(certsMap, idty) {\n var idtyFullKey = idty.uid + '-' + (idty.meta ? idty.meta.timestamp : '');\n certsMap[idtyFullKey] = (idty.others||[]).reduce(function(certs, cert) {\n var certFullKey = idtyFullKey + '-' + cert.pubkey;\n var result = {\n pubkey: cert.pubkey,\n uid: cert.uids[0],\n cert_time: {\n block: (cert.meta && cert.meta.block_number) ? cert.meta.block_number : 0,\n block_hash: (cert.meta && cert.meta.block_hash) ? cert.meta.block_hash : null\n },\n isMember: cert.isMember,\n wasMember: cert.wasMember,\n };\n if (!certPubkeys[certFullKey]) {\n certPubkeys[certFullKey] = result;\n }\n else { // if duplicated cert: keep the most recent\n if (result.cert_time.block > certPubkeys[certFullKey].cert_time.block) {\n certPubkeys[certFullKey] = result;\n certs.splice(_.findIndex(certs, {pubkey: cert.pubkey}), 1, result);\n return certs;\n }\n else {\n return certs; // skip this cert\n }\n }\n return certs.concat(result);\n }, []);\n return certsMap;\n }, certsMap);\n }, {});\n\n // Store given certifications\n certPubkeys = {};\n data.lookup.givenCertifications = (res.results || []).reduce(function(certs, res) {\n return (res.signed || []).reduce(function(certs, cert) {\n var result = {\n pubkey: cert.pubkey,\n uid: cert.uid,\n cert_time: {\n block: (cert.cert_time && cert.cert_time.block) ? cert.cert_time.block : 0,\n block_hash: (cert.cert_time && cert.cert_time.block_hash) ? cert.cert_time.block_hash : null\n },\n sigDate: cert.meta ? cert.meta.timestamp : null,\n isMember: cert.isMember,\n wasMember: cert.wasMember\n };\n if (!certPubkeys[cert.pubkey]) {\n certPubkeys[cert.pubkey] = result;\n }\n else { // if duplicated cert: keep the most recent\n if (result.block > certPubkeys[cert.pubkey].block) {\n certPubkeys[cert.pubkey] = result;\n // TODO: Replace the existing one ? May be not, to be able to see renewal\n // (see issue #806)\n // If yes (need to replace), check this code works:\n //certs.splice(_.findIndex(certs, {pubkey: cert.pubkey}), 1, result);\n //return certs;\n }\n else {\n return certs; // skip this cert\n }\n }\n return certs.concat(result);\n }, certs);\n }, []);\n\n return data;\n })\n .catch(function(err) {\n if (!!err && err.ucode == BMA.errorCodes.NO_MATCHING_IDENTITY) { // Identity not found (if no self)\n _resetRequirements(data);\n return data;\n }\n else {\n throw err;\n }\n });\n },\n\n loadCertifications = function(getFunction, pubkey, lookupCertifications, parameters, medianTime, certifiersOf) {\n\n function _certId(pubkey, block) {\n return pubkey + '-' + block;\n }\n\n // TODO : remove this later (when all node will use duniter v0.50+)\n var lookupHasCertTime = true; // Will be set ti FALSE before Duniter v0.50\n var lookupCerticationsByCertId = lookupCertifications ? lookupCertifications.reduce(function(res, cert){\n var certId = _certId(cert.pubkey, cert.cert_time ? cert.cert_time.block : cert.sigDate);\n if (!cert.cert_time) lookupHasCertTime = false;\n res[certId] = cert;\n return res;\n }, {}) : {};\n\n var isMember = true;\n\n return getFunction({ pubkey: pubkey })\n .then(function(res) {\n return (res && res.certifications || []).reduce(function (res, cert) {\n // Rappel :\n // cert.sigDate = blockstamp de l'identité\n // cert.cert_time.block : block au moment de la certification\n // cert.written.number : block où la certification est écrite\n\n var pending = !cert.written;\n var certTime = cert.cert_time ? cert.cert_time.medianTime : null;\n var expiresIn = (!certTime) ? 0 : (pending ?\n (certTime + parameters.sigWindow - medianTime) :\n (certTime + parameters.sigValidity - medianTime));\n expiresIn = (expiresIn < 0) ? 0 : expiresIn;\n // Remove from lookup certs\n var certId = _certId(cert.pubkey, lookupHasCertTime && cert.cert_time ? cert.cert_time.block : cert.sigDate);\n delete lookupCerticationsByCertId[certId];\n\n // Add to result list\n return res.concat({\n pubkey: cert.pubkey,\n uid: cert.uid,\n time: certTime,\n isMember: cert.isMember,\n wasMember: cert.wasMember,\n expiresIn: expiresIn,\n willExpire: (expiresIn && expiresIn <= csSettings.data.timeWarningExpire),\n pending: pending,\n block: (cert.written !== null) ? cert.written.number :\n (cert.cert_time ? cert.cert_time.block : null),\n valid: (expiresIn > 0)\n });\n }, []);\n })\n .catch(function(err) {\n if (!!err && err.ucode == BMA.errorCodes.NO_MATCHING_MEMBER) { // member not found\n isMember = false;\n return []; // continue (append pendings cert if exists in lookup)\n }\n /*FIXME: workaround for Duniter issue #1309 */\n else if (!!err && err.ucode == 1002) {\n console.warn(\"[wallet-service] Detecting Duniter issue #1309 ! Applying workaround... \");\n isMember = false;\n return []; // not found\n }\n else {\n throw err;\n }\n })\n\n // Add pending certs (found in lookup - see loadIdentityByLookup())\n .then(function(certifications) {\n var pendingCertifications = _.values(lookupCerticationsByCertId);\n if (!pendingCertifications.length) return certifications; // No more pending continue\n\n // Special case for initPhase - issue #\n if (csCurrency.data.initPhase) {\n return pendingCertifications.reduce(function(res, cert) {\n return res.concat({\n pubkey: cert.pubkey,\n uid: cert.uid,\n isMember: cert.isMember,\n wasMember: cert.wasMember,\n time: null,\n expiresIn: parameters.sigWindow,\n willExpire: false,\n pending: true,\n block: 0,\n valid: true\n });\n }, certifications);\n }\n\n var pendingCertByBlocks = pendingCertifications.reduce(function(res, cert){\n var block = lookupHasCertTime && cert.cert_time ? cert.cert_time.block :\n (cert.sigDate ? cert.sigDate.split('-')[0] : null);\n if (angular.isDefined(block)) {\n if (!res[block]) {\n res[block] = [cert];\n }\n else {\n res[block].push(cert);\n }\n }\n return res;\n }, {});\n\n // Set time to pending cert, from blocks\n return BMA.blockchain.blocks(_.keys(pendingCertByBlocks)).then(function(blocks){\n certifications = blocks.reduce(function(res, block){\n return res.concat(pendingCertByBlocks[block.number].reduce(function(res, cert) {\n var certTime = block.medianTime;\n var expiresIn = Math.max(0, certTime + parameters.sigWindow - medianTime);\n var validBuid = (!cert.cert_time || !cert.cert_time.block_hash || cert.cert_time.block_hash == block.hash);\n if (!validBuid) {\n console.debug(\"[wot] Invalid cert {0}: block hash changed\".format(cert.pubkey.substring(0,8)));\n }\n var valid = (expiresIn > 0) && (!certifiersOf || cert.isMember) && validBuid;\n return res.concat({\n pubkey: cert.pubkey,\n uid: cert.uid,\n isMember: cert.isMember,\n wasMember: cert.wasMember,\n time: certTime,\n expiresIn: expiresIn,\n willExpire: (expiresIn && expiresIn <= csSettings.data.timeWarningExpire),\n pending: true,\n block: lookupHasCertTime && cert.cert_time ? cert.cert_time.block :\n (cert.sigDate ? cert.sigDate.split('-')[0] : null),\n valid: valid\n });\n }, []));\n }, certifications);\n return certifications;\n });\n })\n\n // Sort and return result\n .then(function(certifications) {\n\n // Remove pending cert duplicated with a written & valid cert\n var writtenCertByPubkey = certifications.reduce(function(res, cert) {\n if (!cert.pending && cert.valid && cert.expiresIn >= parameters.sigWindow) {\n res[cert.pubkey] = true;\n }\n return res;\n }, {});\n\n // Final sort\n certifications = _sortCertifications(certifications);\n\n // Split into valid/pending/error\n var pendingCertifications = [];\n var errorCertifications = [];\n var validCertifications = certifications.reduce(function(res, cert) {\n if (cert.pending) {\n if (cert.valid && !writtenCertByPubkey[cert.pubkey]) {\n pendingCertifications.push(cert);\n }\n else if (!cert.valid && !writtenCertByPubkey[cert.pubkey]){\n errorCertifications.push(cert);\n }\n return res;\n }\n return res.concat(cert);\n }, []);\n\n return {\n valid: validCertifications,\n pending: pendingCertifications,\n error: errorCertifications\n };\n })\n ;\n },\n\n // Add events on given account\n addEvents = function(data) {\n\n if (data.requirements.revoked) {\n delete data.requirements.meta.invalid;\n if (data.requirements.revoked_on) {\n addEvent(data, {type: 'error', message: 'ERROR.IDENTITY_REVOKED_WITH_TIME', messageParams: {revocationTime: data.requirements.revoked_on}});\n console.debug(\"[wot] Identity [{0}] has been revoked on {1}\".format(data.uid, data.requirements.revoked_on));\n }\n else {\n addEvent(data, {type: 'error', message: 'ERROR.IDENTITY_REVOKED'});\n console.debug(\"[wot] Identity [{0}] has been revoked\".format(data.uid));\n }\n }\n else if (data.requirements.pendingRevocation) {\n delete data.requirements.meta.invalid;\n addEvent(data, {type:'error', message: 'ERROR.IDENTITY_PENDING_REVOCATION'});\n console.debug(\"[wot] Identity [{0}] has pending revocation\".format(data.uid));\n }\n else if (data.requirements.meta && data.requirements.meta.invalid) {\n if (!data.isMember) {\n addEvent(data, {type: 'error', message: 'ERROR.IDENTITY_INVALID_BLOCK_HASH'});\n console.debug(\"[wot] Invalid membership for uid {0}: block hash changed\".format(data.uid));\n }\n }\n else if (data.requirements.expired) {\n addEvent(data, {type: 'error', message: 'ERROR.IDENTITY_EXPIRED'});\n console.debug(\"[wot] Identity {0} expired (in sandbox)\".format(data.uid));\n }\n else if (data.requirements.willNeedCertificationCount > 0) {\n addEvent(data, {type: 'error', message: 'INFO.IDENTITY_WILL_MISSING_CERTIFICATIONS', messageParams: data.requirements});\n console.debug(\"[wot] Identity {0} will need {1} certification(s)\".format(data.uid, data.requirements.willNeedCertificationCount));\n }\n else if (!data.requirements.needSelf && data.requirements.needMembership) {\n addEvent(data, {type: 'error', message: 'INFO.IDENTITY_NEED_MEMBERSHIP'});\n console.debug(\"[wot] Identity {0} has a self but no membership\".format(data.uid));\n }\n if (!data.isMember && data.requirements.alternatives) {\n addEvent(data, {type: 'info', message: 'INFO.HAS_ALTERNATIVE_IDENTITIES'});\n }\n },\n\n loadData = function(pubkey, uid, options) {\n\n options = options || {};\n var data;\n\n if (!pubkey && uid && !options.force) {\n return BMA.wot.member.getByUid(uid)\n .then(function(member) {\n if (member) return loadData(member.pubkey, member.uid, options); // recursive call, with a pubkey\n //throw {message: 'NOT_A_MEMBER'};\n var options = angular.copy(options || {});\n options.force = true;\n return loadData(pubkey, uid, options); // Loop with force=true\n });\n }\n\n // Check cached data\n if (pubkey) {\n data = (options.cache !== false) ? identityCache.get(pubkey) : null;\n if (data && (!uid || data.uid === uid) && (!options.blockUid || data.blockUid === options.blockUid)) {\n console.debug(\"[wot] Identity {{0}} found in cache\".format(pubkey.substring(0, 8)));\n return $q.when(data);\n }\n console.debug(\"[wot] Loading identity {{0}}...\".format(pubkey.substring(0, 8)));\n data = {\n pubkey: pubkey,\n uid: uid\n };\n }\n else {\n console.debug(\"[wot] Loading identity from uid {{0}}...\".format(uid));\n data = {\n uid: uid\n };\n }\n if (options.blockUid) {\n data.blockUid = options.blockUid;\n }\n\n var now = Date.now();\n var parameters;\n var medianTime;\n\n return $q.all([\n\n // Get parameters\n csCurrency.parameters()\n .then(function(res) {\n parameters = res;\n }),\n\n // Get current time\n csCurrency.blockchain.current(true)\n .then(function(current) {\n medianTime = current.medianTime;\n })\n .catch(function(err){\n // Special case for currency init (root block not exists): use now\n if (err && err.ucode == BMA.errorCodes.NO_CURRENT_BLOCK) {\n medianTime = moment.utc().unix();\n }\n else {\n throw err;\n }\n }),\n\n // Get requirements\n loadRequirements(data, options.cache !== false),\n\n // Get identity using lookup\n loadIdentityByLookup(pubkey, uid)\n\n ])\n .then(function(res) {\n var dataByLookup = res[3];\n\n // If no requirements found: copy from lookup data\n if (!data.requirements.uid) {\n console.debug(\"[wot] No requirements found: using data from lookup\");\n angular.merge(data, dataByLookup);\n delete data.lookup; // not need\n return;\n }\n\n var idtyFullKey = data.requirements.uid + '-' + data.requirements.meta.timestamp;\n\n return $q.all([\n // Get received certifications\n loadCertifications(BMA.wot.certifiersOf, data.pubkey, dataByLookup.lookup ? dataByLookup.lookup.certifications[idtyFullKey] : null, parameters, medianTime, true /*certifiersOf*/)\n .then(function (res) {\n data.received_cert = res.valid;\n data.received_cert_pending = res.pending;\n data.received_cert_error = res.error;\n }),\n\n // Get given certifications\n loadCertifications(BMA.wot.certifiedBy, data.pubkey, dataByLookup.lookup ? dataByLookup.lookup.givenCertifications : null, parameters, medianTime, false/*certifiersOf*/)\n .then(function (res) {\n data.given_cert = res.valid;\n data.given_cert_pending = res.pending;\n data.given_cert_error = res.error;\n })\n ]);\n })\n .then(function() {\n\n // Add compute some additional requirements (that required all data like certifications)\n data.requirements.pendingCertificationCount = data.received_cert_pending ? data.received_cert_pending.length : data.requirements.pendingCertificationCount;\n // Use /wot/lookup.revoked when requirements not filled\n data.requirements.revoked = angular.isDefined(data.requirements.revoked) ? data.requirements.revoked : data.revoked;\n\n // Add account events\n addEvents(data);\n\n // API extension\n return api.data.raisePromise.load(data)\n .catch(function(err) {\n console.debug('Error while loading identity data, on extension point.');\n console.error(err);\n });\n })\n .then(function() {\n if (!data.pubkey) return undefined; // not found\n identityCache.put(data.pubkey, data); // add to cache\n console.debug('[wot] Identity '+ data.pubkey.substring(0, 8) +' loaded in '+ (Date.now()-now) +'ms');\n return data;\n });\n },\n\n search = function(text, options) {\n if (!text || text.trim() !== text) {\n return $q.when(undefined);\n }\n\n // Remove first special characters (to avoid request error)\n var safeText = text.replace(/(^|\\s)#\\w+/g, ''); // remove tags\n safeText = safeText.replace(/[^a-zA-Z0-9_-\\s]+/g, '');\n safeText = safeText.replace(/\\s+/g, ' ').trim();\n\n options = options || {};\n options.addUniqueId = angular.isDefined(options.addUniqueId) ? options.addUniqueId : true;\n options.allowExtension = angular.isDefined(options.allowExtension) ? options.allowExtension : true;\n options.excludeRevoked = angular.isDefined(options.excludeRevoked) ? options.excludeRevoked : false;\n\n var promise;\n if (!safeText) {\n promise = $q.when([]);\n }\n else {\n promise = $q.all(\n safeText.split(' ').reduce(function(res, text) {\n console.debug('[wot] Will search on: \\'' + text + '\\'');\n return res.concat(BMA.wot.lookup({ search: text }));\n }, [])\n ).then(function(res){\n return res.reduce(function(idties, res) {\n return idties.concat(res.results.reduce(function(idties, res) {\n return idties.concat(res.uids.reduce(function(uids, idty) {\n var blocUid = idty.meta.timestamp.split('-', 2);\n var revoked = !idty.revoked && idty.revocation_sig;\n if (!options.excludeRevoked || !revoked) {\n return uids.concat({\n uid: idty.uid,\n pubkey: res.pubkey,\n number: blocUid[0],\n hash: blocUid[1],\n revoked: revoked\n });\n }\n return uids;\n }, []));\n }, []));\n }, []);\n })\n .catch(function(err) {\n if (err && err.ucode == BMA.errorCodes.NO_MATCHING_IDENTITY) {\n return [];\n }\n else {\n throw err;\n }\n });\n }\n\n return promise\n .then(function(idties) {\n if (!options.allowExtension) {\n // Add unique id (if enable)\n return options.addUniqueId ? _addUniqueIds(idties) : idties;\n }\n var lookupResultCount = idties.length;\n // call extension point\n return api.data.raisePromise.search(text, idties, 'pubkey')\n .then(function() {\n\n // Make sure to add uid to new results - fix #488\n if (idties.length > lookupResultCount) {\n var idtiesWithoutUid = _.filter(idties, function(idty) {\n return !idty.uid && idty.pubkey;\n });\n if (idtiesWithoutUid.length) {\n return BMA.wot.member.uids()\n .then(function(uids) {\n _.forEach(idties, function(idty) {\n if (!idty.uid && idty.pubkey) {\n idty.uid = uids[idty.pubkey];\n }\n });\n });\n }\n }\n })\n .then(function() {\n // Add unique id (if enable)\n return options.addUniqueId ? _addUniqueIds(idties) : idties;\n });\n });\n },\n\n getNewcomers = function(offset, size) {\n offset = offset || 0;\n size = size || 20;\n var total;\n return $q.all([\n csCurrency.blockchain.current(true)\n .then(function(block) {\n total = block.membersCount || 0;\n }),\n BMA.blockchain.stats.newcomers()\n ])\n .then(function(res) {\n res = res[1];\n if (!res || !res.result || !res.result.blocks || !res.result.blocks.length) return null; // no result\n var blocks = _.sortBy(res.result.blocks, function (n) {\n return -n;\n });\n return getNewcomersRecursive(blocks, 0, 5, offset+size);\n })\n .then(function(idties){\n if (!idties || !idties.length) {\n return null;\n }\n idties = _sortAndSliceIdentities(idties, offset, size);\n\n // Extension point\n return extendAll(idties, 'pubkey', true/*skipAddUid*/);\n })\n .then(function(idties) {\n return {\n hits: idties,\n total: total\n };\n });\n },\n\n\n getNewcomersRecursive = function(blocks, offset, size, maxResultSize) {\n return $q(function(resolve, reject) {\n var result = [];\n var jobs = [];\n _.each(blocks.slice(offset, offset+size), function(number) {\n jobs.push(\n BMA.blockchain.block({block: number})\n .then(function(block){\n if (!block || !block.joiners) return;\n _.each(block.joiners, function(joiner){\n var parts = joiner.split(':');\n var idtyKey = parts[parts.length-1]/*uid*/ + '-' + parts[0]/*pubkey*/;\n result.push({\n id: idtyKey,\n uid: parts[parts.length-1],\n pubkey:parts[0],\n memberDate: block.medianTime,\n block: block.number\n });\n });\n })\n );\n });\n\n $q.all(jobs)\n .then(function() {\n if (result.length < maxResultSize && offset < blocks.length - 1) {\n $timeout(function() {\n getNewcomersRecursive(blocks, offset+size, size, maxResultSize - result.length)\n .then(function(res) {\n resolve(result.concat(res));\n })\n .catch(function(err) {\n reject(err);\n });\n }, 1000);\n }\n else {\n resolve(result);\n }\n })\n .catch(function(err){\n if (err && err.ucode === BMA.errorCodes.HTTP_LIMITATION) {\n resolve(result);\n }\n else {\n reject(err);\n }\n });\n });\n },\n\n getPending = function(offset, size) {\n offset = offset || 0;\n size = size || 20;\n var now = Date.now();\n return $q.all([\n BMA.wot.member.uids(),\n BMA.wot.member.pending()\n .then(function(res) {\n return (res.memberships && res.memberships.length) ? res.memberships : undefined;\n })\n ])\n .then(function(res) {\n var uids = res[0];\n var memberships = res[1];\n if (!memberships) return;\n\n var idtiesByBlock = {};\n var idtiesByPubkey = {};\n _.forEach(memberships, function(ms){\n if (ms.membership == 'IN' && !uids[ms.pubkey]) {\n var idty = {\n uid: ms.uid,\n pubkey: ms.pubkey,\n block: ms.blockNumber,\n blockHash: ms.blockHash\n };\n var otherIdtySamePubkey = idtiesByPubkey[ms.pubkey];\n if (otherIdtySamePubkey && idty.block > otherIdtySamePubkey.block) {\n return; // skip\n }\n idtiesByPubkey[idty.pubkey] = idty;\n if (!idtiesByBlock[idty.block]) {\n idtiesByBlock[idty.block] = [idty];\n }\n else {\n idtiesByBlock[idty.block].push(idty);\n }\n\n // Remove previous idty from map\n if (otherIdtySamePubkey) {\n idtiesByBlock[otherIdtySamePubkey.block] = idtiesByBlock[otherIdtySamePubkey.block].reduce(function(res, aidty){\n if (aidty.pubkey == otherIdtySamePubkey.pubkey) return res; // if match idty to remove, to NOT add\n return (res||[]).concat(aidty);\n }, null);\n if (idtiesByBlock[otherIdtySamePubkey.block] === null) {\n delete idtiesByBlock[otherIdtySamePubkey.block];\n }\n }\n }\n });\n\n var idties = _.values(idtiesByPubkey);\n var total = idties.length; // get total BEFORE slice\n\n idties = _sortAndSliceIdentities(idties, offset, size);\n var blocks = idties.reduce(function(res, aidty) {\n return res.concat(aidty.block);\n }, []);\n\n return $q.all([\n // Get time from blocks\n BMA.blockchain.blocks(_.uniq(blocks))\n .then(function(blocks) {\n\n _.forEach(blocks, function(block){\n _.forEach(idtiesByBlock[block.number], function(idty) {\n idty.sigDate = block.medianTime;\n if (block.number !== 0 && idty.blockHash !== block.hash) {\n addEvent(idty, {type:'error', message: 'ERROR.WOT_PENDING_INVALID_BLOCK_HASH'});\n console.debug(\"Invalid membership for uid={0}: block hash changed\".format(idty.uid));\n }\n });\n });\n }),\n\n // Extension point\n extendAll(idties, 'pubkey', true/*skipAddUid*/)\n ])\n .then(function() {\n console.debug(\"[ES] [wot] Loaded {0}/{1} pending identities in {2} ms\".format(idties && idties.length || 0, total, Date.now() - now));\n return {\n hits: idties,\n total: total\n };\n });\n });\n },\n\n getAll = function() {\n var letters = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','u','v','w','x','y','z'];\n return getAllRecursive(letters, 0, BMA.constants.LIMIT_REQUEST_COUNT)\n .then(function(idties) {\n return extendAll(idties, 'pubkey', true/*skipAddUid*/);\n })\n .then(_addUniqueIds)\n .then(function() {\n return {\n hits: idties,\n total: idties.length\n };\n });\n },\n\n getAllRecursive = function(letters, offset, size) {\n return $q(function(resolve, reject) {\n var result = [];\n var pubkeys = {};\n var jobs = [];\n _.each(letters.slice(offset, offset+size), function(letter) {\n jobs.push(\n search(letter, {\n addUniqueId: false, // will be done in parent method\n allowExtension: false // extension point will be called in parent method\n })\n .then(function(idties){\n if (!idties || !idties.length) return;\n result = idties.reduce(function(res, idty) {\n if (!pubkeys[idty.pubkey]) {\n pubkeys[idty.pubkey] = true;\n return res.concat(idty);\n }\n return res;\n }, result);\n })\n );\n });\n\n $q.all(jobs)\n .then(function() {\n if (offset < letters.length - 1) {\n $timeout(function() {\n getAllRecursive(letters, offset+size, size)\n .then(function(idties) {\n if (!idties || !idties.length) {\n resolve(result);\n return;\n }\n resolve(idties.reduce(function(res, idty) {\n if (!pubkeys[idty.pubkey]) {\n pubkeys[idty.pubkey] = true;\n return res.concat(idty);\n }\n return res;\n }, result));\n })\n .catch(function(err) {\n reject(err);\n });\n }, BMA.constants.LIMIT_REQUEST_DELAY);\n }\n else {\n resolve(result);\n }\n })\n .catch(function(err){\n if (err && err.ucode === BMA.errorCodes.HTTP_LIMITATION) {\n resolve(result);\n }\n else {\n reject(err);\n }\n });\n });\n },\n\n extend = function(idty, pubkeyAttributeName, skipAddUid) {\n return extendAll([idty], pubkeyAttributeName, skipAddUid)\n .then(function(res) {\n return res[0];\n });\n },\n\n extendAll = function(idties, pubkeyAttributeName, skipAddUid) {\n\n pubkeyAttributeName = pubkeyAttributeName || 'pubkey';\n\n var jobs = [];\n if (!skipAddUid) jobs.push(BMA.wot.member.uids());\n\n jobs.push(api.data.raisePromise.search(null, idties, pubkeyAttributeName)\n .catch(function(err) {\n console.debug('Error while search identities, on extension point.');\n console.error(err);\n }));\n\n return $q.all(jobs)\n .then(function(res) {\n if (!skipAddUid) {\n var uidsByPubkey = res[0];\n // Set uid (on every data)\n _.forEach(idties, function(data) {\n if (!data.uid && data[pubkeyAttributeName]) {\n data.uid = uidsByPubkey[data[pubkeyAttributeName]];\n // Remove name if redundant with uid\n if (data.uid && data.uid == data.name) {\n delete data.name;\n }\n }\n });\n }\n\n return idties;\n });\n },\n\n addEvent = function(data, event) {\n event = event || {};\n event.type = event.type || 'info';\n event.message = event.message || '';\n event.messageParams = event.messageParams || {};\n data.events = data.events || [];\n data.events.push(event);\n },\n\n cleanCache = function() {\n console.debug(\"[wot] Cleaning cache...\");\n csCache.clear(cachePrefix);\n }\n ;\n\n // Register extension points\n api.registerEvent('data', 'load');\n api.registerEvent('data', 'search');\n\n // Listen if node changed\n BMA.api.node.on.stop($rootScope, cleanCache, this);\n\n return {\n load: loadData,\n loadRequirements: loadRequirements,\n search: search,\n newcomers: getNewcomers,\n pending: getPending,\n all: getAll,\n extend: extend,\n extendAll: extendAll,\n // api extension\n api: api\n };\n}]);\n","\nangular.module('cesium.tx.services', ['ngApi', 'cesium.bma.services',\n 'cesium.settings.services', 'cesium.wot.services' ])\n\n.factory('csTx', ['$q', '$timeout', '$filter', '$translate', 'FileSaver', 'UIUtils', 'BMA', 'Api', 'csConfig', 'csSettings', 'csWot', 'csCurrency', function($q, $timeout, $filter, $translate, FileSaver, UIUtils, BMA, Api,\n csConfig, csSettings, csWot, csCurrency) {\n 'ngInject';\n\n var\n api = new Api(this, \"csTx\");\n\n function reduceTxAndPush(pubkey, txArray, result, processedTxMap, allowPendings) {\n if (!txArray || !txArray.length) return; // Skip if empty\n\n _.forEach(txArray, function(tx) {\n if (tx.block_number !== null || allowPendings) {\n var walletIsIssuer = false;\n var otherIssuers = tx.issuers.reduce(function(res, issuer) {\n walletIsIssuer = walletIsIssuer || (issuer === pubkey);\n return (issuer !== pubkey) ? res.concat(issuer) : res;\n }, []);\n var otherRecipients = [],\n outputBase,\n sources = [],\n lockedOutputs;\n\n var amount = tx.outputs.reduce(function(sum, output, noffset) {\n // FIXME duniter v1.4.13\n var outputArray = (typeof output === 'string') ? output.split(':',3) : [output.amount,output.base,output.conditions];\n outputBase = parseInt(outputArray[1]);\n var outputAmount = powBase(parseInt(outputArray[0]), outputBase);\n var outputCondition = outputArray[2];\n var sigMatches = BMA.regexp.TX_OUTPUT_SIG.exec(outputCondition);\n\n // Simple unlock condition\n if (sigMatches) {\n var outputPubkey = sigMatches[1];\n if (outputPubkey === pubkey) { // output is for the wallet\n if (!walletIsIssuer) {\n return sum + outputAmount;\n }\n // If pending: use output as new sources\n else if (tx.block_number === null) {\n sources.push({\n amount: parseInt(outputArray[0]),\n base: outputBase,\n type: 'T',\n identifier: tx.hash,\n noffset: noffset,\n consumed: false,\n conditions: outputCondition\n });\n }\n }\n\n // The output is for someone else\n else {\n // Add into recipients list(if not a issuer)\n if (outputPubkey !== '' && !_.contains(otherIssuers, outputPubkey)) {\n otherRecipients.push(outputPubkey);\n }\n if (walletIsIssuer) {\n // TODO: should be fix, when TX has multiple issuers (need a repartition)\n return sum - outputAmount;\n }\n }\n\n }\n\n // Complex unlock condition, on the issuer pubkey\n else if (outputCondition.indexOf('SIG('+pubkey+')') !== -1) {\n var lockedOutput = BMA.tx.parseUnlockCondition(outputCondition);\n if (lockedOutput) {\n // Add a source\n sources.push(angular.merge({\n amount: parseInt(outputArray[0]),\n base: outputBase,\n type: 'T',\n identifier: tx.hash,\n noffset: noffset,\n conditions: outputCondition,\n consumed: false\n }, lockedOutput));\n lockedOutput.amount = outputAmount;\n lockedOutputs = lockedOutputs || [];\n lockedOutputs.push(lockedOutput);\n console.debug('[tx] has locked output:', lockedOutput);\n\n return sum + outputAmount;\n }\n }\n return sum;\n }, 0);\n\n var txPubkeys = amount > 0 ? otherIssuers : otherRecipients;\n var time = tx.time || tx.blockstampTime;\n\n // Avoid duplicated tx, or tx to him self\n var txKey = (amount !== 0) && amount + ':' + tx.hash + ':' + time;\n if (txKey && !processedTxMap[txKey]) {\n processedTxMap[txKey] = true; // Mark as processed\n var newTx = {\n time: time,\n amount: amount,\n pubkey: txPubkeys.length === 1 ? txPubkeys[0] : undefined,\n pubkeys: txPubkeys.length > 1 ? txPubkeys : undefined,\n comment: tx.comment,\n isUD: false,\n hash: tx.hash,\n locktime: tx.locktime,\n block_number: tx.block_number\n };\n\n // If pending: store sources and inputs for a later use - see method processTransactionsAndSources()\n if (walletIsIssuer && tx.block_number === null) {\n newTx.inputs = tx.inputs;\n newTx.sources = sources;\n }\n if (lockedOutputs) {\n newTx.lockedOutputs = lockedOutputs;\n }\n result.push(newTx);\n }\n }\n });\n }\n\n\n function loadTx(pubkey, fromTime) {\n return $q(function(resolve, reject) {\n\n var nowInSec = moment().utc().unix();\n fromTime = fromTime || (nowInSec - csSettings.data.walletHistoryTimeSecond);\n var tx = {\n pendings: [],\n validating: [],\n history: [],\n errors: []\n };\n\n var processedTxMap = {};\n\n var jobs = [\n // get current block\n csCurrency.blockchain.current(true),\n\n // get pending tx\n BMA.tx.history.pending({pubkey: pubkey})\n .then(function (res) {\n reduceTxAndPush(pubkey, res.history.sending, tx.pendings, processedTxMap, true /*allow pendings*/);\n reduceTxAndPush(pubkey, res.history.pending, tx.pendings, processedTxMap, true /*allow pendings*/);\n })\n ];\n\n // get TX history since\n if (fromTime !== 'pending') {\n var reduceTxFn = function (res) {\n reduceTxAndPush(pubkey, res.history.sent, tx.history, processedTxMap, false);\n reduceTxAndPush(pubkey, res.history.received, tx.history, processedTxMap, false);\n };\n\n // get TX from a given time\n if (fromTime > 0) {\n // Use slice, to be able to cache requests result\n var sliceTime = csSettings.data.walletHistorySliceSecond;\n fromTime = fromTime - (fromTime % sliceTime);\n for(var i = fromTime; i - sliceTime < nowInSec; i += sliceTime) {\n jobs.push(BMA.tx.history.times({pubkey: pubkey, from: i, to: i+sliceTime-1}, true /*with cache*/)\n .then(reduceTxFn)\n );\n }\n\n // Last slide: no cache\n jobs.push(BMA.tx.history.times({pubkey: pubkey, from: nowInSec - (nowInSec % sliceTime), to: nowInSec+999999999}, false/*no cache*/)\n .then(reduceTxFn));\n }\n\n // get all TX\n else {\n jobs.push(BMA.tx.history.all({pubkey: pubkey})\n .then(reduceTxFn)\n );\n }\n\n // get UD history\n if (csSettings.data.showUDHistory && fromTime > 0) {\n /*jobs.push(\n BMA.ud.history({pubkey: pubkey})\n .then(function(res){\n udHistory = !res.history || !res.history.history ? [] :\n _.forEach(res.history.history, function(ud){\n if (ud.time < fromTime) return res; // skip to old UD\n var amount = powBase(ud.amount, ud.base);\n udHistory.push({\n time: ud.time,\n amount: amount,\n isUD: true,\n block_number: ud.block_number\n });\n });\n }));*/\n // API extension\n jobs.push(\n api.data.raisePromise.loadUDs({\n pubkey: pubkey,\n fromTime: fromTime\n })\n .then(function(res) {\n if (!res || !res.length) return;\n _.forEach(res, function(hits) {\n tx.history.push(hits);\n });\n })\n\n .catch(function(err) {\n console.debug('Error while loading UDs history, on extension point.');\n console.error(err);\n })\n );\n }\n }\n\n // Execute jobs\n $q.all(jobs)\n .then(function(res){\n var current = res[0];\n\n // sort by time desc\n tx.history.sort(function(tx1, tx2) {\n return (tx2.time - tx1.time);\n });\n var firstValidatedTxIndex = _.findIndex(tx.history, function(tx){\n return (tx.block_number <= current.number - csSettings.data.blockValidityWindow);\n });\n // remove validating from history\n tx.validating = firstValidatedTxIndex > 0 ? tx.history.splice(0, firstValidatedTxIndex) : [];\n\n tx.fromTime = fromTime !== 'pending' && fromTime || undefined;\n tx.toTime = tx.history.length ? tx.history[0].time /*=max(tx.time)*/: tx.fromTime;\n\n resolve(tx);\n })\n .catch(reject);\n });\n }\n\n function powBase(amount, base) {\n return base <= 0 ? amount : amount * Math.pow(10, base);\n }\n\n function addSource(src, sources, sourcesIndexByKey) {\n var srcKey = src.type+':'+src.identifier+':'+src.noffset;\n if (angular.isUndefined(sourcesIndexByKey[srcKey])) {\n sources.push(src);\n sourcesIndexByKey[srcKey] = sources.length - 1;\n }\n }\n\n function addSources(result, sources) {\n _(sources).forEach(function(src) {\n addSource(src, result.sources, result.sourcesIndexByKey);\n });\n }\n\n function loadSourcesAndBalance(pubkey) {\n return BMA.tx.sources({pubkey: pubkey})\n .then(function(res){\n var data = {\n sources: [],\n sourcesIndexByKey: [],\n balance: 0\n };\n if (res.sources && res.sources.length) {\n _.forEach(res.sources, function(src) {\n src.consumed = false;\n data.balance += powBase(src.amount, src.base);\n });\n addSources(data, res.sources);\n }\n return data;\n })\n .catch(function(err) {\n console.warn(\"[tx] Error while getting sources...\", err);\n throw err;\n });\n }\n\n function loadData(pubkey, fromTime) {\n var now = Date.now();\n\n var data;\n\n // Alert user, when request is too long (> 2s)\n $timeout(function() {\n if (!data) UIUtils.loading.update({template: \"COMMON.LOADING_WAIT\"});\n }, 2000);\n\n return $q.all([\n\n // Load Sources\n loadSourcesAndBalance(pubkey),\n\n // Load Tx\n loadTx(pubkey, fromTime)\n ])\n\n .then(function(res) {\n // Copy sources and balance\n data = res[0];\n data.tx = res[1];\n\n var txPendings = [];\n var txErrors = [];\n var balanceFromSource = data.balance;\n var balanceWithPending = data.balance;\n\n function _processPendingTx(tx) {\n var consumedSources = [];\n var valid = true;\n if (tx.amount > 0) { // do not check sources from received TX\n valid = false;\n // TODO get sources from the issuer ?\n }\n else {\n _.find(tx.inputs, function(input) {\n var inputKey = input.split(':').slice(2).join(':');\n var srcIndex = data.sourcesIndexByKey[inputKey];\n if (angular.isDefined(srcIndex)) {\n consumedSources.push(data.sources[srcIndex]);\n }\n else {\n valid = false;\n return true; // break\n }\n });\n if (tx.sources) { // add source output\n addSources(data, tx.sources);\n }\n delete tx.sources;\n delete tx.inputs;\n }\n if (valid) {\n balanceWithPending += tx.amount; // update balance\n txPendings.push(tx);\n _.forEach(consumedSources, function(src) {\n src.consumed=true;\n });\n }\n else {\n txErrors.push(tx);\n }\n }\n\n var txs = data.tx.pendings;\n var retry = true;\n while(txs && txs.length) {\n // process TX pendings\n _.forEach(txs, _processPendingTx);\n\n // Retry once (TX could be chained and processed in a wrong order)\n if (txErrors.length > 0 && txPendings.length > 0 && retry) {\n txs = txErrors;\n txErrors = [];\n retry = false;\n }\n else {\n txs = null;\n }\n }\n\n data.tx = data.tx || {};\n data.tx.pendings = txPendings.sort(function(tx1, tx2) {\n return (tx2.time - tx1.time);\n });\n data.tx.errors = txErrors.sort(function(tx1, tx2) {\n return (tx2.time - tx1.time);\n });\n // Negative balance not allow (use only source's balance) - fix #769\n data.balance = (balanceWithPending < 0) ? balanceFromSource : balanceWithPending;\n\n // Will add uid (+ plugin will add name, avatar, etc. if enable)\n var allTx = (data.tx.history || []).concat(data.tx.validating||[], data.tx.pendings||[], data.tx.errors||[]);\n return csWot.extendAll(allTx, 'pubkey')\n .then(function() {\n console.debug('[tx] TX and sources loaded in '+ (Date.now()-now) +'ms');\n return data;\n });\n })\n .catch(function(err) {\n console.warn(\"[tx] Error while getting sources and tx...\", err);\n throw err;\n });\n }\n\n function loadSources(pubkey) {\n console.debug(\"[tx] Loading sources for \" + pubkey.substring(0,8));\n return loadData(pubkey, 'pending');\n }\n\n // Download TX history file\n function downloadHistoryFile(pubkey, options) {\n\n options = options || {};\n options.fromTime = options.fromTime || -1;\n\n console.debug(\"[tx] Exporting TX history for pubkey [{0}]\".format(pubkey.substr(0,8)));\n\n return $q.all([\n $translate(['ACCOUNT.HEADERS.TIME',\n 'COMMON.UID',\n 'COMMON.PUBKEY',\n 'COMMON.UNIVERSAL_DIVIDEND',\n 'ACCOUNT.HEADERS.AMOUNT',\n 'ACCOUNT.HEADERS.COMMENT']),\n csCurrency.blockchain.current(true/*withCache*/),\n loadData(pubkey, options.fromTime)\n ])\n .then(function(result){\n var translations = result[0];\n var currentBlock = result[1];\n var currentTime = (currentBlock && currentBlock.medianTime) || moment().utc().unix();\n var currency = currentBlock && currentBlock.currency;\n\n var data = result[2];\n\n // no TX\n if (!data || !data.tx || !data.tx.history) {\n return UIUtils.toast.show('INFO.EMPTY_TX_HISTORY');\n }\n\n return $translate('ACCOUNT.FILE_NAME', {currency: currency, pubkey: pubkey, currentTime : currentTime})\n .then(function(filename){\n\n var formatDecimal = $filter('formatDecimal');\n var medianDate = $filter('medianDate');\n var formatSymbol = $filter('currencySymbolNoHtml');\n\n var headers = [\n translations['ACCOUNT.HEADERS.TIME'],\n translations['COMMON.UID'],\n translations['COMMON.PUBKEY'],\n translations['ACCOUNT.HEADERS.AMOUNT'] + ' (' + formatSymbol(currency) + ')',\n translations['ACCOUNT.HEADERS.COMMENT']\n ];\n var content = data.tx.history.concat(data.tx.validating).reduce(function(res, tx){\n return res.concat([\n medianDate(tx.time),\n tx.uid,\n tx.pubkey,\n formatDecimal(tx.amount/100),\n '\"' + (tx.isUD ? translations['COMMON.UNIVERSAL_DIVIDEND'] : tx.comment) + '\"'\n ].join(';') + '\\n');\n }, [headers.join(';') + '\\n']);\n\n var file = new Blob(content, {type: 'text/plain; charset=utf-8'});\n FileSaver.saveAs(file, filename);\n });\n });\n }\n\n // Register extension points\n api.registerEvent('data', 'loadUDs');\n\n return {\n load: loadData,\n loadSources: loadSources,\n downloadHistoryFile: downloadHistoryFile,\n // api extension\n api: api\n };\n}]);\n","\nangular.module('cesium.wallet.services', ['ngApi', 'ngFileSaver', 'cesium.bma.services', 'cesium.crypto.services', 'cesium.utils.services',\n 'cesium.settings.services'])\n\n\n.factory('csWallet', ['$q', '$rootScope', '$timeout', '$translate', '$filter', '$ionicHistory', 'UIUtils', 'Api', 'Idle', 'localStorage', 'sessionStorage', 'Modals', 'CryptoUtils', 'csCrypto', 'BMA', 'csConfig', 'csSettings', 'FileSaver', 'Blob', 'csWot', 'csTx', 'csCurrency', function($q, $rootScope, $timeout, $translate, $filter, $ionicHistory, UIUtils,\n Api, Idle, localStorage, sessionStorage, Modals,\n CryptoUtils, csCrypto, BMA, csConfig, csSettings, FileSaver, Blob, csWot, csTx, csCurrency) {\n 'ngInject';\n\n var defaultBMA = BMA;\n var service;\n\n function CsWallet(id, BMA) {\n\n BMA = BMA || defaultBMA;\n var\n exports,\n constants = {\n STORAGE_PUBKEY: 'pubkey',\n STORAGE_UID: 'uid',\n STORAGE_DATA_PREFIX: 'data-',\n STORAGE_SECKEY: 'seckey',\n /* Need for compat with old currencies (test_net and sou) */\n TX_VERSION: BMA.constants.PROTOCOL_VERSION,\n IDTY_VERSION: BMA.constants.PROTOCOL_VERSION,\n MS_VERSION: BMA.constants.PROTOCOL_VERSION,\n CERT_VERSION: BMA.constants.PROTOCOL_VERSION,\n REVOKE_VERSION: BMA.constants.PROTOCOL_VERSION,\n TX_MAX_INPUTS_COUNT: 40 // Allow to get a TX with less than 100 rows (=max row count in Duniter protocol)\n },\n data = {},\n settings,\n listeners,\n started,\n startPromise,\n loadPromise,\n enableAuthIdle = false,\n api = new Api(this, 'csWallet-' + id),\n\n resetData = function(init) {\n data.loaded = false;\n data.pubkey= null;\n data.qrcode=null;\n\n data.uid = null;\n data.localName = null;\n data.isNew = null;\n data.sourcesIndexByKey = null;\n data.medianTime = null;\n data.requirements = {};\n data.blockUid = null;\n data.sigDate = null;\n data.sigStock = null;\n data.isMember = false;\n data.events = [];\n\n // children's wallets\n data.children = [];\n\n // Encrypted (need auth() to be encrypted)\n data.encryptedData = null;\n\n resetKeypair();\n resetTxAndSources();\n\n started = false;\n startPromise = undefined;\n\n if (init) {\n api.data.raise.init(data);\n }\n else {\n if (isDefault() && settings && !settings.useLocalStorage) {\n csSettings.reset();\n }\n api.data.raise.reset(data);\n }\n },\n\n resetKeypair = function(){\n data.keypair = {\n signSk: null,\n signPk: null\n };\n },\n\n resetSources = function(){\n // reset sources data\n data.sources = undefined;\n data.sourcesIndexByKey = undefined;\n data.balance = 0;\n },\n\n resetTx = function(){\n // reset TX data\n data.tx = data.tx || {};\n data.tx.history = [];\n data.tx.pendings = [];\n data.tx.validating = [];\n data.tx.errors = [];\n delete data.tx.fromTime;\n delete data.tx.toTime;\n },\n\n resetTxAndSources = function(){\n // reset sources data\n resetSources();\n // reset TX data\n resetTx();\n },\n\n isDefault = function(){\n return id === 'default';\n },\n\n hasEncryptedData = function(){\n return data.encryptedData && data.encryptedData.nonce && data.encryptedData.content;\n },\n\n addSource = function(src, sources, sourcesIndexByKey) {\n var srcKey = src.type+':'+src.identifier+':'+src.noffset;\n if (angular.isUndefined(sourcesIndexByKey[srcKey])) {\n if (!src.conditions) {\n console.warn(\"Trying to add a source without output condition !\", src);\n }\n sources.push(src);\n sourcesIndexByKey[srcKey] = sources.length - 1;\n }\n },\n\n addSources = function(sources) {\n data.sources = data.sources || [];\n data.sourcesIndexByKey = data.sourcesIndexByKey || {};\n _(sources).forEach(function(src) {\n addSource(src, data.sources, data.sourcesIndexByKey);\n });\n },\n\n // Show login modal\n login = function(options) {\n if (!started) {\n return (startPromise || start())\n .then(function () {\n return login(options); // loop\n });\n }\n\n var needLogin = !isLogin();\n var needAuth = options && ((options.auth && !isAuth()) || options.forceAuth);\n\n // user already login\n if (!needLogin && !needAuth) {\n if (!isDataLoaded(options)) {\n return loadData(options);\n }\n return $q.when(data);\n }\n var keepAuth = csSettings.data.keepAuthIdle > 0;\n\n var authData;\n return (options && options.authData ? $q.when(options.authData) : Modals.showLogin(options))\n .then(function(res){\n if (!res || !res.pubkey ||\n (!needLogin && res.pubkey !== data.pubkey) ||\n (needAuth && (!res.keypair || !res.keypair.signPk || !res.keypair.signSk))) {\n throw 'CANCELLED';\n } // invalid data\n\n authData = res;\n data.pubkey = authData.pubkey;\n data.uid = authData.uid || data.uid;\n data.isNew = options && angular.isDefined(options.isNew) ? options.isNew : data.isNew;\n if (keepAuth) {\n data.keypair = authData.keypair || {\n signSk: null,\n signPk: null\n };\n }\n\n if (needLogin) {\n // extend API to check login validity\n return api.data.raisePromise.loginCheck(data)\n .catch(function (err) {\n resetData(); // Reset data if not valid, then exit process\n throw err;\n })\n // Call extend api\n .then(function() {\n if (needLogin) {\n return api.data.raisePromise.login(data)\n .catch(function(err) {\n console.warn('Error during extension call [wallet.api.data.on.login]', err);\n // continue\n });\n }\n });\n }\n })\n\n .then(function() {\n // Read data from pubkey (when first login)\n if (needLogin) {\n return restoreData();\n }\n // Or the was login but now auth: just try to decrypt data\n else if (needAuth) {\n return openEncryptedData();\n }\n })\n\n .then(function() {\n if (needLogin) {\n\n // store wallet\n store();\n }\n\n // Send auth event (if need)\n if (needAuth || isAuth()) {\n // Check if need to start/stop auth idle\n checkAuthIdle(true);\n\n return api.data.raisePromise.auth(keepAuth ? data : authData);\n }\n })\n .then(function() {\n // Load data if need\n // If user just login, force data full load (even if min data asked)\n // because the user can wait (after the login modal)\n var loadOptions = !needLogin && options && options.minData ? {minData: true} : undefined/*=load all*/;\n if (!isDataLoaded(loadOptions)) {\n return loadData(loadOptions);\n }\n })\n .then(function() {\n if (options && options.silent) {\n UIUtils.loading.hide(10);\n }\n else {\n UIUtils.loading.hide(1000);\n }\n\n return keepAuth ? data : angular.merge({}, data, authData);\n })\n .catch(function(err) {\n if (err === 'RETRY' && (!options || !options.authData)) {\n return $timeout(function(){\n return login(options);\n }, 300);\n }\n throw err;\n });\n },\n\n logout = function() {\n var wasAuth = isAuth();\n\n return $q(function(resolve, reject) {\n\n var pubkey = data.pubkey;\n resetData(); // will reset keypair\n resetStore(pubkey); // reset store\n\n // Send logout event\n api.data.raise.logout();\n\n if (wasAuth) {\n api.data.raise.unauth();\n }\n\n checkAuthIdle(false);\n\n $ionicHistory.clearCache();\n\n resolve();\n });\n },\n\n isLogin = function() {\n return !!data.pubkey;\n },\n\n auth = function(options) {\n if (!started) {\n return (startPromise || start())\n .then(function () {\n return auth(options); // loop\n });\n }\n\n // Disable auth, if readonly or demo\n if (csConfig.readonly || csConfig.demo) {\n return UIUtils.alert.demo()\n .then(function() {\n throw 'CANCELLED';\n });\n }\n\n if (isAuth() && (!options || !options.forceAuth)) {\n return $q.when(data);\n }\n\n options = options || {};\n options.expectedPubkey = isLogin() && data.pubkey;\n options.auth = true;\n return login(options);\n },\n\n unauth = function() {\n return $q(function(resolve, reject) {\n\n resetKeypair();\n store();\n\n // Send unauth event\n api.data.raise.unauth();\n\n checkAuthIdle(false);\n\n $ionicHistory.clearCache();\n\n resolve();\n });\n },\n\n isAuth = function() {\n return data.pubkey && data.keypair && data.keypair.signSk && true;\n },\n\n getKeypair = function(options) {\n if (!started) {\n return (startPromise || start())\n .then(function () {\n return getKeypair(options); // loop\n });\n }\n\n if (isAuth()) {\n return $q.when(data.keypair);\n }\n options = options || {};\n options.silent = angular.isDefined(options.silent) ? options.silent : true;\n return auth(options)\n .then(function() {\n return data.keypair;\n });\n },\n\n hasSelf = function() {\n return !!data.pubkey && !data.requirements.needSelf;\n },\n\n isDataLoaded = function(options) {\n if (options) {\n if (options.minData && !options.sources) return data.loaded && true;\n if (options.requirements && !data.requirements.loaded) return false;\n if (options.tx && options.tx.enable && (!data.tx.fromTime || data.tx.fromTime === 'pending')) return false;\n if (options.sigStock && !data.sigStock) return false;\n }\n return data.loaded && data.sources && true;\n },\n\n isNeverUsed = function() {\n if (!data.loaded) return undefined; // undefined if not full loaded\n return !data.pubkey || !(\n // Check registration\n data.isMember ||\n data.requirements.pendingMembership ||\n data.requirements.revoked ||\n !data.requirements.needSelf ||\n data.requirements.wasMember ||\n\n // Check sources\n (data.sources && data.sources.length > 0) ||\n\n // Check TX history\n data.tx.history.length > 0 ||\n data.tx.validating.length > 0 ||\n data.tx.pendings.length > 0 ||\n\n // Check extended data (name+avatar)\n !!data.localName ||\n !!data.name ||\n !!data.avatar\n );\n },\n\n isNew = function() {return !!data.isNew;},\n\n // If connected and same pubkey\n isUserPubkey = function(pubkey) {\n return isLogin() && data.pubkey === pubkey;\n },\n\n // store pubkey and uid\n store = function(pubkey) {\n pubkey = pubkey && typeof pubkey == 'string' ? pubkey : data.pubkey;\n if (settings && settings.useLocalStorage) {\n\n if (isLogin() && settings.rememberMe) {\n\n var now = Date.now();\n console.debug(\"[wallet] Storing...\");\n\n var jobs = [];\n\n // Use session storage for secret key - fix #372\n if (settings.keepAuthIdle == csSettings.constants.KEEP_AUTH_IDLE_SESSION && isAuth()) {\n jobs.push(sessionStorage.put(constants.STORAGE_SECKEY, CryptoUtils.util.encode_base58(data.keypair.signSk)));\n }\n else {\n jobs.push(sessionStorage.put(constants.STORAGE_SECKEY, null));\n }\n\n // Use local storage for pubkey\n jobs.push(localStorage.put(constants.STORAGE_PUBKEY, data.pubkey));\n\n // Use local storage for uid - fix #625\n if (data.uid) {\n jobs.push(localStorage.put(constants.STORAGE_UID, data.uid));\n }\n else {\n jobs.push(localStorage.put(constants.STORAGE_UID, null));\n }\n\n return $q.all(jobs)\n .then(function() {\n console.debug(\"[wallet] Stored in \"+ (Date.now() - now) +\"ms\");\n });\n }\n else {\n // Resetting local storage\n return $q.all([\n sessionStorage.put(constants.STORAGE_SECKEY, null),\n localStorage.put(constants.STORAGE_PUBKEY, null),\n localStorage.put(constants.STORAGE_UID, null),\n // Clean data (only in the session storage - keep local)\n pubkey ? sessionStorage.put(constants.STORAGE_DATA_PREFIX + pubkey, null) : $q.when()\n ]);\n }\n }\n else {\n return $q.all([\n sessionStorage.put(constants.STORAGE_SECKEY, null),\n localStorage.put(constants.STORAGE_PUBKEY, null),\n localStorage.put(constants.STORAGE_UID, null),\n // Clean data\n pubkey ? sessionStorage.put(constants.STORAGE_DATA_PREFIX + pubkey, null) : $q.when(),\n pubkey ? localStorage.put(constants.STORAGE_DATA_PREFIX + pubkey, null) : $q.when()\n ]);\n }\n },\n\n // reset data store for this pubkey\n resetStore = function(pubkey) {\n\n console.debug(\"[wallet] Resetting stored pubkey (and uid) in local storage...\");\n\n sessionStorage.put(constants.STORAGE_SECKEY, null);\n localStorage.put(constants.STORAGE_PUBKEY, null);\n localStorage.put(constants.STORAGE_UID, null);\n\n if (settings && settings.useLocalStorage) {\n // Clean data (only in the session storage - keep local)\n return pubkey ? sessionStorage.put(constants.STORAGE_DATA_PREFIX + pubkey, null) : $q.when();\n }\n else {\n console.debug(\"[wallet] Resetting stored data in local storage...\");\n return $q.all([\n pubkey ? sessionStorage.put(constants.STORAGE_DATA_PREFIX + pubkey, null) : $q.when(),\n pubkey ? localStorage.put(constants.STORAGE_DATA_PREFIX + pubkey, null) : $q.when()\n ]);\n }\n },\n\n // store children wallet, notifications read Time, ...\n storeData = function() {\n if (!isLogin()) throw {message:'ERROR.NEED_LOGIN_FIRST'};\n\n var useEncryption = settings && settings.useLocalStorageEncryption;\n var storageKey = constants.STORAGE_DATA_PREFIX + data.pubkey;\n\n var content; // Init only if used\n var secureContent; // Init only if used\n\n // Add time\n if (data.notifications && data.notifications.time) {\n content = content || {};\n content.notifications = {\n time: data.notifications.time\n };\n }\n if (data.invitations && data.invitations.time) {\n content = content || {};\n content.invitations = {\n time: data.invitations.time\n };\n }\n\n // Add children wallets\n if (data.children && data.children.length) {\n // remember children count - need when data still encrypted, by method getChildrenCount()\n content = content || {};\n content.childrenCount = data.children.length;\n\n secureContent = secureContent || {}; // Init th secured content\n // Add children wallet\n secureContent.children = _.map(data.children, function(wallet) {\n return {\n pubkey: wallet.data.pubkey,\n uid: wallet.data.uid,\n localName: wallet.data.localName\n };\n });\n }\n var contentStr = (content || secureContent) && JSON.stringify(angular.merge({}, content||{}, secureContent||{}));\n\n // Not encryption (or nothing to secure content): store without encryption\n if (!useEncryption || !secureContent) {\n return $q.all([\n sessionStorage.put(storageKey, null), // clear session storage (not used if no encryption)\n localStorage.put(storageKey, contentStr || null)\n ]);\n }\n\n // Encryption is enable, but user not auth: use the session storage\n // (and keep the local storage value)\n if (!isAuth()) {\n return sessionStorage.put(storageKey, contentStr||null);\n }\n\n return $q.all([\n // Get a unique nonce\n CryptoUtils.util.random_nonce(),\n // Get box keypair\n CryptoUtils.box.keypair.fromSignKeypair(data.keypair),\n // Put also (without encryption) in the session storage\n sessionStorage.put(storageKey, contentStr || null)\n ])\n .then(function(res) {\n var nonce = res[0];\n var keypair = res[1];\n\n return CryptoUtils.box.pack(JSON.stringify(secureContent), nonce, keypair.boxPk, keypair.boxSk)\n .then(function(cypherContent) {\n content = angular.merge(content||{}, {\n encryptedData: {\n nonce: CryptoUtils.util.encode_base58(nonce),\n content: cypherContent\n }\n });\n //console.debug(\"[wallet] Storing with encryption: \", content);\n return localStorage.put(storageKey, JSON.stringify(content));\n });\n });\n },\n\n restore = function() {\n return $q.all([\n sessionStorage.get(constants.STORAGE_SECKEY),\n localStorage.get(constants.STORAGE_PUBKEY),\n localStorage.get(constants.STORAGE_UID)\n ])\n .then(function(res) {\n var seckey = res[0];\n var pubkey = res[1];\n var uid = res[2];\n if (!pubkey || pubkey == 'null') return;\n\n console.debug('[wallet] Restore {' + pubkey.substring(0, 8) + '} from local storage');\n\n var keypair;\n if (seckey && seckey.length && seckey != 'null') {\n try {\n keypair = {\n signPk: CryptoUtils.util.decode_base58(pubkey),\n signSk: CryptoUtils.util.decode_base58(seckey)\n };\n }\n catch (err) {\n console.warn('[wallet] Secret key restoration failed: ', err);\n keypair = undefined;\n }\n }\n\n data.pubkey = pubkey;\n data.uid = uid && uid != 'null' ? uid : undefined;\n data.keypair = keypair || {signPk: undefined, signSk: undefined};\n\n // Get pubkey's data\n return restoreData();\n })\n\n .then(function() {\n // Successful restored: raise API events\n if (isAuth()) {\n return $q.all([\n api.data.raisePromise.login(data),\n checkAuthIdle(true),\n api.data.raisePromise.auth(data)\n ])\n .catch(function(err) {\n console.warn('Error during extension call [wallet.api.data.on.auth]', err);\n // continue\n });\n }\n else if (isLogin()) {\n return api.data.raisePromise.login(data)\n .catch(function(err) {\n console.warn('Error during extension call [wallet.api.data.on.login]', err);\n // continue\n });\n }\n })\n\n .then(function(){\n return data;\n });\n },\n\n restoreData = function() {\n if (!isLogin()) throw {message:'ERROR.NEED_LOGIN_FIRST'};\n if (isNew()) return $q.when(data); // Skip restore\n // Get pubkey's data\n return $q.all([\n sessionStorage.getObject(constants.STORAGE_DATA_PREFIX + data.pubkey),\n localStorage.getObject(constants.STORAGE_DATA_PREFIX + data.pubkey)\n ])\n // Apply data, first from the session storage, then from local storage\n .then(function (res) {\n var sessionStorageData = res[0];\n var localStorageData = res[1];\n if (sessionStorageData && sessionStorageData.children && sessionStorageData.children.length === localStorageData.childrenCount) {\n return applyRestoredData(sessionStorageData)\n .catch(function(err) {\n console.error(\"[wallet] Failed to restore from the session storage ! Retrying from the local storage...\", err);\n // Retry using another storage\n return applyRestoredData(localStorageData);\n });\n }\n return applyRestoredData(localStorageData);\n });\n },\n\n applyRestoredData = function(content) {\n if (!content) return $q.when(); // skip\n\n // Apply children\n if (content.children) {\n var oldChildrenCount = data.childrenCount;\n var oldChildren = removeAllChildrenWallets({\n stop: false, /*do not stop wallet*/\n store: false/*skip store*/\n });\n\n try {\n var pubkeys = {};\n _.forEach(content.children, function(child) {\n if (!pubkeys[child.pubkey]) { // make sure wallet is unique by pubkey\n pubkeys[child.pubkey] = true;\n var wallet = newChildInstance();\n wallet.data.pubkey = child.pubkey;\n wallet.data.localName = child.localName;\n wallet.data.uid = child.uid;\n addChildWallet(wallet, {store: false/*skip store*/});\n }\n });\n delete content.children;\n // childrenCount not need anymore\n delete data.childrenCount;\n }\n catch(err) {\n console.error(\"[wallet] Failed to restore children wallet.\", err);\n // Restore removed values\n data.childrenCount = oldChildrenCount;\n data.children = oldChildren;\n return $q.reject({message:'ERROR.RESTORE_WALLET_LIST_FAILED'});\n }\n\n // Restoration succeed: stop old children\n _.forEach(oldChildren||[], function(child) {\n child.stop();\n });\n }\n\n // make sure to remove pubkey before copy\n delete content.pubkey;\n delete content.uid;\n\n // Copy to data\n angular.merge(data, content);\n\n // If auth: open encrypted data\n if (hasEncryptedData() && isAuth()) {\n return openEncryptedData({store: false})\n .then(function(){\n return data; // Important: return the data\n });\n }\n\n return $q.when(data); // Important: return the data\n },\n\n getData = function() {\n return data;\n },\n\n loadRequirements = function(withCache, secondTry) {\n // Clean existing events\n cleanEventsByContext('requirements');\n\n // Get requirements\n return csWot.loadRequirements(data, withCache)\n .catch(function(err) {\n // Retry once (can be a timeout, because Duniter node are long to response)\n if (!secondTry) {\n console.error(\"[wallet] Unable to load requirements (first try): {0}. Retrying once...\".format(err && err.message || err), err);\n UIUtils.loading.update({template: \"COMMON.LOADING_WAIT\"});\n return loadRequirements(withCache, true);\n }\n console.error(\"[wallet] Unable to load requirements (after a second try): {0}\".format(err && err.message || err), err);\n throw err;\n });\n },\n\n loadTxAndSources = function(fromTime) {\n return csTx.load(data.pubkey, fromTime)\n .then(function(res){\n resetTxAndSources();\n angular.merge(data, res);\n })\n .catch(function(err) {\n resetTxAndSources();\n throw err;\n });\n },\n\n loadSources = function() {\n return csTx.loadSources(data.pubkey)\n .then(function(res){\n resetSources();\n angular.merge(data, res);\n })\n .catch(function(err) {\n resetSources();\n throw err;\n });\n },\n\n /**\n * Add user events (generate events from requirements)\n */\n addEvents = function() {\n if (data.requirements.revoked) {\n delete data.requirements.meta.invalid;\n addEvent({type:'info', message: 'ERROR.WALLET_REVOKED', context: 'requirements'});\n }\n else if (data.requirements.pendingRevocation) {\n delete data.requirements.meta.invalid;\n addEvent({type:'pending', message: 'INFO.REVOCATION_SENT_WAITING_PROCESS', context: 'requirements'});\n }\n\n // If not revoked\n else {\n if (!data.isMember && data.requirements.meta && data.requirements.meta.invalid) {\n addEvent({type: 'error', message: 'ERROR.WALLET_INVALID_BLOCK_HASH', context: 'requirements'});\n console.debug(\"Invalid membership for uid={0}: block hash changed\".format(data.uid));\n }\n // Check if self expired\n else if (!data.isMember && data.requirements.expired) {\n addEvent({type: 'error', message: 'ERROR.WALLET_IDENTITY_EXPIRED', context: 'requirements'});\n console.debug(\"Identity expired for uid={0}.\".format(data.uid));\n }\n // Pending membership\n else if (data.requirements.pendingMembership) {\n addEvent({type:'pending', message: 'ACCOUNT.WAITING_MEMBERSHIP', context: 'requirements'});\n\n // Add a warning when out distanced\n // (only if has enough certification - fix #808)\n if (!data.requirements.needCertificationCount && data.requirements.outdistanced) {\n addEvent({type:'warn', message: 'ACCOUNT.OUT_DISTANCED', context: 'requirements'});\n }\n }\n // If user has send a SELF, ask for membership - fix #625\n else if (!data.requirements.needSelf && data.requirements.needMembership){\n addEvent({type:'warn', message: 'ACCOUNT.NO_WAITING_MEMBERSHIP', context: 'requirements'});\n }\n\n if (data.requirements.needRenew) {\n // Still a member: WILL need renew\n if (data.isMember && data.requirements.membershipExpiresIn > 0) {\n addEvent({type:'warn', message: 'ACCOUNT.WILL_NEED_RENEW_MEMBERSHIP', messageParams: data.requirements, context: 'requirements'});\n }\n // Fix #649: Not a member anymore, even if membership NOT expired, because membersjip cancelled for lack of certifications\n else if (!data.isMember && data.requirements.membershipExpiresIn > 0 && data.requirements.needCertificationCount > 0) {\n addEvent({type:'warn', message: 'ACCOUNT.NEED_RENEW_MEMBERSHIP_AFTER_CANCELLED', messageParams: data.requirements, context: 'requirements'});\n }\n // Not a member anymore\n else {\n addEvent({type:'warn', message: 'ACCOUNT.NEED_RENEW_MEMBERSHIP', messageParams: data.requirements, context: 'requirements'});\n }\n }\n else\n {\n if (data.requirements.needCertificationCount > 0) {\n addEvent({type:'info', message: 'ACCOUNT.WAITING_CERTIFICATIONS', messageParams: data.requirements, context: 'requirements'});\n // Add a help message, if user has never been a member\n if (!data.requirements.wasMember) {\n addEvent({\n type: 'help',\n message: 'ACCOUNT.WAITING_CERTIFICATIONS_HELP',\n messageParams: data.requirements,\n context: 'requirements'\n });\n }\n }\n if (data.requirements.willNeedCertificationCount > 0) {\n addEvent({type:'warn', message: 'ACCOUNT.WILL_MISSING_CERTIFICATIONS', messageParams: data.requirements, context: 'requirements'});\n }\n if (data.requirements.wasMember && data.requirements.needMembership) {\n addEvent({type:'warn', message: 'ACCOUNT.NEED_RENEW_MEMBERSHIP', messageParams: data.requirements, context: 'requirements'});\n }\n // Add a warning when out distanced - fix #777\n if (!data.requirements.needCertificationCount && !data.requirements.willNeedCertificationCount && data.requirements.outdistanced) {\n addEvent({type:'warn', message: 'ACCOUNT.OUT_DISTANCED', context: 'requirements'});\n }\n }\n }\n },\n\n loadSigStock = function() {\n // Get certified by, then count written certification\n return BMA.wot.certifiedBy({pubkey: data.pubkey})\n .then(function(res){\n data.sigStock = !res.certifications ? 0 : res.certifications.reduce(function(res, cert) {\n return cert.written === null ? res : res+1;\n }, 0);\n })\n .catch(function(err) {\n if (!!err && err.ucode == BMA.errorCodes.NO_MATCHING_MEMBER) {\n data.sigStock = 0;\n }\n /*FIXME: workaround for Duniter issue #1309 */\n else if (!!err && err.ucode == 1002) {\n console.warn(\"[wallet-service] Detecting Duniter issue #1309 ! Applying workaround... \");\n data.sigStock = 0;\n }\n else {\n throw err;\n }\n });\n },\n\n loadQrCode = function(){\n if (!data.pubkey || data.qrcode) return $q.when(data.qrcode);\n console.debug(\"[wallet] Creating SVG QRCode...\");\n return $timeout(function() {\n data.qrcode = UIUtils.qrcode.svg(data.pubkey);\n return data.qrcode;\n });\n },\n\n loadData = function(options) {\n\n var alertIfUnusedWallet = !csCurrency.data.initPhase && (!csSettings.data.wallet || csSettings.data.wallet.alertIfUnusedWallet) &&\n !data.loaded && (!options || !options.minData || !options.silent);\n\n // Make sure to load once at a time\n if (loadPromise) {\n return loadPromise.then(function() {\n return isDataLoaded(options) ? data : refreshData(options);\n });\n }\n\n if (options && options.minData) {\n loadPromise = loadMinData(options);\n }\n else if (options || data.loaded) {\n loadPromise = refreshData(options);\n }\n else {\n loadPromise = loadFullData();\n }\n\n return $q.all([\n loadPromise,\n\n // Create the QR code\n loadQrCode()\n ])\n // Warn if wallet has been never used - see #167\n .then(function() {\n var unused = isNeverUsed();\n var showAlert = alertIfUnusedWallet && !isNew() && unused === true;\n if (!showAlert) return true;\n return UIUtils.loading.hide()\n .then(function() {\n return UIUtils.alert.confirm('CONFIRM.LOGIN_UNUSED_WALLET', 'CONFIRM.LOGIN_UNUSED_WALLET_TITLE', {\n cancelText: 'COMMON.BTN_CONTINUE',\n okText: 'COMMON.BTN_RETRY'\n });\n })\n .then(function(retry) {\n if (retry) {\n return logout().then(function() {\n throw 'RETRY';\n });\n }\n else {\n // Remembering to not ask for confirmation\n if (csSettings.data.wallet.alertIfUnusedWallet) {\n csSettings.data.wallet.alertIfUnusedWallet = false;\n csSettings.store();\n }\n }\n return true;\n });\n })\n\n // Return wallet data\n .then(function(confirm) {\n loadPromise = null;\n if (confirm) {\n return data;\n }\n else { // cancel\n\n throw 'CANCELLED';\n }\n });\n },\n\n loadFullData = function(fromTime) {\n data.loaded = false;\n\n var now = Date.now();\n console.debug(\"[wallet] Loading {{0}} full data...\".format(data.pubkey && data.pubkey.substr(0,8)));\n\n return $q.all([\n\n // Get requirements\n loadRequirements(true)\n .then(function(data) {\n if (data.requirements && (data.requirements.isMember || data.requirements.wasMember)) {\n // Load sigStock\n return loadSigStock();\n }\n else {\n data.sigStock = 0;\n }\n }),\n\n // Get TX and sources (only pending by default)\n loadTxAndSources(fromTime || 'pending')\n ])\n .then(function() {\n\n // Load wallet events\n addEvents();\n\n // API extension\n return api.data.raisePromise.load(data)\n .catch(function(err) {\n console.error('[wallet] Error during load API extension point. Try to continue',err);\n });\n })\n .then(function() {\n data.loaded = true;\n console.debug(\"[wallet] Loaded {{0}} full data in {1}ms\".format(data.pubkey && data.pubkey.substr(0,8), Date.now() - now));\n\n // Make sure to hide loading, because sometimes it stay - should fix freeze screen\n UIUtils.loading.hide(1000);\n return data;\n })\n .catch(function(err) {\n data.loaded = false;\n throw err;\n });\n },\n\n loadMinData = function(options) {\n options = options || {};\n options.requirements = angular.isDefined(options.requirements) ? options.requirements :\n (!data.requirements.loaded || angular.isUndefined(data.requirements.needSelf));\n if (!options.requirements) {\n return $q.when(data);\n }\n\n return refreshData(options)\n .then(function(data) {\n data.loaded = true;\n return data;\n });\n },\n\n refreshData = function(options) {\n options = options || {\n requirements: true,\n sources: true,\n tx: {\n enable: true,\n fromTime: data.tx && data.tx.fromTime !== 'pending' ? data.tx.fromTime : undefined // keep previous time\n },\n sigStock: true,\n api: true\n };\n\n // Force some load (requirements) if not already loaded\n options.requirements = angular.isDefined(options.requirements) ? options.requirements : !data.requirements.loaded;\n\n // Force sources when TX enable\n if (angular.isUndefined(options.sources) && options.tx && options.tx.enable) {\n options.sources = true;\n }\n\n var jobs = [];\n\n var now = Date.now();\n console.debug(\"[wallet] {0} {{1}} data, with options: \".format(!data.loaded ? 'Loading' : 'Refreshing', data.pubkey.substr(0,8)), options);\n\n // Get requirements\n if (options.requirements) {\n // Reset events\n cleanEventsByContext('requirements');\n\n jobs.push(\n loadRequirements(true)\n\n // Add wallet events\n .then(addEvents)\n );\n }\n\n if (options.sources && (!options.tx || options.tx.enable)) {\n // Get TX and sources\n jobs.push(loadTxAndSources(options.tx ? options.tx.fromTime: undefined));\n }\n\n else if (options.sources && (options.tx && !options.tx.enable)) {\n // Get sources and only pending TX (and NOT the TX history)\n jobs.push(loadTxAndSources('pending'));\n }\n\n // Load sigStock\n if (options.sigStock) jobs.push(loadSigStock());\n\n return (jobs.length ? $q.all(jobs) : $q.when())\n .then(function() {\n // Skip api\n if (angular.isDefined(options.api) && !options.api) return data;\n\n // API extension (after all other jobs)\n return api.data.raisePromise.load(data)\n .then(function(){\n\n console.debug(\"[wallet] {0} {{1}} data in {2}ms\".format(!data.loaded ? 'Loaded' : 'Refreshed', data.pubkey.substr(0,8), Date.now() - now));\n\n // Compute if full loaded\n if (!data.loaded) {\n data.loaded = data.requirements.loaded && data.sources && true;\n }\n\n return data;\n });\n })\n .catch(function(err) {\n console.error(\"[wallet] Error while {0} data: {1}\".format(!data.loaded ? 'Loading' : 'Refreshing', (err && err.message || err)), err);\n data.loaded = data.requirements.loaded && data.sources && true;\n throw err;\n });\n },\n\n setSelf = function(uid, blockUid){\n // Skip if same self\n if (data.uid == uid && (!blockUid || data.blockUid == blockUid)) return $q.when();\n\n // Data not loaded\n if (!data.loaded) {\n return !loadPromise ?\n // If no pending load: ok\n $q.when() :\n // If a load is running: force a reload\n loadPromise.then(function() {\n return setSelf(uid, blockUid); // loop\n });\n }\n\n data.uid = uid;\n data.blockUid = blockUid;\n\n // Refresh requirements\n return refreshData({requirements: true, sigStock: true})\n .then(function() {\n // Store (to remember the new uid)\n return store({skipData: true});\n });\n },\n\n isBase = function(amount, base) {\n if (!base) return true; // no base\n if (amount < Math.pow(10, base)) return false; // too small\n var rest = '00000000' + amount;\n var lastDigits = parseInt(rest.substring(rest.length-base));\n return lastDigits === 0; // no rest\n },\n\n truncBase = function(amount, base) {\n var pow = Math.pow(10, base); // = min value in this base\n if (amount < pow) return 0;\n return Math.trunc(amount / pow ) * pow;\n },\n\n truncBaseOrMinBase = function(amount, base) {\n var pow = Math.pow(10, base);\n if (amount < pow) return pow; //\n return Math.trunc(amount / pow ) * pow;\n },\n\n powBase = function(amount, base) {\n return base <= 0 ? amount : amount * Math.pow(10, base);\n },\n\n getInputs = function(amount, outputBase, filterBase) {\n if (angular.isUndefined(filterBase)) {\n filterBase = outputBase;\n }\n var sourcesAmount = 0;\n var sources = [];\n var minBase = filterBase;\n var maxBase = filterBase;\n _.find(data.sources || [], function(source) {\n if (!source.consumed && source.base === filterBase &&\n // Filter on simple SIG output condition - fix #845\n BMA.regexp.TX_OUTPUT_SIG.exec(source.conditions)\n ) {\n sourcesAmount += powBase(source.amount, source.base);\n sources.push(source);\n }\n // Stop if enough sources\n return (sourcesAmount >= amount);\n });\n\n // IF not enough sources, get add inputs from lower base (recursively)\n if (sourcesAmount < amount && filterBase > 0) {\n filterBase -= 1;\n var missingAmount = amount - sourcesAmount;\n var lowerInputs = getInputs(missingAmount, outputBase, filterBase);\n\n // Add lower base inputs to result\n if (lowerInputs.amount > 0) {\n minBase = lowerInputs.minBase;\n sourcesAmount += lowerInputs.amount;\n [].push.apply(sources, lowerInputs.sources);\n }\n }\n\n return {\n minBase: minBase,\n maxBase: maxBase,\n amount: sourcesAmount,\n sources: sources\n };\n },\n\n /**\n * Send a new transaction\n */\n transfer = function(destPub, amount, comments, useRelative, restPub, block) {\n return $q.all([\n getKeypair(),\n csCurrency.get(),\n block && $q.when(block) || csCurrency.blockchain.current(true)\n ])\n .then(function(res) {\n var keypair = res[0];\n var currency = res[1];\n block = res[2];\n if (!BMA.regexp.PUBKEY.test(destPub)){\n throw {message:'ERROR.INVALID_PUBKEY'};\n }\n if (!BMA.regexp.COMMENT.test(comments)){\n throw {message:'ERROR.INVALID_COMMENT'};\n }\n if (!isLogin()){\n throw {message:'ERROR.NEED_LOGIN_FIRST'};\n }\n if (destPub === data.pubkey){\n throw {message:'ERROR.SAME_TX_RECIPIENT'};\n }\n if (!amount) {\n throw {message:'ERROR.AMOUNT_REQUIRED'};\n }\n if (amount <= 0) {\n throw {message:'ERROR.AMOUNT_NEGATIVE'};\n }\n amount = Math.floor(amount); // remove decimals\n\n var inputs = {\n amount: 0,\n minBase: block.unitbase,\n maxBase: block.unitbase + 1,\n sources : []\n };\n\n var logs = [];\n logs.push(\"[wallet] amount=\" + amount);\n\n // Get inputs, starting to use current base sources\n var amountBase = 0;\n while (inputs.amount < amount && amountBase <= block.unitbase) {\n inputs = getInputs(amount, block.unitbase);\n\n if (inputs.amount < amount) {\n // try to reduce amount (replace last digits to zero)\n amountBase++;\n if (amountBase <= block.unitbase) {\n amount = truncBase(amount, amountBase);\n logs.push(\"[wallet] inputs not found. Retrying with amount =\" + amount + \" be compatible with amountBase=\" + amountBase);\n }\n }\n }\n\n if (inputs.amount < amount) {\n if (data.balance < amount) {\n throw {message:'ERROR.NOT_ENOUGH_CREDIT'};\n }\n else if (inputs.amount === 0) {\n throw {message:'ERROR.ALL_SOURCES_USED'};\n }\n else {\n return $translate('COMMON.UD')\n .then(function(UD) {\n var params;\n if(useRelative) {\n params = {\n amount: ($filter('formatDecimal')(inputs.amount / currency.currentUD)),\n unit: UD,\n subUnit: $filter('abbreviate')(currency.name)\n };\n }\n else {\n params = {\n amount: ($filter('formatDecimal')(inputs.amount/100)),\n unit: $filter('abbreviate')(currency.name),\n subUnit: ''\n };\n }\n return $translate('ERROR.NOT_ENOUGH_SOURCES', params)\n .then(function(message) {\n throw {message: message};\n });\n });\n }\n }\n // Avoid to get outputs on lower base\n if (amountBase < inputs.minBase && !isBase(amount, inputs.minBase)) {\n amount = truncBaseOrMinBase(amount, inputs.minBase);\n console.debug(\"[wallet] Amount has been truncate to \" + amount);\n logs.push(\"[wallet] Amount has been truncate to \" + amount);\n }\n else if (amountBase > 0) {\n console.debug(\"[wallet] Amount has been truncate to \" + amount);\n logs.push(\"[wallet] Will use amount truncated to \" + amount + \" (amountBase=\"+amountBase+\")\");\n }\n\n // Send tx\n return createAndSendTx(currency, block, keypair, destPub, amount, inputs, comments, restPub||data.pubkey, logs)\n .then(function(res) {\n data.balance -= res.amount;\n if (data.balance < 0) data.balance = 0; // fix #712\n _.forEach(inputs.sources, function(source) {\n source.consumed=true;\n });\n\n // Add new sources\n if (res && res.sources.length) {\n console.debug(\"[wallet-service] New sources to be add after the TX: \", res.sources);\n addSources(res.sources);\n }\n\n // Add TX to pendings\n var pendingTx = {\n time: csCurrency.date.now(),\n amount: -amount,\n pubkey: destPub,\n comment: comments,\n isUD: false,\n hash: res.hash,\n locktime: 0,\n block_number: null\n };\n return csWot.extendAll([pendingTx], 'pubkey')\n .then(function() {\n data.tx.pendings.unshift(pendingTx);\n\n // API extension\n api.data.raise.balanceChanged(data);\n api.data.raise.newTx(data);\n\n // Return TX hash (if chained TXs, return the last tx hash) - required by Cesium-API\n return {\n hash: res.hash\n };\n });\n })\n .catch(function(err) {\n\n // Source already consumed: whould refresh wallet sources\n if (err && err.ucode === BMA.errorCodes.SOURCE_ALREADY_CONSUMED) {\n console.debug('[wallet] TX rejected by node with error [{0}]. Reloading sources then retry...'.format(err.message||'Source already consumed'));\n return $timeout(loadTxAndSources, 500)\n .then(function() {\n return transfer(destPub, amount, comments, useRelative, restPub, block);\n });\n }\n\n // Error in generated TX - issue #524\n else if (err && err.ucode === BMA.errorCodes.TX_INPUTS_OUTPUTS_NOT_EQUAL) {\n // Ask user to send log to developers\n var esEnable = csSettings.data.plugins && csSettings.data.plugins.es && csSettings.data.plugins.es.enable;\n if (esEnable) {\n UIUtils.loading.hide();\n return UIUtils.alert.confirm('CONFIRM.ISSUE_524_SEND_LOG', 'ERROR.POPUP_TITLE', {\n cssClass: 'warning',\n okText: 'COMMON.BTN_OK',\n cancelText: 'COMMON.BTN_NO'\n })\n .then(function(confirm) {\n if (confirm) {\n api.error.raise.send({\n title: 'Issue #524 logs',\n content: 'App version: ' +csConfig.version+'\\n'+\n 'App build: ' +csConfig.build+'\\n'+\n 'Logs:\\n\\n' + logs.join('\\n')\n });\n return $timeout(function() {\n throw {message: 'ERROR.ISSUE_524_TX_FAILED'};\n }, 1500);\n }\n throw {message: 'ERROR.SEND_TX_FAILED'};\n });\n }\n }\n throw err;\n });\n });\n },\n\n /**\n * Send a WIF wallet\n */\n transferAll = function(destPub, amount, comments, useRelative, restPub) {\n if (!isLogin()) return $q.reject({message:'ERROR.NEED_LOGIN_FIRST'});\n\n if (!restPub || destPub == restPub) {\n return $q.reject({message: \"Could not have same pubkey for 'destPub' and 'restPub'\"});\n }\n\n return csCurrency.blockchain.lastValid()\n .then(function(block) {\n console.debug(\"[wallet] Using last valid block as TX reference (to avoid network fork): \", block);\n\n return transfer(destPub, amount, comments, useRelative, restPub, block)\n .then(function() {\n // If more money: transfer all to restPub\n if (data.balance > 0 && restPub) {\n console.debug(\"[wallet] Wallet has some more money: transfering fund to [{0}]\".format(restPub.substring(0,8)));\n return transfer(restPub, data.balance, undefined/*comments*/, false/*useRelative*/, restPub, block);\n }\n });\n\n });\n\n },\n\n /**\n * Create TX doc and send it\n * @param block the current block\n * @param destPub\n * @param amount\n * @param inputs\n * @param comments\n * @return the hash of the sent TX\n */\n createAndSendTx = function(currency, block, keypair, destPub, amount, inputs, comments, restPub, logs) {\n\n // Make sure a TX in compact mode has no more than 100 lines (fix #118)\n // (If more than 100 lines, send to TX to himself first, then its result as sources for the final TX)\n if (inputs.sources.length > constants.TX_MAX_INPUTS_COUNT) {\n console.debug(\"[Wallet] TX has to many sources. Will chain TX...\");\n\n // Compute a slice of sources\n var firstSlice = {\n minBase: block.unitbase,\n maxBase: 0,\n amount: 0,\n sources: inputs.sources.slice(0, constants.TX_MAX_INPUTS_COUNT) /* end index is excluded, so array length=TX_MAX_INPUTS_COUNT - issue #524 */\n };\n _.forEach(firstSlice.sources, function(source) {\n if (source.base < firstSlice.minBase) firstSlice.minBase = source.base;\n if (source.base > firstSlice.maxBase) firstSlice.maxBase = source.base;\n firstSlice.amount += powBase(source.amount, source.base);\n });\n\n // Send inputs first slice\n return createAndSendTx(currency, block, keypair, data.pubkey/*to himself*/, firstSlice.amount, firstSlice, undefined/*comment not need*/, data.pubkey/*rest to himself*/, logs)\n .then(function(res) {\n _.forEach(firstSlice.sources, function(source) {\n source.consumed=true;\n });\n addSources(res.sources);\n\n var secondSlice = {\n minBase: block.unitbase,\n maxBase: 0,\n amount: 0,\n sources: inputs.sources.slice(constants.TX_MAX_INPUTS_COUNT).concat(res.sources)\n };\n _.forEach(secondSlice.sources, function(source) {\n if (source.base < secondSlice.minBase) secondSlice.minBase = source.base;\n if (source.base > secondSlice.maxBase) secondSlice.maxBase = source.base;\n secondSlice.amount += powBase(source.amount, source.base);\n });\n\n // Send inputs second slice (recursive call)\n return createAndSendTx(currency, block, keypair, destPub, amount, secondSlice, comments, restPub, logs);\n });\n }\n\n var tx = 'Version: '+ constants.TX_VERSION +'\\n' +\n 'Type: Transaction\\n' +\n 'Currency: ' + currency.name + '\\n' +\n 'Blockstamp: ' + block.number + '-' + block.hash + '\\n' +\n 'Locktime: 0\\n' + // no lock\n 'Issuers:\\n' +\n data.pubkey + '\\n' +\n 'Inputs:\\n';\n\n _.forEach(inputs.sources, function(source) {\n // if D : AMOUNT:BASE:D:PUBLIC_KEY:BLOCK_ID\n // if T : AMOUNT:BASE:T:T_HASH:T_INDEX\n tx += [source.amount, source.base, source.type, source.identifier,source.noffset].join(':')+\"\\n\";\n });\n\n tx += 'Unlocks:\\n';\n for (i=0; i<inputs.sources.length; i++) {\n // INPUT_INDEX:UNLOCK_CONDITION\n tx += i + ':SIG(0)\\n';\n }\n\n tx += 'Outputs:\\n';\n // AMOUNT:BASE:CONDITIONS\n var rest = amount;\n var outputBase = inputs.maxBase;\n var outputAmount;\n var outputOffset = 0;\n var newSources = [];\n // Outputs to receiver (if not himself)\n if (destPub !== data.pubkey) {\n while(rest > 0) {\n outputAmount = truncBase(rest, outputBase);\n rest -= outputAmount;\n if (outputAmount > 0) {\n outputAmount = outputBase === 0 ? outputAmount : outputAmount / Math.pow(10, outputBase);\n tx += outputAmount + ':' + outputBase + ':SIG(' + destPub + ')\\n';\n outputOffset++;\n }\n outputBase--;\n }\n rest = inputs.amount - amount;\n outputBase = inputs.maxBase;\n }\n // Outputs to restPub\n while(rest > 0) {\n outputAmount = truncBase(rest, outputBase);\n rest -= outputAmount;\n if (outputAmount > 0) {\n outputAmount = outputBase === 0 ? outputAmount : outputAmount / Math.pow(10, outputBase);\n tx += outputAmount +':'+outputBase+':SIG('+restPub+')\\n';\n // If rest to himself: add new sources\n if (data.pubkey === restPub) {\n newSources.push({\n type: 'T',\n noffset: outputOffset,\n amount: outputAmount,\n base: outputBase,\n conditions: 'SIG('+restPub+')',\n consumed: false\n });\n }\n outputOffset++;\n }\n outputBase--;\n }\n\n tx += \"Comment: \"+ (comments||\"\") + \"\\n\";\n\n // Append to logs (need to resolve issue #524)\n if (logs) {\n if (destPub == data.pubkey) {\n logs.push('[wallet] Creating new TX, using inputs:\\n - minBase: '+inputs.minBase+'\\n - maxBase: '+inputs.maxBase);\n }\n else {\n logs.push('[wallet] Creating new TX, using inputs:\\n - minBase: '+inputs.minBase+'\\n - maxBase: '+inputs.maxBase + '\\n - sources (=TX inputs):');\n }\n _.forEach(inputs.sources, function(source) {\n logs.push([source.amount, source.base, source.type, source.identifier,source.noffset].join(':'));\n });\n logs.push(\"\\n[wallet] generated TX document (without signature) :\\n------ START ------\\n\" + tx + \"------ END ------\\n\");\n }\n\n return CryptoUtils.sign(tx, keypair)\n .then(function(signature) {\n var signedTx = tx + signature + \"\\n\";\n return BMA.tx.process({transaction: signedTx})\n .catch(function(err) {\n if (err && err.ucode === BMA.errorCodes.TX_ALREADY_PROCESSED) {\n // continue\n return;\n }\n throw err;\n })\n .then(function() {\n return CryptoUtils.util.hash(signedTx);\n })\n .then(function(txHash) {\n _.forEach(newSources, function(output) {\n output.identifier= txHash;\n output.consumed = false;\n output.pending = true;\n });\n return {\n amount: (data.pubkey === destPub) ? 0 : ((data.pubkey === restPub) ? amount : inputs.amount),\n tx: signedTx,\n hash: txHash,\n sources: newSources\n };\n });\n });\n },\n\n getIdentityDocument = function(currency, keypair, uid, blockUid) {\n uid = uid || data.uid;\n blockUid = blockUid || data.blockUid;\n if (!uid || !blockUid) {\n throw {message: 'ERROR.WALLET_HAS_NO_SELF'};\n }\n if (data.requirements.expired) {\n throw {message: 'ERROR.WALLET_IDENTITY_EXPIRED'};\n }\n\n var identity = 'Version: '+ constants.IDTY_VERSION +'\\n' +\n 'Type: Identity\\n' +\n 'Currency: ' + currency.name + '\\n' +\n 'Issuer: ' + data.pubkey + '\\n' +\n 'UniqueID: ' + uid + '\\n' +\n 'Timestamp: ' + blockUid + '\\n';\n return CryptoUtils.sign(identity, keypair)\n .then(function(signature) {\n identity += signature + '\\n';\n console.debug('Has generate an identity document:\\n----\\n' + identity + '----');\n return identity;\n });\n },\n\n /**\n * Send self identity\n */\n self = function(uid, needToLoadRequirements) {\n if (!BMA.regexp.USER_ID.test(uid)){\n return $q.reject({message: 'ERROR.INVALID_USER_ID'});\n }\n var block;\n return $q.all([\n getKeypair(),\n csCurrency.get(),\n csCurrency.blockchain.lastValid()\n ])\n // Create identity document\n .then(function(res) {\n var keypair = res[0];\n var currency = res[1];\n block = res[2];\n return getIdentityDocument(currency, keypair, uid, block.number + '-' + block.hash);\n })\n\n // Send to node\n .then(function (identity) {\n return BMA.wot.add({identity: identity});\n })\n\n .then(function () {\n if (!!needToLoadRequirements) {\n // Refresh membership data (if need)\n return loadRequirements(false/*no cache*/)\n\n // Add wallet events\n .then(addEvents);\n }\n else {\n data.uid = uid;\n data.blockUid = block.number + '-' + block.hash;\n }\n })\n .catch(function (err) {\n if (err && err.ucode === BMA.errorCodes.IDENTITY_SANDBOX_FULL) {\n throw {ucode: BMA.errorCodes.IDENTITY_SANDBOX_FULL, message: 'ERROR.IDENTITY_SANDBOX_FULL'};\n }\n throw err;\n });\n },\n\n /**\n * Send membership (in or out)\n */\n membership = function(sideIn) {\n return function() {\n var membership;\n\n return $q.all([\n getKeypair(),\n csCurrency.blockchain.lastValid()\n ])\n .then(function(res) {\n var keypair = res[0];\n var block = res[1];\n // Create membership to sign\n membership = 'Version: '+ constants.MS_VERSION +'\\n' +\n 'Type: Membership\\n' +\n 'Currency: ' + block.currency + '\\n' +\n 'Issuer: ' + data.pubkey + '\\n' +\n 'Block: ' + block.number + '-' + block.hash + '\\n' +\n 'Membership: ' + (!!sideIn ? \"IN\" : \"OUT\" ) + '\\n' +\n 'UserID: ' + data.uid + '\\n' +\n 'CertTS: ' + data.blockUid + '\\n';\n\n return CryptoUtils.sign(membership, keypair);\n })\n .then(function(signature) {\n var signedMembership = membership + signature + '\\n';\n // Send signed membership\n return BMA.blockchain.membership({membership: signedMembership});\n })\n .then(function() {\n return $timeout(function() {\n return loadRequirements(false /*no cache*/);\n }, 1000); // waiting for node to process membership doc\n })\n\n // Add wallet events\n .then(addEvents);\n };\n },\n\n /**\n * Send identity certification\n */\n certify = function(uid, pubkey, timestamp, signature, isMember, wasMember) {\n return $q.all([\n getKeypair(),\n csCurrency.get(),\n csCurrency.blockchain.lastValid()\n ])\n .then(function(res) {\n var keypair = res[0];\n var currency = res[1];\n var block = res[2];\n\n // Check if member account\n if (!data.isMember && !csConfig.initPhase) {\n throw {message:'ERROR.ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION'};\n }\n\n // Create the self part to sign\n var cert = 'Version: '+ constants.CERT_VERSION +'\\n' +\n 'Type: Certification\\n' +\n 'Currency: ' + currency.name + '\\n' +\n 'Issuer: ' + data.pubkey + '\\n' +\n 'IdtyIssuer: ' + pubkey + '\\n' +\n 'IdtyUniqueID: ' + uid + '\\n' +\n 'IdtyTimestamp: ' + timestamp + '\\n' +\n 'IdtySignature: ' + signature + '\\n' +\n 'CertTimestamp: ' + block.number + '-' + block.hash + '\\n';\n\n return CryptoUtils.sign(cert, keypair)\n .then(function(signature) {\n var signedCert = cert + signature + '\\n';\n return BMA.wot.certify({cert: signedCert});\n })\n .then(function() {\n var cert = {\n pubkey: pubkey,\n uid: uid,\n time: block.medianTime,\n isMember: isMember,\n wasMember: wasMember,\n expiresIn: currency.parameters.sigWindow,\n pending: true,\n block: block.number,\n valid: true\n };\n\n // Notify extension\n api.action.raise.certify(cert);\n\n return cert;\n });\n });\n },\n\n addEvent = function(event, insertAtFirst) {\n event = event || {};\n event.type = event.type || 'info';\n event.message = event.message || '';\n event.messageParams = event.messageParams || {};\n event.context = event.context || 'undefined';\n if (event.message.trim().length) {\n if (!insertAtFirst) {\n data.events.push(event);\n }\n else {\n data.events.splice(0, 0, event);\n }\n }\n else {\n console.debug('Event without message. Skipping this event');\n }\n },\n\n getkeypairSaveId = function(record) {\n var nbCharSalt = Math.round(record.answer.length / 2);\n var salt = record.answer.substr(0, nbCharSalt);\n var pwd = record.answer.substr(nbCharSalt);\n return CryptoUtils.scryptKeypair(salt, pwd)\n .then(function (keypair) {\n record.pubkey = CryptoUtils.util.encode_base58(keypair.signPk);\n record.keypair = keypair;\n return record;\n });\n },\n\n getCryptedId = function(record){\n return getkeypairSaveId(record)\n .then(CryptoUtils.util.random_nonce)\n .then(function(nonce) {\n record.nonce = CryptoUtils.util.encode_base58(nonce);\n return $q.all([\n CryptoUtils.box.pack(record.salt, nonce, record.keypair.boxPk, record.keypair.boxSk),\n CryptoUtils.box.pack(record.pwd, nonce, record.keypair.boxPk, record.keypair.boxSk)\n ]);\n })\n .then(function (res) {\n record.salt = res[0];\n record.pwd = res[1];\n return record;\n });\n },\n\n recoverId = function(recover) {\n if (!recover || !recover.cypherNonce || !recover.cypherSalt || !recover.cypherPwd) {\n throw {message:'ERROR.INVALID_FILE_FORMAT'};\n }\n var nonce = CryptoUtils.util.decode_base58(recover.cypherNonce);\n return getkeypairSaveId(recover)\n .then(function (recover) {\n return CryptoUtils.box.open(recover.cypherSalt, nonce, recover.keypair.boxPk, recover.keypair.boxSk);\n })\n .then(function (salt) {\n recover.salt = salt;\n return CryptoUtils.box.open(recover.cypherPwd, nonce, recover.keypair.boxPk, recover.keypair.boxSk);\n })\n .then(function (pwd) {\n recover.pwd = pwd;\n return recover;\n })\n .catch(function(err){\n console.warn('Incorrect answers: unable to recover identifiers', err);\n throw new Error('Incorrect answers: unable to recover identifiers');\n });\n },\n\n getSaveIDDocument = function(record) {\n var saveId = 'Version: 10 \\n' +\n 'Type: SaveID\\n' +\n 'Questions: ' + '\\n' + record.questions +\n 'Issuer: ' + data.pubkey + '\\n' +\n 'Crypted-Nonce: '+ record.nonce + '\\n'+\n 'Crypted-Pubkey: '+ record.pubkey +'\\n' +\n 'Crypted-Salt: '+ record.salt + '\\n' +\n 'Crypted-Pwd: '+ record.pwd + '\\n';\n\n // Sign SaveId document\n return CryptoUtils.sign(saveId, data.keypair)\n\n .then(function(signature) {\n saveId += signature + '\\n';\n console.debug('Has generate an SaveID document:\\n----\\n' + saveId + '----');\n return saveId;\n });\n\n },\n\n downloadSaveId = function(record){\n return getSaveIDDocument(record)\n .then(function(saveId) {\n var saveIdFile = new Blob([saveId], {type: 'text/plain; charset=utf-8'});\n FileSaver.saveAs(saveIdFile, '{0}-recover_ID.txt'.format(data.pubkey.substring(0,8)));\n });\n },\n\n downloadKeyFile = function(format){\n if (!isAuth()) return $q.reject('user not authenticated');\n\n return $q.all([\n csCurrency.get(),\n csCrypto.keyfile.generateContent(data.keypair,\n {\n type: format,\n password: function() {\n UIUtils.loading.hide();\n return Modals.showPassword({\n title: 'ACCOUNT.SECURITY.KEYFILE.PASSWORD_POPUP.TITLE',\n subTitle: 'ACCOUNT.SECURITY.KEYFILE.PASSWORD_POPUP.HELP'\n })\n .then(function(password) {\n return UIUtils.loading.show(10)\n .then(function(){\n return password;\n });\n });\n }\n })\n ])\n .then(function(res) {\n var currency = res[0];\n var document = res[1];\n return $translate('ACCOUNT.SECURITY.KEYFILE_FILENAME', {\n currency: currency.name,\n pubkey: data.pubkey,\n format: format,\n })\n .then(function(filename){\n var file = new Blob([document], {type: 'text/plain; charset=utf-8'});\n FileSaver.saveAs(file, filename);\n });\n });\n\n },\n\n getRevocationDocument = function() {\n return $q.all([\n getKeypair(),\n csCurrency.get()\n ])\n\n .then(function(res) {\n var keypair = res[0];\n var currency = res[1];\n // get the Identity document\n return getIdentityDocument(currency, keypair)\n\n // Create membership document (unsigned)\n .then(function(identity){\n var identityLines = identity.trim().split('\\n');\n var idtySignature = identityLines[identityLines.length-1];\n\n var revocation = 'Version: '+ constants.REVOKE_VERSION +'\\n' +\n 'Type: Revocation\\n' +\n 'Currency: ' + currency.name + '\\n' +\n 'Issuer: ' + data.pubkey + '\\n' +\n 'IdtyUniqueID: ' + data.uid + '\\n' +\n 'IdtyTimestamp: ' + data.blockUid + '\\n' +\n 'IdtySignature: ' + idtySignature + '\\n';\n\n\n // Sign revocation document\n return CryptoUtils.sign(revocation, keypair)\n\n // Add revocation to document\n .then(function(signature) {\n revocation += signature + '\\n';\n console.debug('Has generate an revocation document:\\n----\\n' + revocation + '----');\n return revocation;\n });\n });\n });\n },\n\n /**\n * Send a revocation\n */\n revoke = function() {\n\n // Clear old events\n cleanEventsByContext('revocation');\n\n // Get revocation document\n return getRevocationDocument()\n // Send revocation document\n .then(function(revocation) {\n return BMA.wot.revoke({revocation: revocation});\n })\n\n // Reload requirements\n .then(function() {\n\n return $timeout(function() {\n return loadRequirements(false/*no cache*/);\n }, 1000); // waiting for node to process membership doc\n })\n\n // Add wallet events\n .then(addEvents)\n\n .catch(function(err) {\n if (err && err.ucode == BMA.errorCodes.REVOCATION_ALREADY_REGISTERED) {\n // Already registered by node: just add an event\n addEvent({type:'pending', message: 'INFO.REVOCATION_SENT_WAITING_PROCESS', context: 'requirements'}, true);\n }\n else {\n throw err;\n }\n })\n ;\n },\n\n revokeWithFile = function(revocation){\n return $q.all([\n BMA.wot.revoke({revocation: revocation})\n ])\n // Reload requirements\n .then(function(res) {\n if (isLogin()) {\n return $timeout(function () {\n return loadRequirements(false/*no cache*/);\n }, 1000) // waiting for node to process membership doc\n\n // Add wallet events\n .then(addEvents)\n\n .catch(function (err) {\n if (err && err.ucode == BMA.errorCodes.REVOCATION_ALREADY_REGISTERED) {\n // Already registered by node: just add an event\n addEvent({type: 'pending', message: 'INFO.REVOCATION_SENT_WAITING_PROCESS', context: 'requirements'}, true);\n }\n else {\n throw err;\n }\n });\n }\n else {\n addEvent({type: 'pending', message: 'INFO.REVOCATION_SENT_WAITING_PROCESS', context: 'requirements'}, true);\n }\n });\n\n },\n\n downloadRevocation = function(){\n return $q.all([\n csCurrency.get(),\n getRevocationDocument()\n ])\n .then(function(res) {\n var currency = res[0];\n var revocation = res[1];\n var revocationFile = new Blob([revocation], {type: 'text/plain; charset=utf-8'});\n return $translate('ACCOUNT.SECURITY.REVOCATION_FILENAME', {\n uid: data.uid,\n currency: currency.name,\n pubkey: data.pubkey\n })\n .then(function (fileName) {\n FileSaver.saveAs(revocationFile, fileName);\n });\n });\n },\n\n cleanEventsByContext = function(context){\n data.events = data.events.reduce(function(res, event) {\n if (event.context && event.context == context) return res;\n return res.concat(event);\n },[]);\n },\n\n /* -- children wallets -- */\n\n setParentWallet = function(parentWallet) {\n listeners = listeners || [];\n var listener;\n _.forEach(['load', 'reset'], function(method) {\n listener = api.data.on[method]($rootScope, function(data, deferred) {\n deferred = deferred || $q.defer();\n parentWallet.api.data.raisePromise[method](data)\n .then(deferred.resolve)\n .catch(deferred.reject);\n return deferred.promise;\n }, this);\n listeners.push(listener);\n });\n\n // Unauth when parent wallet unauth\n listener = parentWallet.api.data.on.unauth($rootScope, function() {\n if (isAuth()) unauth();\n }, this);\n listeners.push(listener);\n },\n\n createNewChildWallet = function(options) {\n var wallet = newChildInstance();\n addChildWallet(wallet, options);\n return wallet;\n },\n\n addChildWallet = function(wallet, options) {\n // Link to parent\n wallet.children.setParent(exports); // = link to self wallet\n\n data.children = data.children || [];\n data.children.push(wallet);\n\n // Store (store children locally)\n if (!options || angular.isUndefined(options.store) || options.store) {\n return storeData();\n }\n return $q.when();\n },\n\n removeAllChildrenWallets = function(options) {\n\n // stop/unauth all existing wallets\n if (!options || options.stop) {\n _.forEach(data.children || [], function(wallet){\n wallet.stop();\n });\n }\n var removedChildren = data.children.splice(0, data.children.length);\n\n // Store (store children locally)\n if (!options || angular.isUndefined(options.store) || options.store) {\n return storeData();\n }\n return removedChildren;\n\n },\n\n removeChildWalletById = function(id, options) {\n data.children = data.children || [];\n var childIndex = _.findIndex(data.children, function(child) {return child.id === id;});\n if (childIndex === -1) {\n console.warn('[wallet] Unable to remove child wallet {{0}} (not found)'.format(id));\n throw new Error('Wallet with id {{0}} not found'.format(id));\n }\n // Remove the wallet, and return it\n var wallet = data.children.splice(childIndex, 1)[0];\n\n // Force to stop without calling api\n wallet.stop();\n\n // Store (store children locally)\n if (!options || options.store !== false) {\n return storeData();\n }\n return $q.when();\n },\n\n getChildWalletById = function(id) {\n return (id !== 'default') && _.find(data.children|| [], function(child) {return child.id === +id;}) || undefined;\n },\n\n getChildWalletByPubkey = function(pubkey) {\n return _.find(data.children|| [], function(child) {return child.isUserPubkey(pubkey);});\n },\n\n hasChildrenWithPubkey = function(pubkey) {\n return !!getChildWalletByPubkey(pubkey);\n },\n\n getChildrenWalletCount = function() {\n return angular.isDefined(data.childrenCount) ? data.childrenCount : (data.children && data.children.length || 0);\n },\n\n newChildInstance = function() {\n // Return max(id) + 1\n var walletId = (data.children || []).reduce(function(res, wallet) {\n return Math.max(res, wallet.id);\n }, 0) + 1;\n return service.instance(walletId, BMA);\n },\n\n getAllChildrenWallet = function() {\n return openEncryptedData()\n .then(function() {\n return data.children;\n });\n },\n\n getAllPubkeys = function() {\n if (!data.pubkey) throw new Error('User not login!');\n return (data.children || []).reduce(function(res, wallet) {\n return wallet.data.pubkey ? res.concat(wallet.data.pubkey) : res;\n }, [data.pubkey]);\n },\n\n getByPubkey = function(pubkey) {\n if (!pubkey) throw new Error(\"Missing 'pubkey' argument !\");\n if (!data.pubkey) throw new Error('User not login!');\n if (data.pubkey === pubkey) return exports; // main wallet\n return getChildWalletByPubkey(pubkey);\n },\n\n downloadChildrenWalletFile = function() {\n return $q.all([\n getAllChildrenWallet(),\n csCurrency.get()\n ])\n .then(function(res) {\n var children = res[0];\n var currency = res[1];\n var content = (children||[]).reduce(function(res, wallet) {\n return res + [wallet.data.pubkey, wallet.data.uid, wallet.data.localName||wallet.data.name].join('\\t') + '\\n';\n }, '');\n var file = new Blob([content], {type: 'text/plain; charset=utf-8'});\n return $translate('ACCOUNT.WALLET_LIST.EXPORT_FILENAME', {\n pubkey: data.pubkey,\n currency: currency.name,\n })\n .then(function (fileName) {\n FileSaver.saveAs(file, fileName);\n });\n });\n },\n\n /* -- END children wallets -- */\n\n openEncryptedData = function(options) {\n if (!hasEncryptedData()) return $q.when();\n if (!isAuth()) return auth().then(openEncryptedData); // Force auth if need\n\n // Open encrypted data\n return CryptoUtils.box.keypair.fromSignKeypair(data.keypair)\n .then(function(keypair) {\n var nonce = CryptoUtils.util.decode_base58(data.encryptedData.nonce);\n return CryptoUtils.box.open(data.encryptedData.content, nonce, keypair.boxPk, keypair.boxSk);\n })\n // Then apply\n .then(function(content) {\n data.encryptedData = null; // reset encrypted data\n var promise = applyRestoredData(JSON.parse(content));\n\n // Store (store data into session storage)\n if (!options || angular.isUndefined(options.store) || options.store) {\n promise.then(function() {\n return storeData();\n });\n }\n\n return promise;\n })\n ;\n },\n\n /**\n * De-serialize from JSON string\n */\n fromJson = function(json, failIfInvalid) {\n failIfInvalid = angular.isUndefined(failIfInvalid) ? true : failIfInvalid;\n return $q(function(resolve, reject) {\n var obj;\n try {\n obj = JSON.parse(json || '{}');\n }\n catch(err) { /* invalid JSON : continue*/}\n\n // FIXME #379\n /*if (obj && obj.pubkey) {\n resolve({\n pubkey: obj.pubkey\n });\n }\n else */\n if (obj && obj.keypair && obj.keypair.signPk && obj.keypair.signSk) {\n var keypair = {};\n var i;\n\n // sign Pk : Convert to Uint8Array type\n var signPk = new Uint8Array(32);\n for (i = 0; i < 32; i++) signPk[i] = obj.keypair.signPk[i];\n keypair.signPk = signPk;\n\n var signSk = new Uint8Array(64);\n for (i = 0; i < 64; i++) signSk[i] = obj.keypair.signSk[i];\n keypair.signSk = signSk;\n\n // box Pk : Convert to Uint8Array type\n if (obj.version && obj.keypair.boxPk) {\n var boxPk = new Uint8Array(32);\n for (i = 0; i < 32; i++) boxPk[i] = obj.keypair.boxPk[i];\n keypair.boxPk = boxPk;\n }\n\n if (obj.version && obj.keypair.boxSk) {\n var boxSk = new Uint8Array(32);\n for (i = 0; i < 64; i++) boxSk[i] = obj.keypair.boxSk[i];\n keypair.boxSk = boxSk;\n }\n\n resolve({\n pubkey: obj.pubkey,\n keypair: keypair,\n tx: obj.tx\n });\n }\n else if (failIfInvalid) {\n reject('Not a valid Wallet.data object');\n }\n else {\n resolve();\n }\n });\n },\n\n checkAuthIdle = function(isAuthResult) {\n isAuthResult = angular.isDefined(isAuthResult) ? isAuthResult : isAuth();\n var newEnableAuthIdle = isAuthResult && settings && settings.keepAuthIdle > 0 && settings.keepAuthIdle != csSettings.constants.KEEP_AUTH_IDLE_SESSION;\n var changed = (enableAuthIdle != newEnableAuthIdle);\n\n // need start/top watching\n if (changed) {\n // start idle\n if (newEnableAuthIdle) {\n console.debug(\"[wallet] Start idle (delay: {0}s)\".format(settings.keepAuthIdle));\n Idle.setIdle(settings.keepAuthIdle);\n Idle.watch();\n }\n // stop idle, if was enable\n else if (enableAuthIdle){\n console.debug(\"[wallet] Stop idle\");\n Idle.unwatch();\n }\n enableAuthIdle = newEnableAuthIdle;\n }\n\n // if idle time changed: apply it\n else if (newEnableAuthIdle && Idle.getIdle() !== settings.keepAuthIdle) {\n console.debug(\"[idle] Updating auth idle (delay: {0}s)\".format(settings.keepAuthIdle));\n Idle.setIdle(settings.keepAuthIdle);\n }\n\n // Make sure to store seckey, in the session storage for secret key -fix #372\n var storeSecKey = isAuthResult && settings && settings.keepAuthIdle == csSettings.constants.KEEP_AUTH_IDLE_SESSION && true;\n if (storeSecKey) {\n sessionStorage.put(constants.STORAGE_SECKEY, CryptoUtils.util.encode_base58(data.keypair.signSk));\n }\n // Make sure to clean previous seckey, if exists in session storage\n else if (changed) {\n sessionStorage.put(constants.STORAGE_SECKEY, null);\n }\n };\n\n function getWalletSettings(settings) {\n return settings && {\n useLocalStorage: settings.useLocalStorage,\n useLocalStorageEncryption: settings.useLocalStorageEncryption,\n rememberMe: settings.rememberMe,\n keepAuthIdle: settings.keepAuthIdle\n };\n }\n\n function onSettingsChanged(allSettings) {\n var newSettings = getWalletSettings(allSettings);\n var hasChanged = !angular.equals(settings, newSettings);\n if (!hasChanged || !settings) return; // skip\n\n var useEncryptionChanged = !angular.equals(settings.useLocalStorageEncryption, newSettings.useLocalStorageEncryption);\n var useStorageChanged = !angular.equals(settings.useLocalStorage, newSettings.useLocalStorage) || useEncryptionChanged;\n var keepAuthIdleChanged = !angular.equals(settings.keepAuthIdle, newSettings.keepAuthIdle);\n\n settings = newSettings;\n\n if (keepAuthIdleChanged) {\n checkAuthIdle();\n }\n\n // Local storage option changed\n if (useStorageChanged) {\n\n // If disabled, then reset the store\n if (!settings.useLocalStorage) {\n resetStore(data.pubkey);\n }\n // If storage enable\n else {\n // Store login data\n return store()\n .then(function() {\n\n // Encryption enable: auth before saving data\n if (data.childrenCount > 0 && useEncryptionChanged && settings.useLocalStorageEncryption) {\n return auth({minData: true, silent: true})\n .catch(function(err){\n // user not auth: revert encryption to false\n if (err === 'CANCELLED') {\n csSettings.apply({useLocalStorageEncryption: false});\n return csSettings.store();\n }\n else {\n throw err;\n }\n });\n }\n })\n\n // Store other data (children wallet, ...)\n .then(storeData);\n }\n }\n }\n\n function addListeners() {\n listeners = [\n // Listen if settings changed\n csSettings.api.data.on.changed($rootScope, onSettingsChanged, this),\n // Listen if node changed\n BMA.api.node.on.restart($rootScope, restart, this)\n ];\n\n $rootScope.$on('IdleStart', unauth);\n }\n\n function addListener(listener) {\n listeners = listeners || [];\n listeners.push(listener);\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function ready() {\n if (started) return $q.when();\n return startPromise || start();\n }\n\n function stop() {\n console.debug('[wallet] Stopping...');\n removeListeners();\n resetData();\n }\n\n function restart() {\n stop();\n return $timeout(start, 200);\n }\n\n function start(options) {\n options = options || {};\n // By default, restore if the service is the default object\n options.restore = angular.isDefined(options.restore) ? options.restore : (id === 'default');\n\n console.debug('[wallet] Starting...');\n var now = Date.now();\n\n startPromise = $q.all([\n csSettings.ready()\n .then(function() {\n settings = getWalletSettings(csSettings.data);\n }),\n csCurrency.ready(),\n BMA.ready()\n ]);\n\n // Restore\n if (options.restore) startPromise = startPromise.then(restore);\n\n // Emit ready event\n startPromise.then(function() {\n addListeners();\n\n console.debug('[wallet] Started in ' + (Date.now() - now) + 'ms');\n\n started = true;\n startPromise = null;\n })\n .then(function(){\n return data;\n });\n\n return startPromise;\n }\n\n // Register extension points\n api.registerEvent('data', 'init');\n api.registerEvent('data', 'loginCheck'); // allow to stop the login process\n api.registerEvent('data', 'login'); // executed after login check (cannot stop the login process)\n api.registerEvent('data', 'auth');\n api.registerEvent('data', 'unauth');\n api.registerEvent('data', 'load');\n api.registerEvent('data', 'logout');\n api.registerEvent('data', 'reset');\n api.registerEvent('data', 'store');\n\n api.registerEvent('error', 'send');\n\n // Data changed : balance changed, new TX\n api.registerEvent('data', 'balanceChanged');\n api.registerEvent('data', 'newTx');\n\n api.registerEvent('action', 'certify');\n\n\n // init data\n resetData(true);\n\n // Override default store/restore function, when not the 'default' wallet\n if (id !== \"default\") {\n //start = $q.when;\n //started = true;\n store = $q.when;\n restore = $q.when;\n restoreData = $q.when;\n //checkAuthIdle = function(){};\n }\n\n exports = {\n id: id,\n data: data,\n ready: ready,\n start: start,\n stop: stop,\n // auth\n login: login,\n logout: logout,\n auth: auth,\n unauth: unauth,\n isLogin: isLogin,\n isAuth: isAuth,\n getKeypair: getKeypair,\n hasSelf: hasSelf,\n setSelf: setSelf,\n isMember: function() {\n return data.isMember;\n },\n isDataLoaded : isDataLoaded,\n isDefault: isDefault,\n isNeverUsed: isNeverUsed,\n isNew: isNew,\n isUserPubkey: isUserPubkey,\n getData: getData,\n loadData: loadData,\n refreshData: refreshData,\n loadQrCode: loadQrCode,\n // internal\n internal: {\n addListener: addListener,\n removeListeners: removeListeners\n },\n // local storage\n store: store,\n storeData: storeData, // store children wallet, readTime, etc.\n // operations\n transfer: transfer,\n transferAll: transferAll,\n self: self,\n revoke: revoke,\n revokeWithFile: revokeWithFile,\n certify: certify,\n downloadSaveId: downloadSaveId,\n getCryptedId: getCryptedId,\n recoverId: recoverId,\n downloadRevocation: downloadRevocation,\n downloadKeyFile: downloadKeyFile,\n pubkeys: getAllPubkeys,\n getByPubkey: getByPubkey,\n membership: {\n inside: membership(true),\n out: membership(false)\n },\n events: {\n add: addEvent,\n cleanByContext: cleanEventsByContext\n },\n children: {\n create: createNewChildWallet,\n add: addChildWallet,\n remove: removeChildWalletById,\n get: getChildWalletById,\n getByPubkey: getChildWalletByPubkey,\n all: getAllChildrenWallet,\n setParent: setParentWallet,\n count: getChildrenWalletCount,\n hasPubkey: hasChildrenWithPubkey,\n instance: newChildInstance,\n downloadFile: downloadChildrenWalletFile\n },\n api: api\n };\n return exports;\n }\n\n service = CsWallet('default', BMA);\n service.instance = CsWallet;\n\n return service;\n}]);\n","angular.module('cesium.help.services', [])\n\n.constant('csHelpConstants', {\n wallet: {\n stepCount: 4\n }\n})\n\n.factory('csHelp', ['$rootScope', 'csSettings', 'UIUtils', 'csHelpConstants', '$controller', function($rootScope, csSettings, UIUtils, csHelpConstants, $controller) {\n 'ngInject';\n\n\n function createHelptipScope(isTour, helpController) {\n if (!isTour && ($rootScope.tour || !csSettings.data.helptip.enable || UIUtils.screen.isSmall())) {\n return; // avoid other helptip to be launched (e.g. csWallet)\n }\n // Create a new scope for the tour controller\n var helptipScope = $rootScope.$new();\n $controller(helpController||'HelpTipCtrl', { '$scope': helptipScope});\n return helptipScope;\n }\n\n function startWalletHelpTip(index, isTour) {\n index = angular.isDefined(index) ? index : csSettings.data.helptip.wallet;\n isTour = angular.isDefined(isTour) ? isTour : false;\n\n if (index < 0 || index >= csHelpConstants.wallet.stepCount) return;\n\n // Create a new scope for the tour controller\n var helptipScope = createHelptipScope(isTour);\n if (!helptipScope) return; // could be undefined, if a global tour already is already started\n\n helptipScope.tour = isTour;\n\n return helptipScope.startWalletTour(index, false)\n .then(function(endIndex) {\n helptipScope.$destroy();\n if (!isTour) {\n csSettings.data.helptip.wallet = endIndex;\n csSettings.store();\n }\n });\n }\n\n return {\n wallet: {\n tour: function() {\n return startWalletHelpTip(0, true);\n },\n helptip: startWalletHelpTip\n }\n };\n\n}]);\n","\n\nangular.module('cesium.plugin.services', [])\n\n.provider('PluginService', function PluginServiceProvider() {\n 'ngInject';\n\n var eagerLoadingServices = [];\n\n var extensionByStates = {};\n\n this.registerEagerLoadingService = function(serviceName) {\n eagerLoadingServices.push(serviceName);\n return this;\n };\n\n this.extendState = function(stateName, extension) {\n if (angular.isDefined(stateName) && angular.isDefined(extension)) {\n if (!extensionByStates[stateName]) {\n extensionByStates[stateName] = [];\n }\n extensionByStates[stateName].push(extension);\n }\n return this;\n };\n\n this.extendStates = function(stateNames, extension) {\n var that = this;\n stateNames.forEach(function(stateName) {\n that.extendState(stateName, extension);\n });\n return this;\n };\n\n this.$get = ['$injector', '$state', function($injector, $state) {\n\n var currentExtensionPointName;\n\n function start() {\n if (eagerLoadingServices.length>0) {\n _.forEach(eagerLoadingServices, function(name) {\n $injector.get(name);\n });\n }\n }\n\n function getActiveExtensionPointsByName(extensionPointName) {\n var extensions = _.keys(extensionByStates).reduce(function(res, stateName){\n return $state.includes(stateName) ? res.concat(extensionByStates[stateName]) : res;\n }, []);\n return extensions.reduce(function(res, extension){\n return extension.points && extension.points[extensionPointName] ? res.concat(extension.points[extensionPointName]) : res;\n }, []);\n }\n\n function setCurrentExtensionPointName(extensionPointName) {\n currentExtensionPointName = extensionPointName;\n }\n\n function getCurrentExtensionPointName() {\n return currentExtensionPointName;\n }\n\n return {\n start: start,\n extensions: {\n points: {\n getActivesByName: getActiveExtensionPointsByName,\n current: {\n get: getCurrentExtensionPointName,\n set: setCurrentExtensionPointName\n }\n }\n }\n };\n }];\n})\n;\n","angular.module('cesium.services', [\n // removeIf(device)\n 'cesium.desktop.services',\n // endRemoveIf(device)\n 'cesium.settings.services',\n 'cesium.http.services',\n 'cesium.network.services',\n 'cesium.bma.services',\n 'cesium.crypto.services',\n 'cesium.utils.services',\n 'cesium.modal.services',\n 'cesium.storage.services',\n 'cesium.device.services',\n 'cesium.currency.services',\n 'cesium.wot.services',\n 'cesium.tx.services',\n 'cesium.wallet.services',\n 'cesium.help.services',\n 'cesium.plugin.services'\n ])\n;\n","\nangular.module('cesium.controllers', [\n 'cesium.app.controllers',\n 'cesium.join.controllers',\n 'cesium.login.controllers',\n 'cesium.help.controllers',\n 'cesium.wallet.controllers',\n 'cesium.wallets.controllers',\n 'cesium.currency.controllers',\n 'cesium.wot.controllers',\n 'cesium.transfer.controllers',\n 'cesium.settings.controllers',\n 'cesium.network.controllers',\n 'cesium.blockchain.controllers'\n ])\n;\n","angular.module('cesium.templates', []).run(['$templateCache', function($templateCache) {$templateCache.put('templates/api/doc.html','<h2 class=\"padding\" translate>API.DOC.TRANSFER.TITLE</h2><div class=\"list padding no-padding-xs no-padding-top\"><div class=\"item item-divider no-border\"><p translate>API.DOC.DESCRIPTION_DIVIDER</p></div><div class=\"item item-text-wrap\"><p translate>API.DOC.TRANSFER.DESCRIPTION</p></div><div class=\"item item-divider no-border\"><p translate>API.DOC.URL_DIVIDER</p></div><div class=\"item item-text-wrap\"><p class=\"gray text-right\">{{$root.rootPath}}#/v1/payment/:pubkey?amount=<span class=\"text-italic\" translate>API.DOC.TRANSFER.PARAM_AMOUNT</span></p></div><div class=\"item item-divider no-border\"><p translate>API.DOC.PARAMETERS_DIVIDER</p></div><div class=\"item item-text-wrap\"><p translate>API.DOC.AVAILABLE_PARAMETERS</p><div class=\"row\"><div class=\"col col-20 text-italic\">pubkey</div><div class=\"col gray\" translate>API.DOC.TRANSFER.PARAM_PUBKEY_HELP</div></div><div class=\"row stable-bg\"><div class=\"col col-20 text-italic dark\">amount</div><div class=\"col gray\" translate>API.DOC.TRANSFER.PARAM_AMOUNT_HELP</div></div><div class=\"row\"><div class=\"col col-20 text-italic\">comment</div><div class=\"col gray\" translate>API.DOC.TRANSFER.PARAM_COMMENT_HELP</div></div><div class=\"row stable-bg\"><div class=\"col col-20 text-italic dark\">name</div><div class=\"col gray\" translate>API.DOC.TRANSFER.PARAM_NAME_HELP</div></div><div class=\"row\"><div class=\"col col-20 text-italic\">preferred_node</div><div class=\"col gray\" translate>API.DOC.TRANSFER.PARAM_PREFERRED_NODE_HELP</div></div><div class=\"row stable-bg\"><div class=\"col col-20 text-italic dark\">redirect_url</div><div class=\"col gray\" translate>API.DOC.TRANSFER.PARAM_REDIRECT_URL_HELP</div></div><div class=\"row\"><div class=\"col col-20 text-italic\">cancel_url</div><div class=\"col gray\" translate>API.DOC.TRANSFER.PARAM_CANCEL_URL_HELP</div></div></div><div class=\"item item-divider no-border\"><p translate>API.DOC.DEMO_DIVIDER</p></div><div class=\"item item-button-right item-text-wrap padding-bottom\"><p class=\"item-icon-right-padding\" translate>API.DOC.DEMO_HELP</p><span class=\"badge\" ng-if=\"loading\"><ion-spinner class=\"icon\" icon=\"android\"></ion-spinner></span><a ng-if=\"!loading\" href=\"{{transferDemoUrl}}\" class=\"button button-raised button-positive icon ion-play\"></a></div><div class=\"item item-text-wrap\" ng-if=\"result.type === \\'payment\\' && !result.cancelled\"><h2 class=\"text-right balanced\" translate>API.DOC.DEMO_SUCCEED</h2><h4 class=\"gray\" translate>API.DOC.DEMO_RESULT</h4><p class=\"balanced-100-bg padding dark text-keep-lines\">{{result.content}}</p><h4 class=\"gray\"><span translate>API.DOC.DEMO_RESULT_PEER</span> <b>{{result.node}}</b></h4></div><div class=\"item item-text-wrap\" ng-if=\"result.type === \\'payment\\' && result.cancelled\"><h2 class=\"text-right assertive\" translate>API.DOC.DEMO_CANCELLED</h2></div><div class=\"item item-divider no-border\"><p translate>API.DOC.INTEGRATE_DIVIDER</p></div><div class=\"item item-text-wrap\"><p translate>API.DOC.TRANSFER.EXAMPLES_HELP</p><div class=\"row responsive-sm\"><div class=\"col col-20 text-italic\"><span translate>API.DOC.TRANSFER.EXAMPLE_BUTTON</span></div><div class=\"col gray no-border\"><p><i class=\"icon ion-code\"></i> <span translate>API.DOC.INTEGRATE_CODE</span></p><div class=\"item item-input\"><textarea class=\"gray\" select-on-click rows=\"5\" ng-model=\"transferButton.html\" ng-model-options=\"{ debounce: 650 }\"></textarea></div><p class=\"padding-top\"><i class=\"icon ion-eye\"></i> <span translate>API.DOC.INTEGRATE_RESULT</span></p><div class=\"padding-left\" bind-notifier=\"{ notifierKey:watchedExpression }\"><ng-bind-html ng-bind-html=\"transferButton.html|trustAsHtml\"></ng-bind-html></div></div></div><div class=\"row responsive-sm\"><div class=\"col col-20 hidden-xs hidden-sm\">&nbsp;</div><div class=\"col gray no-border\"><p class=\"padding-top\"><a class=\"positive\" ng-click=\"transferButton.showParameters=!transferButton.showParameters\"><i class=\"icon ion-wrench\"></i> <span translate>API.DOC.INTEGRATE_PARAMETERS</span> <i class=\"icon\" ng-class=\"{\\'ion-arrow-down-b\\': !transferButton.showParameters, \\'ion-arrow-up-b\\': transferButton.showParameters}\"></i></a></p><div ng-if=\"transferButton.showParameters\" class=\"padding-left\"><form id=\"transferForm\" class=\"stable-bg padding\"><p class=\"padding-top\"><i class=\"icon ion-key\"></i> {{\\'API.DOC.TRANSFER.PARAM_PUBKEY\\' | translate}} :</p><label class=\"item item-input\"><input type=\"text\" autocomplete=\"off\" ng-model=\"transferData.pubkey\" ng-model-options=\"{ debounce: 650 }\" placeholder=\"{{\\'API.DOC.TRANSFER.PARAM_PUBKEY_HELP\\'|translate}}\"></label><p class=\"padding-top\"><i class=\"icon ion-pricetag\"></i> {{\\'API.DOC.TRANSFER.PARAM_AMOUNT\\' | translate}} :</p><label class=\"item item-input\"><input type=\"text\" autocomplete=\"off\" ng-model=\"transferData.amount\" ng-model-options=\"{ debounce: 650 }\" placeholder=\"{{\\'API.DOC.TRANSFER.PARAM_AMOUNT_HELP\\'|translate}}\"></label><p class=\"padding-top\"><i class=\"icon ion-flag\"></i> {{\\'API.DOC.TRANSFER.PARAM_COMMENT\\' | translate}} :</p><label class=\"item item-input\"><input type=\"text\" autocomplete=\"off\" ng-model=\"transferData.comment\" placeholder=\"{{\\'API.DOC.TRANSFER.PARAM_COMMENT\\'|translate}}\"></label><p class=\"padding-top\"><i class=\"icon ion-ios-world-outline\"></i> {{\\'API.DOC.TRANSFER.PARAM_NAME\\' | translate}} :</p><label class=\"item item-input\"><input type=\"text\" ng-model=\"transferData.name\" ng-model-options=\"{ debounce: 650 }\" placeholder=\"{{\\'API.DOC.TRANSFER.PARAM_NAME\\'|translate}}\"></label><p class=\"padding-top\"><i class=\"icon ion-key\"></i> {{\\'API.DOC.TRANSFER.PARAM_PREFERRED_NODE\\' | translate}} :</p><label class=\"item item-input\"><input type=\"text\" ng-model=\"transferData.preferred_node\" ng-model-options=\"{ debounce: 650 }\" placeholder=\"{{\\'API.DOC.TRANSFER.PARAM_PREFERRED_NODE_HELP\\'|translate}}\"></label><p class=\"padding-top\"><i class=\"icon ion-arrow-return-left\"></i> {{\\'API.DOC.TRANSFER.PARAM_REDIRECT_URL\\' | translate}} :</p><label class=\"item item-input\"><input type=\"text\" ng-model=\"transferData.redirect_url\" ng-model-options=\"{ debounce: 650 }\" placeholder=\"{{\\'API.DOC.TRANSFER.PARAM_REDIRECT_URL\\'|translate}}\"></label><p class=\"padding-top\"><i class=\"icon ion-backspace\"></i> {{\\'API.DOC.TRANSFER.PARAM_CANCEL_URL\\' | translate}} :</p><label class=\"item item-input\"><input type=\"text\" ng-model=\"transferData.cancel_url\" ng-model-options=\"{ debounce: 650 }\" placeholder=\"{{\\'API.DOC.TRANSFER.PARAM_CANCEL_URL\\'|translate}}\"></label><p class=\"padding-top\"><a class=\"positive\" ng-click=\"transferButton.style.enable=!transferButton.style.enable\"><i class=\"icon\" ng-class=\"{\\'ion-android-checkbox-outline\\': transferButton.style.enable, \\'ion-android-checkbox-outline-blank\\': !transferButton.style.enable}\"></i> <span translate>API.DOC.TRANSFER.EXAMPLE_BUTTON_DEFAULT_STYLE</span></a></p><div ng-if=\"transferButton.style.enable\"><p class=\"padding-top\"><i class=\"icon ion-image\"></i> {{\\'API.DOC.TRANSFER.EXAMPLE_BUTTON_TEXT_ICON\\' | translate}} :</p><label class=\"item item-input item-select\"><select class=\"stable-bg dark\" ng-model=\"transferButton.style.icon\" style=\"width: 100%; max-width: 100%;\" ng-options=\"l as (l.label | translate) for l in transferButton.icons track by l.filename\"></select></label><p class=\"padding-top\"><i class=\"icon ion-quote\"></i> {{\\'API.DOC.TRANSFER.EXAMPLE_BUTTON_TEXT_HELP\\' | translate}} :</p><label class=\"item item-input\"><input type=\"text\" ng-model=\"transferButton.style.text\" ng-model-options=\"{ debounce: 650 }\" placeholder=\"{{\\'API.DOC.TRANSFER.EXAMPLE_BUTTON_TEXT_HELP\\'|translate}}\"></label><p class=\"padding-top\"><i class=\"icon ion-paintbucket\"></i> {{\\'API.DOC.TRANSFER.EXAMPLE_BUTTON_BG_COLOR\\' | translate}} :</p><label class=\"item item-input\"><input type=\"text\" ng-model=\"transferButton.style.bgColor\" ng-model-options=\"{ debounce: 650 }\" placeholder=\"{{\\'API.DOC.TRANSFER.EXAMPLE_BUTTON_BG_COLOR_HELP\\'|translate}}\"></label><p class=\"padding-top\"><i class=\"icon ion-paintbrush\"></i> {{\\'API.DOC.TRANSFER.EXAMPLE_BUTTON_FONT_COLOR\\' | translate}} :</p><label class=\"item item-input\"><input type=\"text\" ng-model=\"transferButton.style.fontColor\" ng-model-options=\"{ debounce: 650 }\" placeholder=\"{{\\'API.DOC.TRANSFER.EXAMPLE_BUTTON_FONT_COLOR_HELP\\'|translate}}\"></label><p class=\"padding-top\"><i class=\"icon ion-ios-crop-strong\"></i> {{\\'API.DOC.TRANSFER.EXAMPLE_BUTTON_TEXT_WIDTH\\' | translate}} :</p><label class=\"item item-input\"><input type=\"text\" ng-model=\"transferButton.style.width\" ng-model-options=\"{ debounce: 650 }\" placeholder=\"{{\\'API.DOC.TRANSFER.EXAMPLE_BUTTON_TEXT_WIDTH_HELP\\'|translate}}\"></label></div></form></div></div></div></div></div>');\n$templateCache.put('templates/api/home.html','<ion-view class=\"circle-bg-dark\"><ion-nav-title><span class=\"title visible-xs visible-sm\" translate>API.HOME.TITLE</span></ion-nav-title><ion-nav-buttons side=\"right\"><button class=\"button button-clear hidden-xs hidden-sm flag\" ng-click=\"showLocalesPopover($event)\" style=\"align-content: center\"><i class=\"flag-image\" ng-if=\"$root.settings.locale\" style=\"background-image: url(../img/flag-{{$root.settings.locale.flag}}.png);\"></i> <b class=\"ion-arrow-down-b gray\"></b></button></ion-nav-buttons><ion-content class=\"no-padding-xs no-padding-sm positive-900-bg\"><br class=\"hidden-xs\"><div class=\"light text-center\"><h4 class=\"hidden-xs\" translate>API.HOME.MESSAGE</h4><h4 class=\"visible-xs padding\" translate>API.HOME.MESSAGE_SHORT</h4></div><br class=\"hidden-xs\"><div class=\"row no-padding-xs\"><div class=\"col col-20 hidden-xs hidden-sm\">&nbsp;</div><div class=\"col\"><div class=\"light-bg no-padding\"><ng-include src=\"::\\'templates/api/doc.html\\'\"></ng-include></div></div><div class=\"col col-20 hidden-xs hidden-sm text-center\" id=\"home\"><div style=\"display: block; width: 100%;\"><div class=\"logo\"></div><small class=\"gray padding-top\">v{{$root.config.version}}</small></div></div></div><p class=\"visible-xs visible-sm light padding-top text-center\">{{\\'COMMON.APP_NAME\\'|translate}} API - <a href=\"#\" ng-click=\"showAboutModal($event)\">v{{$root.config.version}}</a></p><p class=\"hidden-xs hidden-sm gray padding-top text-center\">{{\\'COMMON.APP_NAME\\'|translate}} API v{{$root.config.version}} - <a href=\"#\" ng-click=\"showAboutModal($event)\" title=\"{{\\'HOME.BTN_ABOUT\\'|translate}}\">{{\\'HOME.BTN_ABOUT\\'|translate}}</a> - <a href=\"../\" title=\"{{\\'API.COMMON.LINK_STANDARD_APP_HELP\\'|translate}}\">{{\\'API.COMMON.LINK_STANDARD_APP\\'|translate}}</a></p></ion-content></ion-view>');\n$templateCache.put('templates/api/menu.html','<ion-nav-bar class=\"bar-dark\" title-align=\"left\"><ion-nav-back-button class=\"no-text\"></ion-nav-back-button><ion-nav-buttons side=\"left\"></ion-nav-buttons><ion-nav-buttons side=\"right\"></ion-nav-buttons></ion-nav-bar><ion-nav-view name=\"menuContent\"></ion-nav-view>');\n$templateCache.put('templates/api/popover_locales.html','<ion-popover-view class=\"fit popover-locales\" style=\"height: {{locales.length*48}}px;\"><ion-content scroll=\"false\"><div class=\"list item-text-wrap block\"><a ng-repeat=\"l in locales track by l.id\" class=\"item item-icon-left ink\" ng-click=\"changeLanguage(l.id)\"><i class=\"item-image avatar\" style=\"background-image: url(../img/flag-{{l.flag}}.png)\"></i> {{l.label | translate}}</a></div></ion-content></ion-popover-view>');\n$templateCache.put('templates/api/transfer.html','<ion-view class=\"circle-bg-dark\"><ion-nav-buttons side=\"left\"><button class=\"button button-clear visible-xs\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button></ion-nav-buttons><ion-nav-title><span class=\"title visible-xs\" translate>API.TRANSFER.TITLE_SHORT</span></ion-nav-title><ion-nav-buttons side=\"right\"><button class=\"button button-clear hidden-xs hidden-sm gray\" ng-click=\"showLocalesPopover($event)\" style=\"align-content: center\"><img ng-hide=\"!$root.settings.locale.country\" ng-src=\"https://www.countryflags.io/{{$root.settings.locale.country}}/shiny/32.png\"> <span ng-hide=\"$root.settings.locale.country\">{{$root.settings.locale.label}}&nbsp;</span> <small class=\"ion-arrow-down-b\"></small></button> <button class=\"button button-positive button-icon button-clear icon ion-android-send visible-xs\" ng-click=\"doLogin()\"></button></ion-nav-buttons><ion-content class=\"no-padding-xs positive-900-bg\"><br class=\"hidden-xs\"><div class=\"row no-padding-xs\"><div class=\"col col-20 hidden-xs hidden-sm\">&nbsp;</div><div class=\"col no-padding-xs\"><div class=\"light-bg\"><h2 class=\"padding-top text-center hidden-xs\" translate>API.TRANSFER.TITLE</h2><div class=\"no-padding energized-100-bg\" ng-if=\"demo\"><div class=\"item item-icon-left item-text-wrap no-border\"><i class=\"icon ion-information-circled positive\"></i><p translate>API.TRANSFER.DEMO.HELP</p></div></div><div class=\"no-padding energized-100-bg\" ng-if=\"$root.config.demo\"><div class=\"item item-icon-left item-text-wrap no-border\"><i class=\"icon ion-android-alert assertive\"></i><p translate>MODE.DEMO.INSTALL_HELP</p></div></div><ng-include src=\"::\\'templates/login/form_login.html\\'\"></ng-include></div><br class=\"hidden-xs\"><br class=\"hidden-xs\"><div class=\"list padding no-padding-xs light-bg\"><div class=\"item\"><p translate>API.TRANSFER.SUMMARY</p></div><div class=\"item item-icon-left-padding item-tx no-border\" ng-if=\"!transferData.amounts\" style=\"min-height: 56px;\"><h2 translate>API.TRANSFER.AMOUNT</h2><ion-spinner class=\"badge item-note\" icon=\"android\" ng-show=\"loading\"></ion-spinner><div class=\"badge badge-calm ng-hide\" ng-show=\"!loading\" ng-bind-html=\"transferData.amount|formatAmount:{useRelative: false, currency: currency.name}\"></div><div class=\"badge badge-secondary ng-hide\" ng-show=\"!loading\" ng-bind-html=\"transferData.amount|formatAmount:{useRelative: true, currency: currency.name, currentUD: currency.currentUD}\"></div></div><label ng-if=\"transferData.amounts\" style=\"min-height: 58px;\" class=\"item item-icon-left-padding item-input item-select item-tx no-border\" ng-class=\"{ \\'item-input-error\\': form.$submitted && !transferData.amount}\"><div class=\"input-label\"><span translate>API.TRANSFER.AMOUNT</span><h4 class=\"assertive hidden-xs hidden-sm\" ng-if=\"!transferData.amount\"><span translate>API.TRANSFER.AMOUNTS_HELP</span></h4></div><select ng-model=\"transferData.amount\" required=\"true\" ng-options=\"(amount |formatAmount:{useRelative: false, currency: currency.name}) for amount in transferData.amounts\"></select> <span class=\"badge badge-secondary ng-hide\" ng-show=\"transferData.amount\" ng-bind-html=\"transferData.amount|formatAmount:{useRelative: true, currency: currency.name, currentUD: currency.currentUD}\"></span></label><div class=\"form-errors\" ng-if=\"form.$submitted && !transferData.amount\"><div class=\"form-error\"><span translate=\"ERROR.FIELD_REQUIRED\"></span></div></div><div class=\"item item-icon-left-padding\"><h2 translate>API.TRANSFER.NAME</h2><div class=\"badge item-note\">{{transferData.name}}</div></div><div class=\"item item-icon-left-padding item-text-wrap\"><h2 translate>API.TRANSFER.PUBKEY</h2><div class=\"badge\"><span class=\"hidden-xs\"><br class=\"visible-sm visible-md\"><i class=\"icon ion-key\"></i>{{transferData.pubkey}}</span> <span class=\"visible-xs\" copy-on-click=\"{{transferData.pubkey}}\"><br class=\"visible-xs\"><i class=\"icon ion-key\"></i> {{transferData.pubkey|formatPubkey}}</span></div></div><div class=\"item item-icon-left-padding\"><h2 translate>API.TRANSFER.COMMENT</h2><div class=\"badge item-note\"><span class=\"hidden-xs\"><br class=\"visible-sm visible-md\">{{::transferData.comment}}</span> <span class=\"visible-xs\" copy-on-click=\"{{transferData.comment}}\"><br>{{::transferData.comment}}</span></div></div><div class=\"item item-icon-left-padding\" ng-hide=\"error\"><h2 translate>API.TRANSFER.NODE</h2><div class=\"badge item-note\" ng-if=\"!loading\"><br class=\"visible-sm visible-md\"><i class=\"icon ion-locked\" ng-if=\"node.useSsl\"></i>&nbsp;{{node.server}}</div></div><div class=\"center padding animate-fade-in animate-show-hide ng-hide\" ng-show=\"!loading && error\"><div class=\"card card-item padding\"><p class=\"item-content item-text-wrap\"><i class=\"icon ion-android-alert assertive\"></i> <span class=\"dark\" trust-as-html=\"\\'API.COMMON.CONNECTION_ERROR\\'|translate:node\"></span></p><button type=\"button\" class=\"button button-positive icon icon-left ion-refresh ink\" ng-click=\"start()\">{{\\'COMMON.BTN_REFRESH\\'|translate}}</button></div></div><div class=\"padding-bottom visible-xs\">&nbsp;</div></div></div><div class=\"col col-20 hidden-xs hidden-sm text-center\" id=\"home\"><div style=\"display: block; width: 100%;\"><div class=\"logo text-center\"></div><small class=\"gray padding-top\">v{{$root.config.version}}</small></div></div></div><p class=\"visible-xs visible-sm light padding-top text-center\">{{\\'COMMON.APP_NAME\\'|translate}} - <a href=\"#\" ng-click=\"showAboutModal($event)\">v{{$root.config.version}}</a></p><p class=\"hidden-xs hidden-sm gray padding-top text-center\">{{\\'COMMON.APP_NAME\\'|translate}} API v{{$root.config.version}} - <a href=\"#\" ng-click=\"showAboutModal($event)\" title=\"{{\\'HOME.BTN_ABOUT\\'|translate}}\">{{\\'HOME.BTN_ABOUT\\'|translate}}</a> - <a ui-sref=\"app.home\" target=\"_system\" title=\"{{\\'API.COMMON.LINK_DOC_HELP\\'|translate}}\">{{\\'API.COMMON.LINK_DOC\\'|translate}}</a> - <a href=\"../\" title=\"{{\\'API.COMMON.LINK_STANDARD_APP_HELP\\'|translate}}\">{{\\'API.COMMON.LINK_STANDARD_APP\\'|translate}}</a></p></ion-content></ion-view>');\n$templateCache.put('templates/blockchain/item_block_empty_lg.html','<a name=\"block-{{::block.number}}\"></a><div id=\"block-{{::block.number}}\" class=\"item item-block item-icon-left item-block-empty\" ng-class=\":rebind:{\\'compacted\\': block.compacted && compactMode}\" ng-click=\"selectBlock(block)\"><div class=\"row no-padding\" ng-if=\":rebind:!block.compacted || !compactMode\"><div class=\"col\"><h3 class=\"gray\"><i class=\"ion-clock\"></i> {{:rebind:block.medianTime|medianDate}}</h3></div><div class=\"col\"><h3><span class=\"gray\" ng-if=\":rebind:expertMode\"><i class=\"ion-key\"></i> {{:rebind:block.issuer|formatPubkey}} </span><span class=\"positive\"><i class=\"ion-person\"></i> {{:rebind:block.name||block.uid}}</span></h3></div><div class=\"col col-20\"></div><div class=\"col col-20\"><span class=\"badge\" ng-class=\"{\\'badge-balanced\\': !$index && search.type==\\'last\\'}\">{{block.number|formatInteger}}</span></div></div></div>');\n$templateCache.put('templates/blockchain/item_block_lg.html','<ion-item id=\"block-{{::block.number}}\" class=\"item item-block item-icon-left ink {{::ionItemClass}}\" ng-class=\"{{::ionItemClass}}\" ng-click=\"selectBlock(block)\"><i class=\"icon ion-cube stable\" ng-if=\":rebind:!block.avatar\"></i> <i class=\"avatar\" ng-if=\":rebind:!block.empty && block.avatar\" style=\"background-image: url(\\'{{:rebind:block.avatar.src}}\\')\"></i><div class=\"row no-padding\"><div class=\"col\"><h3 class=\"dark\"><i class=\"ion-clock\"></i> {{:rebind:block.medianTime|medianDate}}</h3><h4 class=\"gray\">{{:rebind:\\'BLOCKCHAIN.HASH\\'|translate}} {{:rebind:block.hash|formatHash}}</h4></div><div class=\"col\"><h3><span class=\"gray\" ng-if=\":rebind:expertMode\"><i class=\"ion-key\"></i> {{:rebind:block.issuer|formatPubkey}} </span><span class=\"positive\"><i class=\"ion-person\"></i> {{:rebind:block.name||block.uid}}</span></h3></div><div class=\"col col-20\"><small><ng-if ng-if=\":rebind:block.joinersCount||(block.excludedCount-block.revokedCount)\"><i class=\"ion-person\"></i> <span ng-if=\":rebind:block.joinersCount\">+{{:rebind:block.joinersCount}}</span> <span ng-if=\":rebind:block.excludedCount\">-{{:rebind:block.excludedCount-block.revokedCount}}</span> &nbsp;&nbsp;</ng-if><span ng-if=\":rebind:block.revokedCount\" class=\"assertive\"><i class=\"ion-minus-circled\"></i> -{{:rebind:block.revokedCount}}&nbsp;&nbsp;</span> <span ng-if=\":rebind:block.activesCount\"><i class=\"ion-refresh\"></i> {{:rebind:block.activesCount}}&nbsp;&nbsp;</span> <span ng-if=\":rebind:block.certificationsCount\"><i class=\"ion-ribbon-a\"></i> {{:rebind:block.certificationsCount}}&nbsp;&nbsp;</span> <span ng-if=\":rebind:block.dividend\"><i class=\"gray ion-arrow-up-c\"></i> {{:rebind:\\'COMMON.UD\\'|translate}}&nbsp;&nbsp;</span> <span ng-if=\":rebind:block.transactionsCount\"><i class=\"ion-card\">{{:rebind:block.transactionsCount}}</i>&nbsp;&nbsp;</span></small></div><div class=\"col col-20\"><span class=\"badge\" ng-class=\"{\\'badge-balanced\\': !$index && search.type==\\'last\\', \\'badge-calm\\': ($index || search.type!=\\'last\\')&& !block.compacted && !block.empty}\">{{:rebind:block.number}}</span></div></div></ion-item>');\n$templateCache.put('templates/blockchain/item_block.html','<a name=\"block-{{::block.number}}\"></a><ion-item id=\"block-{{::block.number}}\" class=\"item item-icon-left item-block {{::ionItemClass}}\" ng-class=\":rebind:{\\'ink\\': !block.empty||!block.compacted, \\'item-block-empty\\': block.empty, \\'compacted\\': block.compacted && compactMode}\" ng-click=\"selectBlock(block)\"><i class=\"icon ion-cube stable\" ng-if=\"(!block.empty && !block.avatar)\"></i> <i class=\"avatar\" ng-if=\"!block.empty && block.avatar\" style=\"background-image: url(\\'{{block.avatar.src}}\\')\"></i><div class=\"row no-padding\" ng-if=\":rebind:!block.compacted || !compactMode\"><div class=\"col\" style=\"min-width: 110px; max-width: 130px;\"><h4 ng-class=\":rebind:{\\'gray\\': block.compacted, \\'dark\\': !block.compacted}\"><i class=\"ion-clock\"></i> {{:rebind:block.medianTime|medianDate}}</h4><h4 ng-if=\":rebind:!block.empty\"><ng-if ng-if=\":rebind:block.joinersCount||(block.excludedCount-block.revokedCount)\"><i class=\"dark ion-person\"></i> <span class=\"dark\" ng-if=\":rebind:block.joinersCount\">+{{:rebind:block.joinersCount}}</span> <span class=\"dark\" ng-if=\":rebind:block.excludedCount\">-{{:rebind:block.excludedCount-block.revokedCount}}</span></ng-if><span class=\"dark\" ng-if=\":rebind:block.revokedCount\" class=\"assertive\"><i class=\"ion-minus-circled\"></i> {{:rebind:block.revokedCount}}&nbsp;&nbsp;</span> <span class=\"dark\" ng-if=\":rebind:block.activesCount\" class=\"gray\"><i class=\"gray ion-refresh\"></i> {{:rebind:block.activesCount}}&nbsp;&nbsp;</span> <span class=\"dark\" ng-if=\":rebind:block.certificationsCount\"><i class=\"ion-ribbon-a\"></i> {{:rebind:block.certificationsCount}}&nbsp;&nbsp;</span> <span class=\"dark\" ng-if=\":rebind:block.dividend\" class=\"gray\"><i class=\"gray ion-arrow-up-c\"></i> {{\\'COMMON.UD\\'|translate}}&nbsp;&nbsp;</span> <span class=\"dark\" ng-if=\":rebind:block.transactionsCount\"><i class=\"ion-card\">{{:rebind:block.transactionsCount}}</i></span></h4></div><div class=\"col positive hidden-md\"><h4><i class=\"ion-person\"></i> {{:rebind:block.name||block.uid}}</h4></div><div class=\"col col-20\"><span class=\"badge\" ng-class=\":rebind:{\\'badge-balanced\\': !$index , \\'badge-calm\\': $index && !block.compacted && !block.empty}\">{{::block.number|formatInteger}}</span></div></div></ion-item>');\n$templateCache.put('templates/blockchain/items_blocks.html','<div class=\"center padding\" ng-if=\"search.loading\"><ion-spinner icon=\"android\"></ion-spinner></div><ion-list class=\"animate-ripple padding padding-xs\"><div class=\"padding gray\" ng-if=\"!search.loading && !search.results.length\" translate>BLOCKCHAIN.LOOKUP.NO_BLOCK</div><ng-repeat ng-repeat=\"block in search.results track by block.number\" ng-include=\"::\\'templates/blockchain/item_block.html\\'\"></ng-repeat></ion-list><ion-infinite-scroll ng-if=\"search.hasMore\" icon=\"android\" on-infinite=\"showMore()\" distance=\"1%\"></ion-infinite-scroll>');\n$templateCache.put('templates/blockchain/link_identity.html','<a ui-sref=\"app.wot_identity({pubkey: identity.pubkey, uid: identity.uid})\"><span class=\"positive\" ng-if=\"identity.uid\"><i class=\"icon ion-person\"></i> {{::identity.uid}}&nbsp;</span> <span class=\"gray\" ng-class=\"{\\'hidden-xs hidden-sm\\': identity.uid}\"><i class=\"icon ion-key\"></i>&nbsp;{{::identity.pubkey|formatPubkey}}</span></a>');\n$templateCache.put('templates/blockchain/list_blocks_lg.html','<div class=\"padding padding-xs\" style=\"display: block; height: 100px;\"><h4 translate>BLOCKCHAIN.LOOKUP.LAST_BLOCKS</h4><div class=\"pull-right\"><a class=\"button button-text button-small ink\" ng-class=\"{\\'button-text-positive\\': compactMode, \\'button-text-stable\\': !compactMode}\" ng-click=\"toggleCompactMode()\"><i class=\"icon ion-navicon\"></i> <b class=\"ion-arrow-down-b\" style=\"position: absolute; top: -2px; left: 4px; font-size: 8px;\"></b> <b class=\"ion-arrow-up-b\" style=\"position: absolute; top: 10px; left: 4px; font-size: 8px;\"></b> <span>{{:locale:\\'BLOCKCHAIN.LOOKUP.BTN_COMPACT\\'|translate}}</span></a></div></div><div class=\"center padding\" ng-if=\"search.loading\"><ion-spinner icon=\"android\"></ion-spinner></div><ion-list class=\"padding padding-xs list-blocks {{::motion.ionListClass}}\"><div class=\"padding gray\" ng-if=\"!search.loading && !search.results.length\">{{:locale:\\'BLOCKCHAIN.LOOKUP.NO_BLOCK\\'|translate}}</div><ng-repeat ng-repeat=\"block in search.results track by block.id\" ng-include=\"!block.empty ? \\'templates/blockchain/item_block_lg.html\\' : \\'templates/blockchain/item_block_empty_lg.html\\'\"></ng-repeat></ion-list><ion-infinite-scroll ng-if=\"search.hasMore\" spinner=\"android\" on-infinite=\"showMore()\" distance=\"1%\"></ion-infinite-scroll>');\n$templateCache.put('templates/blockchain/list_blocks.html','<div class=\"center padding\" ng-if=\"search.loading\"><ion-spinner icon=\"android\"></ion-spinner></div><ion-list class=\"padding padding-xs list-blocks {{::motion.ionListClass}}\"><div class=\"padding gray\" ng-if=\"!search.loading && !search.results.length\" translate>BLOCKCHAIN.LOOKUP.NO_BLOCK</div><ng-repeat ng-repeat=\"block in search.results track by block.number\" ng-include=\"::\\'templates/blockchain/item_block.html\\'\"></ng-repeat></ion-list><ion-infinite-scroll ng-if=\"search.hasMore\" spinner=\"android\" on-infinite=\"showMore()\" distance=\"1%\"></ion-infinite-scroll>');\n$templateCache.put('templates/blockchain/lookup_lg.html','<ion-view><ion-nav-title><span translate>BLOCKCHAIN.LOOKUP.TITLE</span></ion-nav-title><ion-content class=\"padding no-padding-xs no-padding-sm\" scroll=\"true\"><ng-include src=\"::\\'templates/blockchain/list_blocks_lg.html\\'\"></ng-include></ion-content></ion-view>');\n$templateCache.put('templates/blockchain/lookup.html','<ion-view><ion-nav-title><span translate>BLOCKCHAIN.LOOKUP.TITLE</span></ion-nav-title><ion-content class=\"padding no-padding-xs\" scroll=\"true\"><ng-include src=\"::\\'templates/blockchain/list_blocks.html\\'\"></ng-include></ion-content></ion-view>');\n$templateCache.put('templates/blockchain/unlock_condition_popover.html','<ion-popover-view class=\"fit\"><ion-header-bar><h1 class=\"title\" translate>BLOCKCHAIN.VIEW.TX_OUTPUT_UNLOCK_CONDITIONS</h1></ion-header-bar><ion-content scroll=\"true\"><div class=\"row\" ng-repeat=\"condition in popoverData.unlockConditions track by $index\" ng-style=\"::condition.style\"><span class=\"gray\" ng-if=\"::condition.operator\">{{::\\'BLOCKCHAIN.VIEW.TX_OUTPUT_OPERATOR.\\'+condition.operator|translate}}&nbsp;</span><div ng-if=\"::condition.type==\\'SIG\\'\"><i class=\"icon ion-key dark\"></i> <span class=\"dark\" ng-bind-html=\"::\\'BLOCKCHAIN.VIEW.TX_OUTPUT_FUNCTION.SIG\\' | translate\"></span> <a ng-click=\"goState(\\'app.wot_identity\\', {pubkey:condition.value})\" style=\"text-decoration: none;\" class=\"positive\">{{condition.value|formatPubkey}}</a></div><div ng-if=\"::condition.type==\\'XHX\\'\"><i class=\"icon ion-lock-combination dark\"></i> <span class=\"dark\" ng-bind-html=\"::\\'BLOCKCHAIN.VIEW.TX_OUTPUT_FUNCTION.XHX\\' | translate\"></span> <a copy-on-click=\"{{::condition.value}}\" class=\"positive\">{{::condition.value|formatPubkey}}...</a></div><div ng-if=\"condition.type==\\'CSV\\'\"><i class=\"icon ion-clock dark\"></i> <span class=\"dark\" ng-bind-html=\"::\\'BLOCKCHAIN.VIEW.TX_OUTPUT_FUNCTION.CSV\\' | translate\"></span> {{::condition.value|formatDuration}}</div><div ng-if=\"condition.type==\\'CLTV\\'\"><i class=\"icon ion-clock dark\"></i> <span class=\"dark\" ng-bind-html=\"::\\'BLOCKCHAIN.VIEW.TX_OUTPUT_FUNCTION.CLTV\\' | translate\"></span> {{::condition.value|medianDate}}</div></div></ion-content></ion-popover-view>');\n$templateCache.put('templates/blockchain/view_block.html','<ion-view><ion-nav-title><span class=\"title visible-xs visible-sm\" ng-if=\"number==\\'current\\'\">{{\\'BLOCKCHAIN.VIEW.TITLE_CURRENT\\'|translate}}</span> <span class=\"title visible-xs visible-sm\" ng-if=\"number!=\\'current\\'\">{{\\'BLOCKCHAIN.VIEW.TITLE\\'|translate:formData}}</span></ion-nav-title><ion-content class=\"no-padding-xs no-padding-sm\" scroll=\"true\"><div class=\"row no-padding\"><div class=\"col col-15 hidden-xs hidden-sm\">&nbsp;</div><div class=\"col no-padding\"><div class=\"center padding\" ng-if=\"loading\"><ion-spinner icon=\"android\"></ion-spinner></div><div class=\"list item-text-wrap no-padding-xs\" ng-if=\"!loading\"><div class=\"item item-text-wrap\"><h1 class=\"padding-top hidden-xs hidden-sm\"><span ng-if=\"number!=\\'current\\'\">{{\\'BLOCKCHAIN.VIEW.TITLE\\'|translate:formData}}</span> <span ng-if=\"number==\\'current\\'\">{{\\'BLOCKCHAIN.VIEW.TITLE_CURRENT\\'|translate}}</span></h1><h3><span class=\"dark\"><i class=\"icon ion-clock\"></i> {{formData.medianTime | medianFromNowAndDate}}</span></h3><h3><span class=\"dark\"><i class=\"icon ion-lock-combination\"></i> {{\\'BLOCKCHAIN.VIEW.COMPUTED_BY\\'|translate}} </span><a class=\"positive\" ui-sref=\"app.wot_identity({pubkey:issuer.pubkey, uid: issuer.uid})\"><i class=\"icon ion-person positive\"></i> {{issuer.name||issuer.uid}} <span class=\"gray\" ng-if=\"issuer.name\">({{issuer.uid}})</span></a></h3><h3><a ng-click=\"openRawBlock($event)\"><i class=\"icon ion-share\"></i> {{\\'BLOCKCHAIN.VIEW.SHOW_RAW\\'|translate}}</a></h3></div><div class=\"item hidden-xs hidden-sm padding text-center\"><div class=\"pull-right\"><a class=\"button button-text button-small ink\" ng-class=\"{\\'button-text-positive\\': compactMode, \\'button-text-stable\\': !compactMode}\" ng-click=\"toggleCompactMode()\"><i class=\"icon ion-navicon\"></i> <b class=\"ion-arrow-down-b\" style=\"position: absolute; top: -2px; left: 4px; font-size: 8px;\"></b> <b class=\"ion-arrow-up-b\" style=\"position: absolute; top: 10px; left: 4px; font-size: 8px;\"></b> <span>{{\\'BLOCKCHAIN.LOOKUP.BTN_COMPACT\\'|translate}}</span></a></div><cs-extension-point name=\"buttons\"></cs-extension-point></div><span class=\"item item-divider\">{{\\'BLOCKCHAIN.VIEW.TECHNICAL_DIVIDER\\' | translate}}</span><ion-item class=\"item-icon-left item-text-wrap\" ng-if=\"!compactMode || $root.settings.expertMode\"><i class=\"icon ion-gear-b\"></i> {{\\'BLOCKCHAIN.VIEW.VERSION\\'|translate}} <span class=\"badge badge-stable\">{{::formData.version}}</span></ion-item><ion-item class=\"item-icon-left item-text-wrap\" ng-if=\"!compactMode || $root.settings.expertMode\" copy-on-click=\"{{::formData.powMin}}\"><i class=\"icon ion-lock-combination\"></i> {{\\'BLOCKCHAIN.VIEW.POW_MIN\\'|translate}}<h4 class=\"gray\">{{\\'BLOCKCHAIN.VIEW.POW_MIN_HELP\\'|translate}}</h4><span class=\"badge badge-stable\">{{::formData.powMin}}</span></ion-item><ion-item class=\"item-icon-left item-text-wrap\" copy-on-click=\"{{::formData.hash}}\"><i class=\"icon ion-pound\"></i> {{\\'BLOCKCHAIN.VIEW.HASH\\'|translate}} <span class=\"item-note hidden-xs hidden-sm dark\">{{::formData.hash}}</span><h5 class=\"visible-xs visible-sm dark\">{{::formData.hash}}</h5></ion-item><ion-item class=\"hidden-sm hidden-xs\"></ion-item><span class=\"item item-divider\">{{\\'BLOCKCHAIN.VIEW.DATA_DIVIDER\\' | translate}}</span><ion-item ng-if=\"compactMode && formData.empty\" class=\"item-icon-left item-text-wrap\">{{\\'BLOCKCHAIN.VIEW.EMPTY\\'|translate}}</ion-item><ion-item ng-if=\"!compactMode || formData.dividend\" class=\"item-icon-left item-text-wrap\" copy-on-click=\"{{::formData.dividend/100}}\"><i class=\"icon ion-arrow-up-c\"></i><div class=\"col col-60\">{{\\'COMMON.UNIVERSAL_DIVIDEND\\'|translate}}<h4 class=\"gray\">{{\\'BLOCKCHAIN.VIEW.UNIVERSAL_DIVIDEND_HELP\\'|translate: {membersCount: formData.membersCount} }}</h4></div><span class=\"badge badge-balanced\" ng-if=\"formData.dividend\">+1 <span ng-bind-html=\"formData.currency|currencySymbol: {useRelative: true} \"></span> / {{\\'COMMON.MEMBER\\'|translate|lowercase}} </span><span class=\"badge badge-stable\" ng-if=\"!formData.dividend\">0</span> <span class=\"badge badge-secondary\" ng-if=\"formData.dividend\">+ {{formData.dividend| formatAmount: {currency: formData.currency, useRelative: false} }} / {{\\'COMMON.MEMBER\\'|translate|lowercase}}</span></ion-item><ng-if ng-if=\"!compactMode || formData.identitiesCount\"><ion-item class=\"item-icon-left\"><i class=\"icon ion-person\"></i> <b class=\"ion-clock\" style=\"position: absolute; top: 16px; left: 39px; font-size: 12px;\"></b> {{\\'BLOCKCHAIN.VIEW.IDENTITIES_COUNT\\'|translate}} <span class=\"badge badge-balanced\" ng-if=\"formData.identitiesCount\">+{{::formData.identitiesCount}}</span> <span class=\"badge badge-stable\" ng-if=\"!formData.identitiesCount\">0</span></ion-item><div class=\"padding-bottom item-icon-left-padding item-icon-right-padding\" ng-if=\"formData.identitiesCount\"><ion-item ng-repeat=\"identity in ::formData.identities\" class=\"item-border-large item-small-height\" ng-include=\"::\\'templates/blockchain/link_identity.html\\'\"></ion-item></div></ng-if><ng-if ng-if=\"!compactMode || formData.joinersCount\"><ion-item class=\"item-icon-left\"><i class=\"icon ion-person-add\"></i> {{\\'BLOCKCHAIN.VIEW.JOINERS_COUNT\\'|translate}} <span class=\"badge badge-balanced\" ng-if=\"formData.joinersCount\">+{{::formData.joinersCount}}</span> <span class=\"badge badge-stable\" ng-if=\"!formData.joinersCount\">0</span></ion-item><div class=\"padding-bottom item-icon-left-padding item-icon-right-padding\" ng-if=\"formData.joinersCount\"><ion-item ng-repeat=\"identity in ::formData.joiners\" class=\"item-border-large item-small-height\" ng-include=\"::\\'templates/blockchain/link_identity.html\\'\"></ion-item></div></ng-if><ng-if ng-if=\"!compactMode || formData.activesCount\"><ion-item class=\"item-icon-left\"><i class=\"icon ion-person\"></i> <b class=\"ion-refresh\" style=\"position: absolute; top: 25px; left: 39px; font-size: 12px;\"></b> {{\\'BLOCKCHAIN.VIEW.ACTIVES_COUNT\\'|translate}}<h4 class=\"gray\">{{\\'BLOCKCHAIN.VIEW.ACTIVES_COUNT_HELP\\'|translate}}</h4><span class=\"badge badge-balanced\" ng-if=\"formData.activesCount\">{{::formData.activesCount}}</span> <span class=\"badge badge-stable\" ng-if=\"!formData.activesCount\">0</span></ion-item><div class=\"padding-bottom item-icon-left-padding item-icon-right-padding\" ng-if=\"formData.activesCount\"><ion-item ng-repeat=\"identity in ::formData.actives\" class=\"item-border-large item-small-height\" ng-include=\"::\\'templates/blockchain/link_identity.html\\'\"></ion-item></div></ng-if><ng-if ng-if=\"!compactMode || (formData.excludedCount-formData.revokedCount)\"><ion-item class=\"item-icon-left\"><i class=\"icon ion-person\"></i> <b class=\"ion-close dark\" style=\"position: absolute; top: 25px; left: 39px; font-size: 12px;\"></b> {{\\'BLOCKCHAIN.VIEW.EXCLUDED_COUNT\\'|translate}}<h4 class=\"gray\">{{\\'BLOCKCHAIN.VIEW.EXCLUDED_COUNT_HELP\\'|translate}}</h4><span class=\"badge badge-assertive\" ng-if=\"formData.excludedCount-formData.revokedCount\">-{{::formData.excludedCount-formData.revokedCount}}</span> <span class=\"badge badge-stable\" ng-if=\"!(formData.excludedCount-formData.revokedCount)\">0</span></ion-item><div class=\"padding-bottom item-icon-left-padding item-icon-right-padding\" ng-if=\"formData.excludedCount\"><ion-item ng-repeat=\"identity in ::formData.excluded\" class=\"item-border-large item-small-height\" ng-include=\"::\\'templates/blockchain/link_identity.html\\'\"></ion-item></div></ng-if><ng-if ng-if=\"!compactMode || formData.leaversCount\"><ion-item class=\"item-icon-left\" ng-if=\"!compactMode || formData.leaversCount\"><i class=\"icon ion-person\"></i> <b class=\"ion-minus\" style=\"position: absolute; top: 25px; left: 39px; font-size: 12px;\"></b> {{\\'BLOCKCHAIN.VIEW.LEAVERS_COUNT\\'|translate}}<h4 class=\"gray\">{{\\'BLOCKCHAIN.VIEW.LEAVERS_COUNT_HELP\\'|translate}}</h4><span class=\"badge badge-assertive\" ng-if=\"formData.leaversCount\">-{{::formData.leaversCount}}</span> <span class=\"badge badge-stable\" ng-if=\"!formData.leaversCount\">0</span></ion-item><div class=\"padding-bottom item-icon-left-padding item-icon-right-padding\" ng-if=\"formData.leaversCount\"><ion-item ng-repeat=\"identity in ::formData.leavers\" class=\"item-border-large item-small-height\" ng-include=\"::\\'templates/blockchain/link_identity.html\\'\"></ion-item></div></ng-if><ng-if ng-if=\"!compactMode || formData.revokedCount\"><ion-item class=\"item-icon-left\"><i class=\"icon ion-person\"></i> <b class=\"ion-minus-circled assertive\" style=\"position: absolute; top: 25px; left: 39px; font-size: 12px;\"></b> {{\\'BLOCKCHAIN.VIEW.REVOKED_COUNT\\'|translate}}<h4 class=\"gray\">{{\\'BLOCKCHAIN.VIEW.REVOKED_COUNT_HELP\\'|translate}}</h4><span class=\"badge badge-balanced\" ng-if=\"formData.revokedCount\">-{{::formData.revokedCount}}</span> <span class=\"badge badge-stable\" ng-if=\"!formData.revokedCount\">0</span></ion-item><div class=\"padding-bottom item-icon-left-padding item-icon-right-padding\" ng-if=\"formData.revokedCount\"><ion-item ng-repeat=\"identity in ::formData.revoked\" class=\"item-border-large item-small-height\" ng-include=\"::\\'templates/blockchain/link_identity.html\\'\"></ion-item></div></ng-if><ng-if ng-if=\"!compactMode || formData.certificationsCount\"><ion-item class=\"item-icon-left\"><i class=\"icon ion-ribbon-a\"></i> {{\\'BLOCKCHAIN.VIEW.CERT_COUNT\\'|translate}} <span class=\"badge badge-stable\" ng-class=\"{\\'badge-positive\\':formData.certificationsCount}\">{{::formData.certificationsCount}}</span></ion-item><div class=\"padding-bottom item-icon-left-padding item-icon-right-padding no-padding-xs\" ng-if=\"formData.certificationsCount\"><div ng-repeat=\"(key, certs) in formData.certifications\" class=\"item item-border-large item-small-height\"><div class=\"row no-padding\"><div class=\"col col-center no-padding\"><ng-repeat ng-repeat=\"cert in certs\"><ng-include src=\"::\\'templates/blockchain/link_identity.html\\'\" onload=\"identity=cert.from\"></ng-include><br></ng-repeat></div><div class=\"col col-10 col-center gray text-center no-padding\"><h2><i class=\"icon ion-arrow-right-a\"></i></h2></div><div class=\"col col-40 col-center no-padding\" ng-include=\"::\\'templates/blockchain/link_identity.html\\'\" onload=\"identity=certs[0].to\"></div></div></div></div></ng-if><ng-if ng-if=\"!compactMode || formData.transactionsCount\"><ion-item class=\"item-icon-left\"><i class=\"icon ion-card\"></i> {{\\'BLOCKCHAIN.VIEW.TX_COUNT\\'|translate}} <span class=\"badge badge-stable\" ng-class=\"{\\'badge-positive\\':formData.transactionsCount}\">{{::formData.transactionsCount}}</span></ion-item><div class=\"padding-bottom item-icon-left-padding item-icon-right-padding no-padding-xs\" ng-if=\"formData.transactionsCount\"><div ng-repeat=\"tx in ::formData.transactions\" class=\"item item-small-height item-border-large\"><div class=\"row no-padding\" style=\"padding-top: 3px;\"><div class=\"col col-40 col-center no-padding list no-margin\"><div ng-repeat=\"identity in ::tx.issuers\" class=\"item no-padding item-small-height\"><ng-include src=\"\\'templates/blockchain/link_identity.html\\'\"></ng-include></div></div><div class=\"col col-10 col-center gray text-center no-padding\"><h2><i class=\"icon ion-arrow-right-a\"></i></h2></div><div class=\"col no-padding padding-right no-padding-xs col-text-wrap list no-margin\"><span class=\"gray\" class=\"gray\" ng-if=\"tx.toHimself\" translate>BLOCKCHAIN.VIEW.TX_TO_HIMSELF</span><div ng-repeat=\"output in ::tx.outputs\" class=\"item no-padding item-small-height\"><ng-include ng-if=\"::output.pubkey\" src=\"\\'templates/blockchain/link_identity.html\\'\" onload=\"identity=output\"></ng-include><span ng-if=\"::!output.pubkey && output.unlockFunctions\"><i class=\"icon ion-locked\"></i> (<a ng-click=\"showUnlockConditionPopover(output, $event)\"> <i ng-repeat=\"unlockFunction in ::output.unlockFunctions\" ng-class=\"::{\\'ion-key\\': (unlockFunction==\\'SIG\\'), \\'ion-clock\\': (unlockFunction==\\'CSV\\' || unlockFunction==\\'CLTV\\'), \\'ion-lock-combination\\': (unlockFunction==\\'XHX\\') }\" class=\"icon\"></i> </a>) </span><span class=\"badge badge-balanced\" ng-bind-html=\"::output.amount | formatAmount:{currency: formData.currency, useRelative: false} \"></span></div></div></div></div></div></ng-if></div></div><div class=\"col col-15 hidden-sm hidden-xs\"></div></div></ion-content></ion-view>');\n$templateCache.put('templates/common/badge_certification_count.html','<span ng-attr-id=\"{{$ctrl.csId}}\" class=\"badge badge-balanced\" ng-class=\"{\\'badge-energized\\': $ctrl.requirements.willNeedCertificationCount || ($ctrl.requirements.needCertificationCount + $ctrl.requirements.pendingCertificationCount >= $ctrl.parameters.sigQty),\\n \\'badge-assertive\\': ($ctrl.requirements.needCertificationCount + $ctrl.requirements.pendingCertificationCount < $ctrl.parameters.sigQty)}\"><span ng-if=\"$ctrl.requirements.certificationCount || !$ctrl.requirements.pendingCertificationCount\"><i ng-if=\"!$ctrl.requirements.needCertificationCount\" class=\"ion-android-done\"></i> {{$ctrl.requirements.certificationCount}} <i ng-if=\"$ctrl.requirements.willNeedCertificationCount\" class=\"ion-android-warning\"></i> </span><span ng-if=\"$ctrl.requirements.pendingCertificationCount\"><ng-if ng-if=\"$ctrl.requirements.certificationCount\">+</ng-if><i class=\"ion-clock\"></i> {{$ctrl.requirements.pendingCertificationCount}}</span></span>');\n$templateCache.put('templates/common/badge_given_certification_count.html','<div ng-attr-id=\"{{$ctrl.csId}}\" class=\"badge badge-calm\" ng-class=\"{\\'badge-assertive\\': $ctrl.identity.given_cert.length >= $ctrl.parameters.sigStock}\"><span><i ng-if=\"$ctrl.identity.given_cert.length\" class=\"ion-android-done\"></i> {{$ctrl.identity.given_cert.length}} </span><span ng-if=\"$ctrl.identity.given_cert_pending.length\">(<ng-if ng-if=\"$ctrl.identity.given_cert.length\">+</ng-if><i class=\"ion-clock\"></i> {{$ctrl.identity.given_cert_pending.length}}) </span><small>/ {{$ctrl.parameters.sigStock}}</small></div>');\n$templateCache.put('templates/common/form_error_messages.html','<div class=\"form-error\" ng-message=\"minlength\"><span translate=\"ERROR.FIELD_TOO_SHORT\"></span></div><div class=\"form-error\" ng-message=\"maxlength\"><span translate=\"ERROR.FIELD_TOO_LONG\"></span></div><div class=\"form-error\" ng-message=\"pattern\"><span translate=\"ERROR.FIELD_ACCENT\"></span></div><div class=\"form-error\" ng-message=\"required\"><span translate=\"ERROR.FIELD_REQUIRED\"></span></div>');\n$templateCache.put('templates/common/note_feature_not_available.html','<h4 class=\"assertive\"><b class=\"ion-android-close\"></b> <span translate>MODE.DEMO.FEATURE_NOT_AVAILABLE</span></h4>');\n$templateCache.put('templates/common/popover_copy.html','<ion-popover-view class=\"popover-copy\" style=\"height: {{(!rows || rows &lt;= 1) ? 50 : rows*22}}px\"><ion-content scroll=\"false\"><div class=\"list\"><div class=\"item item-input\"><input type=\"text\" autocomplete=\"off\" ng-if=\"!rows || rows &lt;= 1\" ng-model=\"value\"> <textarea ng-if=\"rows && rows > 1\" ng-model=\"value\" rows=\"{{rows}}\" cols=\"10\">\\n </textarea></div></div></ion-content></ion-popover-view>');\n$templateCache.put('templates/common/popover_helptip.html','<ion-popover-view class=\"popover-helptip\"><ion-content scroll=\"false\" class=\"list\"><p><i ng-if=\"icon.position && !icon.position.startsWith(\\'bottom-\\')\" class=\"{{icon.class}} icon-{{icon.position}} hidden-xs\" style=\"{{icon.style}}\"></i><a ng-click=\"closePopover()\" class=\"pull-right button-close\" ng-class=\"{\\'pull-left\\': icon.position === \\'right\\', \\'pull-right\\': icon.position !== \\'right\\'}\"><i class=\"ion-close\"></i> </a><span>&nbsp;</span></p><p class=\"padding light\"><ng-bind-html ng-bind-html=\"content | translate:contentParams\"></ng-bind-html><ng-bind-html ng-bind-html=\"trustContent\"></ng-bind-html></p><div class=\"text-center\" ng-if=\"!tour\"><button class=\"button button-small button-stable\" ng-if=\"!hasNext\" ng-click=\"closePopover(true)\" translate>COMMON.BTN_UNDERSTOOD</button> <button class=\"button button-small button-stable\" id=\"helptip-btn-ok\" ng-if=\"hasNext\" ng-click=\"closePopover(false)\" translate>COMMON.BTN_UNDERSTOOD</button> <button id=\"helptip-btn-ok\" class=\"button button-small button-positive icon-right ink\" ng-if=\"hasNext\" ng-click=\"closePopover(true)\"><i class=\"icon ion-chevron-right\"></i></button></div><div class=\"text-center\" ng-if=\"tour\"><button class=\"button button-small button-positive\" id=\"helptip-btn-ok\" ng-if=\"!hasNext\" ng-click=\"closePopover(false)\" translate>COMMON.BTN_CLOSE</button> <button id=\"helptip-btn-ok\" class=\"button button-small button-positive icon-right ink\" ng-if=\"hasNext\" ng-click=\"closePopover(true)\">{{\\'COMMON.BTN_CONTINUE\\'|translate}} <i class=\"icon ion-chevron-right\"></i></button></div><p><i ng-if=\"icon.position && icon.position.startsWith(\\'bottom-\\')\" class=\"{{icon.class}} icon-{{icon.position}} hidden-xs\"></i></p></ion-content></ion-popover-view>');\n$templateCache.put('templates/common/popover_locales.html','<ion-popover-view class=\"fit popover-locales\" style=\"height: {{locales.length*48}}px;\"><ion-content scroll=\"false\"><div class=\"list item-text-wrap block\"><a ng-repeat=\"l in locales track by l.id\" class=\"item item-icon-left ink\" ng-click=\"changeLanguage(l.id)\"><i class=\"item-image avatar\" style=\"background-image: url(./img/flag-{{l.flag}}.png)\"></i> {{l.label | translate}}</a></div></ion-content></ion-popover-view>');\n$templateCache.put('templates/common/popover_profile.html','<ion-popover-view class=\"fit has-header popover-profile hidden-xs hidden-sm\"><ion-content scroll=\"false\"><div class=\"row\"><div class=\"col col-33\"><i class=\"avatar avatar-member\" ng-if=\"!walletData.avatar\" ng-class=\"{\\'royal-bg\\': login, \\'stable-bg\\': !login}\"></i> <i class=\"avatar\" ng-if=\"walletData.avatar\" style=\"background-image: url(\\'{{walletData.avatar.src}}\\')\"></i></div><div class=\"col col-66\" ng-if=\"login\"><h4>{{walletData.name||walletData.uid}}</h4><h4 class=\"gray\" ng-if=\"!walletData.name && !walletData.uid\" copy-on-click=\"{{walletData.pubkey}}\"><i class=\"icon ion-key\"></i> {{walletData.pubkey|formatPubkey}}</h4><span class=\"gray\" ng-if=\"walletData.name||walletData.uid\" copy-on-click=\"{{walletData.pubkey}}\"><i class=\"icon ion-key\"></i> {{walletData.pubkey|formatPubkey}}</span></div></div><div class=\"row\" ng-show=\"login\"><div class=\"col col-66 col-offset-33\"><button ng-show=\"!auth\" class=\"button button-assertive button-small ink\" ng-click=\"doAuth()\">{{\\'AUTH.BTN_AUTH\\' | translate}}</button><cs-extension-point name=\"profile-popover-user\"></cs-extension-point></div></div><div class=\"row\" ng-show=\"!login\"><div class=\"col col-66 col-offset-33\"><div class=\"text-center no-padding gray\">{{\\'LOGIN.NO_ACCOUNT_QUESTION\\'|translate}}<br class=\"visible-xs\"><b><button class=\"button button-calm button-small ink\" ng-click=\"showJoinModal()\">{{\\'LOGIN.CREATE_ACCOUNT\\'|translate}}</button></b></div></div></div></ion-content><ion-footer-bar class=\"stable-bg row\"><div class=\"col\"><button class=\"button button-raised button-block button-stable ink ink-dark\" id=\"helptip-popover-profile-btn-settings\" ng-click=\"showSettings()\" ui-sref=\"app.settings\"><i class=\"icon ion-android-settings\"></i> {{\\'MENU.SETTINGS\\' | translate}}</button></div><div class=\"col\"><button class=\"button button-raised button-block button-stable ink ink-dark\" ng-show=\"login\" ng-click=\"logout()\" translate>COMMON.BTN_LOGOUT</button> <button class=\"button button-raised button-block button-positive ink\" ng-show=\"!login\" ng-click=\"loginAndGo(\\'app.view_wallet\\')\" translate>COMMON.BTN_LOGIN</button></div></ion-footer-bar></ion-popover-view>');\n$templateCache.put('templates/common/popover_share.html','<ion-popover-view class=\"popover-share\"><ion-content scroll=\"false\"><div class=\"bar bar-header\"><h1 class=\"title\">{{titleKey|translate:titleValues}}</h1><span class=\"gray pull-right\">{{time|formatDate}}</span></div><div class=\"list no-margin no-padding has-header has-footer block\"><div class=\"item item-input\"><input type=\"text\" autocomplete=\"off\" ng-model=\"value\"></div></div><div class=\"bar bar-footer\"><div class=\"button-bar\"><a class=\"button button-icon positive icon ion-social-facebook\" href=\"https://www.facebook.com/sharer/sharer.php?u={{postUrl|formatEncodeURI}}&amp;title={{postMessage|formatEncodeURI}}\" onclick=\"window.open(this.href, \\'facebook-share\\',\\'menubar=no,toolbar=no,resizable=yes,scrollbars=yes,width=580,height=296\\');return false;\" title=\"{{\\'COMMON.POPOVER_SHARE.SHARE_ON_FACEBOOK\\'|translate}}\"></a> <a class=\"button button-icon positive icon ion-social-twitter\" href=\"https://twitter.com/intent/tweet?url={{postUrl|formatEncodeURI}}&amp;text={{postMessage|formatEncodeURI}}\" onclick=\"window.open(this.href, \\'twitter-share\\',\\'menubar=no,toolbar=no,resizable=yes,scrollbars=yes,width=580,height=296\\');return false;\" title=\"{{\\'COMMON.POPOVER_SHARE.SHARE_ON_TWITTER\\'|translate}}\"></a> <a class=\"button button-icon positive icon ion-social-googleplus\" href=\"https://plus.google.com/share?url={{postUrl|formatEncodeURI}}\" onclick=\"window.open(this.href, \\'google-plus-share\\', \\'menubar=no,toolbar=no,resizable=yes,scrollbars=yes,height=296,width=580\\');return false;\" title=\"{{\\'COMMON.POPOVER_SHARE.SHARE_ON_GOOGLEPLUS\\'|translate}}\"></a> <a class=\"button button-icon positive icon ion-social-diaspora\" href=\"https://sharetodiaspora.github.io/?title={{postMessage|formatEncodeURI}}&amp;url={{postUrl|formatEncodeURI}}\" onclick=\"window.open(this.href, \\'diaspora-share\\',\\'menubar=no,toolbar=no,resizable=yes,scrollbars=yes,width=580,height=296\\');return false;\" title=\"{{\\'COMMON.POPOVER_SHARE.SHARE_ON_DIASPORA\\'|translate}}\"></a> <a class=\"button-close\" title=\"{{\\'COMMON.BTN_CLOSE\\'|translate}}\" ng-click=\"closePopover()\"><i class=\"icon ion-close\"></i></a></div></div></ion-content></ion-popover-view>');\n$templateCache.put('templates/common/popup_password.html','<form name=\"pwdForm\" ng-submit=\"submit($event)\"><div class=\"list\" ng-init=\"setForm(pwdForm)\"><label class=\"item item-input\" ng-class=\"{\\'item-input-error\\': pwdForm.$submitted && pwdForm.password.$invalid}\"><input name=\"password\" type=\"password\" placeholder=\"{{\\'ACCOUNT.SECURITY.KEYFILE.PASSWORD_POPUP.PASSWORD_HELP\\' | translate}}\" ng-model=\"formData.password\" ng-minlength=\"1\" required></label><div class=\"form-errors\" ng-if=\"pwdForm.$submitted && pwdForm.pseudo.$error\" ng-messages=\"pwdForm.password.$error\"><div class=\"form-error\" ng-message=\"required\"><span translate=\"ERROR.FIELD_REQUIRED\"></span></div><div class=\"form-error\" ng-message=\"minlength\"><span translate=\"ERROR.FIELD_TOO_SHORT\"></span></div></div><div class=\"form-errors\" ng-if=\"error\"><div class=\"form-error\">{{error|translate}}</div></div></div></form>');\n$templateCache.put('templates/common/qrcode.html','<a ng-attr-id=\"{{ qrcodeId }}\" ng-show=\"!loading\" class=\"qrcode fade-in pull-right\" ng-class=\"{\\'active\\': toggleQRCode}\" ng-click=\"toggleQRCode = !toggleQRCode\"><div class=\"content\"></div><div class=\"footer item item-icon-left item-text-wrap ink\" on-hold=\"copy(formData.pubkey)\" copy-on-click=\"{{:rebind:formData.pubkey}}\" ng-click=\"$event.stopPropagation()\"><i class=\"icon ion-key\"></i> <span>{{:locale:\\'COMMON.PUBKEY\\'|translate}}</span><h4 id=\"pubkey\" class=\"dark\">{{:rebind:formData.pubkey}}</h4></div></a>');\n$templateCache.put('templates/common/view_passcode.html','<ion-view left-buttons=\"leftButtons\"><ion-nav-title><span class=\"visible-xs visible-sm\" translate>COMMON.PASSCODE.TITLE</span></ion-nav-title><ion-content scroll=\"false\"></ion-content></ion-view>');\n$templateCache.put('templates/currency/items_network.html','<ion-item id=\"helptip-network-blockchain\" class=\"item-icon-left item-text-wrap\"><i class=\"icon ion-clock\"></i> <span class=\"col col-60\" translate>CURRENCY.VIEW.MEDIAN_TIME</span> <span class=\"badge badge-stable\">{{formData.medianTime | medianDate}}</span></ion-item><ion-item class=\"item-icon-left item-text-wrap\"><i class=\"icon ion-lock-combination\"></i> <span class=\"col col-75\" translate>CURRENCY.VIEW.POW_MIN</span> <span class=\"badge badge-stable\">{{formData.difficulty | formatInteger}}</span></ion-item><cs-extension-point name=\"network-actual\"></cs-extension-point><div class=\"item item-divider\"><span translate>CURRENCY.VIEW.NETWORK_RULES_DIVIDER</span></div><ion-item class=\"item-icon-left item-text-wrap\"><i class=\"icon ion-clock\" style=\"position: absolute; font-size: 20px; left: 16px; margin-top: 11px\"></i> <b class=\"icon-secondary ion-lock-combination\" style=\"left: 14px; margin-top: -4px;\"></b> <b class=\"icon-secondary ion-arrow-right-c\" style=\"font-size: 12px; left: 28px; margin-top: -4px;\"></b> <b class=\"icon-secondary ion-lock-combination\" style=\"left: 38px; margin-top: -4px;\"></b> <span class=\"col col-75\" translate>CURRENCY.VIEW.AVG_GEN_TIME</span> <span class=\"badge badge-stable\">{{formData.avgGenTime | formatDuration}}</span></ion-item><div id=\"helptip-network-peers\" class=\"item item-divider\"><div class=\"pull-left\"><span ng-if=\"search.type==\\'member\\'\" translate>PEER.MEMBERS</span> <span ng-if=\"search.type==\\'mirror\\'\" translate>PEER.MIRRORS</span> <span ng-if=\"search.type==\\'offline\\'\" translate>PEER.OFFLINE</span> <span ng-if=\"!search.type\" translate>PEER.PEERS</span> <span ng-if=\"!search.loading\">({{search.results.length}})</span></div><div class=\"buttons pull-right\"><ion-spinner class=\"icon\" icon=\"android\" ng-if=\"search.loading\"></ion-spinner><a class=\"button button-icon button-small-padding icon ion-loop gray hidden-xs hidden-sm ink\" ng-if=\"!search.loading\" ng-click=\"refresh()\"></a> <a class=\"button button-icon button-small-padding icon ion-android-more-vertical gray hidden-xs hidden-sm ink\" ng-if=\"!search.loading\" ng-click=\"showActionsPopover($event)\"></a></div></div><ng-include src=\"::\\'templates/network/items_peers.html\\'\"></ng-include>');\n$templateCache.put('templates/currency/items_parameters.html','<div bind-notifier=\"{ rebind:formData.useRelative }\"><ion-item class=\"item-icon-left item-text-wrap visible-xs visible-sm\"><i class=\"icon ion-android-bookmark\"></i> <span translate>CURRENCY.VIEW.CURRENCY_NAME</span><div class=\"item-note dark\" ng-if=\"!loading\">{{formData.currency}} (<span ng-bind-html=\":rebind:formData.currency | currencySymbol:formData.useRelative\"></span>)</div></ion-item><ion-item id=\"helptip-currency-mass-member\" class=\"item-icon-left item-text-wrap\"><i class=\"icon ion-pie-graph\"></i><div class=\"col col-60\"><span translate>CURRENCY.VIEW.SHARE</span> <span class=\"gray\">(M<sub>t</sub>/N<sub>t</sub>)</span></div><span id=\"helptip-currency-mass-member-unit\" ng-if=\"!loading\" class=\"badge badge-calm\" ng-bind-html=\":rebind:formData.MoverN | formatAmount:{currency: formData.currency, useRelative: formData.useRelative, currentUD: formData.currentUD}\"></span></ion-item><ion-item class=\"item-icon-left item-text-wrap\"><i class=\"icon ion-record\"></i><div class=\"col col-60\"><span translate>CURRENCY.VIEW.MASS</span> <span class=\"gray\">(M<sub>t</sub>)</span></div><span class=\"badge badge-energized\" ng-if=\"!loading\" ng-bind-html=\":rebind:formData.M | formatAmount:{currency: formData.currency, useRelative: formData.useRelative, currentUD: formData.currentUD}\"></span></ion-item><cs-extension-point name=\"parameters-actual\"></cs-extension-point><ion-item class=\"item-icon-left item-text-wrap\"><i class=\"icon ion-arrow-graph-up-right\"></i><div class=\"col col-60\"><span translate>CURRENCY.VIEW.C_ACTUAL</span> <span class=\"gray\">(c<sub>{{\\'CURRENCY.VIEW.CURRENT\\'|translate}}</sub>)</span></div><span class=\"badge badge-stable\">{{formData.cactual | formatNumeral: \\'0,0.00\\'}} %&nbsp;/&nbsp;{{formData.dt | formatPeriod}}</span></ion-item><ion-item class=\"item-icon-left item-text-wrap\"><i class=\"icon ion-load-c\"></i><div class=\"col col-60\"><span translate>CURRENCY.VIEW.UD</span> <span class=\"gray\">({{\\'COMMON.UD\\'|translate}}<sub>t</sub>)</span></div><div class=\"badge badge-royal\" ng-if=\"!loading\"><span ng-if=\"formData.useRelative\">1<ng-bind-html ng-bind-html=\":rebind:formData.currency| currencySymbol:true\"></ng-bind-html></span><span ng-if=\"!formData.useRelative\" ng-bind-html=\":rebind:formData.currentUD | formatAmount:{currency: formData.currency, useRelative: formData.useRelative, currentUD: formData.currentUD}\"></span> &nbsp;/&nbsp;{{formData.dt | formatPeriod}}</div></ion-item><div class=\"item item-toggle dark\"><div class=\"item-label text-right gray\" translate>COMMON.BTN_RELATIVE_UNIT</div><label class=\"toggle toggle-royal\" id=\"helptip-currency-change-unit\"><input type=\"checkbox\" ng-model=\"formData.useRelative\"><div class=\"track\"><div class=\"handle\"></div></div></label></div><a name=\"helptip-currency-rules-anchor\"></a><div class=\"item item-divider\" id=\"helptip-currency-rules\"><span translate>CURRENCY.VIEW.MONEY_RULES_DIVIDER</span></div><ion-item class=\"item-icon-left item-text-wrap\"><i class=\"icon ion-arrow-graph-up-right\"></i><div class=\"col col-60\"><span translate>CURRENCY.VIEW.C_RULE</span> <span class=\"gray\">(c)</span></div><span class=\"item-note dark\" ng-if=\"!loading && !formData.udReevalTime0\">{{formData.c*100 | formatNumeral: \\'0,0.00\\'}} %&nbsp;/&nbsp;{{formData.dt | formatPeriod}}</span><span class=\"badge badge-stable\" ng-if=\"!loading && formData.udReevalTime0\">{{formData.c*100 | formatNumeral: \\'0,0.00\\'}} %&nbsp;/&nbsp;{{formData.dtReeval | formatDuration}}</span></ion-item><ion-item class=\"item-icon-left item-text-wrap\" ng-if=\"formData.udReevalTime0 && formData.allRules\"><i class=\"icon ion-load-c\"></i> <b class=\"ion-clock icon-secondary\" style=\"font-size: 18px; left: 36px; top: -12px;\"></b><div class=\"col col-60\"><span translate>CURRENCY.VIEW.DT_REEVAL</span> <span class=\"gray\">(dt<sub>{{\\'CURRENCY.VIEW.REEVAL_SYMBOL\\'|translate}}</sub>)</span></div><span class=\"item-note dark\" ng-if=\"!loading\" translate=\"CURRENCY.VIEW.DT_REEVAL_VALUE\" translate-values=\"formData\"></span></ion-item><ion-item class=\"item-icon-left item-text-wrap\" ng-if=\"formData.udReevalTime0 && formData.allRules\"><i class=\"icon ion-load-c\"></i> <b class=\"ion-calendar icon-secondary\" style=\"font-size: 18px; left: 36px; top: -12px;\"></b><div class=\"col col-60\"><span translate>CURRENCY.VIEW.UD_REEVAL_TIME0</span> <span class=\"gray\">(t0<sub>{{\\'CURRENCY.VIEW.REEVAL_SYMBOL\\'|translate}}</sub>)</span></div><span class=\"item-note dark\" ng-if=\"!loading\">{{formData.udReevalTime0|medianDate}}</span></ion-item><ion-item class=\"item-icon-left item-text-wrap\" ng-if=\"formData.allRules\"><i class=\"icon ion-load-c\"></i> <b class=\"ion-calculator icon-secondary\" style=\"font-size: 18px; left: 36px; top: -12px;\"></b><div class=\"col col-60\"><span translate>CURRENCY.VIEW.UD_RULE</span> <span class=\"gray\" ng-if=\"formData.udReevalTime0\">- {{\\'COMMON.UD\\'|translate}}<sub>{{formData.dt|formatPeriod}}</sub>(t<sub>{{\\'CURRENCY.VIEW.REEVAL_SYMBOL\\'|translate}}</sub>)</span></div><span class=\"item-note dark\" ng-if=\"!loading && !formData.udReevalTime0\">{{\\'COMMON.UD\\'|translate}}<sub>t-1</sub> + c<sup>2</sup> * M<sub>t-1</sub>/N<sub>t-1</sub></span><span class=\"item-note dark\" ng-if=\"!loading && formData.udReevalTime0\">{{\\'COMMON.UD\\'|translate}}<sub>{{formData.dt|formatPeriod}}</sub>(t<sub>{{\\'CURRENCY.VIEW.REEVAL_SYMBOL\\'|translate}}</sub> - dt<sub>{{\\'CURRENCY.VIEW.REEVAL_SYMBOL\\'|translate}}</sub>)+ c<sup>2</sup> * (M/N)(t<sub>{{\\'CURRENCY.VIEW.REEVAL_SYMBOL\\'|translate}}</sub> - dt<sub>{{\\'CURRENCY.VIEW.REEVAL_SYMBOL\\'|translate}}</sub>) / dt<sub>{{\\'CURRENCY.VIEW.REEVAL_SYMBOL\\'|translate}}</sub></span></ion-item><div class=\"item item-toggle dark\"><div class=\"item-label text-right gray\" translate>CURRENCY.VIEW.DISPLAY_ALL_RULES</div><label class=\"toggle toggle-royal\"><input type=\"checkbox\" ng-model=\"formData.allRules\"><div class=\"track\"><div class=\"handle\"></div></div></label></div></div>');\n$templateCache.put('templates/currency/items_wot.html','<div bind-notifier=\"{ rebind:formData.useRelative }\"><a name=\"helptip-currency-newcomers-anchor\"></a><ion-item class=\"item-icon-left item-text-wrap\"><i class=\"icon ion-person-stalker\"></i><div class=\"col col-60\"><span translate>CURRENCY.VIEW.MEMBERS</span> <span class=\"gray\">(N<sub>{{\\'CURRENCY.VIEW.CURRENT\\'|translate}}</sub>)</span></div><span class=\"badge badge-calm\" ng-if=\"!loading\">{{formData.N | formatInteger}}</span></ion-item><ion-item id=\"helptip-currency-newcomers\" class=\"item-icon-left item-text-wrap\"><i class=\"icon ion-arrow-graph-up-right\"></i><div class=\"col col-75\"><span translate=\"CURRENCY.VIEW.MEMBERS_VARIATION\" translate-values=\"{duration: formData.durationFromLastUD}\"></span> <span class=\"gray\">(&#916;N)</span></div><div class=\"badge\" ng-if=\"!loading\" ng-class=\"{\\'badge-balanced\\': (formData.N>formData.Nprev), \\'badge-stable\\': (formData.N==formData.Nprev) ,\\'badge-assertive\\': (formData.Nprev>formData.N)}\">{{formData.N > formData.Nprev ? \\'+\\' : \\'\\'}}{{formData.N - formData.Nprev}}</div></ion-item><cs-extension-point name=\"wot-actual\"></cs-extension-point><div class=\"item item-divider\"><span translate>CURRENCY.VIEW.WOT_RULES_DIVIDER</span></div><ion-item class=\"item-icon-left item-text-wrap\"><i class=\"icon ion-ribbon-b\"></i> <span class=\"col col-75\" translate>CURRENCY.VIEW.SIG_QTY_RULE</span> <span class=\"badge badge-balanced\" ng-if=\"!loading\">{{formData.sigQty}}</span></ion-item><ion-item class=\"item-icon-left item-text-wrap\"><i class=\"icon ion-person\"></i> <b class=\"ion-clock icon-secondary\" style=\"font-size: 18px; left: 33px; top: -12px;\"></b> <span class=\"col col-60\" translate>CURRENCY.VIEW.MS_WINDOW</span> <span class=\"badge badge-assertive\" ng-if=\"!loading\">{{formData.msWindow | formatDuration}}</span></ion-item><ion-item class=\"item-icon-left item-text-wrap\"><i class=\"icon ion-person\"></i> <b class=\"ion-calendar icon-secondary\" style=\"font-size: 18px; left: 33px; top: -12px;\"></b> <span class=\"col col-60\" translate>CURRENCY.VIEW.MS_VALIDITY</span> <span class=\"badge badge-balanced\" ng-if=\"!loading\">{{formData.msValidity | formatDuration}}</span></ion-item><ion-item class=\"item-icon-left item-text-wrap\" ng-if=\"formData.allWotRules\"><i class=\"icon ion-ribbon-b\"></i> <b class=\"ion-clock icon-secondary\" style=\"font-size: 18px; left: 33px; top: -12px;\"></b> <span class=\"col col-60\" translate>CURRENCY.VIEW.SIG_WINDOW</span> <span class=\"badge badge-stable\" ng-if=\"!loading\">{{formData.sigWindow | formatDuration}}</span></ion-item><ion-item class=\"item-icon-left item-text-wrap\" ng-if=\"formData.allWotRules\"><i class=\"icon ion-ribbon-b\"></i> <b class=\"ion-calendar icon-secondary\" style=\"font-size: 18px; left: 33px; top: -12px;\"></b> <span class=\"col col-60\" translate>CURRENCY.VIEW.SIG_VALIDITY</span> <span class=\"badge badge-balanced\" ng-if=\"!loading\">{{formData.sigValidity | formatDuration}}</span></ion-item><ion-item class=\"item-icon-left item-text-wrap\" ng-if=\"formData.allWotRules\"><i class=\"icon ion-ribbon-a\"></i> <span class=\"col col-75\" translate>CURRENCY.VIEW.SIG_STOCK</span> <span class=\"badge badge-stable\" ng-if=\"!loading\">{{formData.sigStock}}</span></ion-item><ion-item class=\"item-icon-left item-text-wrap\" ng-if=\"formData.allWotRules\"><i class=\"icon ion-clock\" style=\"position: absolute; font-size: 20px; left: 16px;\"></i> <b class=\"ion-ribbon-a icon-secondary\" style=\"left: 16px; top: -15px;\"></b> <b class=\"ion-arrow-right-c icon-secondary\" style=\"left: 28px; top: -15px;\"></b> <b class=\"ion-ribbon-a icon-secondary\" style=\"left: 40px; top: -15px;\"></b> <span class=\"col col-75\" translate>CURRENCY.VIEW.SIG_PERIOD</span> <span class=\"badge badge-stable\" ng-if=\"!loading\">{{formData.sigPeriod | formatDuration}}</span></ion-item><ion-item class=\"item-icon-left item-text-wrap\" ng-if=\"formData.allWotRules\"><i class=\"icon ion-steam\"></i> <b class=\"ion-person icon-secondary\" style=\"left: 38px; top: -17px\"></b><div class=\"col col-75\"><span ng-bind-html=\"\\'CURRENCY.VIEW.STEP_MAX\\'|translate\"></span> <span class=\"gray\">(stepMax)</span></div><span class=\"badge badge-assertive\" ng-if=\"!loading\">{{formData.stepMax}}</span></ion-item><ion-item class=\"item-icon-left item-text-wrap\" ng-if=\"formData.allWotRules\"><i class=\"icon ion-ribbon-b\"></i> <b class=\"ion-star icon-secondary\" style=\"color: yellow; font-size: 16px; left: 25px; top: -7px;\"></b> <span class=\"col col-75\" translate>CURRENCY.VIEW.SENTRIES</span> <span class=\"badge badge-stable\" ng-if=\"!loading\">{{formData.sentries}}</span></ion-item><ion-item class=\"item-icon-left item-text-wrap\" ng-if=\"formData.allWotRules\"><i class=\"icon ion-ribbon-b\"></i> <b class=\"ion-star icon-secondary\" style=\"color: yellow; font-size: 16px; left: 25px; top: -7px;\"></b> <span class=\"col col-75\" translate>CURRENCY.VIEW.SENTRIES_FORMULA</span> <span class=\"item-note dark\" ng-if=\"!loading\">{{\\'CURRENCY.VIEW.MATH_CEILING\\'| translate}}( N<sub>t</sub><sup>^ (1 / stepMax)</sup>)</span></ion-item><ion-item class=\"item-icon-left item-text-wrap\" ng-if=\"formData.allWotRules\"><i class=\"icon ion-pull-request\"></i> <span class=\"col col-75\" translate>CURRENCY.VIEW.XPERCENT</span> <span class=\"badge badge-stable\" ng-if=\"!loading\">{{formData.xpercent*100| formatNumeral: \\'0,0\\'}} %</span></ion-item><div class=\"item item-toggle dark\"><div class=\"item-label text-right gray\" translate>CURRENCY.VIEW.DISPLAY_ALL_RULES</div><label class=\"toggle toggle-royal\"><input type=\"checkbox\" ng-model=\"formData.allWotRules\"><div class=\"track\"><div class=\"handle\"></div></div></label></div></div>');\n$templateCache.put('templates/currency/lookup_form.html','<ion-list><div class=\"item center\" ng-if=\"search.loading\"><ion-spinner icon=\"android\"></ion-spinner></div><div ng-repeat=\"currency in search.results\" ng-class=\"{ selected: selectedCurrency == currency }\"><a class=\"item card card-item stable-bg padding ink\" ng-click=\"selectCurrency(currency)\" ng-class=\"{ selected: selectedCurrency && selectedCurrency.name == currency.name }\"><h2>{{currency.name}}</h2><h4 class=\"gray\">{{currency.peer.server}}</h4><span class=\"badge badge-royal\">{{\\'CURRENCY.SELECT.MEMBERS_COUNT\\'|translate:currency}}</span></a></div></ion-list>');\n$templateCache.put('templates/currency/lookup.html','<ion-view view-title=\"{{\\'CURRENCY.SELECT.TITLE\\' | translate}}\"><ion-content class=\"padding no-padding-xs no-padding-sm\"><h4 class=\"content double-padding-x\" translate>CURRENCY.SELECT.CURRENCIES</h4><ng-include src=\"::\\'templates/currency/lookup_form.html\\'\"></ion-content></ion-view>');\n$templateCache.put('templates/currency/modal_license.html','<ion-modal-view class=\"modal-full-height modal-license\"><ion-header-bar class=\"bar-positive\"><button class=\"button button-clear visible-xs\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button><h1 class=\"title\" translate>CURRENCY.LICENSE.TITLE</h1><button class=\"button button-icon button-clear icon ion-android-send visible-xs\" ng-click=\"doTransfer()\"></button></ion-header-bar><ion-content scroll=\"false\" style=\"bottom: 0px;\"><p ng-if=\"!licenseUrl && !loading\">translate>CURRENCY.LICENSE.NO_LICENSE_FILE</p><iframe ng-if=\"licenseUrl && !loading\" class=\"padding-left padding-right no-padding-xs iframe-license\" id=\"iframe-license\" ng-src=\"{{licenseUrlHtml||licenseUrl}}\"></iframe><div class=\"padding hidden-xs text-center\"><button class=\"button button-stable ink\" ng-click=\"downloadFile()\">{{\\'CURRENCY.LICENSE.BTN_DOWNLOAD\\' | translate}}</button> <button class=\"button button-positive ink\" type=\"submit\" ng-click=\"closeModal()\">{{\\'COMMON.BTN_CLOSE\\' | translate}}</button></div></ion-content></ion-modal-view>');\n$templateCache.put('templates/currency/popover_actions.html','<ion-popover-view class=\"fit has-header popover-wallet-actions\"><ion-header-bar><h1 class=\"title\" translate>COMMON.POPOVER_ACTIONS_TITLE</h1></ion-header-bar><ion-content scroll=\"false\"><div class=\"list item-text-wrap\"><a class=\"item item-icon-left ink hidden-sm hidden-xs\" ng-click=\"startCurrencyTour()\"><i class=\"icon ion-easel\"></i> {{\\'COMMON.BTN_HELP_TOUR_SCREEN\\' | translate}}</a></div></ion-content></ion-popover-view>');\n$templateCache.put('templates/currency/tabs/tab_blocks.html','<ion-view><ion-nav-buttons side=\"secondary\"><button class=\"button button-icon button-clear icon ion-navicon visible-xs visible-sm\" ng-click=\"toggleCompactMode()\"><b class=\"icon-secondary\" ng-class=\"{\\'ion-arrow-down-b\\': !compactMode, \\'ion-arrow-up-b\\': compactMode}\" style=\"top: -12px; left: 11px; font-size: 10px;\"></b> <b class=\"icon-secondary\" ng-class=\"{\\'ion-arrow-up-b\\': !compactMode,\\'ion-arrow-down-b\\': compactMode}\" style=\"top: 12px; left: 11px; font-size: 10px;\"></b></button><cs-extension-point name=\"nav-buttons\"></cs-extension-point></ion-nav-buttons><ion-content><div class=\"item item-divider\"><span translate>BLOCKCHAIN.LOOKUP.LAST_BLOCKS</span></div><cs-extension-point name=\"buttons\"></cs-extension-point><ng-include src=\"::\\'templates/blockchain/list_blocks.html\\'\"></ng-include></ion-content></ion-view>');\n$templateCache.put('templates/currency/tabs/tab_network.html','<ion-view><ion-nav-buttons side=\"secondary\"><button class=\"button button-icon button-clear\" ng-click=\"showExtendActionsPopover($event)\"><i class=\"icon ion-android-funnel\"></i></button></ion-nav-buttons><ion-content><ion-refresher pulling-text=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\" on-refresh=\"refreshPeers()\"></ion-refresher><div class=\"list\"><ng-include src=\"::\\'templates/currency/items_network.html\\'\"></ng-include></div></ion-content></ion-view>');\n$templateCache.put('templates/currency/tabs/tab_parameters.html','<ion-view><ion-nav-buttons side=\"secondary\"><cs-extension-point name=\"nav-buttons\"></cs-extension-point></ion-nav-buttons><ion-content><ion-refresher pulling-text=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\" on-refresh=\"refresh()\"></ion-refresher><div class=\"list\"><ng-include src=\"::\\'templates/currency/items_parameters.html\\'\"></ng-include></div></ion-content></ion-view>');\n$templateCache.put('templates/currency/tabs/tab_wot.html','<ion-view><ion-content><ion-refresher pulling-text=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\" on-refresh=\"refresh()\"></ion-refresher><div class=\"list\"><ng-include src=\"::\\'templates/currency/items_wot.html\\'\"></ng-include></div></ion-content></ion-view>');\n$templateCache.put('templates/currency/view_currency_lg.html','<ion-view left-buttons=\"leftButtons\" cache-view=\"false\"><ion-nav-title bind-notifier=\"{ rebind:formData.useRelative }\"><span ng-if=\"!loading\">{{\\'CURRENCY.VIEW.TITLE\\' | translate}} {{formData.currency|abbreviate}}</span></ion-nav-title><ion-nav-buttons side=\"secondary\"><button class=\"button button-icon button-clear icon ion-loop visible-xs visible-sm\" ng-click=\"refreshPeers()\"></button><cs-extension-point name=\"nav-buttons\"></cs-extension-point></ion-nav-buttons><ion-content><div class=\"hidden-xs hidden-sm padding text-center\"><button class=\"button button-stable icon-right ink\" ng-if=\"formData.licenseUrl\" ng-click=\"showLicenseModal()\"><i class=\"icon ion-document-text\"></i>&nbsp; {{\\'CURRENCY.VIEW.BTN_SHOW_LICENSE\\' | translate}}</button> <button class=\"button button-stable button-small-padding icon ion-loop ink\" ng-click=\"refresh()\" title=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\"></button> <button class=\"button button-stable button-small-padding icon ion-android-more-vertical ink\" ng-click=\"showActionsPopover($event)\"></button></div><div class=\"item item-text-wrap no-border no-padding pull-left\"><div class=\"item-icon-left card padding stable-900-bg\"><ion-spinner class=\"icon\" icon=\"android\" ng-if=\"loading\"></ion-spinner><i class=\"icon ion-help-circled calm\" ng-if=\"!loading\"></i><div class=\"item-icon-left-padding\" style=\"min-height: 26px;\"><span ng-if=\"!loading\" trust-as-html=\"\\'CURRENCY.VIEW.CURRENCY_SHORT_DESCRIPTION\\'|translate:formData\"></span></div></div></div><div class=\"row responsive-sm\"><div class=\"col list\"><div class=\"item item-divider\"><span translate>CURRENCY.VIEW.MONEY_DIVIDER</span></div><ng-include src=\"::\\'templates/currency/items_parameters.html\\'\"></ng-include></div><div class=\"col list\"><div class=\"item item-divider\"><span translate>CURRENCY.VIEW.WOT_DIVIDER</span></div><ng-include src=\"::\\'templates/currency/items_wot.html\\'\"></ng-include></div></div></ion-content></ion-view>');\n$templateCache.put('templates/currency/view_currency.html','<ion-view left-buttons=\"leftButtons\" cache-view=\"false\"><ion-tabs class=\"tabs-positive tabs-icon-top\"><ion-tab title=\"{{\\'CURRENCY.VIEW.TAB_CURRENCY\\'|translate}}\" icon=\"ion-stats-bars\" ui-sref=\"app.currency.tab_parameters\"><ion-nav-view name=\"tab-parameters\"></ion-nav-view></ion-tab><ion-tab title=\"{{\\'CURRENCY.VIEW.TAB_WOT\\'|translate}}\" icon=\"ion-person-stalker\" ui-sref=\"app.currency.tab_wot\"><ion-nav-view name=\"tab-wot\"></ion-nav-view></ion-tab><ion-tab id=\"helptip-currency-tab-peers\" title=\"{{\\'CURRENCY.VIEW.TAB_NETWORK\\'|translate}}\" icon=\"ion-cloud\" ui-sref=\"app.currency.tab_network\"><ion-nav-view name=\"tab-network\"></ion-nav-view></ion-tab><ion-tab title=\"{{\\'CURRENCY.VIEW.TAB_BLOCKS\\'|translate}}\" icon=\"ion-lock-combination\" ui-sref=\"app.currency.tab_blocks\"><ion-nav-view name=\"tab-blocks\"></ion-nav-view></ion-tab></ion-tabs></ion-view>');\n$templateCache.put('templates/help/help.html','<a name=\"demo\"></a><div class=\"row responsive-sm\" ng-if=\"::$root.config.demo\" ng-class=\"itemsClass[\\'demo\\']\"><div class=\"col col-20\" translate>MODE.DEMO.MODE</div><div class=\"col\"><span translate>MODE.DEMO.MODE_HELP</span><br><span translate>MODE.DEMO.INSTALL_HELP</span></div></div><a name=\"readonly\"></a><div class=\"row responsive-sm\" ng-if=\"::$root.config.readonly\" ng-class=\"itemsClass[\\'readonly\\']\"><div class=\"col col-20\" translate>MODE.READONLY.MODE</div><div class=\"col\"><span translate>MODE.READONLY.MODE_HELP</span><br><span translate>MODE.READONLY.INSTALL_HELP</span></div></div><div class=\"hidden-readonly\"><a name=\"join\"></a><h2 translate>HELP.JOIN.SECTION</h2><a name=\"join-salt\"></a><div class=\"row responsive-sm\" ng-class=\"itemsClass[\\'join-salt\\']\"><div class=\"col col-20\" translate>LOGIN.SALT</div><div class=\"col\" translate>HELP.JOIN.SALT</div></div><a name=\"join-password\"></a><div class=\"row responsive-sm\" ng-class=\"itemsClass[\\'join-password\\']\"><div class=\"col col-20\" translate>LOGIN.PASSWORD</div><div class=\"col\" translate>HELP.JOIN.PASSWORD</div></div><a name=\"join-pseudo\"></a><div class=\"row responsive-sm\" ng-class=\"itemsClass[\\'join-pseudo\\']\"><div class=\"col col-20\" translate>ACCOUNT.NEW.PSEUDO</div><div class=\"col\" translate>HELP.JOIN.PSEUDO</div></div></div><div class=\"hidden-readonly\"><a name=\"login\"></a><h2 translate>HELP.LOGIN.SECTION</h2><a name=\"login-pubkey\"></a><div class=\"row responsive-sm\" ng-class=\"itemsClass[\\'login-pubkey\\']\"><div class=\"col col-20\" translate>HELP.LOGIN.PUBKEY</div><div class=\"col\" translate>HELP.LOGIN.PUBKEY_DEF</div></div><a name=\"login-method\"></a><div class=\"row responsive-sm\" ng-class=\"itemsClass[\\'login-method\\']\"><div class=\"col col-20\" translate>HELP.LOGIN.METHOD</div><div class=\"col\" translate>HELP.LOGIN.METHOD_DEF</div></div></div><div><a name=\"glossary\"></a><h2 translate>HELP.GLOSSARY.SECTION</h2><a name=\"pubkey\"></a><div class=\"row responsive-sm\" ng-class=\"itemsClass.pubkey\"><div class=\"col col-20\" translate>COMMON.PUBKEY</div><div class=\"col\" translate>HELP.GLOSSARY.PUBKEY_DEF</div></div><a name=\"blockchain\"></a><div class=\"row responsive-sm\" ng-class=\"itemsClass.blockchain\"><div class=\"col col-20\" translate>HELP.GLOSSARY.BLOCKCHAIN</div><div class=\"col\" translate>HELP.GLOSSARY.BLOCKCHAIN_DEF</div></div><a name=\"universal_dividend\"></a> <a name=\"ud\"></a><div class=\"row responsive-sm\" ng-class=\"itemsClass.ud\"><div class=\"col col-20\" translate>COMMON.UNIVERSAL_DIVIDEND</div><div class=\"col\" translate>HELP.GLOSSARY.UNIVERSAL_DIVIDEND_DEF</div></div><a name=\"member\"></a><div class=\"row responsive-sm\" ng-class=\"itemsClass.member\"><div class=\"col col-20\" translate>HELP.GLOSSARY.MEMBER</div><div class=\"col\" translate>HELP.GLOSSARY.MEMBER_DEF</div></div><a name=\"wot\"></a><div class=\"row responsive-sm\" ng-class=\"itemsClass.wot\"><div class=\"col col-20\" translate>HELP.GLOSSARY.WOT</div><div class=\"col\" translate>HELP.GLOSSARY.WOT_DEF</div></div><a name=\"currency_rules\"></a><div class=\"row responsive-sm\" ng-class=\"itemsClass.currency_rules\"><div class=\"col col-20\" translate>HELP.GLOSSARY.CURRENCY_RULES</div><div class=\"col\" translate>HELP.GLOSSARY.CURRENCY_RULES_DEF</div></div><a name=\"distance_rule\"></a><div class=\"row responsive-sm\" ng-class=\"itemsClass.distance_rule\"><div class=\"col col-20\" translate>HELP.GLOSSARY.DISTANCE_RULE</div><div class=\"col\" translate>HELP.GLOSSARY.DISTANCE_RULE_DEF</div></div></div>');\n$templateCache.put('templates/help/modal_help.html','<ion-modal-view class=\"modal-full-height modal-help\"><ion-header-bar class=\"bar-positive\"><button class=\"button button-clear\" ng-click=\"closeModal()\" translate>COMMON.BTN_CLOSE</button><h1 class=\"title\" translate>HELP.TITLE</h1></ion-header-bar><ion-content scroll=\"true\" class=\"padding no-padding-xs\"><div ng-class=\"listClass\"><ng-include src=\"::\\'templates/help/help.html\\'\"></ng-include></div><div class=\"padding hidden-xs text-center\"><button class=\"button button-positive ink\" type=\"submit\" ng-click=\"closeModal()\">{{\\'COMMON.BTN_CLOSE\\' | translate}}</button></div></ion-content></ion-modal-view>');\n$templateCache.put('templates/help/view_help.html','<ion-view left-buttons=\"leftButtons\"><ion-nav-title><span class=\"visible-xs visible-sm\" translate>HELP.TITLE</span></ion-nav-title><ion-content scroll=\"true\" class=\"padding\"><h1 class=\"hidden-xs hidden-sm\" translate>HELP.TITLE</h1><ng-include src=\"::\\'templates/help/help.html\\'\"></ng-include></ion-content></ion-view>');\n$templateCache.put('templates/home/home.html','<ion-view id=\"home\"><ion-nav-title></ion-nav-title><ion-nav-buttons side=\"secondary\"><button class=\"button button-clear hidden-xs hidden-sm flag\" ng-click=\"showLocalesPopover($event)\" style=\"align-content: center\"><i class=\"flag-image\" ng-if=\":locale:$root.settings.locale\" style=\"background-image: url(./img/flag-{{$root.settings.locale.flag}}.png);\"></i> <b class=\"ion-arrow-down-b gray\"></b></button></ion-nav-buttons><ion-content class=\"circle-bg-dark\" ng-class=\"::{\\'positive-900-bg\\': !$root.config.readonly, \\'balanced-900-bg\\': $root.config.readonly}\"><div class=\"ribbon\" ng-if=\"::$root.config.demo || $root.config.readonly\"><a class=\"badge badge-assertive\" ng-if=\"$root.config.demo\" ng-click=\"showHelpModal(\\'demo\\')\">{{:locale:\\'MODE.DEMO.BADGE\\'|translate}}</a> <a class=\"badge badge-balanced\" ng-if=\"$root.config.readonly\" ng-click=\"showHelpModal(\\'readonly\\')\">{{:locale:\\'MODE.READONLY.BADGE\\'|translate}}</a> <a class=\"badge badge-positive\" ng-click=\"openLink($event, $root.settings.sourceUrl)\" title=\"{{:locale:\\'HOME.FORK_ME\\'|translate}}\">{{:locale:\\'HOME.FREE_SOFTWARE\\'|translate}}</a> <a class=\"badge badge-stable\" ng-click=\"openLink($event, $root.settings.sourceLicenseUrl)\" title=\"{{:locale:\\'HOME.SHOW_LICENSE\\'|translate}}\">AGPL-3.0</a></div><div class=\"row padding-horizontal no-padding-xxs responsive-lg\"><div class=\"col col-30 no-padding hidden-xs hidden-sm\">&nbsp;</div><div class=\"col text-center no-padding-xs main-container\"><div id=\"helptip-home-logo\" class=\"logo\"></div><h4 class=\"welcome\" ng-if=\"::!$root.config.readonly\"><p class=\"hidden-xs\" translate>HOME.WELCOME</p><b ng-show=\"!loading\" translate-values=\":currency:{currency: $root.currency.name}\" translate>HOME.MESSAGE</b></h4><h4 class=\"welcome\" ng-if=\"::$root.config.readonly\"><p translate>HOME.WELCOME_READONLY</p><b ng-show=\"!loading\" translate-values=\":currency:{currency: $root.currency.name}\" translate>HOME.MESSAGE_READONLY</b></h4><div class=\"center padding\" ng-if=\"loading\"><ion-spinner icon=\"android\"></ion-spinner></div><div class=\"center padding animate-fade-in animate-show-hide ng-hide\" ng-show=\"!loading && error\"><div class=\"card card-item padding\"><p class=\"item-content item-text-wrap\"><span class=\"dark\" trust-as-html=\"\\'HOME.CONNECTION_ERROR\\'|translate:node\"></span></p><button type=\"button\" class=\"button button-positive icon icon-left ion-refresh ink\" ng-click=\"reload()\">{{:locale:\\'COMMON.BTN_REFRESH\\'|translate}}</button></div></div><div class=\"center animate-show-hide ng-hide\" ng-show=\"!loading && !error\"><button type=\"button\" class=\"button button-block button-stable button-raised icon-left icon ion-easel ink-dark\" ng-class=\"::{\\'hidden-xs\\': !$root.config.readonly}\" ng-show=\"login || $root.config.readonly\" ng-click=\"startHelpTour($event)\">{{:locale:\\'COMMON.BTN_HELP_TOUR\\'|translate}}</button> <button type=\"button\" class=\"item button button-block button-balanced button-raised icon icon-left ion-ios-world-outline ink-dark\" ui-sref=\"app.currency\" ng-if=\"::$root.config.readonly\"><span translate-values=\":currency:{currency: $root.currency.name}\" translate>HOME.BTN_CURRENCY</span></button> <button type=\"button\" class=\"item button button-block button-positive button-raised icon icon-left ion-cloud ink-dark\" ui-sref=\"app.network\" ng-if=\"::$root.config.readonly\">{{:locale:\\'HOME.BTN_NETWORK\\'|translate}}</button> <button type=\"button\" class=\"button button-block button-positive button-raised ink-dark\" ng-click=\"showJoinModal()\" ng-if=\"!$root.config.readonly && !login\" translate>LOGIN.CREATE_FREE_ACCOUNT</button> <button type=\"button\" class=\"item button button-block button-raised icon icon-left ion-person ink-dark\" ng-class=\"{\\'button-stable\\': smallscreen, \\'button-positive\\': !smallscreen}\" ui-sref=\"app.view_wallet\" ng-show=\"login\" translate>MENU.ACCOUNT</button> <button type=\"button\" class=\"item button button-block button-stable button-raised icon icon-left ion-card ink-dark visible-xs\" ui-sref=\"app.view_wallet_tx\" ng-if=\"login\"><b class=\"icon-secondary ion-clock\" style=\"left: 52px; top: -2px; font-size: 10pt; display: block;\"></b> {{:locale:\\'MENU.TRANSACTIONS\\'|translate}}</button> <button type=\"button\" class=\"item button button-block button-positive button-raised icon icon-left ion-paper-airplane ink-dark visible-xs\" ng-click=\"showTransferModal()\" ng-if=\"login\" translate>COMMON.BTN_SEND_MONEY</button><br class=\"visible-xs visible-sm\"><div class=\"text-center no-padding\" ng-if=\"::!$root.config.readonly\" ng-show=\"!login\"><br class=\"visible-xs visible-sm\">{{\\'LOGIN.HAVE_ACCOUNT_QUESTION\\'|translate}} <b><a class=\"assertive hidden-xs hidden-sm\" ui-sref=\"app.view_wallet\" translate>COMMON.BTN_LOGIN</a></b></div><div class=\"text-center no-padding\" ng-show=\"login\"><br class=\"visible-xs visible-sm\"><span ng-bind-html=\"\\'HOME.NOT_YOUR_ACCOUNT_QUESTION\\'|translate:{pubkey: walletData.pubkey}\"></span><br><b><a class=\"assertive\" ng-click=\"logout({askConfirm: true})\" translate>HOME.BTN_CHANGE_ACCOUNT</a></b></div><button type=\"button\" class=\"button button-block button-stable button-raised ink visible-xs visible-sm\" ui-sref=\"app.view_wallet\" ng-if=\"!$root.config.readonly && !login\" translate>COMMON.BTN_LOGIN</button><div class=\"text-center visible-demo\"><br><p class=\"text-center\"><span class=\"light\"><i class=\"icon ion-help-circled\" style=\"font-size: 16pt;\"></i></span> <span class=\"stable\" translate>MODE.DEMO.MODE_HELP</span> <a href=\"#\" ng-click=\"showHelpModal(\\'demo\\')\" translate>HOME.READ_MORE</a></p></div><p class=\"text-center no-padding visible-readonly\"><br><span class=\"light\"><i class=\"icon ion-help-circled\" style=\"font-size: 16pt;\"></i></span> <span class=\"stable\" translate>MODE.READONLY.INSTALL_HELP</span></p><div class=\"text-center no-padding visible-xs stable\"><br>{{:locale:\\'COMMON.APP_VERSION\\'|translate:{version: config.version} }} | <a href=\"#\" ng-click=\"showAboutModal()\" translate>HOME.BTN_ABOUT</a></div></div></div><div class=\"col no-padding\" ng-class=\"{\\'col-30\\': !feed, \\'col-10\\': feed}\">&nbsp;</div><div class=\"col col-30 no-padding\" ng-if=\"feed\"><div class=\"feed padding-horizontal no-padding-xs padding-top\"><h3 class=\"padding-left\"><i class=\"icon ion-speakerphone\"></i> {{feed.title}} <small><a ng-click=\"openLink($event, feed.home_page_url)\" class=\"gray\"><span translate>HOME.SHOW_ALL_FEED</span> <i class=\"icon ion-chevron-right\"></i></a></small></h3><div class=\"animate-show-hide ng-hide\" ng-show=\"feed\"><div ng-repeat=\"item in feed.items\" class=\"card padding no-margin-xs\"><div class=\"header\"><i ng-if=\"item.author.avatar\" class=\"avatar\" style=\"background-image: url({{item.author.avatar}});\"></i> <a ng-class=\"{\\'avatar-left-padding\\': item.author.avatar}\" class=\"author\" ng-click=\"item.author.url && openLink($event, item.author.url)\">{{item.author.name}} </a><a ng-if=\"item.time\" title=\"{{item.time|formatDate}}\" ng-click=\"openLink($event, item.url)\" class=\"item-note\"><small><i class=\"icon ion-clock\"></i>&nbsp;{{item.time|formatFromNow}}</small></a></div><h2 class=\"title feed-title\"><a ng-click=\"openLink($event, item.url)\">{{item.title}}</a></h2><div ng-if=\"item.content\" class=\"content feed-content\" trust-as-html=\"item.content\"></div><h4 class=\"card-footer feed-footer text-right positive-100\"><a ng-click=\"openLink($event, item.url)\"><span ng-if=\"item.truncated\" translate>HOME.READ_MORE</span> <span ng-if=\"!item.truncated\" translate>COMMON.BTN_SHOW</span> <i class=\"icon ion-chevron-right\"></i></a></h4></div></div></div></div></div></ion-content></ion-view>');\n$templateCache.put('templates/join/modal_choose_account_type.html','<ion-modal-view class=\"modal-full-height\"><ion-header-bar class=\"bar-positive\"><button class=\"button button-clear visible-xs\" ng-if=\"!slides.slider.activeIndex\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-icon button-clear icon ion-ios-arrow-back buttons header-item\" ng-click=\"slidePrev()\" ng-if=\"slides.slider.activeIndex\"></button><h1 class=\"title\" translate>ACCOUNT.NEW.TITLE</h1><button class=\"button button-clear icon-right visible-xs\" ng-if=\"slides.slider.activeIndex === 0\" ng-click=\"slideNext()\"><span translate>COMMON.BTN_NEXT</span> <i class=\"icon ion-ios-arrow-right\"></i></button></ion-header-bar><ion-slides options=\"slides.options\" slider=\"slides.slider\"><ion-slide-page><ion-content class=\"has-header padding\"><div class=\"center padding\" ng-if=\"loading\"><ion-spinner class=\"icon\" icon=\"android\"></ion-spinner></div><div ng-if=\"!loading\"><p ng-bind-html=\"\\'ACCOUNT.NEW.INTRO_WARNING_TIME\\'|translate:currency\"></p><div class=\"row responsive-sm\"><div class=\"col\"><div class=\"item card item-icon-left padding item-text-wrap stable-bg\"><i class=\"icon ion-android-warning assertive\"></i><p class=\"item-content item-icon-left-padding\"><span class=\"dark\" translate>ACCOUNT.NEW.INTRO_WARNING_SECURITY</span><br><small translate>ACCOUNT.NEW.INTRO_WARNING_SECURITY_HELP</small></p></div></div><div class=\"col\"><div class=\"item card item-icon-left padding item-text-wrap stable-bg\"><i class=\"icon ion-information-circled positive\"></i><p class=\"item-content item-icon-left-padding\"><span class=\"dark\" trust-as-html=\"\\'ACCOUNT.NEW.REGISTRATION_NODE\\'|translate:currency.node\"></span><br><small trust-as-html=\"\\'ACCOUNT.NEW.REGISTRATION_NODE_HELP\\'|translate:currency.node\"></small></p></div></div></div></div><p class=\"hidden-xs hidden-sm\" ng-bind-html=\"\\'ACCOUNT.NEW.INTRO_HELP\\'|translate\"></p><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-positive icon-right ion-chevron-right ink\" ng-click=\"slideNext()\" ng-disabled=\"loading\" type=\"button\" translate>COMMON.BTN_START</button></div></ion-content></ion-slide-page><ion-slide-page><ion-content class=\"has-header padding\"><p translate>ACCOUNT.NEW.SELECT_ACCOUNT_TYPE</p><div class=\"list\"><button class=\"item item-complex card stable-bg item-icon-left item-icon-right ink\" ng-click=\"selectAccountTypeAndClose(\\'wallet\\')\"><div class=\"item-content item-text-wrap\"><i class=\"item-image icon dark ion-card\"></i><h2 translate>ACCOUNT.NEW.WALLET_ACCOUNT</h2><h4 class=\"gray\" translate>ACCOUNT.NEW.WALLET_ACCOUNT_HELP</h4><ng-if ng-if=\"::$root.config.demo\" ng-include=\"::\\'templates/common/note_feature_not_available.html\\'\"><i class=\"icon dark ion-ios-arrow-right\"></i></ng-if></div></button> <button class=\"item item-complex card stable-100-bg item-icon-left item-icon-right ink\" ng-click=\"selectAccountTypeAndClose(\\'member\\')\"><div class=\"item-content item-text-wrap\"><i class=\"item-image icon dark ion-person\"></i><h2 translate>ACCOUNT.NEW.MEMBER_ACCOUNT</h2><h4 class=\"gray\" ng-bind-html=\"\\'ACCOUNT.NEW.MEMBER_ACCOUNT_HELP\\'|translate:currency\"></h4><ng-if ng-if=\"::$root.config.demo\" ng-include=\"::\\'templates/common/note_feature_not_available.html\\'\"><i class=\"icon dark ion-ios-arrow-right\"></i></ng-if></div></button><cs-extension-point name=\"select-account-type\"></cs-extension-point></div><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" translate>COMMON.BTN_CANCEL</button></div></ion-content></ion-slide-page></ion-slides></ion-modal-view>');\n$templateCache.put('templates/join/modal_join_member.html','<ion-modal-view class=\"modal-full-height\"><ion-header-bar class=\"bar-positive\"><button class=\"button button-clear visible-xs\" ng-if=\"!slides.slider.activeIndex\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-icon button-clear icon ion-ios-arrow-back buttons header-item\" ng-click=\"doPrev()\" ng-if=\"slides.slider.activeIndex && slideBehavior.hasPreviousButton\"></button> <button class=\"button button-icon button-clear icon ion-ios-help-outline visible-xs\" ng-if=\"slideBehavior.helpAnchor\" ng-click=\"showHelpModal(slideBehavior.helpAnchor)\"></button><h1 class=\"title\" translate>ACCOUNT.NEW.MEMBER_ACCOUNT_TITLE</h1><button class=\"button button-clear icon-right visible-xs\" ng-if=\"slideBehavior.hasNextButton\" ng-click=\"doNext()\"><span translate>COMMON.BTN_NEXT</span> <i class=\"icon ion-ios-arrow-right\"></i></button> <button class=\"button button-clear icon-right visible-xs\" ng-class=\"{\\'button-text-stable\\': !isLicenseRead}\" ng-if=\"slideBehavior.hasAcceptButton\" ng-click=\"isLicenseRead ? doNext() : undefined\"><span translate>ACCOUNT.NEW.BTN_ACCEPT</span> <i class=\"icon ion-ios-arrow-right\"></i></button> <button class=\"button button-clear icon-right visible-xs\" ng-if=\"slideBehavior.hasSendButton\" ng-click=\"doNewAccount()\"><i class=\"icon ion-android-send\"></i></button></ion-header-bar><ion-slides options=\"slides.options\" slider=\"slides.slider\"><ion-slide-page ng-if=\"licenseFileUrl\"><ion-content class=\"has-header\" scroll=\"false\"><div class=\"padding\" translate>ACCOUNT.NEW.INFO_LICENSE</div><div class=\"center padding\" ng-if=\"loading\"><ion-spinner class=\"icon\" icon=\"android\"></ion-spinner></div><iframe ng-if=\"!loading\" class=\"padding-left padding-right no-padding-xs iframe-license\" id=\"iframe-license\" ng-src=\"{{licenseFileUrl}}\"></iframe><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-calm icon-right ion-chevron-right ink\" ng-click=\"doNext(\\'licenceForm\\')\" ng-disabled=\"!isLicenseRead\" type=\"button\" translate>ACCOUNT.NEW.BTN_ACCEPT_LICENSE</button></div></ion-content></ion-slide-page><ion-slide-page><ion-content class=\"has-header\" scroll=\"true\"><form name=\"pseudoForm\" novalidate=\"\" ng-submit=\"doNext(\\'pseudoForm\\')\"><div class=\"item item-text-wrap text-center padding\"><a class=\"pull-right icon-help hidden-xs\" ng-click=\"showHelpModal(\\'join-pseudo\\')\"></a> <span translate>ACCOUNT.NEW.PSEUDO_WARNING</span></div><div class=\"list\" ng-init=\"setForm(pseudoForm, \\'pseudoForm\\')\"><div class=\"item item-input\" ng-class=\"{\\'item-input-error\\': (pseudoForm.$submitted && pseudoForm.pseudo.$invalid) || (uiAlreadyUsed && formData.pseudo)}\"><span class=\"input-label\" translate>ACCOUNT.NEW.PSEUDO</span> <input id=\"pseudo\" name=\"pseudo\" type=\"text\" placeholder=\"{{\\'ACCOUNT.NEW.PSEUDO_HELP\\' | translate}}\" ng-model=\"formData.pseudo\" autocomplete=\"off\" ng-minlength=\"3\" ng-maxlength=\"100\" ng-pattern=\"userIdPattern\" ng-model-options=\"{ debounce: 250 }\" required></div><div class=\"form-errors\" ng-show=\"pseudoForm.$submitted && pseudoForm.pseudo.$error\" ng-messages=\"pseudoForm.pseudo.$error\"><div class=\"form-error\" ng-message=\"minlength\"><span translate=\"ERROR.FIELD_TOO_SHORT_WITH_LENGTH\" translate-values=\"{minLength: 3}\"></span></div><div class=\"form-error\" ng-message=\"maxlength\"><span translate=\"ERROR.FIELD_TOO_LONG_WITH_LENGTH\" translate-values=\"{maxLength: 100}\"></span></div><div class=\"form-error\" ng-message=\"required\"><span translate=\"ERROR.FIELD_REQUIRED\"></span></div><div class=\"form-error\" ng-message=\"pattern\"><span translate=\"ERROR.INVALID_USER_ID\"></span></div></div><div class=\"text-right\" style=\"min-height: 18px;\"><div class=\"form-error gray\" ng-if=\"formData.computing && formData.pseudo\"><ion-spinner class=\"icon ion-spinner-small\" icon=\"android\" ng-if=\"formData.computing && formData.pseudo\"></ion-spinner><span translate>ACCOUNT.NEW.CHECKING_PSEUDO</span></div><ng-if ng-if=\"!formData.computing && formData.pseudo\"><div class=\"form-error balanced\" ng-if=\"!uiAlreadyUsed \"><i class=\"icon ion-checkmark balanced\"></i> <span translate>ACCOUNT.NEW.PSEUDO_AVAILABLE</span></div><div class=\"form-error\" ng-if=\"uiAlreadyUsed\"><i class=\"icon ion-close-circled assertive\"></i> <span translate>ACCOUNT.NEW.PSEUDO_NOT_AVAILABLE</span></div></ng-if></div><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-calm icon-right ion-chevron-right ink\" type=\"submit\" ng-disabled=\"uiAlreadyUsed\" translate>COMMON.BTN_NEXT</button></div></div></form></ion-content></ion-slide-page><ion-slide-page ng-if=\"!formData.pubkey\"><ion-content class=\"has-header\" scroll=\"true\"><form name=\"saltForm\" novalidate=\"\" ng-submit=\"doNext(\\'saltForm\\')\"><div class=\"list\" ng-init=\"setForm(saltForm, \\'saltForm\\')\"><div class=\"item item-text-wrap text-center padding hidden-xs\"><a class=\"pull-right icon-help\" ng-click=\"showHelpModal(\\'join-salt\\')\"></a> <span translate>ACCOUNT.NEW.SALT_WARNING</span></div><div class=\"item item-input\" ng-class=\"{ \\'item-input-error\\': saltForm.$submitted && saltForm.username.$invalid}\"><span class=\"input-label\" translate>LOGIN.SALT</span> <input ng-if=\"!showUsername\" name=\"username\" type=\"password\" placeholder=\"{{\\'LOGIN.SALT_HELP\\' | translate}}\" ng-change=\"formDataChanged()\" ng-model=\"formData.username\" autocomplete=\"off\" ng-minlength=\"8\" different-to=\"formData.pseudo\" required> <input ng-if=\"showUsername\" name=\"username\" type=\"text\" placeholder=\"{{\\'LOGIN.SALT_HELP\\' | translate}}\" ng-change=\"formDataChanged()\" ng-model=\"formData.username\" autocomplete=\"off\" ng-minlength=\"8\" different-to=\"formData.pseudo\" required></div><div class=\"form-errors\" ng-show=\"saltForm.$submitted && saltForm.username.$error\" ng-messages=\"saltForm.username.$error\"><div class=\"form-error\" ng-message=\"minlength\"><span translate=\"ERROR.FIELD_TOO_SHORT_WITH_LENGTH\" translate-values=\"{minLength: 8}\"></span></div><div class=\"form-error\" ng-message=\"required\"><span translate=\"ERROR.FIELD_REQUIRED\"></span></div><div class=\"form-error\" ng-message=\"differentTo\"><span translate=\"ERROR.EQUALS_TO_PSEUDO\"></span></div></div><div class=\"item item-input\" ng-class=\"{ \\'item-input-error\\': saltForm.$submitted && saltForm.confirmSalt.$invalid}\"><span class=\"input-label pull-right\" translate>ACCOUNT.NEW.SALT_CONFIRM</span> <input ng-if=\"!showUsername\" name=\"confirmUsername\" type=\"password\" placeholder=\"{{\\'ACCOUNT.NEW.SALT_CONFIRM_HELP\\' | translate}}\" ng-model=\"formData.confirmUsername\" autocomplete=\"off\" compare-to=\"formData.username\"> <input ng-if=\"showUsername\" name=\"confirmUsername\" type=\"text\" placeholder=\"{{\\'ACCOUNT.NEW.SALT_CONFIRM_HELP\\' | translate}}\" ng-model=\"formData.confirmUsername\" autocomplete=\"off\" compare-to=\"formData.username\"></div><div class=\"form-errors\" ng-show=\"saltForm.$submitted && saltForm.confirmUsername.$error\" ng-messages=\"saltForm.confirmUsername.$error\"><div class=\"form-error\" ng-message=\"compareTo\"><span translate=\"ERROR.SALT_NOT_CONFIRMED\"></span></div></div><div class=\"item item-toggle dark\"><span translate>COMMON.SHOW_VALUES</span> <label class=\"toggle toggle-royal\"><input type=\"checkbox\" ng-model=\"showUsername\"><div class=\"track\"><div class=\"handle\"></div></div></label></div><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-calm icon-right ion-chevron-right ink\" type=\"submit\" translate>COMMON.BTN_NEXT <i class=\"icon ion-arrow-right-a\"></i></button></div></div></form></ion-content></ion-slide-page><ion-slide-page ng-if=\"!formData.pubkey\"><ion-content class=\"has-header\" scroll=\"true\"><form name=\"passwordForm\" novalidate=\"\" ng-submit=\"doNext(\\'passwordForm\\')\"><div class=\"item item-text-wrap text-center padding hidden-xs\"><a class=\"pull-right icon-help\" ng-click=\"showHelpModal(\\'join-password\\')\"></a> <span translate>ACCOUNT.NEW.PASSWORD_WARNING</span></div><div class=\"list\" ng-init=\"setForm(passwordForm, \\'passwordForm\\')\"><div class=\"item item-input\" ng-class=\"{ \\'item-input-error\\': passwordForm.$submitted && passwordForm.password.$invalid}\"><span class=\"input-label\" translate>LOGIN.PASSWORD</span> <input ng-if=\"!showPassword\" name=\"password\" type=\"password\" placeholder=\"{{\\'LOGIN.PASSWORD_HELP\\' | translate}}\" ng-model=\"formData.password\" autocomplete=\"off\" ng-change=\"formDataChanged()\" ng-minlength=\"8\" different-to=\"formData.username\" required> <input ng-if=\"showPassword\" name=\"text\" type=\"text\" placeholder=\"{{\\'LOGIN.PASSWORD_HELP\\' | translate}}\" ng-model=\"formData.password\" autocomplete=\"off\" ng-change=\"formDataChanged()\" ng-minlength=\"8\" different-to=\"formData.username\" required></div><div class=\"form-errors\" ng-show=\"passwordForm.$submitted && passwordForm.password.$error\" ng-messages=\"passwordForm.password.$error\"><div class=\"form-error\" ng-message=\"minlength\"><span translate=\"ERROR.FIELD_TOO_SHORT_WITH_LENGTH\" translate-values=\"{minLength: 8}\"></span></div><div class=\"form-error\" ng-message=\"required\"><span translate=\"ERROR.FIELD_REQUIRED\"></span></div><div class=\"form-error\" ng-message=\"differentTo\"><span translate=\"ERROR.EQUALS_TO_SALT\"></span></div></div><div class=\"item item-input\" ng-class=\"{ \\'item-input-error\\': passwordForm.$submitted && passwordForm.confirmPassword.$invalid}\"><span class=\"input-label\" translate>ACCOUNT.NEW.PASSWORD_CONFIRM</span> <input ng-if=\"!showPassword\" name=\"confirmPassword\" type=\"password\" placeholder=\"{{\\'ACCOUNT.NEW.PASSWORD_CONFIRM_HELP\\' | translate}}\" ng-model=\"formData.confirmPassword\" autocomplete=\"off\" compare-to=\"formData.password\"> <input ng-if=\"showPassword\" name=\"confirmPassword\" type=\"text\" placeholder=\"{{\\'ACCOUNT.NEW.PASSWORD_CONFIRM_HELP\\' | translate}}\" ng-model=\"formData.confirmPassword\" autocomplete=\"off\" compare-to=\"formData.password\"></div><div class=\"form-errors\" ng-show=\"passwordForm.$submitted && passwordForm.confirmPassword.$error\" ng-messages=\"passwordForm.confirmPassword.$error\"><div class=\"form-error\" ng-message=\"compareTo\"><span translate=\"ERROR.PASSWORD_NOT_CONFIRMED\"></span></div></div><div class=\"item item-toggle dark\"><span translate>COMMON.SHOW_VALUES</span> <label class=\"toggle toggle-royal\"><input type=\"checkbox\" ng-model=\"showPassword\"><div class=\"track\"><div class=\"handle\"></div></div></label></div></div><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-calm icon-right ion-chevron-right ink\" type=\"submit\" ng-click=\"getRevocationDocument()\" translate>COMMON.BTN_NEXT</button></div><div class=\"padding hidden-xs\"></div></form></ion-content></ion-slide-page><ion-slide-page><ion-content class=\"has-header\" scroll=\"true\"><div class=\"center padding\" ng-if=\"formData.computing\"><ion-spinner icon=\"android\"></ion-spinner></div><ng-if ng-if=\"!formData.computing\"><div class=\"animate-fade-in animate-show-hide ng-hide\" ng-show=\"accountAvailable\"><div class=\"padding text-center\" translate>ACCOUNT.NEW.LAST_SLIDE_CONGRATULATION</div><div class=\"list\"><ion-item class=\"item text-center item-text-wrap\"><h3 class=\"gray\" translate>LOGIN.ASSOCIATED_PUBKEY</h3><h3 class=\"dark bold\">{{formData.pubkey}}</h3></ion-item></div><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-positive ink\" ng-click=\"doNewAccount()\" translate>COMMON.BTN_SEND <i class=\"icon ion-android-send\"></i></button></div></div><div class=\"animate-fade-in animate-show-hide ng-hide\" ng-show=\"!accountAvailable\"><ion-item class=\"item-icon-left item-text-wrap text-center\"><i class=\"icon ion-minus-circled assertive\"></i> <span id=\"modal-license\" trust-as-html=\"\\'ERROR.EXISTING_ACCOUNT\\'|translate\"></span></ion-item><div class=\"list\"><ion-item class=\"item item-text-wrap item-border\"><div class=\"padding text-center\"><span class=\"gray text-no-wrap\">{{formData.pubkey}}</span></div></ion-item><div class=\"padding text-center\"><span translate>ERROR.EXISTING_ACCOUNT_REQUEST</span></div></div><div class=\"padding hidden-xs text-left\"><button class=\"button button-assertive icon-left ion-chevron-left ink\" ng-click=\"identifierRecovery()\" translate>COMMON.BTN_MODIFY</button></div></div></ng-if></ion-content></ion-slide-page></ion-slides></ion-modal-view>');\n$templateCache.put('templates/join/modal_join_wallet.html','<ion-modal-view class=\"modal-full-height\"><ion-header-bar class=\"bar-positive\"><button class=\"button button-clear visible-xs\" ng-if=\"!slides.slider.activeIndex\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-icon button-clear icon ion-ios-arrow-back buttons header-item\" ng-click=\"slidePrev()\" ng-if=\"slideBehavior.hasPreviousButton\"></button> <button class=\"button button-icon button-clear icon ion-ios-help-outline visible-xs\" ng-if=\"slideBehavior.helpAnchor\" ng-click=\"showHelpModal(slideBehavior.helpAnchor)\"></button><h1 class=\"title\" translate>ACCOUNT.NEW.WALLET_ACCOUNT_TITLE</h1><button class=\"button button-clear icon-right visible-xs\" ng-if=\"slideBehavior.hasNextButton\" ng-click=\"doNext()\"><span translate>COMMON.BTN_NEXT</span> <i class=\"icon ion-ios-arrow-right\"></i></button> <button class=\"button button-clear icon-right visible-xs\" ng-if=\"slideBehavior.hasSendButton\" ng-click=\"doNewAccount()\"><i class=\"icon ion-android-send\"></i></button></ion-header-bar><ion-slides options=\"slides.options\" slider=\"slides.slider\"><ion-slide-page><ion-content class=\"has-header\" scroll=\"false\"><form name=\"saltForm\" novalidate=\"\" ng-submit=\"doNext(\\'saltForm\\')\"><div class=\"list\" ng-init=\"setForm(saltForm, \\'saltForm\\')\"><div class=\"item item-text-wrap text-center padding hidden-xs\"><a class=\"pull-right icon-help\" ng-click=\"showHelpModal(\\'join-salt\\')\"></a> <span translate>ACCOUNT.NEW.SALT_WARNING</span></div><div class=\"item item-input\" ng-class=\"{ \\'item-input-error\\': saltForm.$submitted && saltForm.username.$invalid}\"><span class=\"input-label\" translate>LOGIN.SALT</span> <input ng-if=\"!showUsername\" name=\"username\" type=\"password\" placeholder=\"{{\\'LOGIN.SALT_HELP\\' | translate}}\" ng-change=\"formDataChanged()\" ng-model=\"formData.username\" ng-minlength=\"8\" required> <input ng-if=\"showUsername\" name=\"username\" type=\"text\" placeholder=\"{{\\'LOGIN.SALT_HELP\\' | translate}}\" ng-change=\"formDataChanged()\" ng-model=\"formData.username\" ng-minlength=\"8\" required></div><div class=\"form-errors\" ng-show=\"saltForm.$submitted && saltForm.username.$error\" ng-messages=\"saltForm.username.$error\"><div class=\"form-error\" ng-message=\"minlength\"><span translate=\"ERROR.FIELD_TOO_SHORT_WITH_LENGTH\" translate-values=\"{minLength: 8}\"></span></div><div class=\"form-error\" ng-message=\"required\"><span translate=\"ERROR.FIELD_REQUIRED\"></span></div></div><div class=\"item item-input\" ng-class=\"{ \\'item-input-error\\': saltForm.$submitted && saltForm.confirmSalt.$invalid}\"><span class=\"input-label pull-right\" translate>ACCOUNT.NEW.SALT_CONFIRM</span> <input ng-if=\"!showUsername\" name=\"confirmUsername\" type=\"password\" placeholder=\"{{\\'ACCOUNT.NEW.SALT_CONFIRM_HELP\\' | translate}}\" ng-model=\"formData.confirmUsername\" compare-to=\"formData.username\"> <input ng-if=\"showUsername\" name=\"confirmUsername\" type=\"text\" placeholder=\"{{\\'ACCOUNT.NEW.SALT_CONFIRM_HELP\\' | translate}}\" ng-model=\"formData.confirmUsername\" compare-to=\"formData.username\"></div><div class=\"form-errors\" ng-show=\"saltForm.$submitted && saltForm.confirmUsername.$error\" ng-messages=\"saltForm.confirmUsername.$error\"><div class=\"form-error\" ng-message=\"compareTo\"><span translate=\"ERROR.SALT_NOT_CONFIRMED\"></span></div></div><div class=\"item item-toggle dark\"><span translate>COMMON.SHOW_VALUES</span> <label class=\"toggle toggle-royal\"><input type=\"checkbox\" ng-model=\"showUsername\"><div class=\"track\"><div class=\"handle\"></div></div></label></div><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-calm icon-right ion-chevron-right ink\" type=\"submit\" translate>COMMON.BTN_NEXT <i class=\"icon ion-arrow-right-a\"></i></button></div></div></form></ion-content></ion-slide-page><ion-slide-page><ion-content class=\"has-header\" scroll=\"false\"><form name=\"passwordForm\" novalidate=\"\" ng-submit=\"doNext(\\'passwordForm\\')\"><div class=\"item item-text-wrap text-center padding hidden-xs\"><a class=\"pull-right icon-help\" ng-click=\"showHelpModal(\\'join-password\\')\"></a> <span translate>ACCOUNT.NEW.PASSWORD_WARNING</span></div><div class=\"list\" ng-init=\"setForm(passwordForm, \\'passwordForm\\')\"><div class=\"item item-input\" ng-class=\"{ \\'item-input-error\\': passwordForm.$submitted && passwordForm.password.$invalid}\"><span class=\"input-label\" translate>LOGIN.PASSWORD</span> <input ng-if=\"!showPassword\" name=\"password\" type=\"password\" placeholder=\"{{\\'LOGIN.PASSWORD_HELP\\' | translate}}\" ng-model=\"formData.password\" ng-change=\"formDataChanged()\" ng-minlength=\"8\" required> <input ng-if=\"showPassword\" name=\"text\" type=\"text\" placeholder=\"{{\\'LOGIN.PASSWORD_HELP\\' | translate}}\" ng-model=\"formData.password\" ng-change=\"formDataChanged()\" ng-minlength=\"8\" required></div><div class=\"form-errors\" ng-show=\"passwordForm.$submitted && passwordForm.password.$error\" ng-messages=\"passwordForm.password.$error\"><div class=\"form-error\" ng-message=\"minlength\"><span translate=\"ERROR.FIELD_TOO_SHORT_WITH_LENGTH\" translate-values=\"{minLength: 8}\"></span></div><div class=\"form-error\" ng-message=\"required\"><span translate=\"ERROR.FIELD_REQUIRED\"></span></div></div><div class=\"item item-input\" ng-class=\"{ \\'item-input-error\\': passwordForm.$submitted && passwordForm.confirmPassword.$invalid}\"><span class=\"input-label\" translate>ACCOUNT.NEW.PASSWORD_CONFIRM</span> <input ng-if=\"!showPassword\" name=\"confirmPassword\" type=\"password\" placeholder=\"{{\\'ACCOUNT.NEW.PASSWORD_CONFIRM_HELP\\' | translate}}\" ng-model=\"formData.confirmPassword\" compare-to=\"formData.password\"> <input ng-if=\"showPassword\" name=\"confirmPassword\" type=\"text\" placeholder=\"{{\\'ACCOUNT.NEW.PASSWORD_CONFIRM_HELP\\' | translate}}\" ng-model=\"formData.confirmPassword\" compare-to=\"formData.password\"></div><div class=\"form-errors\" ng-show=\"passwordForm.$submitted && passwordForm.confirmPassword.$error\" ng-messages=\"passwordForm.confirmPassword.$error\"><div class=\"form-error\" ng-message=\"compareTo\"><span translate=\"ERROR.PASSWORD_NOT_CONFIRMED\"></span></div></div><div class=\"item item-toggle dark\"><span translate>COMMON.SHOW_VALUES</span> <label class=\"toggle toggle-royal\"><input type=\"checkbox\" ng-model=\"showPassword\"><div class=\"track\"><div class=\"handle\"></div></div></label></div></div><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-calm icon-right ion-chevron-right ink\" type=\"submit\" translate>COMMON.BTN_NEXT</button></div><div class=\"padding hidden-xs\"></div></form></ion-content></ion-slide-page><ion-slide-page><ion-content class=\"has-header\" scroll=\"false\"><div class=\"padding center\" ng-if=\"formData.computing\"><ion-spinner icon=\"android\"></ion-spinner></div><div ng-if=\"accountAvailable && !formData.computing\"><div class=\"padding text-center\" translate>ACCOUNT.NEW.LAST_SLIDE_CONGRATULATION</div><div class=\"list\"><ion-item class=\"item item-text-wrap item-border\"><div class=\"dark pull-right padding-right\" ng-if=\"formData.computing\"><ion-spinner icon=\"android\"></ion-spinner></div><span class=\"input-label\" translate>COMMON.PUBKEY</span> <span class=\"gray text-no-wrap\" ng-if=\"formData.computing\" translate>ACCOUNT.NEW.COMPUTING_PUBKEY </span><span class=\"gray text-no-wrap\" ng-if=\"formData.pubkey\">{{formData.pubkey}}</span></ion-item></div><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-positive ink\" ng-click=\"doNewAccount()\" translate>COMMON.BTN_CREATE</button></div></div><div ng-if=\"!accountAvailable && !formData.computing\"><ion-item class=\"item-icon-left item-text-wrap text-center\"><i class=\"icon ion-android-close active\"></i> <span id=\"modal-license\" translate>ERROR.EXISTING_ACCOUNT</span></ion-item><div class=\"list\"><ion-item class=\"item item-text-wrap item-border\"><div class=\"dark pull-right padding-right\" ng-if=\"formData.computing\"><ion-spinner icon=\"android\"></ion-spinner></div><span class=\"gray text-no-wrap\" ng-if=\"formData.computing\" translate>ACCOUNT.NEW.COMPUTING_PUBKEY</span><div class=\"padding text-center\"><span class=\"gray text-no-wrap\" ng-if=\"formData.pubkey\">{{formData.pubkey}}</span></div></ion-item><div class=\"padding text-center\"><span translate>ERROR.EXISTING_ACCOUNT_REQUEST</span></div></div><div class=\"padding hidden-xs text-left\"><button class=\"button button-assertive icon-left ion-chevron-left ink\" ng-click=\"identifierRecovery()\" translate>COMMON.BTN_MODIFY</button></div></div></ion-content></ion-slide-page></ion-slides></ion-modal-view>');\n$templateCache.put('templates/login/form_file_import.html','<div class=\"item\"><p class=\"item-text-wrap\" translate>LOGIN.FILE_FORM_HELP</p></div><div class=\"item item-icon-left item-text-wrap\"><i class=\"icon ion-ios-information-outline positive\"></i> <span class=\"positive\" translate>LOGIN.FILE.HELP</span></div><div drop-zone=\"onFileChanged(file)\"><div ng-if=\"!formData.file\" file-select=\"onFileChanged(file)\" accept=\".dunikey,.yml\"><h2 class=\"gray\" translate>COMMON.CHOOSE_FILE</h2></div><div class=\"item item-icon-left item-icon-right stable-bg\" ng-if=\"formData.file\"><i class=\"icon ion-document-text dark\"></i><div class=\"item-content row\"><div class=\"col\"><h2>{{formData.file.name}}</h2><h4 class=\"dark\" ng-if=\"formData.file.lastModified\"><span class=\"gray\" translate>COMMON.FILE.DATE</span> {{formData.file.lastModified/1000|formatDate}}</h4><h5 class=\"dark\"><span class=\"gray\" translate>COMMON.FILE.SIZE</span> {{formData.file.size|formatInteger}} Ko</h5></div><div class=\"col\"><h3><span class=\"gray\" translate>COMMON.PUBKEY</span></h3><h3 ng-if=\"validatingFile\" translate>COMMON.FILE.VALIDATING</h3><h3 ng-if=\"!validatingFile\"><span class=\"dark animate-show-hide ng-hide\" ng-show=\"formData.file.pubkey\">{{formData.file.pubkey}}</span> <span class=\"assertive animate-show-hide ng-hide\" ng-show=\"!formData.file.valid\"><br><i class=\"ion-close-circled assertive\"></i> {{formData.file.pubkey ? \\'ERROR.AUTH_INVALID_PUBKEY\\' : \\'ERROR.AUTH_INVALID_FILE\\' |translate}}</span></h3></div></div><a class=\"ion-close-round gray pull-right\" style=\"font-size: 10px; position: absolute; top: 6px; right: 6px;\" ng-click=\"removeKeyFile()\"></a></div></div><ion-checkbox ng-model=\"formData.keepAuth\" class=\"item ink item-text-wrap\"><div class=\"item-content dark\" translate>LOGIN.MEMORIZE_AUTH_FILE</div></ion-checkbox>');\n$templateCache.put('templates/login/form_login.html','<form name=\"loginForm\" novalidate=\"\" ng-submit=\"doLogin()\" autocomplete=\"off\"><div class=\"list padding no-padding-xs\" ng-init=\"setForm(loginForm)\" ng-switch on=\"formData.method\"><div class=\"item hidden-xs no-padding\" ng-if=\"showMethods\"><div class=\"pull-right\"><a class=\"button button-text button-small-padding icon-right ink\" ng-click=\"showMethodsPopover($event)\"><i class=\"icon ion-wrench\"></i> {{\\'LOGIN.BTN_METHODS\\'| translate}} </a>&nbsp; <a class=\"button button-icon positive button-small-padding icon ion-ios-help-outline\" style=\"right: 8px;\" ng-click=\"showHelpModal(\\'login-method\\')\"></a></div></div><div class=\"item item-text-wrap\" ng-if=\"::isAuth\"><p ng-if=\"::expectedPubkey\" ng-bind-html=\"::expectedUid ? \\'AUTH.EXPECTED_UID_HELP\\' : \\'AUTH.EXPECTED_PUBKEY_HELP\\' |translate: {uid: expectedUid, pubkey: expectedPubkey}\"></p><p ng-if=\"::!expectedPubkey\" ng-bind-html=\"::\\'AUTH.GENERAL_HELP\\'|translate\"></p></div><div ng-switch-when=\"SCRYPT_DEFAULT\"><ng-include src=\"::\\'templates/login/form_scrypt.html\\'\"></ng-include></div><div ng-switch-when=\"SCRYPT_ADVANCED\"><ng-include src=\"::\\'templates/login/form_scrypt_advanced.html\\'\"></ng-include></div><div ng-switch-when=\"PUBKEY\"><ng-include src=\"::\\'templates/login/form_pubkey.html\\'\"></ng-include></div><div ng-switch-when=\"FILE\"><ng-include src=\"::\\'templates/login/form_file_import.html\\'\"></ng-include></div><div ng-switch-when=\"SCAN\"><ng-include src=\"::\\'templates/login/form_scan.html\\'\"></ng-include></div><div ng-switch-default><ng-include src=\"::\\'templates/login/form_scrypt.html\\'\"></ng-include></div></div><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-positive ink\" ng-class=\"{\\'button-assertive\\': isAuth, \\'button-positive\\': !isAuth}\" type=\"submit\">{{okText || (isAuth ? \\'AUTH.BTN_AUTH\\' : \\'COMMON.BTN_LOGIN\\') | translate}}</button></div><div class=\"text-center no-padding visible-xs\"><button type=\"button\" class=\"button button-small icon-right ink\" ng-click=\"showMethodsPopover($event)\"><i class=\"icon ion-loop\"></i> <span translate>LOGIN.BTN_METHODS_DOTS</span></button><br><br></div><ng-if ng-if=\"!isAuth && showNewAccountLink\"><div class=\"text-center no-padding\">{{\\'LOGIN.NO_ACCOUNT_QUESTION\\'|translate}}<br class=\"visible-xs\"><a ng-click=\"showJoinModal()\" translate>LOGIN.CREATE_ACCOUNT</a></div><br class=\"visible-xs\"><div class=\"text-center no-padding\"><a ng-click=\"showAccountSecurityModal()\" translate>LOGIN.FORGOTTEN_ID</a></div></ng-if></form>');\n$templateCache.put('templates/login/form_pubkey.html','<div class=\"item\"><p class=\"item-text-wrap\" translate>LOGIN.PUBKEY_FORM_HELP</p></div><div class=\"item item-input item-button-right\" ng-class=\"{ \\'item-input-error\\': form.$submitted && form.pubkey.$invalid}\"><span class=\"input-label hidden-xs\" translate>COMMON.PUBKEY</span> <input name=\"pubkey\" type=\"text\" placeholder=\"{{\\'LOGIN.PUBKEY_HELP\\' | translate}}\" autocomplete=\"off\" ng-model=\"formData.pubkey\" ng-model-options=\"{ debounce: 650 }\" required> <a class=\"button button-stable icon ion-android-search ink\" ng-click=\"showWotLookupModal(form.pubkey.$viewValue)\"></a></div><div class=\"form-errors\" ng-show=\"form.$submitted && form.pubkey.$error\" ng-messages=\"form.pubkey.$error\"><div class=\"form-error\" ng-message=\"required\"><span translate=\"ERROR.FIELD_REQUIRED\"></span></div><div class=\"form-error\" ng-message=\"checksum\"><span translate=\"ERROR.INVALID_PUBKEY_CHECKSUM\"></span></div></div>');\n$templateCache.put('templates/login/form_scan.html','<div class=\"item\"><p class=\"item-text-wrap\" ng-bind-html=\"::isAuth ? \\'AUTH.SCAN_FORM_HELP\\' : \\'LOGIN.SCAN_FORM_HELP\\' |translate\"></p></div><div class=\"item item-icon-right item-text-wrap item-input\" ng-class=\"{ \\'item-input-error\\': pubkeyError}\"><span class=\"input-label\" translate>COMMON.PUBKEY</span><div class=\"item-content text-wrap\"><span class=\"gray animate-show-hide\" ng-show=\"!computing && formData.pubkey\">{{formData.pubkey}}</span><ion-spinner class=\"ion-spinner-small\" icon=\"android\" ng-if=\"computing\"></ion-spinner><input type=\"hidden\" ng-model=\"formData.pubkey\" required></div><a class=\"button button-icon positive button-small-padding icon ion-qr-scanner animate-show-hide\" ng-show=\"!computing && (!expectedPubkey || pubkeyError)\" ng-click=\"doScan()\"></a> <span class=\"button button-icon balanced button-small-padding icon ion-checkmark animate-show-hide\" ng-if=\"expectedPubkey\" ng-show=\"!computing && !pubkeyError\"></span></div><div class=\"form-errors\" ng-if=\"expectedPubkey\"><div class=\"form-error\" ng-show=\"pubkeyError\"><span trust-as-html=\"::\\'ERROR.AUTH_INVALID_PUBKEY\\'|translate:{pubkey: expectedPubkey}\"></span></div></div>');\n$templateCache.put('templates/login/form_scrypt_advanced.html','<div class=\"row responsive-md responsive-sm padding-left\"><div class=\"col col-33 no-padding\"><label class=\"item item-input item-select\"><select ng-model=\"formData.scrypt\" style=\"max-width: 100%\" ng-change=\"changeScrypt(formData.scrypt)\" ng-options=\"l as (l.label | translate) for l in scryptParamsValues track by l.id\"></select></label></div><div class=\"col no-padding\"><label class=\"item item-input\"><span class=\"input-label\" translate>LOGIN.SCRYPT.N</span> <input class=\"no-padding-right\" type=\"number\" placeholder=\"N\" autocomplete=\"off\" ng-model=\"formData.scrypt.params.N\" ng-model-options=\"{ debounce: 650 }\" ng-change=\"onScryptFormChanged()\" required></label></div><div class=\"col no-padding\"><label class=\"item item-input\"><span class=\"input-label\" translate>LOGIN.SCRYPT.r</span> <input class=\"no-padding-right\" type=\"number\" placeholder=\"r\" ng-model=\"formData.scrypt.params.r\" autocomplete=\"off\" ng-model-options=\"{ debounce: 650 }\" ng-change=\"onScryptFormChanged()\" required></label></div><div class=\"col no-padding\"><label class=\"item item-input\"><span class=\"input-label\" translate>LOGIN.SCRYPT.p</span> <input class=\"no-padding-right\" type=\"number\" placeholder=\"p\" autocomplete=\"off\" ng-model=\"formData.scrypt.params.p\" ng-model-options=\"{ debounce: 650 }\" ng-change=\"onScryptFormChanged()\" required></label></div></div><p class=\"energized-100-bg padding dark\"><i class=\"icon ion-android-warning\"></i> <span translate>INFO.FEATURES_NOT_IMPLEMENTED</span></p><ng-include src=\"::\\'templates/login/form_scrypt.html\\'\"></ng-include>');\n$templateCache.put('templates/login/form_scrypt.html','<div class=\"item item-text-wrap\" ng-if=\"!isAuth\"><p ng-bind-html=\"\\'LOGIN.SCRYPT_FORM_HELP\\'|translate\"></p></div><input type=\"password\" name=\"fake-password\" autocomplete=\"off\" style=\"visibility:hidden; position:absolute;\"> <label class=\"item item-input\" ng-class=\"{ \\'item-input-error\\': form.$submitted && form.username.$invalid}\"><span class=\"input-label hidden-xs\" translate>LOGIN.SALT</span> <input name=\"username\" type=\"password\" placeholder=\"{{\\'LOGIN.SALT_HELP\\' | translate}}\" autocomplete=\"off\" ng-model=\"formData.username\" ng-model-options=\"{ debounce: 650 }\" class=\"highlight-light\" required></label><div class=\"form-errors\" ng-show=\"form.$submitted && form.username.$error\" ng-messages=\"form.username.$error\"><div class=\"form-error\" ng-message=\"required\"><span translate=\"ERROR.FIELD_REQUIRED\"></span></div></div><label class=\"item item-input\" ng-class=\"{ \\'item-input-error\\': form.$submitted && form.password.$invalid}\"><span class=\"input-label hidden-xs\" translate>LOGIN.PASSWORD</span> <input name=\"password\" type=\"password\" placeholder=\"{{\\'LOGIN.PASSWORD_HELP\\' | translate}}\" autocomplete=\"off\" ng-model=\"formData.password\" ng-model-options=\"{ debounce: 650 }\" select-on-click required></label><div class=\"form-errors\" ng-show=\"form.$submitted && form.password.$error\" ng-messages=\"form.password.$error\"><div class=\"form-error\" ng-message=\"required\"><span translate=\"ERROR.FIELD_REQUIRED\"></span></div></div><div class=\"item item-icon-right item-text-wrap\" ng-class=\"{ \\'item-input-error\\': pubkeyError, \\'item-input\\': showPubkey}\"><span class=\"input-label hidden-xs animate-show-hide ng-hide\" ng-show=\"showPubkey\" translate>COMMON.PUBKEY</span><div class=\"item-content text-wrap\"><a class=\"positive ink animate-show-hide ng-hide\" ng-show=\"showComputePubkeyButton && !pubkey\" ng-click=\"computePubkey()\"><i class=\"ion-eye\"></i> {{\\'COMMON.BTN_SHOW_PUBKEY\\' | translate}} </a><span class=\"gray animate-show-hide\" ng-show=\"!computing && pubkey\">{{pubkey}}</span><ion-spinner class=\"ion-spinner-small\" icon=\"android\" ng-if=\"computing\"></ion-spinner></div><a class=\"button button-icon positive button-small-padding icon ion-ios-help-outline animate-show-hide\" ng-click=\"showHelpModal(\\'login-pubkey\\')\" ng-if=\"!expectedPubkey\" ng-show=\"showPubkey\"></a> <span class=\"button button-icon balanced button-small-padding icon ion-checkmark animate-show-hide\" ng-if=\"expectedPubkey\" ng-show=\"showPubkey && !showComputePubkeyButton && !computing && !pubkeyError\"></span></div><div class=\"form-errors\" ng-if=\"expectedPubkey\"><div class=\"form-error\" ng-show=\"pubkeyError\"><span trust-as-html=\"::\\'ERROR.AUTH_INVALID_PUBKEY\\'|translate:{pubkey: expectedPubkey}\"></span></div></div>');\n$templateCache.put('templates/login/item_remember_me.html','<ion-checkbox ng-model=\"formData.rememberMe\" ng-if=\"!isAuth\" class=\"item ink item-text-wrap\"><div class=\"item-content dark\" translate>SETTINGS.REMEMBER_ME</div></ion-checkbox>');\n$templateCache.put('templates/login/modal_login.html','<ion-modal-view class=\"modal-full-height modal-login\"><ion-header-bar class=\"\" ng-class=\"{\\'bar-positive\\': !isAuth, \\'bar-assertive\\': isAuth}\"><button class=\"button button-clear visible-xs\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button><h1 class=\"title\" ng-bind-html=\"title | translate\"></h1><div class=\"buttons buttons-right\"><div class=\"secondary-buttons\"><button class=\"button button-icon button-clear icon ion-android-done visible-xs\" ng-class=\"{\\'button-positive\\': !isAuth}\" style=\"color: #fff;\" ng-click=\"doLogin()\"></button></div></div></ion-header-bar><ion-content scroll=\"true\"><ng-include src=\"::\\'templates/login/form_login.html\\'\"></ng-include></ion-content></ion-modal-view>');\n$templateCache.put('templates/login/popover_methods.html','<ion-popover-view class=\"fit has-header popover-login-methods\" ng-class=\"{\\'auth\\': isAuth}\"><ion-header-bar><h1 class=\"title\" translate>LOGIN.METHOD_POPOVER_TITLE</h1></ion-header-bar><ion-content scroll=\"false\"><div class=\"list item-text-wrap\"><a class=\"item item-icon-left ink\" ng-click=\"changeMethod(\\'SCRYPT_DEFAULT\\')\"><i class=\"icon ion-shuffle\" style=\"font-size: 22px;\"></i> {{\\'LOGIN.METHOD.SCRYPT_DEFAULT\\' | translate}} </a><a class=\"item item-icon-left ink\" ng-click=\"changeMethod(\\'SCRYPT_ADVANCED\\')\"><i class=\"icon ion-shuffle\" style=\"font-size: 22px;\"></i> <i class=\"icon-secondary ion-plus\" style=\"font-size: 13px; left: 40px; margin-top: -4px;\"></i> {{\\'LOGIN.METHOD.SCRYPT_ADVANCED\\' | translate}} </a><a class=\"item item-icon-left ink hidden-xs\" ng-click=\"changeMethod(\\'FILE\\')\"><i class=\"icon ion-document-text\"></i> {{\\'LOGIN.METHOD.FILE\\' | translate}}</a><div ng-if=\"!isAuth\" class=\"item-divider hidden-xs hidden-sm\"></div><a class=\"item item-icon-left ink\" ng-if=\"$root.device.barcode.enable\" ng-click=\"changeMethod(\\'SCAN\\')\"><i class=\"icon ion-qr-scanner\"></i> {{\\'LOGIN.METHOD.SCAN\\' | translate}} </a><a class=\"item item-icon-left ink\" ng-if=\"!isAuth\" ng-click=\"changeMethod(\\'PUBKEY\\')\"><i class=\"icon ion-key\"></i> {{\\'LOGIN.METHOD.PUBKEY\\' | translate}}</a></div></ion-content></ion-popover-view>');\n$templateCache.put('templates/menu.html','<ion-side-menus enable-menu-with-back-views=\"true\" bind-notifier=\"{locale: $root.settings.locale.id, peer: $root.currency.node.url}\"><ion-side-menu-content><ion-nav-bar class=\"bar-dark\" title-align=\"left\"><ion-nav-back-button class=\"no-text\"></ion-nav-back-button><ion-nav-buttons side=\"left\"><button class=\"button button-clear visible-nomenu\" menu-toggle=\"left\"><i class=\"icon ion-navicon\"></i></button></ion-nav-buttons><ion-nav-buttons side=\"right\"><button class=\"button button-clear button-peer hidden-xs hidden-sm gray\" ng-if=\"$root.config.readonly ||\\xA0$root.settings.expertMode\" style=\"max-width: 450px !important;\" ng-click=\"showPeerInfoPopover($event)\"><span style=\"display: inline-flex;\"><small class=\"ion-locked\" ng-if=\":peer:$root.currency.node.useSsl\">&nbsp;</small> {{:peer:$root.currency.node.host}}{{:peer:$root.currency.node.port != 80 && $root.currency.node.port != 443 ? \\':\\'+$root.currency.node.port : \\'\\'}} <small>&nbsp;</small> <small class=\"ion-arrow-down-b\"></small></span></button><cs-extension-point name=\"nav-buttons-right\"></cs-extension-point><a id=\"helptip-header-bar-btn-profile\" class=\"button button-icon button-clear hidden-xs hidden-sm\" ng-if=\"::!$root.config.readonly\" ng-click=\"showProfilePopover($event)\"><i class=\"avatar avatar-member\" ng-if=\"!walletData.avatar\" ng-class=\"{\\'disable\\': !login, \\'royal-bg\\': login}\"></i> <i class=\"avatar\" ng-if=\"walletData.avatar\" style=\"background-image: url(\\'{{walletData.avatar.src}}\\')\"></i> <span ng-if=\"login && !auth\" class=\"badge badge-button badge-secondary badge-assertive ion-locked\"></span></a></ion-nav-buttons></ion-nav-bar><ion-nav-view name=\"menuContent\"></ion-nav-view></ion-side-menu-content><ion-side-menu id=\"menu\" side=\"left\" expose-aside-when=\"large\" enable-menu-with-back-views=\"false\" width=\"225\"><ion-header-bar class=\"bar-title\"><h1 class=\"title dark hidden-sm hidden-xs\"><span class=\"animate-fade-in animate-show-hide ng-hide\" ng-show=\"$root.currency.name\">{{:locale:\\'COMMON.APP_NAME\\'|translate}} {{$root.currency.name|abbreviate}} </span><a class=\"badge badge-assertive badge-app-mode left visible-demo\" ng-click=\"showHelpModal(\\'demo\\')\">{{:locale:\\'MODE.DEMO.BADGE\\'|translate}}</a> <a class=\"badge badge-balanced badge-app-mode right visible-readonly\" ng-click=\"showHelpModal(\\'readonly\\')\">{{:locale:\\'MODE.READONLY.BADGE\\'|translate}}</a></h1><div class=\"visible-sm visible-xs hero\"><div class=\"content\"><i class=\"avatar avatar-member hero-icon\" ng-if=\"!walletData.avatar\" ng-class=\"{\\'royal-bg\\': login, \\'stable-bg\\': !login}\" ng-click=\"!login ? showHome() : loginAndGo()\" menu-close></i> <a class=\"avatar hero-icon\" ng-if=\"walletData.avatar\" style=\"background-image: url(\\'{{walletData.avatar.src}}\\')\" ui-sref=\"app.view_wallet\" menu-close></a><h4 ng-if=\"login\"><a class=\"light\" ui-sref=\"app.view_wallet\" menu-close>{{walletData.name||walletData.uid}} <span ng-if=\"!walletData.name && !walletData.uid\"><i class=\"icon ion-key\"></i>&nbsp;{{walletData.pubkey|formatPubkey}}</span></a></h4><h4 ng-if=\"!login\"><a class=\"light\" ui-sref=\"app.login\" menu-close>{{\\'COMMON.BTN_LOGIN\\'|translate}} <i class=\"ion-arrow-right-b\"></i></a></h4><cs-extension-point name=\"menu-profile-user\"></cs-extension-point></div><a ng-if=\"::$root.device.isWeb()\" ng-click=\"toggleFullscreen()\" class=\"button-icon\" style=\"position: absolute; top: 5px; right: 5px; z-index: 999;\"><i class=\"icon ion-arrow-expand dark\" ng-class=\"{\\'ion-arrow-shrink\\': fullscreen}\"></i></a></div></ion-header-bar><ion-content scroll=\"false\" class=\"scroll-content ionic-scroll\" ng-class=\"{\\'overflow-scroll\\': smallscreen, \\'scroll-content-false\\': !smallscreen}\"><ion-list class=\"list\" ng-class=\"{\\'scroll\\': smallscreen}\"><ion-item menu-close class=\"item item-actions item-button-right visible-xs visible-sm hidden-readonly\" ng-if=\"login\" ng-class=\"::{\\'item-button-left\\': $root.device.barcode.enable}\"><button class=\"button button-positive ink-dark\" ng-click=\"showTransferModal()\"><i class=\"icon ion-paper-airplane\"></i></button> <button class=\"button button-stable ink\" ng-if=\"$root.device.barcode.enable\" ng-click=\"scanQrCodeAndGo()\"><i class=\"icon ion-qr-scanner\"></i></button></ion-item><ion-item menu-close class=\"item-icon-left hidden-xs\" ui-sref=\"app.home\" active-link=\"active\"><i class=\"icon ion-home\"></i> {{:locale:\\'MENU.HOME\\'|translate}}</ion-item><ion-item menu-close class=\"item-icon-left visible-xs\" ui-sref=\"app.home\" active-link=\"active\"><i class=\"icon ion-home\"></i> {{:locale:\\'MENU.HOME\\'|translate}}</ion-item><div class=\"item item-divider hidden-readonly\"></div><a menu-close class=\"item item-icon-left hidden-readonly\" active-link=\"active\" active-link-path-prefix=\"#/app/account\" ui-sref=\"app.view_wallet\" ng-class=\"{\\'item-menu-disable\\': !login}\"><i class=\"icon ion-person\"></i> {{:locale:\\'MENU.ACCOUNT\\'|translate}} </a><a id=\"helptip-menu-btn-account\"></a> <a menu-close class=\"item item-icon-left hidden-readonly\" active-link=\"active\" active-link-path-prefix=\"#/app/history\" ui-sref=\"app.view_wallet_tx\" ng-class=\"{\\'item-menu-disable\\': !login}\"><i class=\"icon ion-clock\" style=\"top: calc(100%/4); left: 25px; font-size: 10pt; display: block;\"></i> <b class=\"icon-secondary ion-card\" style=\"top: calc(100%/2.5); left: 19px; font-size: 17pt; background-color: whitesmoke; width:17px; height: 14px;\"></b> {{:locale:\\'MENU.TRANSACTIONS\\'|translate}} </a><a id=\"helptip-menu-btn-tx\"></a> <a menu-close class=\"item item-icon-left hidden-readonly\" active-link=\"active\" active-link-path-prefix=\"#/app/wallets\" ui-sref=\"app.view_wallets\" ng-class=\"{\\'item-menu-disable\\': !login}\"><i class=\"icon ion-card\" style=\"top: calc(100%/5); left: 22px; font-size: 16pt; display: block;\"></i> <i class=\"icon-secondary ion-card\" style=\"top: 20px; left: 19px; font-size: 16pt; background-color: whitesmoke; width:17px; height: 14px;\"></i> {{:locale:\\'MENU.WALLETS\\'|translate}} </a><a id=\"helptip-menu-btn-wallets\"></a><div class=\"item item-divider visible-xs visible-sm hidden-readonly\"></div><cs-extension-point name=\"menu-user\"></cs-extension-point><ion-item class=\"item hidden-xs hidden-sm hidden-readonly\"><button class=\"button button-block button-small button-small-padding icon-left icon ion-paper-airplane no-margin\" ng-class=\"{\\'button-positive\\': login, \\'button-stable\\': !login}\" ng-click=\"showTransferModal()\">{{:locale:\\'COMMON.BTN_SEND_MONEY\\'|translate}}</button></ion-item><div class=\"item-spacer hidden-readonly\"></div><div class=\"item item-divider hidden-readonly\"></div><a class=\"item item-icon-left item-closeable hidden-xs hidden-sm\" ng-show=\"$root.settings.helptip.enable\" title=\"{{:locale:\\'SETTINGS.DISABLE_HELPTIP\\'|translate}}\" ng-click=\"startHelpTour($event)\"><i class=\"icon ion-easel\"></i> {{:locale:\\'COMMON.BTN_HELP_TOUR\\'|translate}} <span class=\"close\" ng-click=\"disableHelpTour($event)\"></span> </a><a menu-close class=\"item item-icon-left\" id=\"helptip-menu-btn-wot\" active-link=\"active\" active-link-path-prefix=\"#/app/wot\" ui-sref=\"app.wot_lookup.tab_search\"><i class=\"icon ion-person-stalker\"></i> {{:locale:\\'MENU.WOT\\'|translate}}</a><cs-extension-point name=\"menu-main\"></cs-extension-point><a menu-close class=\"item item-icon-left\" id=\"helptip-menu-btn-currency\" active-link=\"active\" active-link-path-prefix=\"#/app/currency\" ui-sref=\"app.currency\"><i class=\"icon ion-ios-world-outline\"></i> {{:locale:\\'MENU.CURRENCY\\'|translate}} </a><a menu-close class=\"item item-icon-left hidden-xs hidden-sm\" id=\"helptip-menu-btn-network\" active-link=\"active\" active-link-path-prefix=\"#/app/network\" ui-sref=\"app.network\"><i class=\"icon ion-cloud\"></i> {{:locale:\\'MENU.NETWORK\\'|translate}}</a><cs-extension-point name=\"menu-discover\"></cs-extension-point><div class=\"item-spacer visible-readonly\"></div><div class=\"item item-divider visible-xs visible-sm\"></div><a menu-close class=\"item item-icon-left visible-xs visible-sm\" active-link=\"active\" active-link-path-prefix=\"#/app/help\" ui-sref=\"app.help\"><i class=\"icon ion-ios-help-outline\"></i> {{:locale:\\'HOME.BTN_HELP\\'|translate}} </a><a menu-close class=\"item item-icon-left visible-xs visible-sm visible-readonly\" active-link=\"active\" id=\"menu-btn-settings\" active-link-path-prefix=\"#/app/settings\" ui-sref=\"app.settings\"><i class=\"icon ion-android-settings\"></i> {{:locale:\\'MENU.SETTINGS\\'|translate}} </a><a id=\"helptip-menu-btn-settings\"></a><div class=\"item item-divider visible-xs visible-sm margin-top\" ng-if=\"login\"></div><a menu-close ng-if=\"login\" class=\"item item-icon-left visible-xs visible-sm\" ng-click=\"logout({askConfirm: true})\"><i class=\"icon ion-log-out assertive\"></i> <span class=\"assertive\" translate>{{:locale:\\'COMMON.BTN_LOGOUT\\'|translate}}</span></a></ion-list></ion-content><ion-footer-bar class=\"bar-stable footer hidden-xs hidden-sm\"><a class=\"pull-left icon-help\" menu-toggle=\"left\" title=\"{{:locale:\\'HOME.BTN_HELP\\'|translate}}\" ui-sref=\"app.help\"></a> <a class=\"title gray\" ng-click=\"showAboutModal()\"><span title=\"{{:locale:\\'HOME.BTN_ABOUT\\'|translate}}\" ng-class=\"{\\'assertive\\': $root.newRelease}\"><i ng-if=\"$root.newRelease\" class=\"ion-alert-circled assertive\"></i> {{:locale:\\'COMMON.APP_VERSION\\'|translate:{version: config.version} }} </span>| <span title=\"{{:locale:\\'HOME.BTN_ABOUT\\'|translate}}\">{{:locale:\\'HOME.BTN_ABOUT\\'|translate}}</span></a></ion-footer-bar></ion-side-menu></ion-side-menus>');\n$templateCache.put('templates/modal_about.html','<ion-modal-view class=\"about\"><ion-header-bar class=\"bar-positive\"><button class=\"button button-clear visible-xs\" ng-click=\"closeModal()\" translate>COMMON.BTN_CLOSE</button><h1 class=\"title\" translate>ABOUT.TITLE</h1></ion-header-bar><ion-content class=\"text-center\" scroll=\"true\"><div class=\"list item-wrap-text\"><ion-item class=\"item-icon-left item-text-wrap\"><span>{{\\'COMMON.APP_NAME\\'|translate}}&nbsp;<b>{{\\'COMMON.APP_VERSION\\'|translate:$root.config}}</b> - <a ng-click=\"openLink($event, \\'http://cesium.app\\')\">www.cesium.app</a></span> <i ng-if=\"$root.newRelease\" class=\"assertive ion-alert-circled\"></i><h3 ng-if=\"buildDate\" class=\"gray\">{{\\'COMMON.APP_BUILD\\'|translate:{build: buildDate} }}</h3><span translate>ABOUT.LICENSE</span></ion-item><ion-item class=\"item-icon-left\" ng-if=\"$root.newRelease\"><i class=\"item-image icon ion-alert-circled assertive\"></i> <span ng-if=\"!$root.device.isWeb()\" ng-bind-html=\"\\'ABOUT.PLEASE_UPDATE\\' | translate:$root.newRelease \"></span> <span ng-if=\"$root.device.isWeb()\" ng-bind-html=\"\\'ABOUT.LATEST_RELEASE\\' | translate:$root.newRelease \"></span><h3 ng-if=\"!$root.device.enable\"><a ng-click=\"openLink($event, $root.newRelease.url)\" translate>{{::$root.newRelease.url}}</a></h3></ion-item><ion-item class=\"item-icon-left item-text-wrap\"><i class=\"item-image icon ion-android-laptop\"></i> <span translate>ABOUT.OFFICIAL_WEB_SITE</span><h3><a ng-click=\"openLink($event, \\'https://www.cesium.app\\')\">https://www.cesium.app</a></h3></ion-item><ion-item class=\"item-icon-left\"><i class=\"item-image icon ion-chatbubbles\"></i> {{\\'ABOUT.FORUM\\' | translate}}<h3><a ng-click=\"openLink($event, $root.settings.userForumUrl)\">{{::$root.settings.userForumUrl}}</a></h3></ion-item><ion-item class=\"item-icon-left item-text-wrap\"><i class=\"item-image icon ion-bug\"></i> <span translate>ABOUT.PLEASE_REPORT_ISSUE</span><h3><a ng-click=\"openLink($event, $root.settings.newIssueUrl)\" translate>ABOUT.REPORT_ISSUE</a></h3></ion-item><ion-item class=\"item-icon-left\"><i class=\"item-image icon ion-network\"></i> {{\\'ABOUT.CODE\\' | translate}}<h3><a ng-click=\"openLink($event, $root.settings.sourceUrl)\">{{$root.settings.sourceUrl}}</a></h3></ion-item><ion-item class=\"item-icon-left\"><i class=\"item-image icon ion-person-stalker\"></i> {{\\'ABOUT.DEVELOPERS\\' | translate}}<h3><a href=\"https://github.com/blavenie\" target=\"_system\">Benoit Lavenier</a>, <a href=\"https://github.com/bpresles\" target=\"_system\">bpresles</a>, <a href=\"https://github.com/c-geek\" target=\"_system\">cgeek</a>, <a href=\"https://github.com/devingfx\" target=\"_system\">DiG</a>, <a href=\"https://git.duniter.org/ji_emme\" target=\"_system\">Ji_emme</a></h3></ion-item><div class=\"padding hidden-xs text-center\"><button class=\"button button-stable icon-left ink\" type=\"submit\" ng-click=\"closeModal()\" ui-sref=\"app.help\"><i class=\"icon ion-ios-help-outline\"></i> {{\\'HOME.BTN_HELP\\' | translate}}</button> <button class=\"button button-positive ink\" type=\"submit\" ng-click=\"closeModal()\">{{\\'COMMON.BTN_CLOSE\\' | translate}}</button></div></div></ion-content></ion-modal-view>');\n$templateCache.put('templates/network/item_content_peer.html','<i class=\"icon ion-android-desktop\" ng-class=\":rebind:{\\'balanced\\': peer.online && peer.hasMainConsensusBlock, \\'energized\\': peer.online && peer.hasConsensusBlock, \\'gray\\': peer.online && !peer.hasConsensusBlock && !peer.hasMainConsensusBlock, \\'stable\\': !peer.online}\" ng-if=\":rebind:!peer.avatar\"></i> <b class=\"icon-secondary ion-person\" ng-if=\":rebind:!peer.avatar\" ng-class=\":rebind:{\\'balanced\\': peer.online && peer.hasMainConsensusBlock, \\'energized\\': peer.online && peer.hasConsensusBlock, \\'gray\\': peer.online && !peer.hasConsensusBlock && !peer.hasMainConsensusBlock, \\'stable\\': !peer.online}\" style=\"left: 26px; top: -3px;\"></b> <i class=\"avatar\" ng-if=\"::peer.avatar\" style=\"background-image: url(\\'{{::peer.avatar.src}}\\')\"></i> <b class=\"icon-secondary assertive ion-close-circled\" ng-if=\":rebind:!peer.online\" style=\"left: 37px; top: -10px;\"></b><div class=\"row no-padding\"><div class=\"col no-padding\"><h3 class=\"dark\" ng-if=\":rebind:!peer.bma.private\">{{:rebind:peer.dns || peer.server}}</h3><h4 class=\"gray\" ng-if=\":rebind:peer.bma.private\"><i class=\"ion-flash\"></i> {{:locale:\\'NETWORK.VIEW.PRIVATE_ACCESS\\'|translate}}</h4><h4><span class=\"gray\" ng-if=\":rebind:!peer.uid\"><i class=\"ion-key\"></i> {{:rebind:peer.pubkey|formatPubkey}} </span><span class=\"positive\" ng-if=\":rebind:peer.uid\"><i class=\"ion-person\"></i> {{:rebind:peer.name || peer.uid}} </span><span class=\"gray\" ng-if=\":rebind:!compactMode\">{{:rebind:peer.dns && (\\' | \\' + peer.server) + (peer.bma.path||\\'\\') }}</span></h4></div><div class=\"col col-15 no-padding text-center hidden-xs hidden-sm\" ng-if=\"::expertMode\"><div style=\"min-width: 50px; padding-top: 5px;\" ng-if=\":rebind:!compactMode\"><span ng-if=\":rebind:peer.isSsl()\" title=\"SSL\"><i class=\"ion-locked\"></i><small class=\"hidden-md\"> SSL</small> </span><span ng-if=\":rebind:peer.isBma()\" title=\"BMA\"><i class=\"ion-cloud\"></i><small class=\"hidden-md\"> BMA</small> </span><span ng-if=\":rebind:peer.isWs2p()\" ng-click=\"showWs2pPopover($event, peer)\" title=\"WS2P\"><i class=\"ion-arrow-swap\"></i><small class=\"hidden-md\"> WS2P</small></span></div><div ng-if=\":rebind:!peer.isWs2p()&&peer.hasEndpoint(\\'ES_USER_API\\')\" ng-click=\"showEndpointsPopover($event, peer, \\'ES_USER_API\\')\" title=\"Cesium+\"><i class=\"ion-es-user-api\"></i> <b class=\"ion-plus dark\" style=\"position: relative; left: -14px; top:-17px; font-size : 16px;\"></b></div><div ng-if=\":rebind:!peer.isWs2p()&&peer.isTor()\" ng-click=\"showEndpointsPopover($event, peer, \\'BMATOR\\')\"><i class=\"ion-bma-tor-api\"></i></div><div ng-if=\":rebind:peer.isWs2p()&&peer.isTor()\" ng-click=\"showWs2pPopover($event, peer)\"><i class=\"ion-bma-tor-api\"></i></div></div><div class=\"col col-20 no-padding text-center\" ng-if=\"::expertMode && search.type != \\'offline\\'\"><h3 class=\"hidden-sm hidden-xs gray\"><span ng-if=\":rebind:peer.uid\"><i class=\"ion-lock-combination\"></i>{{:rebind:peer.difficulty||\\'?\\'}}</span> <span ng-if=\":rebind:!peer.uid\" translate>PEER.MIRROR</span></h3><h4 class=\"hidden-sm hidden-xs gray\">{{:rebind: peer.software !== \\'duniter\\' ? peer.software : \\'\\'}} {{:rebind: peer.version ? (\\'v\\'+peer.version) : \\'\\'}}</h4></div><div class=\"col col-20 no-padding text-center\"><span id=\"{{$index === 0 ? helptipPrefix + \\'-peer-0-block\\' : \\'\\'}}\" class=\"badge\" ng-class=\":rebind:{\\'badge-balanced\\': peer.hasMainConsensusBlock, \\'badge-energized\\': peer.hasConsensusBlock, \\'ng-hide\\': !peer.currentNumber && !peer.blockNumber }\">{{:locale:!expertMode ? (\\'COMMON.BLOCK\\'|translate) : \\'\\' }} {{:rebind:(peer.currentNumber || peer.blockNumber) | formatInteger}}</span> <span class=\"badge badge-secondary\" ng-if=\":rebind:peer.consensusBlockDelta && expertMode\"><i class=\"ion-clock\"></i>&nbsp; {{:rebind:peer.consensusBlockDelta|formatDurationTime}}</span></div></div>');\n$templateCache.put('templates/network/items_peers.html','<div class=\"no-padding {{::motion.ionListClass}}\"><div class=\"item item-text-wrap no-border done in gray no-padding-top no-padding-bottom inline text-italic\" ng-if=\"::isHttps && expertMode\"><small><i class=\"icon ion-alert-circled\"></i> {{:locale:\\'NETWORK.INFO.ONLY_SSL_PEERS\\'|translate}}</small></div><div class=\"item row row-header hidden-xs hidden-sm done in\" ng-if=\"::expertMode\"><a class=\"col col-header no-padding dark\" ng-click=\"toggleSort(\\'uid\\')\"><cs-sort-icon asc=\"search.asc\" sort=\"search.sort\" toggle=\"\\'uid\\'\"></cs-sort-icon>{{:locale:\\'COMMON.UID\\' | translate}} / {{:locale:\\'COMMON.PUBKEY\\' | translate}} </a><a class=\"no-padding dark hidden-md col col-15 col-header\" ng-click=\"toggleSort(\\'api\\')\" ng-if=\":rebind:!compactMode\"><cs-sort-icon asc=\"search.asc\" sort=\"search.sort\" toggle=\"\\'api\\'\"></cs-sort-icon>{{:locale:\\'PEER.API\\' | translate}}</a><div class=\"no-padding dark hidden-md col col-15 col-header\" ng-if=\":rebind:compactMode\"></div><a class=\"no-padding dark col col-20 col-header\" ng-click=\"toggleSort(\\'difficulty\\')\"><cs-sort-icon asc=\"search.asc\" sort=\"search.sort\" toggle=\"\\'difficulty\\'\"></cs-sort-icon>{{:locale:\\'PEER.DIFFICULTY\\' | translate}} </a><a class=\"col col-20 col-header no-padding dark\" ng-click=\"toggleSort(\\'current_block\\')\"><cs-sort-icon asc=\"search.asc\" sort=\"search.sort\" toggle=\"\\'current_block\\'\"></cs-sort-icon>{{:locale:\\'PEER.CURRENT_BLOCK\\' | translate}}</a></div><div ng-repeat=\"peer in search.results track by peer.id\" class=\"item item-peer item-icon-left ink {{::ionItemClass}}\" ng-class=\":rebind:{\\'compacted\\': peer.compacted && compactMode}\" ng-attr-id=\"{{::($index === 0 ? (helptipPrefix + \\'-peer-0\\') : undefined)}}\" ng-click=\"selectPeer(peer)\" ng-include=\"::\\'templates/network/item_content_peer.html\\'\"></div></div>');\n$templateCache.put('templates/network/lookup_popover_actions.html','<ion-popover-view class=\"fit has-header\"><ion-header-bar><h1 class=\"title\" translate>PEER.POPOVER_FILTER_TITLE</h1></ion-header-bar><ion-content scroll=\"false\"><div class=\"list item-text-wrap\"><a class=\"item item-icon-left item-icon-right ink\" ng-click=\"toggleSearchType(\\'member\\')\"><i class=\"icon ion-person\"></i> {{\\'PEER.MEMBERS\\' | translate}} <i class=\"icon ion-ios-checkmark-empty\" ng-show=\"search.type==\\'member\\'\"></i> </a><a class=\"item item-icon-left item-icon-right ink\" ng-click=\"toggleSearchType(\\'mirror\\')\"><i class=\"icon ion-radio-waves\"></i> {{\\'PEER.MIRRORS\\' | translate}} <i class=\"icon ion-ios-checkmark-empty\" ng-show=\"search.type==\\'mirror\\'\"></i> </a><a class=\"item item-icon-left item-icon-right ink\" ng-click=\"toggleSearchType(\\'offline\\')\"><i class=\"icon ion-eye-disabled\"></i> {{\\'PEER.OFFLINE\\' | translate}} <i class=\"icon ion-ios-checkmark-empty\" ng-show=\"search.type==\\'offline\\'\"></i></a></div></ion-content></ion-popover-view>');\n$templateCache.put('templates/network/modal_network.html','<ion-modal-view id=\"nodes\" class=\"modal-full-height\" cache-view=\"false\"><ion-header-bar class=\"bar-positive\"><button class=\"button button-clear\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button><h1 class=\"title\" translate>PEER.PEER_LIST</h1><div class=\"buttons buttons-right header-item\"><span class=\"secondary\"><button class=\"button button-clear icon ion-loop button-clear\" ng-click=\"refresh()\"></button> <button class=\"button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm\" ng-click=\"showActionsPopover($event)\"></button></span></div></ion-header-bar><ion-content><div class=\"list\"><div class=\"padding padding-xs\" style=\"display: block; height: 60px;\"><div class=\"pull-left\"><h4><span ng-if=\"enableFilter && search.type==\\'member\\'\" translate>PEER.MEMBER_PEERS</span> <span ng-if=\"enableFilter && search.type==\\'mirror\\'\" translate>PEER.MIRROR_PEERS</span> <span ng-if=\"!enableFilter || !search.type\" translate>PEER.ALL_PEERS</span> <span ng-if=\"!search.loading\">({{search.results.length}})</span></h4></div><div class=\"pull-right\"><ion-spinner class=\"icon\" icon=\"android\" ng-if=\"search.loading\"></ion-spinner>&nbsp;<div class=\"pull-right\"><a class=\"button button-text button-small hidden-xs hidden-sm ink\" ng-if=\"enableFilter\" ng-class=\"{\\'button-text-positive\\': search.type==\\'member\\'}\" ng-click=\"toggleSearchType(\\'member\\')\"><i class=\"icon ion-person\"></i> {{\\'PEER.MEMBERS\\'|translate}} </a>&nbsp; <a class=\"button button-text button-small hidden-xs hidden-sm ink\" ng-if=\"enableFilter\" ng-class=\"{\\'button-text-positive\\': search.type==\\'mirror\\'}\" ng-click=\"toggleSearchType(\\'mirror\\')\"><i class=\"icon ion-ios-infinite\"></i> {{\\'PEER.MIRRORS\\'|translate}}</a></div></div></div><ng-include src=\"::\\'templates/network/items_peers.html\\'\"></ng-include></div></ion-content></ion-modal-view>');\n$templateCache.put('templates/network/popover_endpoints.html','<ion-popover-view class=\"popover-endpoints popover-light\" style=\"height: {{(titleKey?30:0)+((!items || items.length &lt;= 1) ? 55 : 3+items.length*52)}}px\"><ion-header-bar class=\"bar bar-header stable-bg\" ng-if=\"titleKey\"><div class=\"title\">{{titleKey | translate:titleValues }}</div></ion-header-bar><ion-content scroll=\"false\"><div class=\"list\" ng-class=\"{\\'has-header\\': titleKey}\"><div class=\"item item-text-wrap\" ng-repeat=\"item in items\"><div class=\"item-label\" ng-if=\"item.label\">{{item.label | translate}}</div><div id=\"endpoint_{{$index}}\" class=\"badge item-note dark\">{{item.value}}</div></div></div></ion-content></ion-popover-view>');\n$templateCache.put('templates/network/popover_network.html','<ion-popover-view class=\"fit hidden-xs hidden-sm popover-notification popover-network\" ng-controller=\"NetworkLookupPopoverCtrl\"><ion-header-bar class=\"stable-bg block\"><div class=\"title\">{{\\'MENU.NETWORK\\'|translate}}<ion-spinner class=\"ion-spinner-small\" icon=\"android\" ng-if=\"search.loading\"></ion-spinner></div><div class=\"pull-right\"><a ng-class=\"{\\'positive\\': search.type==\\'member\\', \\'dark\\': search.type!==\\'member\\'}\" ng-click=\"toggleSearchType(\\'member\\')\" translate>PEER.MEMBERS</a></div></ion-header-bar><ion-content scroll=\"true\"><div class=\"list no-padding\"><ng-include src=\"::\\'templates/network/items_peers.html\\'\"></ng-include></div></ion-content><ion-footer-bar class=\"stable-bg block\"><div class=\"pull-left\"><a class=\"positive\" ui-sref=\"app.settings\" ng-click=\"closePopover()\" translate>COMMON.NOTIFICATIONS.SETTINGS</a></div><div class=\"pull-right\"><a class=\"positive\" ui-sref=\"app.network\" ng-click=\"closePopover()\" translate>COMMON.NOTIFICATIONS.SHOW_ALL</a></div></ion-footer-bar></ion-popover-view>');\n$templateCache.put('templates/network/popover_peer_info.html','<ion-popover-view class=\"fit hidden-xs hidden-sm popover-notification popover-peer-info\" ng-controller=\"PeerInfoPopoverCtrl\"><ion-header-bar class=\"stable-bg block\"><div class=\"title\">{{\\'PEER.VIEW.TITLE\\'|translate}}</div></ion-header-bar><ion-content scroll=\"true\"><div class=\"center padding\" ng-if=\"loading\"><ion-spinner icon=\"android\"></ion-spinner></div><div class=\"list no-padding\" ng-if=\"!loading\"><div class=\"item\" ng-if=\":rebind:formData.software\"><i class=\"ion-outlet\"></i> {{\\'NETWORK.VIEW.SOFTWARE\\'|translate}}<div class=\"badge\" ng-class=\":rebind:{\\'badge-energized\\': formData.isPreRelease, \\'badge-assertive\\': formData.hasNewRelease }\">{{formData.software}} v{{:rebind:formData.version}}</div><div class=\"gray badge badge-secondary\" ng-if=\"formData.isPreRelease\"><i class=\"ion-alert-circled\"></i> <span ng-bind-html=\"\\'NETWORK.VIEW.WARN_PRE_RELEASE\\'|translate: formData.latestRelease\"></span></div><div class=\"gray badge badge-secondary\" ng-if=\"formData.hasNewRelease\"><i class=\"ion-alert-circled\"></i> <span ng-bind-html=\"\\'NETWORK.VIEW.WARN_NEW_RELEASE\\'|translate: formData.latestRelease\"></span></div></div><div class=\"item\"><i class=\"ion-locked\"></i> {{\\'NETWORK.VIEW.ENDPOINTS.BMAS\\'|translate}}<div class=\"badge badge-balanced\" ng-if=\":rebind:formData.useSsl\" translate>COMMON.BTN_YES</div><div class=\"badge badge-assertive\" ng-if=\":rebind:!formData.useSsl\" translate>COMMON.BTN_NO</div></div><div class=\"item\"><i class=\"ion-cube\"></i> {{\\'BLOCKCHAIN.VIEW.TITLE_CURRENT\\'|translate}}<div class=\"badge badge-balanced\">{{:rebind:formData.number | formatInteger}}</div></div><div class=\"item\"><i class=\"ion-clock\"></i> {{\\'CURRENCY.VIEW.MEDIAN_TIME\\'|translate}}<div class=\"badge dark\">{{:rebind:formData.medianTime | medianDate}}</div></div><div class=\"item\"><i class=\"ion-lock-combination\"></i> {{\\'CURRENCY.VIEW.POW_MIN\\'|translate}}<div class=\"badge dark\">{{:rebind:formData.powMin | formatInteger}}</div></div><cs-extension-point name=\"default\"></cs-extension-point></div></ion-content><ion-footer-bar class=\"stable-bg block\"><div class=\"pull-left\"><a class=\"positive\" ui-sref=\"app.settings\" ng-click=\"closePopover()\" translate>MENU.SETTINGS</a></div><div class=\"pull-right\"><a class=\"positive\" ui-sref=\"app.view_peer\" ng-click=\"closePopover()\" translate>PEER.BTN_SHOW_PEER</a></div></ion-footer-bar></ion-popover-view>');\n$templateCache.put('templates/network/view_network.html','<ion-view><ion-nav-title><span translate>MENU.NETWORK</span></ion-nav-title><ion-nav-buttons side=\"secondary\"><button class=\"button button-icon button-clear icon ion-loop visible-xs visible-sm\" ng-click=\"refresh()\"></button></ion-nav-buttons><ion-content scroll=\"true\" ng-init=\"enableFilter=true; ionItemClass=\\'item-border-large\\';\"><div class=\"row responsive-sm responsive-md responsive-lg\"><div class=\"col list col-border-right\"><div class=\"padding padding-xs\" style=\"display: block; height: 60px;\"><div class=\"pull-left\"><h4><span ng-if=\"enableFilter && search.type==\\'member\\'\" translate>PEER.MEMBER_PEERS</span> <span ng-if=\"enableFilter && search.type==\\'mirror\\'\" translate>PEER.MIRROR_PEERS</span> <span ng-if=\"enableFilter && search.type==\\'offline\\'\" translate>PEER.OFFLINE_PEERS</span> <span ng-if=\"!enableFilter || !search.type\" translate>PEER.ALL_PEERS</span> <span ng-if=\"search.results.length\">({{search.results.length}})</span><ion-spinner ng-if=\"search.loading\" class=\"icon ion-spinner-small\" icon=\"android\"></ion-spinner></h4></div><div class=\"pull-right\"><div class=\"pull-right\" ng-if=\"enableFilter\"><a class=\"button button-text button-small hidden-xs hidden-sm ink\" ng-class=\"{\\'button-text-positive\\': compactMode}\" ng-click=\"toggleCompactMode()\"><i class=\"icon ion-navicon\"></i> <b class=\"ion-arrow-down-b\" style=\"position: absolute; top: -2px; left: 4px; font-size: 8px;\"></b> <b class=\"ion-arrow-up-b\" style=\"position: absolute; top: 10px; left: 4px; font-size: 8px;\"></b> <span>{{:locale:\\'BLOCKCHAIN.LOOKUP.BTN_COMPACT\\'|translate}}</span> </a><a class=\"button button-text button-small hidden-xs hidden-sm ink\" ng-class=\"{\\'button-text-positive\\': search.type==\\'member\\'}\" title=\"{{:locale:\\'PEER.MEMBER_PEERS\\'|translate}}\" ng-click=\"toggleSearchType(\\'member\\')\"><i class=\"icon ion-person-stalker\"></i> {{\\'PEER.MEMBERS\\'|translate}} </a>&nbsp; <a class=\"button button-text button-small hidden-xs hidden-sm ink\" ng-class=\"{\\'button-text-positive\\': search.type==\\'mirror\\'}\" title=\"{{\\'PEER.MIRROR_PEERS\\'|translate}}\" ng-click=\"toggleSearchType(\\'mirror\\')\"><i class=\"icon ion-radio-waves\"></i> {{:locale:\\'PEER.MIRRORS\\'|translate}} </a><a class=\"button button-text button-small hidden-xs hidden-sm ink\" ng-class=\"{\\'button-text-positive\\': search.type==\\'offline\\', \\'button-text-stable\\': search.type!=\\'offline\\'}\" title=\"{{\\'PEER.OFFLINE_PEERS\\'|translate}}\" ng-click=\"toggleSearchType(\\'offline\\')\"><i class=\"icon ion-close-circled light-gray\"></i> <span>{{:locale:\\'PEER.OFFLINE\\'|translate}}</span></a><cs-extension-point name=\"network-buttons\"></cs-extension-point></div></div></div><div id=\"helptip-network-blockchain\" style=\"display: block\"></div><div id=\"helptip-network-peers\" style=\"display: block\"></div><ng-include src=\"::\\'templates/network/items_peers.html\\'\"></ng-include></div><div class=\"col col-33\" ng-controller=\"BlockLookupCtrl\"><div class=\"padding padding-xs\" style=\"display: block; height: 100px;\"><h4 translate>BLOCKCHAIN.LOOKUP.LAST_BLOCKS</h4><div class=\"pull-right hidden-xs hidden-sm\"><a class=\"button button-text button-small ink\" ng-class=\"{\\'button-text-positive\\': compactMode, \\'button-text-stable\\': !compactMode}\" ng-click=\"toggleCompactMode()\"><i class=\"icon ion-navicon\"></i> <b class=\"icon-secondary ion-arrow-down-b\" style=\"top: -8px; left: 5px; font-size: 8px;\"></b> <b class=\"icon-secondary ion-arrow-up-b\" style=\"top: 4px; left: 5px; font-size: 8px;\"></b> <span>{{:locale:\\'BLOCKCHAIN.LOOKUP.BTN_COMPACT\\'|translate}}</span></a><cs-extension-point name=\"blockchain-buttons\"></cs-extension-point></div></div><ng-include src=\"::\\'templates/blockchain/list_blocks.html\\'\"></ng-include></div></div></ion-content></ion-view>');\n$templateCache.put('templates/network/view_peer.html','<ion-view><ion-nav-title><span translate>PEER.VIEW.TITLE</span></ion-nav-title><ion-content><div class=\"row no-padding\"><div class=\"col col-20 hidden-xs hidden-sm\">&nbsp;</div><div class=\"col list\"><ion-item><h1><span translate>PEER.VIEW.TITLE</span> <span class=\"gray\">{{node.host}}</span></h1><h2 class=\"gray\"><i class=\"gray icon ion-android-globe\"></i> {{node.bma.dns || node.server}} <span class=\"gray\" ng-if=\"!loading && node.useSsl\"><i class=\"gray ion-locked\"></i> <small>SSL</small> </span><span class=\"gray\" ng-if=\"!loading && node.useTor\"><i class=\"gray ion-bma-tor-api\"></i> </span><span class=\"assertive\" ng-if=\"!loading && !node.uid\">({{\\'PEER.MIRROR\\'|translate}})</span></h2><h3><span class=\"dark\"><i class=\"icon ion-android-desktop\"></i> {{\\'PEER.VIEW.OWNER\\'|translate}} </span><a class=\"positive\" ng-if=\"node.uid\" ui-sref=\"app.wot_identity({pubkey: node.pubkey, uid: node.uid})\"><i class=\"ion-person\"></i> {{node.name || node.uid}} <span class=\"gray\" ng-if=\"node.name\">({{node.uid}}) </span></a><span ng-if=\"!loading && !node.uid\"><a class=\"gray\" ui-sref=\"app.wot_identity({pubkey: node.pubkey})\"><i class=\"ion-key\"></i> {{node.pubkey|formatPubkey}} <span class=\"gray\" ng-if=\"node.name\">({{node.name}})</span></a></span></h3><h3><a ng-click=\"openRawPeering($event)\"><i class=\"icon ion-share\"></i> {{\\'PEER.VIEW.SHOW_RAW_PEERING\\'|translate}} </a><span class=\"gray\" ng-if=\"!isReachable\">| </span><a ng-if=\"!isReachable\" ng-click=\"openRawCurrentBlock($event)\"><i class=\"icon ion-share\"></i> <span translate>PEER.VIEW.SHOW_RAW_CURRENT_BLOCK</span></a></h3></ion-item><div class=\"item item-divider\" translate>PEER.VIEW.GENERAL_DIVIDER</div><ion-item class=\"item-icon-left item-text-wrap ink\" copy-on-click=\"{{node.pubkey}}\"><i class=\"icon ion-key\"></i> <span translate>COMMON.PUBKEY</span><h4 class=\"dark text-left\">{{node.pubkey}}</h4></ion-item><a class=\"item item-icon-left item-icon-right item-text-wrap ink\" ng-if=\"isReachable\" ui-sref=\"app.view_server_block_hash({server: node.server, ssl: node.useSsl, tor: node.useTor, number: current.number, hash: current.hash})\"><i class=\"icon ion-cube\"></i> <span translate>BLOCKCHAIN.VIEW.TITLE_CURRENT</span><div class=\"badge badge-calm\" ng-if=\"!loading\">{{current.number|formatInteger}}</div><i class=\"gray icon ion-ios-arrow-right\"></i> </a><a class=\"item item-icon-left item-icon-right item-text-wrap ink\" ng-if=\"isReachable\" ui-sref=\"app.server_blockchain({server: node.server, ssl: node.useSsl, tor: node.useTor})\"><i class=\"icon ion-cube\" style=\"font-size: 25px;\"></i> <i class=\"icon-secondary ion-clock\" style=\"font-size: 18px; left: 33px; top: -12px;\"></i> <span translate>PEER.VIEW.LAST_BLOCKS</span> <i class=\"gray icon ion-ios-arrow-right\"></i></a><cs-extension-point name=\"general\"></cs-extension-point><div class=\"item item-divider\" ng-hide=\"loading || !isReachable\" translate>PEER.VIEW.KNOWN_PEERS</div><ion-item class=\"item item-text-wrap no-border done in gray no-padding-top no-padding-bottom inline text-italic\" ng-show=\"!loading && !isReachable\"><small><i class=\"icon ion-alert-circled\"></i> {{\\'NETWORK.INFO.ONLY_SSL_PEERS\\'|translate}}</small></ion-item><div class=\"item center\" ng-if=\"loading\"><ion-spinner class=\"icon\" icon=\"android\"></ion-spinner></div><div class=\"list no-padding {{::motion.ionListClass}}\" ng-if=\"isReachable\"><div ng-repeat=\"peer in :rebind:peers track by peer.id\" class=\"item item-peer item-icon-left ink {{::ionItemClass}}\" ng-click=\"selectPeer(peer)\" ng-include=\"::\\'templates/network/item_content_peer.html\\'\"></div></div></div><div class=\"col col-20 hidden-xs hidden-sm\">&nbsp;</div></div></ion-content></ion-view>');\n$templateCache.put('templates/settings/popover_actions.html','<ion-popover-view class=\"fit has-header\"><ion-header-bar><h1 class=\"title\" translate>COMMON.POPOVER_ACTIONS_TITLE</h1></ion-header-bar><ion-content scroll=\"false\"><div class=\"list item-text-wrap\"><a class=\"item item-icon-left ink visible-xs visible-sm\" ng-click=\"reset()\"><i class=\"icon ion-refresh\"></i> {{\\'SETTINGS.BTN_RESET\\' | translate}} </a><a class=\"item item-icon-left ink\" ng-click=\"startSettingsTour()\"><i class=\"icon ion-easel\"></i> {{\\'COMMON.BTN_HELP_TOUR_SCREEN\\' | translate}}</a></div></ion-content></ion-popover-view>');\n$templateCache.put('templates/settings/popup_node.html','<form name=\"popupForm\" ng-submit=\"\"><div class=\"list no-padding\" ng-init=\"setPopupForm(popupForm)\"><div class=\"item item-input item-floating-label\" ng-class=\"{\\'item-input-error\\': popupForm.$submitted && popupForm.newNode.$invalid}\"><span class=\"input-label\" ng-bind-html=\"\\'SETTINGS.POPUP_PEER.HOST\\'|translate\"></span> <input name=\"newNode\" type=\"text\" placeholder=\"{{\\'SETTINGS.POPUP_PEER.HOST_HELP\\' | translate}}\" ng-model=\"popupData.newNode\" ng-minlength=\"3\" required></div><div class=\"form-errors\" ng-if=\"popupForm.$submitted && popupForm.newNode.$error\" ng-messages=\"popupForm.newNode.$error\"><div class=\"form-error\" ng-message=\"required\"><span translate=\"ERROR.FIELD_REQUIRED\"></span></div><div class=\"form-error\" ng-message=\"minlength\"><span translate=\"ERROR.FIELD_TOO_SHORT\"></span></div></div><div class=\"item item-toggle\"><span class=\"input-label\">{{\\'SETTINGS.POPUP_PEER.USE_SSL\\' | translate}}</span><h4><small class=\"gray\" ng-bind-html=\"\\'SETTINGS.POPUP_PEER.USE_SSL_HELP\\' | translate\"></small></h4><label class=\"toggle toggle-royal no-padding-right\"><input type=\"checkbox\" ng-model=\"popupData.useSsl\"><div class=\"track\"><div class=\"handle\"></div></div></label></div><a class=\"button button-positive button-clear positive button-outline button-full button-small-padding icon-left ink no-padding\" ng-click=\"showNodeList()\"><i class=\"icon ion-search\"></i> {{\\'SETTINGS.POPUP_PEER.BTN_SHOW_LIST\\' | translate}}</a></div><button type=\"submit\" class=\"hide\"></button></form>');\n$templateCache.put('templates/settings/settings.html','<ion-view left-buttons=\"leftButtons\" cache-view=\"false\" class=\"settings\"><ion-nav-title translate>SETTINGS.TITLE</ion-nav-title><ion-nav-buttons side=\"secondary\"><button class=\"button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm\" ng-click=\"showActionsPopover($event)\"></button></ion-nav-buttons><ion-content><div class=\"padding text-center hidden-xs hidden-sm\"><button class=\"button button-raised button-stable ink\" ng-click=\"reset()\"><i class=\"icon ion-refresh\"></i> {{\\'SETTINGS.BTN_RESET\\' | translate}}</button> <button class=\"button button-stable button-small-padding icon ion-android-more-vertical\" ng-click=\"showActionsPopover($event)\" title=\"{{\\'COMMON.BTN_OPTIONS\\' | translate}}\"></button></div><div class=\"row no-padding responsive-sm responsive-md responsive-lg\"><div class=\"col col-50 list item-border-large padding-left padding-right no-padding-xs no-padding-sm\" style=\"margin-bottom: 2px;\"><span class=\"item item-divider\" translate>SETTINGS.DISPLAY_DIVIDER</span> <label class=\"item item-input item-select\"><div class=\"input-label\" translate>COMMON.LANGUAGE</div><select ng-model=\"formData.locale\" ng-change=\"changeLanguage(formData.locale.id)\" ng-options=\"l as l.label for l in locales track by l.id\"></select></label><div class=\"item item-toggle dark\"><div class=\"input-label\">{{\\'COMMON.BTN_RELATIVE_UNIT\\' | translate}}</div><label class=\"toggle toggle-royal\" id=\"helptip-settings-btn-unit-relative\"><input type=\"checkbox\" ng-model=\"formData.useRelative\"><div class=\"track\"><div class=\"handle\"></div></div></label></div><div class=\"item item-toggle dark item-text-wrap\"><div class=\"input-label\" ng-bind-html=\"\\'SETTINGS.ENABLE_HELPTIP\\' | translate\"></div><label class=\"toggle toggle-royal\"><input type=\"checkbox\" ng-model=\"formData.helptip.enable\"><div class=\"track\"><div class=\"handle\"></div></div></label></div><span class=\"item item-divider\" translate>SETTINGS.STORAGE_DIVIDER</span><div class=\"item item-text-wrap item-toggle dark\"><div class=\"input-label\">{{\\'SETTINGS.USE_LOCAL_STORAGE\\' | translate}}</div><h4 class=\"gray\" ng-bind-html=\"\\'SETTINGS.USE_LOCAL_STORAGE_HELP\\' | translate\"></h4><label class=\"toggle toggle-royal\"><input type=\"checkbox\" ng-model=\"formData.useLocalStorage\"><div class=\"track\"><div class=\"handle\"></div></div></label></div><div class=\"item item-text-wrap item-toggle dark\"><div class=\"input-label\" ng-class=\"{\\'gray\\': !formData.useLocalStorage}\" ng-bind-html=\"\\'SETTINGS.PERSIST_CACHE\\' | translate\"></div><h4 class=\"gray\" ng-bind-html=\"\\'SETTINGS.PERSIST_CACHE_HELP\\' | translate\"></h4><label class=\"toggle toggle-royal\"><input type=\"checkbox\" ng-model=\"formData.persistCache\" ng-if=\"formData.useLocalStorage\"> <input type=\"checkbox\" ng-model=\"formData.useLocalStorage\" ng-if=\"!formData.useLocalStorage\" disabled=\"disabled\"><div class=\"track\"><div class=\"handle\"></div></div></label></div><cs-extension-point name=\"common\"></cs-extension-point><span class=\"item item-divider hidden-readonly\">{{\\'SETTINGS.AUTHENTICATION_SETTINGS\\' | translate}}</span><div class=\"item item-toggle item-text-wrap hidden-readonly\"><div class=\"input-label\" ng-class=\"{\\'gray\\': !formData.useLocalStorage}\">{{\\'SETTINGS.REMEMBER_ME\\' | translate}}</div><h4 class=\"gray text-wrap\" ng-bind-html=\"\\'SETTINGS.REMEMBER_ME_HELP\\' | translate\"></h4><label class=\"toggle toggle-royal\"><input type=\"checkbox\" ng-model=\"formData.rememberMe\" ng-if=\"formData.useLocalStorage\"> <input type=\"checkbox\" ng-model=\"formData.useLocalStorage\" ng-if=\"!formData.useLocalStorage\" disabled=\"disabled\"><div class=\"track\"><div class=\"handle\"></div></div></label></div><label class=\"item item-input item-select item-text-wrap hidden-readonly\"><div class=\"input-label hidden-xs\" ng-class=\"::{\\'gray\\': $root.config.demo}\"><span class=\"hidden-xs\" translate>SETTINGS.KEEP_AUTH</span><h4 class=\"gray text-wrap hidden-xs\" ng-bind-html=\"\\'SETTINGS.KEEP_AUTH_HELP\\' | translate\"></h4><ng-if ng-if=\"::$root.config.demo\" ng-include=\"::\\'templates/common/note_feature_not_available.html\\'\"></ng-if></div><span class=\"visible-xs\" ng-class=\"::{\\'gray\\': $root.config.demo}\" translate>SETTINGS.KEEP_AUTH_SHORT</span> <select ng-model=\"formData.keepAuthIdle\" ng-disabled=\"$root.config.demo\" ng-options=\"i as (keepAuthIdleLabels[i].labelKey | translate:keepAuthIdleLabels[i].labelParams ) for i in keepAuthIdles track by i\"></select></label><div class=\"item item-input hidden-xs hidden-sm\" ng-class=\"{\\'gray\\': (!formData.useLocalStorage || !formData.rememberMe)}\" ng-if=\"::$root.device.isDesktop()\"><div class=\"input-label\"><span class=\"input-label\" translate>SETTINGS.KEYRING_FILE</span><h4 class=\"gray text-wrap\" ng-bind-html=\"\\'SETTINGS.KEYRING_FILE_HELP\\' | translate\"></h4></div><div class=\"item-note dark\">{{formData.keyringFile}}</div></div></div><div class=\"col col-50 list item-border-large padding-left padding-right no-padding-xs no-padding-sm no-margin-xs no-margin-sm\"><span class=\"item item-divider hidden-readonly\">{{\\'SETTINGS.WALLETS_SETTINGS\\' | translate}}</span><div class=\"item item-toggle item-text-wrap dark hidden-readonly\"><span class=\"input-label\" ng-class=\"{\\'gray\\': !formData.useLocalStorage}\" translate>SETTINGS.USE_WALLETS_ENCRYPTION</span><h4 class=\"gray text-wrap\" ng-bind-html=\"\\'SETTINGS.USE_WALLETS_ENCRYPTION_HELP\\' | translate\"></h4><label class=\"toggle toggle-royal\"><input type=\"checkbox\" ng-model=\"formData.useLocalStorageEncryption\" ng-if=\"formData.useLocalStorage\"> <input type=\"checkbox\" ng-model=\"formData.useLocalStorage\" ng-if=\"!formData.useLocalStorage\" disabled=\"disabled\"><div class=\"track\"><div class=\"handle\"></div></div></label></div><span class=\"item item-divider hidden-readonly\" translate>SETTINGS.HISTORY_SETTINGS</span><div class=\"item item-toggle item-text-wrap dark hidden-readonly\"><div class=\"input-label\" translate>SETTINGS.DISPLAY_UD_HISTORY</div><label class=\"toggle toggle-royal\"><input type=\"checkbox\" ng-model=\"formData.showUDHistory\"><div class=\"track\"><div class=\"handle\"></div></div></label></div><div class=\"item item-toggle dark hidden-xs hidden-sm hidden-readonly\"><div class=\"input-label\" translate>SETTINGS.TX_HISTORY_AUTO_REFRESH</div><h4 class=\"gray text-wrap\" ng-bind-html=\"\\'SETTINGS.TX_HISTORY_AUTO_REFRESH_HELP\\' | translate\"></h4><label class=\"toggle toggle-royal\"><input type=\"checkbox\" ng-model=\"formData.walletHistoryAutoRefresh\"><div class=\"track\"><div class=\"handle\"></div></div></label></div><cs-extension-point name=\"history\"></cs-extension-point><span class=\"item item-divider\" translate>SETTINGS.NETWORK_SETTINGS</span><div class=\"item ink item-text-wrap item-icon-right hidden-xs hidden-sm\" ng-click=\"changeNode()\"><div class=\"input-label\" translate>SETTINGS.PEER</div><ng-if ng-if=\"formData.node.temporary\"><h4 class=\"gray text-wrap assertive\"><i class=\"icon ion-alert-circled\"></i> <span ng-bind-html=\"\\'SETTINGS.PEER_CHANGED_TEMPORARY\\' | translate \"></span></h4><div class=\"item-note assertive text-italic\">{{bma.server}}</div></ng-if><div class=\"badge badge-balanced\" ng-if=\"!formData.node.temporary\">{{bma.server}}</div><i class=\"icon ion-ios-arrow-right\"></i></div><ion-item class=\"ink item-icon-right visible-xs visible-sm\" ng-click=\"changeNode()\"><div class=\"input-label hidden-xs\" translate>SETTINGS.PEER</div><div class=\"input-label visible-xs\" translate>SETTINGS.PEER_SHORT</div><ng-if ng-if=\"formData.node.temporary\"><h4 class=\"gray text-wrap assertive\"><b class=\"ion-alert-circled\"></b> <span ng-bind-html=\"\\'SETTINGS.PEER_CHANGED_TEMPORARY\\' | translate \"></span></h4><div class=\"badge badge-assertive\">{{bma.server}}</div></ng-if><div class=\"badge badge-balanced\" ng-if=\"!formData.node.temporary\">{{bma.server}}</div><i class=\"icon ion-ios-arrow-right\"></i></ion-item><div class=\"item item-text-wrap item-toggle dark hidden-xs hidden-sm\"><div class=\"input-label\" ng-bind-html=\"\\'SETTINGS.EXPERT_MODE\\' | translate\"></div><h4 class=\"gray\" ng-bind-html=\"\\'SETTINGS.EXPERT_MODE_HELP\\' | translate\"></h4><label class=\"toggle toggle-royal\"><input type=\"checkbox\" ng-model=\"formData.expertMode\"><div class=\"track\"><div class=\"handle\"></div></div></label></div><label class=\"item item-input item-select item-text-wrap\"><div class=\"input-label hidden-xs\"><span translate>SETTINGS.BLOCK_VALIDITY_WINDOW</span><h4 class=\"gray text-wrap hidden-xs\" ng-bind-html=\"\\'SETTINGS.BLOCK_VALIDITY_WINDOW_HELP\\' | translate\"></h4></div><div class=\"input-label visible-xs\" translate>SETTINGS.BLOCK_VALIDITY_WINDOW_SHORT</div><select ng-model=\"formData.blockValidityWindow\" ng-options=\"i as (blockValidityWindowLabels[i].labelKey | translate:blockValidityWindowLabels[i].labelParams ) for i in blockValidityWindows track by i\"></select></label><cs-extension-point name=\"network\"></cs-extension-point><span class=\"item item-divider\" ng-if=\"$root.config.plugins\" translate>SETTINGS.PLUGINS_SETTINGS</span><cs-extension-point name=\"plugins\"></cs-extension-point></div></div></ion-content></ion-view>');\n$templateCache.put('templates/wallet/item_tx.html','<i class=\"icon item-image\" ng-if=\"::!tx.avatar\" ng-class=\"::{\\'ion-person dark\\': tx.uid, \\'ion-card dark\\': !tx.uid}\"></i> <i class=\"avatar\" ng-if=\"::tx.avatar\" style=\"background-image: url({{::tx.avatar.src}})\"></i><div class=\"row no-padding\"><div class=\"col col-pubkey no-padding\"><a class=\"\" ui-sref=\"app.wot_identity({pubkey:tx.pubkey, uid:tx.uid})\" ng-if=\"::tx.uid\">{{::tx.name||tx.uid}} </a><a class=\"gray\" ui-sref=\"app.wot_identity({pubkey:tx.pubkey, uid:tx.uid})\" ng-if=\"::!tx.uid && tx.pubkey\"><i class=\"ion-key gray\"></i> {{::tx.pubkey | formatPubkey}} <span ng-if=\"::tx.name\">- {{::tx.name | truncText:40}}</span></a><p ng-if=\"::tx.pubkeys\" class=\"pubkeys\"><a class=\"gray\" ng-repeat=\"pubkey in ::tx.pubkeys.slice(0, 4)\" ui-sref=\"app.wot_identity({pubkey:pubkey})\"><i class=\"ion-key gray\"></i>&nbsp;{{::pubkey | formatPubkey}} </a><span ng-if=\"::tx.pubkeys.length &gt; 4\">...</span></p><p class=\"dark visible-xs comment text-italic\" ng-if=\"::tx.comment\" title=\"{{::tx.comment}}\"><i class=\"ion-ios-chatbubble-outline\"></i> {{::tx.comment}}<br></p><h4><a ng-if=\"::!pending\" class=\"gray underline\" ui-sref=\"app.view_block({number: tx.block_number})\">{{::tx.time | medianFromNowAndDate: false}} </a><span ng-if=\"::pending\" class=\"gray\">{{::tx.time | medianFromNowAndDate: false}}</span></h4></div><div class=\"col col-50 col-comment no-padding padding-left hidden-xs\" ng-if=\"::tx.comment\"><p class=\"vertical-center gray text-italic\" data-toggle=\"tooltip\" title=\"{{::tx.comment}}\">{{::tx.comment}}</p></div><div class=\"col col-10 no-padding\"><span ng-if=\"::!tx.lockedOutputs\" class=\"badge item-note\" ng-class=\"{\\'badge-calm\\': tx.amount > 0, \\'badge-white\\': tx.amount <= 0}\"><span ng-bind-html=\":rebind:tx.amount| formatAmount:{currency:$root.currency.name}\"></span> </span><a ng-if=\":rebind:tx.lockedOutputs\" class=\"badge item-note\" ng-class=\"{\\'badge-calm\\': tx.amount > 0}\" ng-click=\"showLockedOutputsPopover(tx, $event)\"><b class=\"ion-locked\"></b> <span ng-bind-html=\":rebind:tx.amount| formatAmount:{currency:$root.currency.name}\"></span></a><div class=\"badge badge-secondary\" ng-if=\"$root.settings.expertMode\">(<span ng-bind-html=\":rebind:tx.amount| formatAmount:{useRelative: !$root.settings.useRelative, currency:$root.currency.name}\"></span>)</div></div></div>');\n$templateCache.put('templates/wallet/item_ud.html','<i class=\"icon item-image ion-arrow-up-c energized\"></i><div class=\"row no-padding\"><div class=\"col no-padding\"><span class=\"energized\" translate>COMMON.UNIVERSAL_DIVIDEND</span><h4><a class=\"gray underline\" ui-sref=\"app.view_block({number: tx.block_number})\">{{::tx.time | medianFromNowAndDate}}</a></h4></div><div class=\"col col-10 no-padding\"><span class=\"badge item-note badge-energized\"><span ng-bind-html=\":rebind:tx.amount| formatAmount:{currency:$root.currency.name}\"></span></span><div class=\"badge badge-secondary\" ng-if=\"$root.settings.expertMode\">(<span ng-bind-html=\":rebind:tx.amount| formatAmount:{useRelative: !$root.settings.useRelative, currency:$root.currency.name}\"></span>)</div></div></div>');\n$templateCache.put('templates/wallet/list/item_wallet_light.html','<div class=\"item item-avatar item-icon-right item-border item-wallet\" ng-click=\"select($event, wallet)\" ng-init=\"walletData=wallet.data;\"><i ng-if=\"::!walletData.avatar\" class=\"item-image icon\" ng-class=\"::{\\'ion-card\\': !walletData.isMember, \\'ion-person\\': walletData.isMember}\"></i> <i ng-if=\"::walletData.avatar\" class=\"item-image avatar\" style=\"background-image: url({{::walletData.avatar.src}})\"></i><div class=\"badge badge-button badge-avatar badge-assertive ion-locked\" ng-hide=\"::wallet.isAuth()\"></div><h2><ng-if ng-if=\"::walletData.localName||walletData.name||walletData.uid\">{{::walletData.localName||walletData.name||walletData.uid}}</ng-if><ng-if ng-if=\"::!walletData.localName && !walletData.name && !walletData.uid\">{{::walletData.pubkey|formatPubkey}}</ng-if></h2><h4 class=\"gray\"><span class=\"positive\" ng-if=\"::walletData.name && walletData.uid\"><i class=\"ion-person\"></i> {{::walletData.uid}}&nbsp; </span><b class=\"ion-key\"></b> {{::walletData.pubkey | formatPubkey}} <span ng-if=\"::!walletData.uid\" class=\"assertive\" translate>WOT.NOT_MEMBER_PARENTHESIS</span></h4><div class=\"badge\" ng-if=\"formData.showBalance\" ng-class=\"{\\'badge-calm\\': (walletData.balance > 0) }\"><span ng-bind-html=\"walletData.balance|formatAmount:{useRelative: formData.useRelative, currency: currency}\"></span></div><i class=\"icon ion-ios-arrow-right\"></i></div>');\n$templateCache.put('templates/wallet/list/item_wallet.html','<div class=\"item item-avatar item-icon-right item-border-large item-wallet ink\" id=\"wallet-{{::wallet.id}}\" ng-click=\"select($event, wallet)\" ng-init=\"walletData=wallet.data;\"><i ng-if=\":rebind:!walletData.avatar\" class=\"item-image icon\" ng-class=\":rebind:{\\'ion-card\\': !walletData.isMember, \\'ion-person\\': walletData.isMember}\"></i> <i ng-if=\":rebind:walletData.avatar\" class=\"item-image avatar\" style=\"background-image: url({{::walletData.avatar.src}})\"></i><div class=\"badge badge-button badge-avatar badge-assertive ion-locked\" ng-hide=\":rebind:wallet.isAuth()\"></div><h2><span class=\"text-editable\" ng-click=\"editWallet($event, wallet)\" title=\"{{\\'ACCOUNT.WALLET_LIST.BTN_RENAME\\'|translate}}\"><ng-if ng-if=\":rebind:walletData.localName||walletData.name||walletData.uid\" ng-bind-html=\"::walletData.localName||walletData.name||walletData.uid\"></ng-if><ng-if ng-if=\":rebind:!walletData.localName && !walletData.name && !walletData.uid\">{{::walletData.pubkey|formatPubkey}}</ng-if></span></h2><h4 class=\"gray\"><span class=\"positive\" ng-if=\"::walletData.name && walletData.uid\"><i class=\"ion-person\"></i> {{::walletData.uid}}&nbsp; </span><b class=\"ion-key\"></b> {{::walletData.pubkey | formatPubkey}} <span ng-if=\"::!walletData.uid\" class=\"assertive\" translate>WOT.NOT_MEMBER_PARENTHESIS</span></h4><cs-extension-point name=\"item-wallet\"></cs-extension-point><span class=\"badge\" ng-if=\":rebind:formData.showBalance && walletData.sources\" ng-class=\":rebind:{\\'badge-calm\\': (walletData.balance > 0) }\"><ion-spinner class=\"ion-spinner-small\" ng-if=\"formData.updatingWalletId==wallet.id\" icon=\"android\"></ion-spinner><span ng-bind-html=\":rebind:walletData.balance|formatAmount:{useRelative: formData.useRelative, currency: currency}\"></span> </span><i class=\"icon ion-ios-arrow-right\"></i></div>');\n$templateCache.put('templates/wallet/list/modal_import_file.html','<ion-modal-view id=\"transfer\" class=\"modal-full-height\"><ion-header-bar class=\"bar-positive\"><button class=\"button button-clear visible-xs\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button><h1 class=\"title\" translate>ACCOUNT.WALLET_LIST.IMPORT_MODAL.TITLE</h1></ion-header-bar><ion-content scroll=\"true\" class=\"padding\"><p translate>ACCOUNT.WALLET_LIST.IMPORT_MODAL.HELP</p><div drop-zone=\"onFileChanged(file)\"><div ng-if=\"!hasContent\" file-select=\"onFileChanged(file)\" accept=\".csv,.txt\"><h2 class=\"gray\" translate>COMMON.CHOOSE_FILE</h2></div><div ng-if=\"hasContent\" class=\"item item-icon-left item-icon-right stable-bg\"><i class=\"icon ion-document-text gray\"></i><div class=\"item-content row\"><div class=\"col\"><h2>{{fileData.name}}</h2><h4 ng-if=\"fileData.lastModified\"><span class=\"gray\" translate>COMMON.FILE.DATE</span> {{fileData.lastModified/1000|formatDate}}</h4><h5><span class=\"gray\" translate>COMMON.FILE.SIZE</span> {{fileData.size|formatInteger}} Ko</h5></div><div class=\"col padding-left\"><h3 ng-if=\"validatingFile\" translate>COMMON.FILE.VALIDATING</h3><h3 ng-if=\"!validatingFile\"><span class=\"dark animate-show-hide ng-hide\" ng-show=\"isValidFile && content.length\" ng-bind-html=\"\\'ACCOUNT.WALLET_LIST.IMPORT_MODAL.WALLET_COUNT\\'|translate:{count: content.length}\"></span> <span class=\"assertive animate-show-hide ng-hide\" ng-show=\"isValidFile && !content.length\"><br><i class=\"ion-close-circled assertive\"></i> {{\\'ACCOUNT.WALLET_LIST.IMPORT_MODAL.NO_NEW_WALLET\\' |translate}} </span><span class=\"assertive animate-show-hide ng-hide\" ng-show=\"!isValidFile\"><br><i class=\"ion-close-circled assertive\"></i> {{\\'ERROR.INVALID_FILE_FORMAT\\' |translate}}</span></h3></div></div><a class=\"ion-close-round gray pull-right\" style=\"font-size: 10px; position: absolute; top: 6px; right: 6px;\" ng-click=\"removeFile()\"></a></div></div><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-positive ink\" ng-disabled=\"loading || !content.length\" ng-click=\"closeModal(content)\" translate>COMMON.BTN_IMPORT</button></div></ion-content></ion-modal-view>');\n$templateCache.put('templates/wallet/list/modal_wallets.html','<ion-modal-view id=\"transfer\" class=\"modal-full-height\"><ion-header-bar class=\"bar-positive\"><button class=\"button button-clear\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button><h1 class=\"title\" translate>ACCOUNT.SELECT_WALLET_MODAL.TITLE</h1></ion-header-bar><ion-content scroll=\"true\"><div class=\"center padding\" ng-if=\"loading\"><ion-spinner icon=\"android\"></ion-spinner></div><div class=\"center padding gray\" ng-if=\"!loading && !wallets.length && !defaultWallet\">{{:locale:\\'ACCOUNT.WALLET_LIST.NO_WALLET\\'|translate}}</div><ion-list ng-if=\"!loading\" class=\"{{::motion.ionListClass}}\"><ng-include ng-if=\"defaultWallet\" ng-init=\"wallet = defaultWallet\" src=\"\\'templates/wallet/list/item_wallet.html\\'\"></ng-include><ng-repeat ng-repeat=\"wallet in wallets track by wallet.id\" ng-include=\"::\\'templates/wallet/list/item_wallet_light.html\\'\"></ng-repeat></ion-list></ion-content></ion-modal-view>');\n$templateCache.put('templates/wallet/list/popover_actions.html','<ion-popover-view class=\"fit has-header\"><ion-header-bar><h1 class=\"title\" translate>COMMON.POPOVER_ACTIONS_TITLE</h1></ion-header-bar><ion-content scroll=\"false\"><div class=\"list item-text-wrap\"><button class=\"item item-icon-left ink\" ng-class=\"{\\'gray\\': loading || !wallets.length, \\'assertive\\': !loading && wallets.length}\" ng-disabled=\"loading || !wallets.length\" ng-click=\"selectAndRemoveWallet()\"><i class=\"icon ion-trash-a\"></i> {{\\'ACCOUNT.WALLET_LIST.BTN_DELETE\\' | translate}}</button><div class=\"item-divider hidden-sm hidden-xs\"></div><button class=\"item item-icon-left ink hidden-sm hidden-xs\" ng-class=\"{\\'gray\\': loading || !wallets.length}\" ng-disabled=\"loading || !wallets.length\" ng-click=\"downloadAsFile()\"><i class=\"icon ion-android-download\"></i> {{\\'ACCOUNT.WALLET_LIST.BTN_DOWNLOAD\\' | translate}}</button> <button class=\"item item-icon-left ink hidden-sm hidden-xs\" ng-class=\"{\\'gray\\': loading}\" ng-disabled=\"loading\" ng-click=\"showImportFileModal()\"><i class=\"icon ion-android-upload\"></i> {{\\'ACCOUNT.WALLET_LIST.BTN_IMPORT_FILE_DOTS\\' | translate}}</button></div></ion-content></ion-popover-view>');\n$templateCache.put('templates/wallet/list/popover_wallets.html','<ion-popover-view class=\"fit popover-wallets popover-light\"><ion-header-bar class=\"stable-bg block\"><div class=\"title\" translate>ACCOUNT.SELECT_WALLET_MODAL.TITLE</div><div class=\"pull-right\"><a class=\"positive\" ng-click=\"showNewWalletModal()\" translate>ACCOUNT.WALLET_LIST.BTN_NEW</a></div></ion-header-bar><ion-content scroll=\"true\"><div class=\"center padding\" ng-if=\"loading\"><ion-spinner icon=\"android\"></ion-spinner></div><div class=\"center padding gray\" ng-if=\"!loading && !wallets.length && !defaultWallet\">{{:locale:\\'ACCOUNT.WALLET_LIST.NO_WALLET\\'|translate}}</div><ion-list ng-if=\"!loading\"><ng-include ng-if=\"defaultWallet\" ng-init=\"wallet = defaultWallet\" src=\"\\'templates/wallet/list/item_wallet_light.html\\'\"></ng-include><ng-repeat ng-repeat=\"wallet in :rebind:wallets | filter:filterFn(formData) track by wallet.id\" ng-include=\"::\\'templates/wallet/list/item_wallet_light.html\\'\"></ng-repeat></ion-list></ion-content><ion-footer-bar class=\"stable-bg block\"><div class=\"pull-right\"><a class=\"positive\" ui-sref=\"app.view_wallets\" ng-click=\"closePopover()\" translate>COMMON.NOTIFICATIONS.SHOW_ALL</a></div></ion-footer-bar></ion-popover-view>');\n$templateCache.put('templates/wallet/list/popup_edit_name.html','<form name=\"editForm\" ng-submit=\"\"><div class=\"list\" ng-init=\"setEditForm(editForm)\"><label class=\"item item-input\" ng-class=\"{\\'item-input-error\\': editForm.$submitted && editForm.name.$invalid}\"><input name=\"name\" type=\"text\" placeholder=\"{{\\'ACCOUNT.WALLET_LIST.EDIT_POPOVER.NAME_HELP\\' | translate}}\" ng-model=\"formData.name\" ng-minlength=\"3\" required></label><div class=\"form-errors\" ng-if=\"editForm.$submitted && editForm.name.$error\" ng-messages=\"editForm.name.$error\"><div class=\"form-error\" ng-message=\"required\"><span translate=\"ERROR.FIELD_REQUIRED\"></span></div><div class=\"form-error\" ng-message=\"minlength\"><span translate=\"ERROR.FIELD_TOO_SHORT\"></span></div></div></div></form>');\n$templateCache.put('templates/wallet/list/view_wallets.html','<ion-view left-buttons=\"leftButtons\" class=\"view-wallet-list\"><ion-nav-title></ion-nav-title><ion-nav-buttons side=\"secondary\"><cs-extension-point name=\"nav-buttons\"></cs-extension-point><button class=\"button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm\" ng-click=\"showActionsPopover($event)\"></button></ion-nav-buttons><ion-content scroll=\"true\" class=\"padding no-padding-xs no-padding-sm\" bind-notifier=\"{ rebind:formData.useRelative, locale:settings.locale.id}\"><ion-refresher pulling-text=\"{{:locale:\\'COMMON.BTN_REFRESH\\' | translate}}\" on-refresh=\"doUpdate(true, $event)\"></ion-refresher><div class=\"hidden-xs hidden-sm padding text-center\"><button class=\"button button-stable button-small-padding icon ion-loop ink\" ng-click=\"doUpdate(true, $event)\" title=\"{{:locale:\\'COMMON.BTN_REFRESH\\' | translate}}\"></button><cs-extension-point name=\"buttons\"></cs-extension-point><button class=\"button button-calm icon-left ink\" ng-click=\"showNewWalletModal()\">{{:locale:\\'ACCOUNT.WALLET_LIST.BTN_NEW\\' | translate}}</button> <button class=\"button button-stable button-small-padding icon ion-android-more-vertical ink\" ng-click=\"showActionsPopover($event)\" title=\"{{:locale:\\'COMMON.BTN_OPTIONS\\' | translate}}\"></button></div><div class=\"padding-top padding-xs hidden-xs hidden-sm\" style=\"display: block; height: 60px;\"><div class=\"pull-left\"><h4><span translate>ACCOUNT.WALLET_LIST.TITLE</span> <small class=\"gray\" ng-if=\"formData.balance\">(<span translate>ACCOUNT.WALLET_LIST.TOTAL_DOTS</span>&nbsp; <span ng-bind-html=\"formData.balance|formatAmount:{useRelative: formData.useRelative, currency: currency}\"></span>)</small><ion-spinner class=\"ion-spinner-small\" icon=\"android\" ng-if=\"loading || formData.updatingWalletId\"></ion-spinner></h4></div></div><div class=\"center padding gray\" ng-if=\"!loading && wallets && !wallets.length && !defaultWallet\">{{:locale:\\'ACCOUNT.WALLET_LIST.NO_WALLET\\'|translate}}</div><ion-list class=\"{{::motion.ionListClass}}\"><ng-include ng-if=\"defaultWallet\" ng-init=\"wallet = defaultWallet\" src=\"\\'templates/wallet/list/item_wallet.html\\'\"></ng-include><ng-include ng-repeat=\"wallet in wallets track by wallet.id\" src=\"\\'templates/wallet/list/item_wallet.html\\'\"></ng-include></ion-list><div class=\"center padding visible-xs visible-sm\" ng-if=\"loading\"><ion-spinner icon=\"android\"></ion-spinner></div></ion-content><button id=\"fab-add-wallet\" class=\"button button-fab button-fab-bottom-right button-assertive hidden-md hidden-lg drop ng-hide\" ng-show=\"!loading\" ng-click=\"showNewWalletModal()\"><i class=\"icon ion-plus\"></i></button></ion-view>');\n$templateCache.put('templates/wallet/modal_security.html','<ion-modal-view class=\"modal-full-height\"><ion-header-bar class=\"bar-positive\"><button class=\"button button-clear visible-xs\" ng-if=\"!slides.slider.activeIndex\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-icon button-clear icon ion-ios-arrow-back buttons header-item\" ng-click=\"slidePrev()\" ng-if=\"slides.slider.activeIndex\"></button><h1 class=\"title hidden-xs\" translate>ACCOUNT.SECURITY.TITLE</h1><button class=\"button button-clear icon-right visible-xs\" ng-if=\"!isLastSlide && slides.slider.activeIndex > 0\" ng-click=\"doNext()\"><span translate>COMMON.BTN_NEXT</span> <i class=\"icon ion-ios-arrow-right\"></i></button> <button class=\"button button-positive button-icon button-clear icon ion-android-done visible-xs\" ng-click=\"doNext()\" ng-if=\"isLastSlide && option === \\'saveID\\'\"></button></ion-header-bar><ion-slides options=\"slides.options\" slider=\"slides.slider\"><ion-slide-page><ion-content class=\"has-header padding\"><div class=\"list\"><div class=\"item item-complex card stable-bg item-icon-left item-icon-right ink\" ng-click=\"selectOption(\\'recoverID\\')\" ng-if=\"!login\"><div class=\"item-content item-text-wrap\"><i class=\"item-image dark icon ion-person\"></i> <b class=\"ion-ios-undo icon-secondary dark\" style=\"top: -8px; left: 39px; font-size: 12px;\"></b><h2 translate>ACCOUNT.SECURITY.RECOVER_ID</h2><h4 class=\"gray\" translate>ACCOUNT.SECURITY.RECOVER_ID_HELP</h4><ng-if ng-if=\"::$root.config.demo\" ng-include=\"::\\'templates/common/note_feature_not_available.html\\'\"><i class=\"icon dark ion-ios-arrow-right\" ng-if=\"::!$root.config.demo\"></i></ng-if></div></div><div class=\"item item-complex card stable-bg item-icon-left item-icon-right ink\" ng-click=\"selectOption(\\'revocation\\', true)\" ng-if=\"!login\"><div class=\"item-content item-text-wrap\"><i class=\"item-image dark icon ion-person\"></i> <b class=\"ion-close icon-secondary dark\" style=\"top: -8px; left: 39px; font-size: 12px;\"></b><h2 translate>ACCOUNT.SECURITY.REVOCATION_WITH_FILE</h2><h4 class=\"gray\" translate>ACCOUNT.SECURITY.REVOCATION_WITH_FILE_DESCRIPTION</h4><i class=\"icon dark ion-ios-arrow-right\"></i></div></div><div class=\"item item-complex card stable-bg item-icon-left item-icon-right ink hidden-xs\" ng-click=\"selectOption(\\'saveID\\')\" ng-if=\"login && !$root.device.enable\"><div class=\"item-content item-text-wrap\"><i class=\"item-image dark icon ion-person\"></i> <b class=\"ion-ios-redo icon-secondary dark\" style=\"top: -8px; left: 39px; font-size: 12px;\"></b> <b class=\"ion-locked icon-secondary dark\" style=\"top: 0px; left: 40px; font-size: 8px;\"></b><h2 translate>ACCOUNT.SECURITY.SAVE_ID</h2><h4 class=\"gray\" translate>ACCOUNT.SECURITY.SAVE_ID_HELP</h4><ng-if ng-if=\"::$root.config.demo\" ng-include=\"::\\'templates/common/note_feature_not_available.html\\'\"><i class=\"icon dark ion-ios-arrow-right\"></i></ng-if></div></div><div class=\"item item-complex card stable-bg item-icon-left item-icon-right ink hidden-xs\" ng-click=\"selectOption(\\'generateKeyfile\\')\" ng-if=\"login && !$root.device.enable\"><div class=\"item-content item-text-wrap\"><i class=\"item-image dark icon ion-document-text\"></i> <b class=\"ion-key icon-secondary dark\" style=\"top: -8px; left: 42px; font-size: 12px;\"></b><h2 translate>ACCOUNT.SECURITY.GENERATE_KEYFILE</h2><h4 class=\"gray\" translate>ACCOUNT.SECURITY.GENERATE_KEYFILE_HELP</h4><ng-if ng-if=\"::$root.config.demo\" ng-include=\"::\\'templates/common/note_feature_not_available.html\\'\"><i class=\"icon dark ion-ios-arrow-right\"></i></ng-if></div></div><div class=\"item item-complex card stable-bg item-icon-left item-icon-right ink hidden-xs hidden-sm\" ng-click=\"downloadRevokeFile()\" ng-if=\"canRevoke && !$root.device.enable\"><div class=\"item-content item-text-wrap\"><i class=\"item-image dark icon ion-person\"></i> <b class=\"ion-ios-redo icon-secondary dark\" style=\"top: -8px; left: 39px; font-size: 12px;\"></b> <b class=\"ion-close icon-secondary dark\" style=\"top: 0px; left: 40px; font-size: 8px;\"></b><h2 translate>ACCOUNT.SECURITY.DOWNLOAD_REVOKE</h2><h4 class=\"gray\" translate>ACCOUNT.SECURITY.DOWNLOAD_REVOKE_HELP</h4><ng-if ng-if=\"::$root.config.demo\" ng-include=\"::\\'templates/common/note_feature_not_available.html\\'\"><i class=\"icon dark ion-android-archive\"></i></ng-if></div></div><div class=\"item item-complex card stable-bg item-icon-left item-icon-right ink\" ng-click=\"self()\" ng-if=\"needSelf\"><div class=\"item-content item-text-wrap\"><i class=\"item-image icon ion-person dark\"></i> <b class=\"ion-flag icon-secondary dark\" style=\"top: -8px; left: 39px; font-size: 12px;\"></b><h2 translate>ACCOUNT.SECURITY.SEND_IDENTITY</h2><h4 class=\"gray\" ng-bind-html=\"::\\'ACCOUNT.SECURITY.SEND_IDENTITY_HELP\\' | translate\"></h4><ng-if ng-if=\"::$root.config.demo\" ng-include=\"::\\'templates/common/note_feature_not_available.html\\'\"></ng-if></div></div><div class=\"item item-complex card stable-bg item-icon-left item-icon-right ink\" ng-click=\"membershipIn()\" ng-if=\"needMembership\"><div class=\"item-content item-text-wrap\"><i class=\"item-image icon ion-person dark\"></i> <b class=\"ion-plus icon-secondary dark\" style=\"top: -8px; left: 39px; font-size: 12px;\"></b><h2 translate>ACCOUNT.SECURITY.MEMBERSHIP_IN</h2><h4 class=\"gray\" ng-bind-html=\"::\\'ACCOUNT.SECURITY.MEMBERSHIP_IN_HELP\\' | translate\"></h4><ng-if ng-if=\"::$root.config.demo\" ng-include=\"::\\'templates/common/note_feature_not_available.html\\'\"></ng-if></div></div><div class=\"item item-complex card stable-bg item-icon-left item-icon-right ink\" ng-click=\"revokeWalletIdentity()\" ng-if=\"canRevoke\"><div class=\"item-content item-text-wrap\"><i class=\"item-image icon ion-person assertive-900\"></i> <b class=\"ion-close icon-secondary assertive-900\" style=\"top: -8px; left: 39px; font-size: 12px;\"></b><h2 translate>ACCOUNT.SECURITY.REVOCATION_WALLET</h2><h4 class=\"gray\" translate>ACCOUNT.SECURITY.REVOCATION_WALLET_HELP</h4><ng-if ng-if=\"::$root.config.demo\" ng-include=\"::\\'templates/common/note_feature_not_available.html\\'\"></ng-if></div></div></div><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" translate>COMMON.BTN_CANCEL</button></div></ion-content></ion-slide-page><ion-slide-page ng-if=\"option == \\'revocation\\'\"><ng-include src=\"::\\'templates/wallet/slides/slides_revocation_file.html\\'\"></ng-include></ion-slide-page><ion-slide-page ng-if=\"login && option == \\'saveID\\'\"><ng-include src=\"::\\'templates/wallet/slides/slides_saveID_1.html\\'\"></ng-include></ion-slide-page><ion-slide-page ng-if=\"login && option == \\'saveID\\'\"><ng-include src=\"::\\'templates/wallet/slides/slides_saveID_2.html\\'\"></ng-include></ion-slide-page><ion-slide-page ng-if=\"option == \\'recoverID\\'\"><ng-include src=\"::\\'templates/wallet/slides/slides_recoverID_1.html\\'\"></ng-include></ion-slide-page><ion-slide-page ng-if=\"option == \\'recoverID\\'\"><ng-include src=\"::\\'templates/wallet/slides/slides_recoverID_2.html\\'\"></ng-include></ion-slide-page><ion-slide-page ng-if=\"option == \\'recoverID\\'\"><ng-include src=\"::\\'templates/wallet/slides/slides_recoverID_3.html\\'\"></ng-include></ion-slide-page><ion-slide-page ng-if=\"login && option == \\'generateKeyfile\\'\"><ng-include src=\"::\\'templates/wallet/slides/slides_generate_keyfile.html\\'\"></ng-include></ion-slide-page></ion-slides></ion-modal-view>');\n$templateCache.put('templates/wallet/modal_transfer.html','<ion-modal-view id=\"transfer\" class=\"modal-full-height modal-transfer\"><ion-header-bar class=\"bar-positive\"><button class=\"button button-clear visible-xs\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button><h1 class=\"title\" translate>TRANSFER.MODAL.TITLE</h1><button class=\"button button-icon button-clear icon ion-android-send visible-xs\" ng-click=\"doTransfer()\"></button></ion-header-bar><ion-content><ng-include src=\"::\\'templates/wallet/transfer_form.html\\'\"></ng-include></ion-content><ion-digit-keyboard settings=\"digitKeyboardSettings\" ng-if=\"digitKeyboardVisible\"></ion-digit-keyboard></ion-modal-view>');\n$templateCache.put('templates/wallet/new_transfer.html','<ion-view left-buttons=\"leftButtons\" id=\"transfer\"><ion-nav-title><span class=\"visible-xs visible-sm\" translate>TRANSFER.TITLE</span></ion-nav-title><ion-nav-buttons side=\"secondary\"><button class=\"button button-icon button-clear icon ion-android-send visible-xs\" ng-click=\"doTransfer()\"></button></ion-nav-buttons><ion-content scroll=\"true\"><div class=\"row no-padding-xs\"><div class=\"col col-20 hidden-xs hidden-sm\">&nbsp;</div><div class=\"col no-padding-xs\"><h2 class=\"hidden-xs hidden-sm\" ng-if=\"formData\">{{(formData.all ? \\'TRANSFER.SUB_TITLE_ALL\\' : \\'TRANSFER.SUB_TITLE\\')|translate}}</h2><h4 class=\"hidden-xs hidden-sm\">&nbsp;</h4><ng-include src=\"::\\'templates/wallet/transfer_form.html\\'\"></ng-include></div><div class=\"col col-20 hidden-xs hidden-sm\">&nbsp;</div></div></ion-content><ion-digit-keyboard settings=\"digitKeyboardSettings\" ng-if=\"digitKeyboardVisible\"></ion-digit-keyboard></ion-view>');\n$templateCache.put('templates/wallet/popover_actions.html','<ion-popover-view class=\"fit has-header popover-wallet-actions\"><ion-header-bar><h1 class=\"title\" translate>COMMON.POPOVER_ACTIONS_TITLE</h1></ion-header-bar><ion-content scroll=\"false\"><div class=\"list item-text-wrap\"><a class=\"item item-icon-left ink visible-xs visible-sm\" ng-click=\"showSharePopover($event)\"><i class=\"icon ion-android-share-alt\"></i> {{\\'COMMON.BTN_SHARE\\' | translate}} </a><a class=\"item item-icon-left ink\" ng-if=\"walletData.requirements.alternatives\" ng-click=\"showSelectIdentitiesModal()\"><i class=\"icon ion-person\"></i> <b class=\"icon-secondary ion-loop\" style=\"margin-top: 4px; left: 15px;\"></b> {{\\'ACCOUNT.BTN_SELECT_ALTERNATIVES_IDENTITIES\\' | translate}} </a><a class=\"item item-icon-left ink visible-xs visible-sm\" ng-if=\"!walletData.requirements.needSelf && walletData.requirements.needRenew\" ng-click=\"renewMembership()\"><i class=\"icon ion-loop\"></i> {{\\'ACCOUNT.BTN_MEMBERSHIP_RENEW_DOTS\\' | translate}} </a><a class=\"item item-icon-left ink hidden-xs hidden-sm\" ng-if=\"!walletData.requirements.needSelf && !walletData.requirements.hasBadSelfBlock && !walletData.requirements.revoked\" ng-class=\"{\\'gray\\':!walletData.requirements.needRenew}\" ng-click=\"renewMembership()\"><i class=\"icon ion-loop\"></i> {{\\'ACCOUNT.BTN_MEMBERSHIP_RENEW_DOTS\\' | translate}} </a><a class=\"item item-icon-left ink hidden-xs hidden-sm\" ng-if=\"walletData.requirements.hasBadSelfBlock\" ng-click=\"fixMembership()\"><i class=\"icon ion-loop\"></i> {{\\'ACCOUNT.BTN_FIX_MEMBERSHIP\\' | translate}} </a><a class=\"item item-icon-left assertive ink\" ng-if=\"walletData.requirements.canMembershipOut\" ng-click=\"membershipOut()\"><i class=\"icon ion-log-out\"></i> {{\\'ACCOUNT.BTN_MEMBERSHIP_OUT_DOTS\\' | translate}} </a><a class=\"item item-icon-left ink\" ng-click=\"showSecurityModal()\"><i class=\"icon ion-locked\"></i> <span ng-bind-html=\"\\'ACCOUNT.BTN_SECURITY_DOTS\\' | translate\"></span></a><div class=\"item-divider hidden-sm hidden-xs\"></div><a class=\"item item-icon-left ink hidden-sm hidden-xs\" ng-if=\"isDefaultWallet\" ng-click=\"startWalletTour()\"><i class=\"icon ion-easel\"></i> {{\\'COMMON.BTN_HELP_TOUR_SCREEN\\' | translate}}</a></div></ion-content></ion-popover-view>');\n$templateCache.put('templates/wallet/popover_unit.html','<ion-popover-view class=\"popover-unit\"><ion-content scroll=\"false\"><div class=\"list\"><a class=\"item item-icon-left\" ng-class=\"{ \\'selected\\': !formData.useRelative}\" ng-click=\"closePopover(false)\"><i class=\"icon\" ng-class=\"{ \\'ion-ios-checkmark-empty\\': !formData.useRelative}\"></i> <i ng-bind-html=\"$root.currency.name | currencySymbol:false\"></i> </a><a class=\"item item-icon-left\" ng-class=\"{ \\'selected\\': formData.useRelative}\" ng-click=\"closePopover(true)\"><i class=\"icon\" ng-class=\"{ \\'ion-ios-checkmark-empty\\': formData.useRelative}\"></i> <i ng-bind-html=\"$root.currency.name | currencySymbol:true\"></i></a></div></ion-content></ion-popover-view>');\n$templateCache.put('templates/wallet/popup_register.html','<form name=\"registerForm\" ng-submit=\"\"><div class=\"list\" ng-init=\"setRegisterForm(registerForm)\"><label class=\"item item-input\" ng-class=\"{\\'item-input-error\\': registerForm.$submitted && registerForm.pseudo.$invalid}\"><input name=\"pseudo\" type=\"text\" placeholder=\"{{\\'ACCOUNT.NEW.PSEUDO_HELP\\' | translate}}\" ng-model=\"formData.newUid\" ng-minlength=\"3\" required></label><div class=\"form-errors\" ng-if=\"registerForm.$submitted && registerForm.pseudo.$error\" ng-messages=\"registerForm.pseudo.$error\"><div class=\"form-error\" ng-message=\"required\"><span translate=\"ERROR.FIELD_REQUIRED\"></span></div><div class=\"form-error\" ng-message=\"minlength\"><span translate=\"ERROR.FIELD_TOO_SHORT\"></span></div></div></div></form>');\n$templateCache.put('templates/wallet/slides/slides_generate_keyfile.html','<ion-content class=\"has-header padding\"><h3 translate>ACCOUNT.SECURITY.GENERATE_KEYFILE</h3><div class=\"list\"><div class=\"item item-complex card stable-bg item-icon-left item-icon-right ink\" ng-click=\"downloadKeyFile(\\'PubSec\\')\"><div class=\"item-content item-text-wrap\"><i class=\"item-image dark icon ion-document-text\"></i> <b class=\"ion-ios-redo icon-secondary dark\" style=\"top: -8px; left: 42px; font-size: 12px;\"></b><h2 translate>ACCOUNT.SECURITY.KEYFILE.PUBSEC_FORMAT</h2><h4 class=\"gray\" translate>ACCOUNT.SECURITY.KEYFILE.PUBSEC_FORMAT_HELP</h4><ng-if ng-if=\"::$root.config.demo\" ng-include=\"::\\'templates/common/note_feature_not_available.html\\'\"><i class=\"icon dark ion-ios-arrow-right\"></i></ng-if></div></div><div class=\"item item-complex card stable-bg item-icon-left item-icon-right ink\" ng-click=\"downloadKeyFile(\\'WIF\\')\"><div class=\"item-content item-text-wrap\"><i class=\"item-image dark icon ion-document-text\"></i> <b class=\"ion-ios-redo icon-secondary dark\" style=\"top: -8px; left: 42px; font-size: 12px;\"></b><h2 translate>ACCOUNT.SECURITY.KEYFILE.WIF_FORMAT</h2><h4 class=\"gray\" translate>ACCOUNT.SECURITY.KEYFILE.WIF_FORMAT_HELP</h4><ng-if ng-if=\"::$root.config.demo\" ng-include=\"::\\'templates/common/note_feature_not_available.html\\'\"><i class=\"icon dark ion-ios-arrow-right\"></i></ng-if></div></div><div class=\"item item-complex card stable-bg item-icon-left item-icon-right ink\" ng-click=\"downloadKeyFile(\\'EWIF\\')\"><div class=\"item-content item-text-wrap\"><i class=\"item-image dark icon ion-document-text\"></i> <b class=\"ion-ios-redo icon-secondary dark\" style=\"top: -8px; left: 42px; font-size: 12px;\"></b> <b class=\"ion-locked icon-secondary dark\" style=\"top: 0px; left: 43px; font-size: 8px;\"></b><h2 translate>ACCOUNT.SECURITY.KEYFILE.EWIF_FORMAT</h2><h4 class=\"gray\" translate>ACCOUNT.SECURITY.KEYFILE.EWIF_FORMAT_HELP</h4><ng-if ng-if=\"::$root.config.demo\" ng-include=\"::\\'templates/common/note_feature_not_available.html\\'\"><i class=\"icon dark ion-ios-arrow-right\"></i></ng-if></div></div></div></ion-content>');\n$templateCache.put('templates/wallet/slides/slides_recoverID_1.html','<ion-content class=\"has-header padding\"><p translate>ACCOUNT.SECURITY.RECOVER_ID_SELECT_FILE</p><div drop-zone=\"onFileChanged(file)\"><div ng-if=\"!hasContent\" file-select=\"onFileChanged(file)\" accept=\".txt\"><h2 class=\"gray\" translate>COMMON.CHOOSE_FILE</h2></div><div ng-if=\"hasContent\" class=\"item item-icon-left item-icon-right\"><i class=\"icon ion-document-text dark\"></i><div class=\"item-content row\"><div class=\"col\"><span>{{fileData.name}}</span><br><small>{{fileData.size}} Ko</small></div><div class=\"col-10\"><b ng-class=\"{\\'ion-close-circled assertive\\': !isValidFile}\" style=\"font-size: 28px; position: relative; top: 6px;\"></b></div></div><a class=\"ion-close-round gray pull-right\" style=\"font-size: 10px; position: absolute; top: 6px; right: 6px;\" ng-click=\"restore()\"></a></div></div><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-calm icon-right ion-chevron-right ink\" ng-click=\"doNext()\" translate>COMMON.BTN_NEXT <i class=\"icon ion-arrow-right-a\"></i></button></div></ion-content>');\n$templateCache.put('templates/wallet/slides/slides_recoverID_2.html','<ion-content class=\"has-header padding\"><h3 translate>ACCOUNT.SECURITY.RECOVER_ID</h3><form name=\"recoverForm\" novalidate ng-submit=\"recoverId()\"><div class=\"list\" ng-init=\"setForm(recoverForm, \\'recoverForm\\')\"><ng-repeat ng-repeat=\"question in recover.questions \"><label class=\"item item-input {{smallscreen ? \\'item-stacked-label\\' : \\'item-floating-label\\'}}\" ng-class=\"{\\'item-input-error\\': recoverForm.$submitted && recoverForm[\\'question{{$index}}\\'].$invalid}\"><span class=\"input-label\" style=\"{{smallscreen ? \\'white-space: normal\\' : \\'\\'}}\">{{question.value }}</span> <input type=\"text\" autocomplete=\"off\" name=\"question{{$index}}\" placeholder=\"{{smallscreen ? \\'\\' : question.value }}\" ng-model=\"question.answer\" required></label><div class=\"form-errors\" ng-show=\"recoverForm.$submitted && recoverForm[\\'question{{$index}}\\'].$error\" ng-messages=\"recoverForm[\\'question{{$index}}\\'].$error\"><div class=\"form-error\" ng-message=\"required\"><span translate=\"ERROR.FIELD_REQUIRED\"></span></div></div></ng-repeat><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-clear button-dark\" ng-click=\"restore()\" type=\"button\" translate>ACCOUNT.SECURITY.BTN_CLEAN</button> <button class=\"button button-calm icon-right ion-chevron-right ink\" type=\"submit\" translate>COMMON.BTN_NEXT <i class=\"icon ion-arrow-right-a\"></i></button></div></div></form></ion-content>');\n$templateCache.put('templates/wallet/slides/slides_recoverID_3.html','<ion-content class=\"has-header padding\"><h3 translate>ACCOUNT.SECURITY.RECOVER_ID</h3><div class=\"item item-input\"><span class=\"input-label\">{{\\'LOGIN.SALT\\' | translate}} :</span> <span>{{recover.salt}}</span></div><div class=\"item item-input\"><span class=\"input-label\">{{\\'LOGIN.PASSWORD\\' | translate}} :</span> <span>{{recover.pwd}}</span></div><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" translate>COMMON.BTN_CLOSE</button></div></ion-content>');\n$templateCache.put('templates/wallet/slides/slides_revocation_file.html','<ion-content class=\"has-header padding\"><p translate>ACCOUNT.SECURITY.REVOCATION_WITH_FILE_HELP</p><div drop-zone=\"onFileChanged(file)\"><div ng-if=\"!hasContent\" file-select=\"onFileChanged(file)\" accept=\".txt\"><h2 class=\"gray\" translate>COMMON.CHOOSE_FILE</h2></div><div ng-if=\"hasContent\" class=\"item item-icon-left item-icon-right\"><i class=\"icon ion-document-text dark\"></i><div class=\"row\"><div class=\"col\"><h2>{{fileData.name}}</h2><h4 ng-if=\"fileData.lastModified\"><span class=\"gray\" translate>COMMON.FILE.DATE</span> {{fileData.lastModified/1000|formatDate}}</h4><h5><span class=\"gray\" translate>COMMON.FILE.SIZE</span> {{fileData.size|formatInteger}} Ko</h5></div><div class=\"col padding-left\"><h3 class=\"assertive animate-show-hide ng-hide\" ng-show=\"!isValidFile\"><br><i class=\"ion-close-circled assertive\"></i> {{revocationError|translate}}</h3></div></div><a class=\"ion-close-round gray pull-right\" style=\"font-size: 10px; position: absolute; top: 6px; right: 6px;\" ng-click=\"restore()\"></a></div></div><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-calm icon-right ion-chevron-right ink\" ng-click=\"revokeWithFile()\" translate>COMMON.BTN_NEXT <i class=\"icon ion-arrow-right-a\"></i></button></div></ion-content>');\n$templateCache.put('templates/wallet/slides/slides_saveID_1.html','<ion-content class=\"has-header padding\"><h3 translate>ACCOUNT.SECURITY.SAVE_ID</h3><label class=\"item item-input item-select\"><div class=\"input-label\" translate>ACCOUNT.SECURITY.LEVEL</div><select ng-model=\"formData.level\"><option value=\"2\" ng-bind-html=\"\\'ACCOUNT.SECURITY.LOW_LEVEL\\' | translate\"></option><option value=\"4\" translate>ACCOUNT.SECURITY.MEDIUM_LEVEL</option><option value=\"6\" translate>ACCOUNT.SECURITY.STRONG_LEVEL</option></select></label><div class=\"padding-top\" translate=\"ACCOUNT.SECURITY.HELP_LEVEL\" translate-values=\"{nb: {{formData.level}}}\"></div><form name=\"questionsForm\" novalidate ng-submit=\"doNext(\\'questionsForm\\')\"><div class=\"list\" ng-init=\"setForm(questionsForm, \\'questionsForm\\')\"><ion-checkbox ng-repeat=\"question in formData.questions\" ng-model=\"question.checked\" ng-required=\"isRequired()\"><span style=\"white-space: normal;\">{{question.value | translate}}</span></ion-checkbox><div class=\"item item-icon-right no-padding-top\"><a class=\"dark\"><i class=\"icon ion-android-add\" ng-click=\"addQuestion()\"></i></a><div class=\"list list-inset\"><label class=\"item item-input\"><input type=\"text\" autocomplete=\"off\" placeholder=\"{{\\'ACCOUNT.SECURITY.ADD_QUESTION\\' | translate}}\" ng-model=\"formData.addQuestion\"></label></div></div></div><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-clear button-dark\" ng-click=\"restore()\" type=\"button\" translate>ACCOUNT.SECURITY.BTN_RESET</button> <button class=\"button button-calm icon-right ion-chevron-right ink\" ng-disabled=\"questionsForm.$invalid\" type=\"submit\" translate>COMMON.BTN_NEXT <i class=\"icon ion-arrow-right-a\"></i></button></div></form></ion-content>');\n$templateCache.put('templates/wallet/slides/slides_saveID_2.html','<ion-content class=\"has-header padding\"><h3 translate>ACCOUNT.SECURITY.SAVE_ID</h3><form name=\"answersForm\" novalidate ng-submit=\"doNext(\\'answersForm\\')\"><div class=\"list\" ng-init=\"setForm(answersForm, \\'answersForm\\')\"><ng-repeat ng-repeat=\"question in formData.questions |filter:true:checked\"><label class=\"item item-input item-text-wrap {{smallscreen ? \\'item-stacked-label\\' : \\'item-floating-label\\'}}\" ng-class=\"{\\'item-input-error\\': answersForm.$submitted && answersForm[\\'question{{$index}}\\'].$invalid}\"><span class=\"input-label\" style=\"width: 100%; max-width: inherit;\">{{question.value | translate}}</span> <input type=\"text\" autocomplete=\"off\" name=\"question{{$index}}\" placeholder=\"{{smallscreen ? \\'\\' : question.value | translate}}\" ng-model=\"question.answer\" required></label><div class=\"form-errors\" ng-show=\"answersForm.$submitted && answersForm[\\'question{{$index}}\\'].$error\" ng-messages=\"answersForm[\\'question{{$index}}\\'].$error\"><div class=\"form-error\" ng-message=\"required\"><span translate=\"ERROR.FIELD_REQUIRED\"></span></div></div></ng-repeat><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-clear button-dark\" ng-click=\"restore()\" type=\"button\" translate>ACCOUNT.SECURITY.BTN_CLEAN</button> <button class=\"button button-positive ink\" type=\"submit\" translate>COMMON.BTN_CONTINUE <i class=\"icon ion-android-archive\"></i></button></div></div></form></ion-content>');\n$templateCache.put('templates/wallet/transfer_form.html','<form name=\"transferForm\" novalidate=\"\" ng-submit=\"doTransfer()\"><div class=\"list no-padding-xs\" ng-init=\"setForm(transferForm)\"><ion-item class=\"item-icon-right gray ink\" ng-class=\"{\\'item-input-error\\': form.$submitted && !formData.destPub}\" tabindex=\"1\" ng-click=\"showWotLookupModal()\"><span class=\"gray\" translate=\"\">TRANSFER.TO</span> <span class=\"badge badge-royal animate-fade-in animate-show-hide ng-hide\" ng-show=\"destUid\"><i class=\"ion-person\"></i> {{destUid}} </span>&nbsp; <span class=\"badge badge-royal\" ng-show=\"!destUid && formData.destPub\"><i class=\"ion-key\"></i> {{formData.destPub | formatPubkey}} </span><i class=\"gray icon ion-ios-arrow-right\"></i></ion-item><div class=\"form-errors\" ng-if=\"form.$submitted && !formData.destPub\"><div class=\"form-error\"><span translate=\"ERROR.FIELD_REQUIRED\"></span></div></div><ion-item class=\"item-text-wrap ink\" ng-class=\"{\\'item-icon-right\\': enableSelectWallet}\" tabindex=\"2\" ng-click=\"showSelectWalletModal()\"><span class=\"gray\" translate=\"\">TRANSFER.FROM</span> <span class=\"badge item-note\" ng-if=\"loading\"><ion-spinner class=\"ion-spinner-small\" icon=\"android\"></ion-spinner></span><span class=\"badge animate-fade-in animate-show-hide ng-hide\" ng-show=\"!loading\" ng-class=\"{\\'badge-assertive\\': (convertedBalance <= 0 || form.amount.$error.max), \\'badge-balanced\\': (convertedBalance > 0 && (!form.amount.$error.max)) }\"><span ng-if=\"walletData.pubkey && !walletData.isMember\"><i class=\"ion-key\"></i> {{walletData.pubkey| formatPubkey}}&nbsp;&nbsp; </span><span ng-if=\"walletData.isMember\"><i class=\"ion-person\"></i> {{walletData.name||walletData.uid}}&nbsp;&nbsp; </span><span ng-bind-html=\"walletData.balance|formatAmount:{useRelative: formData.useRelative, currency:currency}\"></span> </span><i class=\"gray icon ion-ios-arrow-right\" ng-if=\"enableSelectWallet\"></i></ion-item><div class=\"form-errors ng-hide\" ng-show=\"!loading && walletData.pubkey && walletData.balance <= 0\"><div class=\"form-error\"><span translate=\"ERROR.NOT_ENOUGH_CREDIT\"></span></div></div><ion-item class=\"item-input item-floating-label item-button-right\" ng-class=\"{\\'item-input-error\\': form.$submitted && form.amount.$invalid}\"><div class=\"input-label\"><span translate=\"\">TRANSFER.AMOUNT</span> (<span ng-bind-html=\"$root.currency.name | currencySymbol:formData.useRelative\"></span>)</div><input type=\"text\" tabindex=\"3\" autocomplete=\"off\" class=\"hidden-device\" name=\"amount\" placeholder=\"{{::\\'TRANSFER.AMOUNT_HELP\\' | translate}}\" ng-model=\"formData.amount\" required number-float=\"\"> <a class=\"button button-clear button-stable dark ink\" tabindex=\"-1\" style=\"z-index:110; padding: 0px 16px;\" ng-click=\"showUnitPopover($event)\"><span ng-bind-html=\"$root.currency.name | currencySymbol:formData.useRelative\"></span> &nbsp;<b class=\"ion-arrow-down-b\" style=\"font-size: 12pt;\"></b></a></ion-item><div class=\"form-errors\" ng-show=\"form.$submitted && form.amount.$error\" ng-messages=\"form.amount.$error\"><div class=\"form-error\" ng-message=\"required\"><span translate=\"ERROR.FIELD_REQUIRED\"></span></div><div class=\"form-error\" ng-message=\"numberFloat\"><span translate=\"ERROR.FIELD_NOT_NUMBER\"></span></div><div class=\"form-error\" ng-message=\"numberInt\"><span translate=\"ERROR.FIELD_NOT_INT\"></span></div><div class=\"form-error\" ng-message=\"min\"><span translate=\"ERROR.FIELD_MIN\" translate-values=\"{min: minAmount}\"></span></div><div class=\"form-error\" ng-message=\"max\"><span translate=\"ERROR.NOT_ENOUGH_CREDIT\"></span></div></div><a class=\"item item-icon-right gray ink\" ng-class=\"{\\'item-input-error\\': form.$submitted && !formData.destPub}\" ng-click=\"showWotLookupModal(\\'restPub\\')\" tabindex=\"5\" ng-if=\"formData.all && formData.restAmount\"><span class=\"gray\"><i translate=\"\">TRANSFER.REST</i><ng-if ng-if=\"formData.restAmount\">(<i ng-bind-html=\"formData.restAmount|formatAmount:{useRelative: formData.useRelative, currency:currency}\"></i>)</ng-if><i translate=\"\">TRANSFER.REST_TO</i> </span><span class=\"badge badge-royal animate-fade-in animate-show-hide ng-hide\" ng-show=\"restUid\"><i class=\"ion-person\"></i> {{restUid}} </span>&nbsp; <span class=\"badge badge-royal\" ng-show=\"!restUid && formData.restPub\"><i class=\"ion-key\"></i> {{formData.restPub | formatPubkey}} </span><i class=\"gray icon ion-ios-arrow-right\"></i></a><div class=\"form-errors\" ng-if=\"form.$submitted && formData.all && !formData.restPub && formData.restAmount &gt; 0\"><div class=\"form-error\"><span translate=\"ERROR.FIELD_REQUIRED\"></span></div></div><div class=\"pull-right visible-xs visible-sm\" ng-if=\"!formData.useComment\"><a class=\"button button-text button-small ink\" tabindex=\"-1\" ng-click=\"addComment()\"><i class=\"icon ion-plus\"></i> <span translate=\"\">TRANSFER.BTN_ADD_COMMENT</span></a></div><label class=\"item item-input item-floating-label hidden-xs hidden-sm\" ng-class=\"{\\'item-input-error\\': form.$submitted && form.comment.$invalid}\"><span class=\"input-label\">{{\\'TRANSFER.COMMENT\\' | translate}}</span> <input type=\"text\" placeholder=\"{{\\'TRANSFER.COMMENT_HELP\\' | translate}}\" name=\"comment\" tabindex=\"6\" autocomplete=\"off\" ng-model=\"formData.comment\" ng-maxlength=\"255\" ng-pattern=\"commentPattern\"></label> <label class=\"item item-input item-floating-label visible-xs visible-sm\" ng-if=\"formData.useComment\" ng-class=\"{\\'item-input-error\\': form.$submitted && form.comment.$invalid}\"><span class=\"input-label\">{{\\'TRANSFER.COMMENT\\' | translate}}</span> <input type=\"text\" placeholder=\"{{\\'TRANSFER.COMMENT_HELP\\' | translate}}\" id=\"{{commentInputId}}\" tabindex=\"7\" name=\"comment\" autocomplete=\"off\" ng-model=\"formData.comment\" ng-model-options=\"{ debounce: 650 }\" ng-maxlength=\"255\" ng-pattern=\"commentPattern\" ng-focus=\"hideDigitKeyboard()\"></label><div class=\"form-errors\" ng-show=\"form.comment.$error\" ng-messages=\"form.comment.$error\"><div class=\"form-error\" ng-message=\"maxlength\"><span translate=\"ERROR.FIELD_TOO_LONG\"></span></div><div class=\"form-error\" ng-message=\"pattern\"><span translate=\"ERROR.FIELD_ACCENT\"></span></div></div><div class=\"item item-icon-left item-text-wrap item-no-border hidden-xs hidden-sm\"><div class=\"animate-fade-in animate-show-hide ng-hide\" ng-show=\"formData.comment && formData.comment.length || form.comment.$invalid\"><i class=\"icon ion-android-alert positive\"></i><h4 class=\"positive\" translate=\"\">TRANSFER.WARN_COMMENT_IS_PUBLIC</h4></div></div><div class=\"item item-icon-left item-text-wrap item-no-border visible-xs visible-sm\" ng-if=\"formData.useComment\"><i class=\"icon ion-android-alert positive\"></i><h4 class=\"positive\" translate=\"\">TRANSFER.WARN_COMMENT_IS_PUBLIC</h4></div></div><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" tabindex=\"-1\" ng-click=\"cancel()\" type=\"button\" translate=\"\">COMMON.BTN_CANCEL</button> <button class=\"button ink\" tabindex=\"8\" ng-class=\"{\\'button-assertive\\': formData.all, \\'button-positive\\': !formData.all}\" ng-disabled=\"loading\" type=\"submit\" translate=\"\">TRANSFER.BTN_SEND</button></div></form>');\n$templateCache.put('templates/wallet/tx_locked_outputs_popover.html','<ion-popover-view class=\"fit popover-locked-outputs\"><ion-header-bar><h1 class=\"title\" translate>ACCOUNT.LOCKED_OUTPUTS_POPOVER.TITLE</h1></ion-header-bar><ion-content scroll=\"true\"><div ng-if=\"popoverData.lockedOuputs.length == 1\" class=\"item item-text-wrap no-border\"><h4 class=\"positive\" translate>ACCOUNT.LOCKED_OUTPUTS_POPOVER.DESCRIPTION</h4></div><div ng-if=\"popoverData.lockedOuputs.length > 1\" class=\"item item-text-wrap no-border\"><h4 class=\"positive\" translate>ACCOUNT.LOCKED_OUTPUTS_POPOVER.DESCRIPTION_MANY</h4></div><div ng-repeat=\"output in popoverData.lockedOuputs track by $index\" class=\"item\"><h2 class=\"gray\" ng-if=\"popoverData.lockedOuputs.length > 1\" translate>ACCOUNT.LOCKED_OUTPUTS_POPOVER.LOCKED_AMOUNT</h2><div ng-if=\"popoverData.lockedOuputs.length > 1\" class=\"badge item-note\" ng-class=\"{\\'badge-balanced\\': output.amount > 0}\"><i class=\"icon ion-locked\"></i> <span ng-bind-html=\"::output.amount| formatAmount\"></span> <span ng-bind-html=\"::unit\"></span></div><div ng-repeat=\"condition in output.unlockConditions track by $index\" class=\"row\" ng-class=\"::{\\'padding-top\\': !$index && popoverData.lockedOuputs.length > 1}\" ng-style=\"::condition.style\"><span class=\"gray\" ng-if=\"::condition.operator\">{{::\\'BLOCKCHAIN.VIEW.TX_OUTPUT_OPERATOR.\\'+condition.operator|translate}}&nbsp;</span><div ng-if=\"::condition.type==\\'SIG\\'\"><i class=\"icon ion-key dark\"></i> <span class=\"dark\" ng-bind-html=\"::\\'BLOCKCHAIN.VIEW.TX_OUTPUT_FUNCTION.SIG\\' | translate\"></span> <a ng-click=\"goState(\\'app.wot_identity\\', {pubkey:condition.value})\" style=\"text-decoration: none;\" class=\"positive\">{{condition.value|formatPubkey}}</a></div><div ng-if=\"::condition.type==\\'XHX\\'\"><i class=\"icon ion-lock-combination dark\"></i> <span class=\"dark\" ng-bind-html=\"::\\'BLOCKCHAIN.VIEW.TX_OUTPUT_FUNCTION.XHX\\' | translate\"></span> <a copy-on-click=\"{{::condition.value}}\" class=\"positive\">{{::condition.value|formatPubkey}}...</a></div><div ng-if=\"condition.type==\\'CSV\\'\"><i class=\"icon ion-clock dark\"></i> <span class=\"dark\" ng-bind-html=\"::\\'BLOCKCHAIN.VIEW.TX_OUTPUT_FUNCTION.CSV\\' | translate\"></span> {{::condition.value|formatDuration}}</div><div ng-if=\"condition.type==\\'CLTV\\'\"><i class=\"icon ion-clock dark\"></i> <span class=\"dark\" ng-bind-html=\"::\\'BLOCKCHAIN.VIEW.TX_OUTPUT_FUNCTION.CLTV\\' | translate\"></span> {{::condition.value|medianDate}}</div></div></div></ion-content></ion-popover-view>');\n$templateCache.put('templates/wallet/view_wallet_tx_error.html','<ion-view left-buttons=\"leftButtons\" class=\"view-wallet-tx-error\"><ion-nav-title></ion-nav-title><ion-nav-buttons side=\"secondary\"><cs-extension-point name=\"nav-buttons\"></cs-extension-point></ion-nav-buttons><ion-content scroll=\"true\" class=\"refresher-top-bg\" bind-notifier=\"{ rebind:settings.useRelative, locale:settings.locale.id}\"><ion-refresher pulling-text=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\" on-refresh=\"doUpdate(true)\"></ion-refresher><div class=\"hidden-xs hidden-sm padding text-center\"><button class=\"button button-stable button-small-padding icon ion-loop ink\" ng-click=\"doUpdate()\" title=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\"></button></div><div class=\"row no-padding\"><div class=\"col col-20 hidden-xs hidden-sm\">&nbsp;</div><div class=\"col list {{::motion.ionListClass}}\"><div class=\"item item-divider\"><span><b class=\"ion-clock\"></b> {{:locale:\\'ACCOUNT.PENDING_TX_RECEIVED\\'|translate}}</span><div class=\"badge item-note\"><span ng-if=\"!$root.settings.useRelative\">({{$root.currency.name | abbreviate}})</span> <span ng-if=\"$root.settings.useRelative\">({{\\'COMMON.UD\\' | translate}}<sub>{{$root.currency.name | abbreviate}}</sub>)</span></div></div><span class=\"item padding\" ng-if=\"!loading && !hasReceivedTx()\"><span class=\"gray\">{{:locale:\\'ACCOUNT.NO_TX\\'|translate}}</span></span><div class=\"item item-pending item-tx item-icon-left\" ng-repeat=\"tx in formData.tx.errors | filter: filterReceivedTx\" ng-init=\"pending=true;\" ng-include=\"::\\'templates/wallet/item_tx.html\\'\"></div><div class=\"item item-divider\"><span><b class=\"ion-close-circled\"></b> {{:locale:\\'ACCOUNT.ERROR_TX_SENT\\'|translate}}</span><div class=\"badge item-note\"><span ng-if=\"!$root.settings.useRelative\">({{$root.currency.name | abbreviate}})</span> <span ng-if=\"$root.settings.useRelative\">({{\\'COMMON.UD\\' | translate}}<sub>{{$root.currency.name | abbreviate}}</sub>)</span></div></div><span class=\"item padding\" ng-if=\"!loading && !hasSentTx()\"><span class=\"gray\">{{:locale:\\'ACCOUNT.NO_TX\\'|translate}}</span></span><div class=\"item item-pending item-tx item-icon-left\" ng-repeat=\"tx in formData.tx.errors | filter: filterSentTx\" ng-init=\"error=true;\" ng-include=\"::\\'templates/wallet/item_tx.html\\'\"></div></div><div class=\"col col-20 hidden-xs hidden-sm\">&nbsp;</div></div></ion-content></ion-view>');\n$templateCache.put('templates/wallet/view_wallet_tx.html','<ion-view left-buttons=\"leftButtons\" class=\"view-wallet-tx\"><ion-nav-title><span class=\"visible-xs visible-sm\" translate>MENU.TRANSACTIONS</span></ion-nav-title><ion-nav-buttons side=\"secondary\"><cs-extension-point name=\"nav-buttons\"></cs-extension-point></ion-nav-buttons><ion-content scroll=\"true\" class=\"refresher-positive-900-bg\" bind-notifier=\"{ rebind:settings.useRelative, locale:settings.locale.id}\"><ion-refresher pulling-text=\"{{:locale:\\'COMMON.BTN_REFRESH\\' | translate}}\" on-refresh=\"doUpdate(true)\"></ion-refresher><div class=\"positive-900-bg hero\"><div class=\"content\" ng-if=\"!loading\"><h1 class=\"light\"><span ng-bind-html=\":balance:rebind:formData.balance | formatAmount:{currency: $root.currency.name}\"></span></h1><h4><ng-if ng-if=\"!loading && $root.settings.expertMode\" style=\"font-style: italic;\">(<span ng-bind-html=\":balance:rebind:formData.balance | formatAmount:{useRelative:!$root.settings.useRelative, currency: $root.currency.name}\"></span>)</ng-if><ng-if ng-if=\":rebind:!enableSelectWallet\" style=\"color: lightgray;\"><span ng-if=\":rebind:formData.name\">{{:rebind:formData.name}}</span> <span ng-if=\":rebind:!formData.name && formData.uid\">{{:rebind:formData.uid}}</span> <span ng-if=\":rebind:!formData.name && !formData.uid\"><i class=\"ion-key\"></i> {{:rebind:formData.pubkey | formatPubkey}}</span></ng-if><ng-if ng-if=\":rebind:enableSelectWallet\"><a class=\"hidden-xs hidden-sm\" style=\"color: lightgray;\" title=\"{{:locale:\\'ACCOUNT.SELECT_WALLET_MODAL.TITLE\\'|translate}}\" ng-click=\"showSelectWalletPopover($event)\"><span ng-if=\":rebind:formData.name\">{{:rebind:formData.name}}</span> <span ng-if=\":rebind:!formData.name && formData.uid\">{{:rebind:formData.uid}}</span> <span ng-if=\":rebind:!formData.name && !formData.uid\"><i class=\"ion-key\"></i> {{:rebind:formData.pubkey | formatPubkey}}</span> <small><i class=\"ion-arrow-down-b\"></i></small> </a><a class=\"visible-xs visible-sm\" style=\"color: lightgray;\" title=\"{{:locale:\\'ACCOUNT.SELECT_WALLET_MODAL.TITLE\\'|translate}}\" ng-click=\"showSelectWalletModal($event)\"><span ng-if=\":rebind:formData.name\">{{:rebind:formData.name}}</span> <span ng-if=\":rebind:!formData.name && formData.uid\">{{:rebind:formData.uid}}</span> <span ng-if=\":rebind:!formData.name && !formData.uid\"><i class=\"ion-key\"></i> {{:rebind:formData.pubkey | formatPubkey}}</span> <small><i class=\"ion-arrow-down-b\"></i></small></a></ng-if></h4><div class=\"helptip-anchor-center\"><a id=\"helptip-wallet-balance\">&nbsp;</a></div></div><h2 class=\"content light\" ng-if=\"loading\"><ion-spinner icon=\"android\"></ion-spinner></h2></div><ng-include src=\"::\\'templates/common/qrcode.html\\'\"></ng-include><div class=\"hidden-xs hidden-sm padding text-center\" ng-if=\"!loading\"><button class=\"button button-stable button-small-padding icon ion-loop ink\" ng-click=\"doUpdate()\" title=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\"></button> <button class=\"button button-stable button-small-padding icon ion-android-download ink\" ng-click=\"downloadHistoryFile()\" title=\"{{\\'COMMON.BTN_DOWNLOAD_ACCOUNT_STATEMENT\\' | translate}}\"></button><cs-extension-point name=\"buttons\"></cs-extension-point>&nbsp;&nbsp; <button class=\"button button-calm ink\" ng-click=\"showTransferModal()\">{{:locale:\\'COMMON.BTN_SEND_MONEY\\' | translate}}</button></div><div class=\"row no-padding\"><div class=\"col col-15 hidden-xs hidden-sm\">&nbsp;</div><div class=\"col\"><div class=\"list {{::motion.ionListClass}}\"><a class=\"item item-icon-left item-icon-right ink\" ng-if=\"formData.tx.errors && formData.tx.errors.length\" ng-click=\"showTxErrors()\"><i class=\"icon ion-alert-circled\"></i> {{:locale:\\'ACCOUNT.ERROR_TX\\'|translate}}<div class=\"badge badge-assertive\">{{formData.tx.errors.length}}</div><i class=\"gray icon ion-ios-arrow-right\"></i></a><ng-if ng-if=\"formData.tx.pendings.length\"><span class=\"item item-pending item-divider\"><b class=\"ion-clock\"></b> {{:locale:\\'ACCOUNT.PENDING_TX\\'|translate}}</span><div class=\"item item-pending item-tx item-icon-left\" ng-repeat=\"tx in formData.tx.pendings\" ng-init=\"pending=true;\" ng-include=\"::\\'templates/wallet/item_tx.html\\'\"></div></ng-if><ng-if ng-if=\"formData.tx.validating.length\"><span class=\"item item-pending item-divider\"><b class=\"icon ion-checkmark\" style=\"font-size: 12px;\"></b> <b class=\"icon-secondary ion-help\" style=\"font-size: 12px; top: 2px; left: 11px;\"></b> {{:locale:\\'ACCOUNT.VALIDATING_TX\\'|translate}}</span><div class=\"item item-pending item-tx item-icon-left\" ng-repeat=\"tx in formData.tx.validating\" ng-init=\"validating=true;\" ng-include=\"::\\'templates/wallet/item_tx.html\\'\"></div></ng-if><span class=\"item item-divider\" ng-if=\"!loading\"><b class=\"icon ion-checkmark\"></b> {{:locale:\\'ACCOUNT.LAST_TX\\'|translate}} <a id=\"helptip-wallet-tx\" style=\"position: relative; bottom: 0; right: 0px;\">&nbsp;</a> </span><span class=\"item padding\" ng-if=\"!loading && !formData.tx.history.length\"><span class=\"gray\">{{:locale:\\'ACCOUNT.NO_TX\\'|translate}}</span></span><div ng-repeat=\"tx in formData.tx.history\" class=\"item item-tx item-icon-left\" ng-include=\"::!tx.isUD ? \\'templates/wallet/item_tx.html\\' : \\'templates/wallet/item_ud.html\\'\"></div><div class=\"item item-text-wrap text-center\" ng-if=\"formData.tx.fromTime > 0\"><p><a ng-click=\"showMoreTx()\">{{:locale:\\'ACCOUNT.SHOW_MORE_TX\\'|translate}}</a> <span class=\"gray\" translate=\"ACCOUNT.TX_FROM_DATE\" translate-values=\"{fromTime: formData.tx.fromTime}\"></span> <span class=\"gray\">|</span> <a ng-click=\"showMoreTx(-1)\" translate>ACCOUNT.SHOW_ALL_TX</a></p></div></div></div><div class=\"col col-15 hidden-xs hidden-sm\">&nbsp;</div></div></ion-content><button id=\"fab-transfer\" ng-show=\"!loading\" class=\"button button-fab button-fab-bottom-right button-energized-900 hidden-md hidden-lg drop ng-hide\" ng-click=\"showTransferModal()\"><i class=\"icon ion-android-send\"></i></button></ion-view>');\n$templateCache.put('templates/wallet/view_wallet.html','<ion-view left-buttons=\"leftButtons\" class=\"view-wallet\" id=\"wallet\"><ion-nav-title></ion-nav-title><ion-nav-buttons side=\"secondary\"><cs-extension-point name=\"nav-buttons\"></cs-extension-point><button class=\"button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm\" id=\"helptip-wallet-options-xs\" ng-click=\"showActionsPopover($event)\"></button></ion-nav-buttons><ion-content scroll=\"true\" class=\"refresher-positive-900-bg\" bind-notifier=\"{ rebind:settings.useRelative, locale:$root.settings.locale.id}\"><ion-refresher pulling-text=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\" on-refresh=\"doUpdate(true)\"></ion-refresher><div class=\"positive-900-bg hero\" style=\"max-width: 100%; display: block\"><div class=\"content\" ng-if=\"!loading\" style=\"max-width: 100%\"><i class=\"avatar\" ng-if=\":rebind:!formData.avatar\" ng-class=\":rebind:{\\'avatar-wallet\\': !formData.isMember, \\'avatar-member\\': formData.isMember}\"></i> <i class=\"avatar\" ng-if=\":rebind:formData.avatar\" style=\"background-image: url({{:rebind:formData.avatar.src}})\"></i><h3 class=\"light\" ng-if=\":rebind:!enableSelectWallet\"><span ng-if=\":rebind:formData.name\">{{:rebind:formData.name}}</span> <span ng-if=\":rebind:!formData.name && formData.uid\">{{:rebind:formData.uid}}</span> <span ng-if=\":rebind:!formData.name && !formData.uid\"><i class=\"ion-key\"></i> {{:rebind:formData.pubkey | formatPubkey}}</span></h3><h3 class=\"light\" ng-if=\":rebind:enableSelectWallet\"><a class=\"hidden-xs hidden-sm\" style=\"color: lightgray;\" title=\"{{:locale:\\'ACCOUNT.SELECT_WALLET_MODAL.TITLE\\'|translate}}\" ng-click=\"showSelectWalletPopover($event)\"><span ng-if=\":rebind:formData.name\">{{:rebind:formData.name}}</span> <span ng-if=\":rebind:!formData.name && formData.uid\">{{:rebind:formData.uid}}</span> <span ng-if=\":rebind:!formData.name && !formData.uid\"><i class=\"ion-key\"></i> {{:rebind:formData.pubkey | formatPubkey}}</span> <small><i class=\"ion-arrow-down-b\"></i></small> </a><a class=\"visible-xs visible-sm\" style=\"color: lightgray;\" title=\"{{:locale:\\'ACCOUNT.SELECT_WALLET_MODAL.TITLE\\'|translate}}\" ng-click=\"showSelectWalletModal($event)\"><span ng-if=\":rebind:formData.name\">{{:rebind:formData.name}}</span> <span ng-if=\":rebind:!formData.name && formData.uid\">{{:rebind:formData.uid}}</span> <span ng-if=\":rebind:!formData.name && !formData.uid\"><i class=\"ion-key\"></i> {{:rebind:formData.pubkey | formatPubkey}}</span> <small><i class=\"ion-arrow-down-b\"></i></small></a></h3><h4><span class=\"assertive\" ng-if=\":rebind:(formData.name || formData.uid) && !formData.isMember\" translate>WOT.NOT_MEMBER_PARENTHESIS</span><cs-extension-point name=\"hero\"></cs-extension-point></h4></div><h4 class=\"content light\" ng-if=\"loading\"><ion-spinner icon=\"android\"></ion-spinner></h4></div><ng-include src=\"::\\'templates/common/qrcode.html\\'\"></ng-include><a id=\"wallet-share-anchor\"></a><div class=\"hidden-xs hidden-sm padding text-center\" ng-if=\"!loading\"><button class=\"button button-stable button-small-padding icon ion-android-share-alt ink\" ng-disabled=\"loading\" ng-click=\"showSharePopover($event)\" title=\"{{\\'COMMON.BTN_SHARE\\' | translate}}\"></button> <button class=\"button button-stable button-small-padding icon ion-loop ink\" ng-click=\"doUpdate()\" title=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\"></button><cs-extension-point name=\"buttons\"></cs-extension-point>&nbsp;&nbsp; <button id=\"helptip-wallet-options\" class=\"button button-stable icon-right ink\" ng-click=\"showActionsPopover($event)\">&nbsp; <i class=\"icon ion-android-more-vertical\"></i>&nbsp; {{:locale:\\'COMMON.BTN_OPTIONS\\' | translate}}</button><div ng-if=\"formData.requirements.needRenew\"><br><button class=\"button button-raised button-stable ink\" ng-click=\"renewMembership()\"><i class=\"icon ion-alert-circled assertive\"></i> <span class=\"assertive\">{{:locale:\\'ACCOUNT.BTN_MEMBERSHIP_RENEW\\' | translate}}</span></button></div></div><div class=\"visible-xs visible-sm padding text-center\" ng-if=\"!loading && formData.requirements.needRenew\"><button class=\"button button-raised icon-left button-stable button-small-padding ink\" ng-click=\"renewMembership()\"><i class=\"icon ion-loop assertive\"></i> <span class=\"assertive\">{{:locale:\\'ACCOUNT.BTN_MEMBERSHIP_RENEW\\' | translate}}</span></button></div><div class=\"row no-padding\"><div class=\"col col-20 hidden-xs hidden-sm\">&nbsp;</div><div class=\"col\"><div class=\"list {{::motion.ionListClass}}\" ng-hide=\"loading\"><span class=\"item item-divider\" translate>WOT.GENERAL_DIVIDER</span><div id=\"helptip-wallet-pubkey\" class=\"item item-icon-left item-text-wrap ink\" on-hold=\"copy(formData.pubkey)\" copy-on-click=\"{{:rebind:formData.pubkey}}\"><i class=\"icon ion-key\"></i> <span>{{:locale:\\'COMMON.PUBKEY\\'|translate}}</span><h4 id=\"pubkey\" class=\"dark\">{{:rebind:formData.pubkey}}</h4></div><ion-item class=\"item-icon-left\" ng-if=\":rebind:formData.sigDate||formData.uid\"><i class=\"icon ion-calendar\"></i> <span translate>COMMON.UID</span><h5 class=\"dark\" ng-if=\":rebind:formData.sigDate\"><span translate>WOT.REGISTERED_SINCE</span> {{:rebind:formData.sigDate | medianDate}}</h5><span class=\"badge badge-stable\">{{:rebind:formData.uid}}</span></ion-item><a id=\"helptip-wallet-certifications\" class=\"item item-icon-left item-icon-right item-text-wrap ink\" ng-if=\"formData.isMember||formData.requirements.pendingMembership||!formData.requirements.needSelf\" ng-click=\"showCertifications()\"><i class=\"icon ion-ribbon-b\"></i> <b ng-if=\"formData.requirements.isSentry\" class=\"ion-star icon-secondary\" style=\"color: yellow; font-size: 16px; left: 25px; top: -7px;\"></b> {{:locale:\\'ACCOUNT.CERTIFICATION_COUNT\\'|translate}}<cs-badge-certification requirements=\"formData.requirements\" parameters=\"::currency.parameters\"></cs-badge-certification><i class=\"gray icon ion-ios-arrow-right\"></i> </a><a id=\"helptip-wallet-given-certifications\" class=\"item item-icon-left item-text-wrap item-icon-right ink visible-xs visible-sm\" ng-if=\"formData.isMember\" ng-click=\"showGivenCertifications()\"><i class=\"icon ion-ribbon-a\"></i> <span translate>WOT.GIVEN_CERTIFICATIONS.SENT</span> <i class=\"gray icon ion-ios-arrow-right\"></i> </a><a class=\"item item-icon-left item-icon-right ink\" ng-click=\"showTxHistory()\"><i class=\"icon ion-card\"></i> <span translate>WOT.ACCOUNT_OPERATIONS</span> <i class=\"gray icon ion-ios-arrow-right\"></i> </a><span class=\"item item-divider\" ng-if=\"formData.events.length\">{{:locale:\\'ACCOUNT.EVENTS\\' | translate}}</span><div class=\"item item-text-wrap item-icon-left item-wallet-event\" ng-repeat=\"event in formData.events\"><i class=\"icon\" ng-class=\"{\\'ion-information-circled royal\\': event.type==\\'info\\',\\'ion-alert-circled assertive\\': event.type==\\'warn\\'||event.type==\\'error\\',\\'assertive\\': event.type==\\'error\\',\\'ion-clock\\': event.type==\\'pending\\'}\"></i> <span trust-as-html=\"event.message | translate:event.messageParams\"></span></div><cs-extension-point name=\"general\"></cs-extension-point><cs-extension-point name=\"after-general\"></cs-extension-point></div></div><div class=\"col col-20 hidden-xs hidden-sm\">&nbsp;</div></div></ion-content></ion-view>');\n$templateCache.put('templates/wot/item_certification.html','<i class=\"item-image\" ng-if=\"!cert.avatar\" ng-class=\"{\\'ion-card\\': !cert.isMember, \\'ion-person\\': cert.isMember}\"></i> <i class=\"item-image avatar\" ng-if=\"cert.avatar\" style=\"background-image: url({{::cert.avatar.src}})\"></i> <span ng-if=\"cert.isMember\"><h3><i class=\"icon ion-clock\" ng-if=\"cert.pending\"></i> <span class=\"positive\">{{::cert.name||cert.uid}}</span></h3><h4 class=\"gray\"><i class=\"ion-key\"></i> {{::cert.pubkey | formatPubkey}} <span class=\"gray\">| {{::cert.time|medianDate}}</span> <span class=\"gray\" ng-if=\"$root.settings.expertMode\">| {{::cert.pending ? \\'WOT.SIGNED_ON_BLOCK\\' : \\'WOT.WRITTEN_ON_BLOCK\\' | translate:cert}}</span></h4></span><span ng-if=\"!cert.isMember\"><h3><i class=\"icon ion-clock\" ng-if=\"cert.pending\"></i> <span ng-if=\"cert.uid\" class=\"dark\">{{::cert.name||cert.uid}} </span><span ng-if=\"!cert.uid\" class=\"gray\"><i class=\"ion-key\"></i> {{::cert.pubkey | formatPubkey}}</span></h3><h5 class=\"assertive\">{{::\\'WOT.NOT_MEMBER_PARENTHESIS\\'|translate}}</h5><h4 class=\"gray\"><span ng-if=\"cert.uid\"><i class=\"ion-key\"></i> {{::cert.pubkey | formatPubkey}} </span><span class=\"gray\">| {{::cert.time|medianDate}}</span> <span class=\"gray\" ng-if=\"$root.settings.expertMode\">| {{::cert.pending ? \\'WOT.SIGNED_ON_BLOCK\\' : \\'WOT.WRITTEN_ON_BLOCK\\' | translate:cert}}</span></h4></span><div class=\"badge badge-stable\" ng-class=\"{\\'badge-energized\\': cert.willExpire}\" ng-if=\"cert.expiresIn\">{{::cert.expiresIn | formatDurationTo}}</div><div class=\"badge badge-assertive\" ng-if=\"!cert.expiresIn\">{{::\\'WOT.EXPIRED\\' | translate}}</div>');\n$templateCache.put('templates/wot/item_content_identity.html','<i ng-if=\"::!item.avatar\" class=\"item-image icon ion-person\"></i> <i ng-if=\"::item.avatar\" class=\"item-image avatar\" style=\"background-image: url({{::item.avatar.src}})\"></i><h2><ng-if ng-if=\"::item.name||item.uid\" ng-bind-html=\"::item.name||item.uid\"></ng-if><ng-if ng-if=\"::!item.name && !item.uid\">{{::item.pubkey|formatPubkey}}</ng-if></h2><h4 class=\"gray\" ng-class=\"{\\'pull-right\\': !smallscreen}\" ng-if=\"::item.sigDate\"><i class=\"ion-clock\"></i> {{::\\'WOT.LOOKUP.REGISTERED\\' | translate:item }}</h4><h4 class=\"gray\" ng-class=\"{\\'pull-right\\': !smallscreen}\" ng-if=\"item.memberDate\"><i class=\"ion-clock\"></i> {{::\\'WOT.LOOKUP.MEMBER_FROM\\' | translate:item}}</h4><h4 class=\"gray\"><span class=\"positive\" ng-if=\"::item.name && item.uid\"><i class=\"ion-person\"></i> {{::item.uid}}&nbsp; </span><b class=\"ion-key\"></b> {{::item.pubkey | formatPubkey}} <span ng-if=\"::(!item.uid && !item.revoked)\" class=\"assertive\" translate>WOT.NOT_MEMBER_PARENTHESIS</span> <span ng-if=\"::item.revoked\" class=\"assertive\" translate>WOT.IDENTITY_REVOKED_PARENTHESIS</span></h4><h4 ng-if=\"::item.events||item.tags\"><span ng-repeat=\"event in ::item.events\" class=\"assertive\"><i class=\"ion-alert-circled\" ng-if=\"::!item.valid\"></i> <span ng-bind-html=\"::event.message|translate:event.messageParams\"></span> </span><span ng-if=\"::item.tags\" class=\"dark\"><ng-repeat ng-repeat=\"tag in ::item.tags\">#<ng-bind-html ng-bind-html=\"::tag\"></ng-bind-html></ng-repeat></span></h4>');\n$templateCache.put('templates/wot/items_given_certifications.html','<div class=\"list given-certifications\" ng-class=\"::motions.givenCertifications.ionListClass\"><span class=\"item item-divider hidden-xs\"><span translate>WOT.GIVEN_CERTIFICATIONS.SUMMARY</span></span><div id=\"helptip-certs-stock\" class=\"item item-icon-left item-text-wrap ink\"><i class=\"icon ion-ribbon-a\"></i> <span translate>WOT.GIVEN_CERTIFICATIONS.SENT</span><cs-badge-given-certification identity=\"formData\" parameters=\"$root.currency.parameters\"></cs-badge-given-certification></div><div class=\"item item-icon-left item-text-wrap ink\" ng-if=\"formData.given_cert_error.length\"><i class=\"icon ion-alert-circled\"></i> <span translate>WOT.GIVEN_CERTIFICATIONS.ERROR</span> <span class=\"badge badge-assertive\">{{formData.given_cert_error.length}}</span></div><span class=\"item item-divider\" ng-if=\"formData.given_cert_pending.length\"><span translate>WOT.GIVEN_CERTIFICATIONS.PENDING_LIST</span><div class=\"badge item-note\" style=\"text-align: right !important;\" translate>WOT.NOT_WRITTEN_EXPIRE_IN</div></span><a class=\"item item-avatar ink\" ng-repeat=\"cert in formData.given_cert_pending\" ui-sref=\"app.wot_identity({pubkey:cert.pubkey, uid:cert.uid})\" ng-include=\"::\\'templates/wot/item_certification.html\\'\"></a><span class=\"item item-divider\"><span translate>WOT.GIVEN_CERTIFICATIONS.LIST</span><div class=\"badge item-note\" translate>WOT.EXPIRE_IN</div></span><span class=\"item gray\" ng-if=\"!formData.given_cert.length\" translate>WOT.NO_GIVEN_CERTIFICATION </span><a class=\"item item-avatar ink\" ng-repeat=\"cert in formData.given_cert\" ui-sref=\"app.wot_identity({pubkey:cert.pubkey, uid:cert.uid})\" ng-include=\"::\\'templates/wot/item_certification.html\\'\"></a></div>');\n$templateCache.put('templates/wot/items_received_certifications.html','<div class=\"list certifications\" ng-class=\"::motions.receivedCertifications.ionListClass\"><span class=\"item item-divider hidden-xs\"><span translate>WOT.CERTIFICATIONS.SUMMARY</span></span><div id=\"helptip-received-certs\" class=\"item item-icon-left item-text-wrap ink\"><i class=\"icon ion-ribbon-b\"></i> <b ng-if=\"formData.requirements.isSentry\" class=\"ion-star icon-secondary\" style=\"color: yellow; font-size: 16px; left: 25px; top: -7px;\"></b> <span translate>WOT.CERTIFICATIONS.RECEIVED</span><h4 class=\"gray\" ng-if=\"formData.requirements.isSentry\" translate>WOT.CERTIFICATIONS.SENTRY_MEMBER</h4><cs-badge-certification cs-id=\"helptip-wot-view-certifications-count\" requirements=\"formData.requirements\" parameters=\"$root.currency.parameters\"></cs-badge-certification></div><div class=\"item item-icon-left item-text-wrap ink\" ng-if=\"formData.received_cert_error.length\"><i class=\"icon ion-alert-circled\"></i> <span translate>WOT.CERTIFICATIONS.ERROR</span> <span class=\"badge badge-assertive\">{{formData.received_cert_error.length}}</span></div><span class=\"item item-divider\" ng-if=\"formData.received_cert_pending.length\"><span translate>WOT.CERTIFICATIONS.PENDING_LIST</span><div class=\"badge item-note\" style=\"text-align: right !important;\" translate>WOT.NOT_WRITTEN_EXPIRE_IN</div></span><a class=\"item item-avatar ink\" ng-repeat=\"cert in formData.received_cert_pending\" ui-sref=\"app.wot_identity({pubkey:cert.pubkey, uid:cert.uid})\" ng-include=\"::\\'templates/wot/item_certification.html\\'\"></a><span class=\"item item-divider\"><span translate>WOT.CERTIFICATIONS.LIST</span><div class=\"badge item-note\" translate>WOT.EXPIRE_IN</div></span><span class=\"item gray\" ng-if=\"!formData.received_cert.length\" translate>WOT.NO_CERTIFICATION</span> <a class=\"item item-avatar ink\" ng-repeat=\"cert in formData.received_cert\" ui-sref=\"app.wot_identity({pubkey:cert.pubkey, uid:cert.uid})\" ng-include=\"::\\'templates/wot/item_certification.html\\'\"></a></div>');\n$templateCache.put('templates/wot/lookup_form.html','<div class=\"lookupForm\"><div class=\"item no-padding\"><div class=\"double-padding-x padding-top-xs item-text-wrap\" ng-if=\"::allowMultiple\" style=\"height: 36px;\"><div class=\"gray padding-top\" ng-if=\"!selection.length && parameters.help\">{{::parameters.help|translate}}</div><div ng-repeat=\"identity in selection track by identity.id\" class=\"button button-small button-text button-stable button-icon-event ink\" ng-class=\"{\\'button-text-positive\\': identity.selected}\"><span ng-bind-html=\"identity.name||identity.uid||(identity.pubkey|formatPubkey)\"></span> <i class=\"icon ion-close\" ng-click=\"removeSelection(identity, $event)\">&nbsp;&nbsp;</i></div></div><div class=\"item-input\"><i class=\"icon ion-search placeholder-icon\"></i> <input type=\"text\" class=\"visible-xs visible-sm\" placeholder=\"{{\\'WOT.SEARCH_HELP\\'|translate}}\" ng-model=\"search.text\" ng-model-options=\"{ debounce: 650 }\" ng-change=\"doSearch()\" on-return=\"doSearchText()\" select-on-click> <input type=\"text\" class=\"hidden-xs hidden-sm\" id=\"{{wotSearchTextId}}\" placeholder=\"{{\\'WOT.SEARCH_HELP\\'|translate}}\" ng-model=\"search.text\" on-return=\"doSearchText()\"><div class=\"helptip-anchor-center\"><a id=\"helptip-wot-search-text\"></a></div></div></div><div class=\"padding-top padding-xs padding-sm\" style=\"display: block; height: 60px;\" ng-class=\"::{\\'hidden-xs hidden-sm\\': !showResultLabel}\"><div class=\"pull-left\" ng-if=\"!search.loading && showResultLabel\"><ng-if ng-if=\"search.type==\\'newcomers\\'\"><h4 translate>WOT.LOOKUP.NEWCOMERS</h4><small class=\"gray no-padding\" ng-if=\"search.total\">{{\\'WOT.LOOKUP.NEWCOMERS_COUNT\\'|translate:{count: search.total} }}</small></ng-if><ng-if ng-if=\"search.type==\\'pending\\'\"><h4 translate>WOT.LOOKUP.PENDING</h4><small class=\"gray no-padding\" ng-if=\"search.total\">{{\\'WOT.LOOKUP.PENDING_COUNT\\'|translate:{count: search.total} }}</small></ng-if><h4 ng-if=\"search.type==\\'text\\'\"><span translate>COMMON.RESULTS_LIST</span> <small class=\"gray\" ng-if=\"search.total\">({{search.total}})</small></h4></div><div class=\"pull-right hidden-xs hidden-sm\"><a ng-if=\"enableFilter\" class=\"button button-text button-small ink\" ng-class=\"{\\'button-text-positive\\': search.type==\\'newcomers\\'}\" ng-click=\"doGetNewcomers()\"><i class=\"icon ion-person-stalker\"></i> {{\\'WOT.LOOKUP.BTN_NEWCOMERS\\' | translate}} </a><a ng-if=\"enableFilter\" class=\"button button-text button-small ink\" ng-class=\"{\\'button-text-positive\\': search.type==\\'pending\\'}\" ng-click=\"doGetPending()\" class=\"badge-balanced\"><i class=\"icon ion-clock\"></i> {{\\'WOT.LOOKUP.BTN_PENDING\\' | translate}} </a><a ng-if=\"enableWallets\" class=\"button button-text button-small ink\" ng-class=\"{\\'button-text-positive\\': search.type==\\'wallets\\'}\" ng-click=\"doGetWallets()\" class=\"badge-balanced\"><i class=\"icon ion-card\" style=\"left: -1px; top: 4px; position: relative; padding-left: 3px; padding-right: 3px;\"></i> <b class=\"icon-secondary ion-card\" style=\"left: 10px; top: -4px; font-size: 14px;\"></b> {{\\'MENU.WALLETS\\' | translate}}</a><cs-extension-point name=\"filter-buttons\"></cs-extension-point>&nbsp; <button class=\"button button-small button-stable ink\" ng-click=\"doSearch()\">{{\\'COMMON.BTN_SEARCH\\' | translate}}</button> <button class=\"button button-small button-positive {{parameters.okType}} ink\" ng-if=\"::allowMultiple\" ng-disabled=\"!selection.length\" ng-click=\"next()\">{{parameters.okText||\\'COMMON.BTN_NEXT\\' | translate}}</button></div></div><div class=\"text-center padding-top\" ng-if=\"search.loading\"><p class=\"gray\" ng-if=\"::$root.currency.initPhase\" translate>WOT.SEARCH_INIT_PHASE_WARNING</p><ion-spinner icon=\"android\"></ion-spinner></div><ng-if ng-if=\"!search.loading\"><div class=\"assertive padding\" ng-if=\"!search.results.length\"><span ng-if=\"search.type==\\'text\\'\" translate>COMMON.SEARCH_NO_RESULT</span> <span ng-if=\"search.type==\\'pending\\'\" translate>WOT.LOOKUP.NO_PENDING</span> <span ng-if=\"search.type==\\'newcomers\\'\" translate>WOT.LOOKUP.NO_NEWCOMERS</span></div><div ng-if=\"::!allowMultiple\" class=\"list {{::motion.ionListClass}}\"><div ng-repeat=\"item in search.results track by item.id\" id=\"helptip-wot-search-result-{{$index}}\" ng-class=\"::{\\'item-avatar item-icon-right ink\\': !item.divider, \\'item-divider \\': item.divider}\" class=\"item item-border-large {{::item.ionItemClass}}\" ng-click=\"::select(item)\"><span ng-if=\"::item.divider\">{{::(\\'WOT.SEARCH.DIVIDER_\\' + item.index)|upper|translate}}</span><ng-include ng-if=\"::!item.divider\" src=\"item.templateUrl || \\'templates/wot/item_content_identity.html\\'\"></ng-include><i ng-if=\"::!item.divider\" class=\"icon ion-ios-arrow-right\"></i></div></div><div ng-if=\"::allowMultiple\" class=\"list {{::motion.ionListClass}}\"><ion-checkbox ng-repeat=\"item in search.results track by item.id\" ng-model=\"item.checked\" class=\"item item-border-large item-avatar ink\" ng-click=\"toggleCheck($index, $event)\"><ng-include src=\"::\\'templates/wot/item_content_identity.html\\'\"></ng-include></ion-checkbox></div><ion-infinite-scroll ng-if=\"search.hasMore\" spinner=\"android\" on-infinite=\"showMore()\" distance=\"20%\"></ion-infinite-scroll></ng-if></div>');\n$templateCache.put('templates/wot/lookup_lg.html','<ion-view><ion-nav-title>{{\\'MENU.WOT\\' | translate}}</ion-nav-title><ion-nav-buttons side=\"secondary\"><button class=\"button button-icon button-clear visible-xs visible-sm\" ng-click=\"showActionsPopover($event)\"><i class=\"icon ion-android-funnel\"></i></button></ion-nav-buttons><ion-content class=\"padding no-padding-x no-padding-sm\" scroll=\"true\"><cs-extension-point name=\"top\"></cs-extension-point><ng-include src=\"::\\'templates/wot/lookup_form.html\\'\"></ng-include></ion-content></ion-view>');\n$templateCache.put('templates/wot/lookup_popover_actions.html','<ion-popover-view class=\"fit has-header visible-sm visible-xs\"><ion-header-bar><h1 class=\"title\" translate>COMMON.POPOVER_FILTER_TITLE</h1></ion-header-bar><ion-content scroll=\"false\"><div class=\"list item-text-wrap\"><a class=\"item item-icon-left ink\" ng-if=\"enableWallets\" ng-click=\"doGetWallets()\"><i class=\"icon ion-card\"></i> {{\\'MENU.WALLETS\\' | translate}} </a><a class=\"item item-icon-left ink\" ng-click=\"doGetNewcomers()\"><i class=\"icon ion-person\"></i> {{\\'WOT.LOOKUP.BTN_NEWCOMERS\\' | translate}} </a><a class=\"item item-icon-left ink\" ng-click=\"doGetPending()\"><i class=\"icon ion-clock\"></i> {{\\'WOT.LOOKUP.BTN_PENDING\\' | translate}}</a></div></ion-content></ion-popover-view>');\n$templateCache.put('templates/wot/lookup.html','<ion-view left-buttons=\"leftButtons\"><ion-tabs class=\"tabs-positive tabs-icon-top\"><ion-tab title=\"{{\\'WOT.LOOKUP.TITLE\\'|translate}}\" icon=\"ion-person-stalker\" ui-sref=\"app.wot_lookup.tab_search\"><ion-nav-view name=\"tab\"></ion-nav-view></ion-tab><cs-extension-point name=\"tabs\"></cs-extension-point></ion-tabs></ion-view>');\n$templateCache.put('templates/wot/modal_lookup.html','<ion-modal-view id=\"wotLookup\" class=\"modal-full-height\"><ion-header-bar class=\"bar-positive\"><button class=\"button button-clear\" ng-click=\"closeModal()\" translate=\"\">COMMON.BTN_CANCEL</button><h1 class=\"title hidden-xs\">{{::parameters.title?parameters.title:\\'WOT.MODAL.TITLE\\'|translate}}</h1><button class=\"button button-clear icon-right visible-xs ink\" ng-if=\"allowMultiple && selection.length\" ng-click=\"closeModal(selection)\">{{::parameters.okText||\\'COMMON.BTN_NEXT\\' | translate}} <i ng-if=\"::!parameters.okText||parameters.okIcon\" class=\"icon {{::parameters.okIcon||\\'ion-ios-arrow-right\\'}}\"></i></button></ion-header-bar><ion-content class=\"padding no-padding-xs no-padding-sm\" scroll=\"true\"><div class=\"visible-xs visible-sm text-right stable-bg stable\"><button class=\"button button-icon button-small-padding dark ink\" ng-click=\"showActionsPopover($event)\"><i class=\"icon ion-android-funnel\"></i></button></div><ng-include src=\"::\\'templates/wot/lookup_form.html\\'\"></ng-include></ion-content></ion-modal-view>');\n$templateCache.put('templates/wot/modal_select_pubkey_identity.html','<ion-modal-view id=\"transfer\" class=\"modal-full-height modal-transfer\"><ion-header-bar class=\"bar-positive\"><button class=\"button button-clear\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button><h1 class=\"title\" translate>ACCOUNT.SELECT_IDENTITY_MODAL.TITLE</h1></ion-header-bar><ion-content scroll=\"true\"><div class=\"padding\"><p trust-as-html=\"\\'ACCOUNT.SELECT_IDENTITY_MODAL.HELP\\'|translate:{pubkey: pubkey}\"></p></div><ion-list><ion-item class=\"item-avatar item-icon-right\" ng-repeat=\"item in identities\" ng-click=\"closeModal(item)\"><i class=\"item-image icon ion-person\"></i><h2>{{item.uid}}</h2><h4 class=\"gray\"><b class=\"ion-key\"></b> {{::item.pubkey | formatPubkey}} <span ng-if=\"::!item.revoked && !item.pendingRevocation && !item.isMember\" class=\"assertive\" translate>WOT.NOT_MEMBER_PARENTHESIS</span> <span ng-if=\"::item.revoked || item.pendingRevocation\" class=\"assertive bold\" translate>WOT.IDENTITY_REVOKED_PARENTHESIS</span> <span ng-if=\"::item.meta.invalid\" class=\"assertive\" translate>ERROR.WOT_PENDING_INVALID_BLOCK_HASH</span></h4><h4 class=\"dark\" ng-if=\"::item.meta.time\"><i class=\"ion-calendar\"></i> <span translate>WOT.REGISTERED_SINCE</span> {{::item.meta.time|medianDate}}</h4><ng-if ng-if=\"::!item.revoked && !item.pendingRevocation && (item.certificationCount || item.pendingCertificationCount)\"><cs-badge-certification requirements=\"item\" parameters=\"$root.currency.parameters\"></cs-badge-certification><div class=\"gray badge badge-secondary hidden-xs\"><span translate>ACCOUNT.CERTIFICATION_COUNT</span></div></ng-if><i class=\"icon ion-ios-arrow-right\"></i></ion-item></ion-list></ion-content></ion-modal-view>');\n$templateCache.put('templates/wot/tabs/tab_given_certifications.html','<ion-view><ion-nav-buttons side=\"secondary\"><button class=\"button button-icon button-clear icon ion-loop\" ng-click=\"doUpdate()\"></button></ion-nav-buttons><ion-content ng-init=\"motions.receivedCertifications=false; motions.avatar=false\"><div class=\"center padding\" ng-if=\"loading\"><ion-spinner icon=\"android\"></ion-spinner></div><ng-include src=\"::\\'templates/wot/items_given_certifications.html\\'\"></ng-include></ion-content><div class=\"visible-xs visible-sm\"><button id=\"fab-select-certify\" class=\"button button-fab button-fab-bottom-right button-energized-900 spin\" ng-if=\"canSelectAndCertify || $root.tour\" ng-click=\"selectAndCertify()\"><i class=\"icon ion-plus\"></i></button></div></ion-view>');\n$templateCache.put('templates/wot/tabs/tab_lookup.html','<ion-view><ion-nav-buttons side=\"secondary\"><cs-extension-point name=\"nav-buttons\"></cs-extension-point><button class=\"button button-icon button-clear\" ng-click=\"showActionsPopover($event)\"><i class=\"icon ion-android-funnel\"></i></button></ion-nav-buttons><ion-content><ion-refresher pulling-text=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\" on-refresh=\"doSearch()\"></ion-refresher><cs-extension-point name=\"buttons\"></cs-extension-point><ng-include src=\"::\\'templates/wot/lookup_form.html\\'\"></ng-include></ion-content></ion-view>');\n$templateCache.put('templates/wot/tabs/tab_received_certifications.html','<ion-view><ion-nav-buttons side=\"secondary\"><button class=\"button button-icon button-clear icon ion-loop\" ng-click=\"doUpdate()\"></button></ion-nav-buttons><ion-content ng-init=\"motions.givenCertifications=false; motions.avatar=false;\"><div class=\"center padding\" ng-if=\"loading\"><ion-spinner icon=\"android\"></ion-spinner></div><ng-include src=\"::\\'templates/wot/items_received_certifications.html\\'\"></ng-include></ion-content><div class=\"visible-xs visible-sm\"><button id=\"fab-certify\" class=\"button button-fab button-fab-bottom-right button-energized-900 spin\" ng-click=\"certify()\" ng-if=\"(formData.hasSelf && canCertify && !alreadyCertified) || $root.tour\"><i class=\"icon ion-ribbon-b\"></i></button></div></ion-view>');\n$templateCache.put('templates/wot/view_certifications.html','<ion-view left-buttons=\"leftButtons\"><ion-nav-title><span class=\"visible-xs visible-sm\">{{::formData.name||formData.uid}}</span> <span class=\"hidden-xs hidden-sm\" ng-if=\"!loading\" translate=\"WOT.CERTIFICATIONS.TITLE\" translate-values=\"{uid: formData.name || formData.uid}\"></span></ion-nav-title><ion-nav-buttons side=\"secondary\"><cs-extension-point name=\"nav-buttons\"></cs-extension-point></ion-nav-buttons><ion-content class=\"certifications certifications-lg\"><ion-refresher pulling-text=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\" on-refresh=\"doUpdate()\"></ion-refresher><div class=\"hidden-xs hidden-sm text-center padding\"><button class=\"button button-stable button-small-padding icon ion-loop ink\" ng-click=\"doUpdate()\" title=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\"></button> <button id=\"helptip-certs-certify\" class=\"button button-raised button-calm icon-left ion-ribbon-b\" ng-if=\"canCertify\" ng-click=\"certify()\" ng-disabled=\"disableCertifyButton\">{{\\'WOT.BTN_CERTIFY\\' | translate}}</button> <button id=\"helptip-certs-select-certify\" class=\"button button-raised button-calm icon-left\" ng-if=\"canSelectAndCertify\" ng-click=\"selectAndCertify()\">{{\\'WOT.BTN_SELECT_AND_CERTIFY\\' | translate}}</button><cs-extension-point name=\"buttons\"></cs-extension-point></div><div class=\"center padding\" ng-if=\"loading\"><ion-spinner icon=\"android\"></ion-spinner></div><div class=\"row responsive-sm responsive-md responsive-lg\"><div class=\"col no-padding\" ng-if=\"motions.receivedCertifications.enable\"><ng-include src=\"::\\'templates/wot/items_received_certifications.html\\'\"></ng-include></div><div class=\"col col-20 col-avatar hidden-xs hidden-sm hidden-md no-padding\" style=\"margin-top: 100px;\" ng-if=\"motions.avatar.enable\"><div class=\"row no-padding\" ng-class=\"::motions.avatar.ionListClass\"><div class=\"col text-center no-padding gray\" style=\"margin-top: 30px;\"><i class=\"icon ion-arrow-right-a\" style=\"font-size:30px\"></i></div><div class=\"col text-center no-padding\"><a style=\"text-decoration: none;\" ui-sref=\"app.wot_identity({pubkey: formData.pubkey, uid: formData.uid})\"><i class=\"avatar avatar-large\" ng-if=\"!formData.avatar\" ng-class=\"{\\'avatar-wallet\\': !formData.isMember, \\'avatar-member\\': formData.isMember}\"></i> <i class=\"avatar avatar-large\" ng-if=\"formData.avatar\" style=\"background-image: url({{::formData.avatar.src}})\"></i><h4 class=\"text-center\" ng-class=\"{\\'positive\\': formData.isMember, \\'gray\\': !formData.isMember}\">{{::formData.name||formData.uid}}</h4><h5 class=\"text-center gray\"><i class=\"icon ion-key\"></i> {{formData.pubkey|formatPubkey}}</h5><h5 class=\"assertive\"><span ng-if=\"::(formData.name || formData.uid) && !formData.isMember && !revoked\" translate>WOT.NOT_MEMBER_PARENTHESIS</span> <b ng-if=\"::(formData.name || formData.uid) && !formData.isMember && revoked\" translate>WOT.IDENTITY_REVOKED_PARENTHESIS</b> <b ng-if=\"::(formData.name || formData.uid) && formData.isMember && revoked\" translate>WOT.MEMBER_PENDING_REVOCATION_PARENTHESIS</b></h5></a></div><div class=\"col text-center no-padding gray\" style=\"margin-top: 30px;\"><i class=\"icon ion-arrow-right-a\" style=\"font-size:30px\"></i></div></div></div><div class=\"col no-padding\" ng-if=\"motions.givenCertifications.enable\"><ng-include src=\"::\\'templates/wot/items_given_certifications.html\\'\"></ng-include></div></div></ion-content><div class=\"visible-xs visible-sm\"><button id=\"fab-certify\" class=\"button button-fab button-fab-bottom-right button-energized-900 spin hidden-readonly\" ng-if=\"canCertify && !alreadyCertified\" ng-click=\"certify()\"><i class=\"icon ion-ribbon-b\"></i></button> <button id=\"fab-select-certify\" class=\"button button-fab button-fab-bottom-right button-energized-900 spin hidden-readonly\" ng-if=\"canSelectAndCertify\" ng-click=\"selectAndCertify()\"><i class=\"icon ion-plus\"></i></button></div></ion-view>');\n$templateCache.put('templates/wot/view_identity_tx.html','<ion-view left-buttons=\"leftButtons\" class=\"view-identity-tx\"><ion-nav-title><span class=\"visible-xs visible-sm\" ng-if=\"!loading\"><span ng-if=\"formData.name || formData.uid\">{{formData.name || formData.uid}} </span><span ng-if=\"!formData.name && !formData.uid\"><i class=\"ion-key\"></i> {{formData.pubkey|formatPubkey}}</span> </span><span class=\"hidden-xs hidden-sm\" ng-if=\"!loading\"><ng-if ng-if=\"formData.name || formData.uid\">{{\\'WOT.OPERATIONS.TITLE\\'|translate: {uid: formData.name || formData.uid} }}</ng-if><ng-if ng-if=\"!formData.name && !formData.uid\"><i class=\"ion-key\"></i> {{formData.pubkey|formatPubkey}} {{\\'WOT.OPERATIONS.TITLE\\'|translate}}</ng-if></span></ion-nav-title><ion-content scroll=\"true\"><ion-refresher pulling-text=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\" on-refresh=\"doUpdate(true)\"></ion-refresher><div class=\"hidden-xs hidden-sm padding text-center\"><button class=\"button button-stable button-small-padding icon ion-loop ink\" ng-click=\"doUpdate()\" title=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\"></button> <button class=\"button button-stable button-small-padding icon ion-android-download ink\" ng-click=\"downloadHistoryFile()\" title=\"{{\\'COMMON.BTN_DOWNLOAD_ACCOUNT_STATEMENT\\' | translate}}\"></button><cs-extension-point name=\"buttons\"></cs-extension-point></div><div class=\"center padding\" ng-if=\"loading\"><ion-spinner icon=\"android\"></ion-spinner></div><div class=\"list {{motion.ionListClass}}\" ng-if=\"!loading\"><div class=\"row\"><div class=\"col col-15 hidden-xs hidden-sm\">&nbsp;</div><div class=\"col\"><div class=\"item item-tx item-divider\">{{:locale:\\'ACCOUNT.BALANCE_ACCOUNT\\'|translate}}<div class=\"badge item-note\" ng-class=\":balance:{\\'badge-assertive\\': formData.balance <= 0, \\'badge-balanced\\': formData.balance > 0 }\" ng-bind-html=\":balance:formData.balance|formatAmount:{currency: $root.currency.name}\"></div><div class=\"badge badge-secondary\" ng-if=\"$root.settings.expertMode\">(<span ng-bind-html=\":balance:formData.balance| formatAmount: {useRelative: !$root.settings.useRelative, currency: $root.currency.name} \"></span>)</div></div><div class=\"item item-icon-left\" ng-if=\"formData.tx.errors.length\"><i class=\"icon ion-alert-circled\"></i> {{:locale:\\'ACCOUNT.ERROR_TX\\'|translate}}<div class=\"badge badge-assertive\">{{formData.tx.errors.length}}</div></div><ng-if ng-if=\"formData.tx.pendings.length\"><span class=\"item item-pending item-divider\"><i class=\"ion-clock\"></i> {{:locale:\\'ACCOUNT.PENDING_TX\\'|translate}}</span><div class=\"item item-pending item-tx item-icon-left\" ng-repeat=\"tx in formData.tx.pendings\" ng-init=\"pending=true;\" ng-include=\"::\\'templates/wallet/item_tx.html\\'\"></div></ng-if><ng-if ng-if=\"formData.tx.validating.length\"><span class=\"item item-pending item-divider\">{{:locale:\\'ACCOUNT.VALIDATING_TX\\'|translate}}</span><div class=\"item item-pending item-tx item-icon-left\" ng-repeat=\"tx in formData.tx.validating\" ng-init=\"validating=true;\" ng-include=\"::\\'templates/wallet/item_tx.html\\'\"></div></ng-if><span class=\"item item-divider\" ng-if=\"!loading\">{{:locale:\\'ACCOUNT.LAST_TX\\'|translate}} <a id=\"helptip-wallet-tx\" style=\"position: relative; bottom: 0; right: 0px;\">&nbsp;</a></span><div ng-repeat=\"tx in formData.tx.history\" class=\"item item-tx item-icon-left\" ng-include=\"::!tx.isUD ? \\'templates/wallet/item_tx.html\\' : \\'templates/wallet/item_ud.html\\'\"></div><div class=\"item item-text-wrap text-center\" ng-if=\"formData.tx.fromTime > 0\"><p><a ng-click=\"showMoreTx()\">{{:locale:\\'ACCOUNT.SHOW_MORE_TX\\'|translate}}</a> <span class=\"gray\" translate=\"ACCOUNT.TX_FROM_DATE\" translate-values=\"{fromTime: formData.tx.fromTime}\"></span> <span class=\"gray\">|</span> <a ng-click=\"showMoreTx(-1)\" translate>ACCOUNT.SHOW_ALL_TX</a></p></div></div><div class=\"col col-15 hidden-xs hidden-sm\">&nbsp;</div></div></div></ion-content></ion-view>');\n$templateCache.put('templates/wot/view_identity.html','<ion-view left-buttons=\"leftButtons\" class=\"view-identity\"><ion-nav-title></ion-nav-title><ion-content scroll=\"true\" ng-class=\"{\\'member\\': !loading && formData.isMember}\"><ion-refresher pulling-text=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\" on-refresh=\"doUpdate(true)\"></ion-refresher><div class=\"hero\"><div class=\"content\" ng-if=\"!loading\"><i class=\"avatar\" ng-if=\":rebind:!formData.avatar\" ng-class=\"{\\'avatar-wallet\\': !formData.isMember, \\'avatar-member\\': formData.isMember}\"></i> <i class=\"avatar\" ng-if=\":rebind:formData.avatar\" style=\"background-image: url({{::formData.avatar.src}})\"></i><ng-if ng-if=\":rebind:formData.name\"><h3 class=\"light\">{{::formData.name}}</h3></ng-if><ng-if ng-if=\":rebind:!formData.name\"><h3 class=\"light\" ng-if=\":rebind:formData.uid\">{{:rebind:formData.uid}}</h3><h3 class=\"light\" ng-if=\":rebind:!formData.uid\"><i class=\"ion-key\"></i> {{:rebind:formData.pubkey | formatPubkey}}</h3></ng-if><h4><ng-if class=\"assertive\" ng-if=\":rebind:(formData.name || formData.uid) && !formData.isMember && revoked\" translate>WOT.IDENTITY_REVOKED_PARENTHESIS</ng-if><ng-if class=\"assertive\" ng-if=\":rebind:(formData.name || formData.uid) && formData.isMember && revoked\" translate>WOT.MEMBER_PENDING_REVOCATION_PARENTHESIS</ng-if><cs-extension-point name=\"hero\"></cs-extension-point></h4></div><h4 class=\"content light\" ng-if=\"loading\"><ion-spinner icon=\"android\"></ion-spinner></h4></div><ng-include src=\"::\\'templates/common/qrcode.html\\'\"></ng-include><a id=\"wot-share-anchor-{{::formData.pubkey}}\"></a><div class=\"hidden-xs hidden-sm padding text-center\"><button class=\"button button-stable button-small-padding icon ion-android-share-alt ink\" ng-disabled=\"loading\" ng-click=\"showSharePopover($event)\" title=\"{{\\'COMMON.BTN_SHARE\\' | translate}}\"></button><cs-extension-point name=\"buttons\"></cs-extension-point><button class=\"button button-stable button-small-padding icon ion-ribbon-b ink hidden-readonly\" ng-click=\"certify()\" ng-if=\":rebind:formData.hasSelf\" title=\"{{\\'WOT.BTN_CERTIFY\\' | translate}}\" ng-disabled=\"disableCertifyButton\"></button> <button class=\"button button-calm ink hidden-readonly\" ng-click=\"showTransferModal({pubkey:formData.pubkey, uid: formData.name||formData.uid})\">{{\\'COMMON.BTN_SEND_MONEY\\' | translate}}</button><cs-extension-point name=\"after-buttons\"></cs-extension-point></div><div class=\"visible-xs visible-sm\"><button id=\"fab-certify-{{:rebind:formData.uid}}\" class=\"button button-fab button-fab-top-left button-fab-hero button-calm spin hidden-readonly\" ng-if=\":rebind:(canCertify && !alreadyCertified)\" ng-click=\"certify()\"><i class=\"icon ion-ribbon-b\"></i></button><cs-extension-point name=\"buttons-top-fab\"></cs-extension-point></div><div class=\"row no-padding\"><div class=\"col col-20 hidden-xs hidden-sm\">&nbsp;</div><div class=\"col list {{::motion.ionListClass}}\" bind-notifier=\"{ rebind:loading}\"><span class=\"item item-divider\" translate>WOT.GENERAL_DIVIDER</span><ion-item class=\"item-icon-left item-text-wrap ink\" copy-on-click=\"{{:rebind:formData.pubkey}}\"><i class=\"icon ion-key\"></i> <span translate>COMMON.PUBKEY</span><h4 id=\"pubkey\" class=\"dark text-left\">{{:rebind:formData.pubkey}}</h4></ion-item><div class=\"item item-icon-left item-text-wrap\" ng-if=\":rebind:!formData.hasSelf\"><i class=\"icon ion-ios-help-outline positive\"></i> <span translate>WOT.NOT_MEMBER_ACCOUNT</span><h4 class=\"gray\" translate>WOT.NOT_MEMBER_ACCOUNT_HELP</h4></div><ion-item class=\"item-icon-left\" ng-if=\":rebind:formData.sigDate||formData.uid\"><i class=\"icon ion-calendar\"></i> <span translate>COMMON.UID</span><h5 class=\"dark\" ng-if=\":rebind:formData.sigDate \"><span translate>WOT.REGISTERED_SINCE</span> {{:rebind:formData.sigDate|medianDate}}</h5><span class=\"badge badge-energized\">{{:rebind:formData.uid}}</span></ion-item><a id=\"helptip-wot-view-certifications\" class=\"item item-icon-left item-text-wrap item-icon-right ink\" ng-if=\":rebind:formData.hasSelf\" ng-click=\"showCertifications()\"><i class=\"icon ion-ribbon-b\"></i> <b ng-if=\":rebind:formData.requirements.isSentry\" class=\"ion-star icon-secondary\" style=\"color: yellow; font-size: 16px; left: 25px; top: -7px;\"></b> <span translate>ACCOUNT.CERTIFICATION_COUNT</span><cs-badge-certification cs-id=\"helptip-wot-view-certifications-count\" requirements=\"formData.requirements\" parameters=\"{sigQty: formData.sigQty}\"></cs-badge-certification><i class=\"gray icon ion-ios-arrow-right\"></i> </a><a class=\"item item-icon-left item-text-wrap item-icon-right ink visible-xs visible-sm\" ng-if=\":rebind:formData.hasSelf && formData.isMember\" ng-click=\"showGivenCertifications()\"><i class=\"icon ion-ribbon-a\"></i> <span translate>WOT.GIVEN_CERTIFICATIONS.SENT</span><cs-badge-given-certification identity=\"formData\" parameters=\"$root.currency.parameters\"></cs-badge-given-certification><i class=\"gray icon ion-ios-arrow-right\"></i> </a><a class=\"item item-icon-left item-icon-right ink\" ng-if=\"!loading\" ui-sref=\"app.wot_identity_tx_uid({uid:formData.uid,pubkey:formData.pubkey})\"><i class=\"icon ion-card\"></i> <span translate>WOT.ACCOUNT_OPERATIONS</span> <i class=\"gray icon ion-ios-arrow-right\"></i></a><div class=\"item item-text-wrap item-icon-left item-wallet-event\" ng-class=\"{\\'assertive\\': event.type==\\'error\\'}\" ng-repeat=\"event in :rebind:formData.events\"><i class=\"icon\" ng-class=\"{\\'ion-information-circled royal\\': event.type==\\'info\\',\\'ion-alert-circled\\': event.type==\\'warn\\'||event.type==\\'error\\',\\'assertive\\': event.type==\\'error\\',\\'ion-clock\\': event.type==\\'pending\\'}\"></i> <span trust-as-html=\"event.message | translate:event.messageParams\"></span></div><cs-extension-point name=\"general\"></cs-extension-point><cs-extension-point name=\"after-general\"></cs-extension-point></div><div class=\"col col-20 hidden-xs hidden-sm\">&nbsp;</div></div></ion-content><div class=\"visible-xs visible-sm\" ng-hide=\"loading\"><button id=\"fab-transfer\" class=\"button button-fab button-fab-bottom-right button-assertive drop hidden-readonly\" ng-click=\"showTransferModal({pubkey:formData.pubkey, uid: formData.uid})\"><i class=\"icon ion-android-send\"></i></button></div></ion-view>');}]);","angular.module(\"cesium.translations\", []).config([\"$translateProvider\", function($translateProvider) {\n$translateProvider.translations(\"en-GB\", {\n \"COMMON\": {\n \"APP_NAME\": \"Cesium\",\n \"APP_VERSION\": \"v{{version}}\",\n \"APP_BUILD\": \"build {{build}}\",\n \"PUBKEY\": \"Public key\",\n \"MEMBER\": \"Member\",\n \"BLOCK\" : \"Block\",\n \"BTN_OK\": \"OK\",\n \"BTN_YES\": \"Yes\",\n \"BTN_NO\": \"No\",\n \"BTN_SEND\": \"Send\",\n \"BTN_SEND_MONEY\": \"Transfer money\",\n \"BTN_SEND_MONEY_SHORT\": \"Transfer\",\n \"BTN_SAVE\": \"Save\",\n \"BTN_YES_SAVE\": \"Yes, Save\",\n \"BTN_YES_CONTINUE\": \"Yes, Continue\",\n \"BTN_SHOW\": \"Show\",\n \"BTN_SHOW_PUBKEY\": \"Show key\",\n \"BTN_RELATIVE_UNIT\": \"Display amounts in UD?\",\n \"BTN_BACK\": \"Back\",\n \"BTN_NEXT\": \"Next\",\n \"BTN_IMPORT\": \"Import\",\n \"BTN_CANCEL\": \"Cancel\",\n \"BTN_CLOSE\": \"Close\",\n \"BTN_LATER\": \"Later\",\n \"BTN_LOGIN\": \"Sign In\",\n \"BTN_LOGOUT\": \"Logout\",\n \"BTN_ADD_ACCOUNT\": \"New Account\",\n \"BTN_SHARE\": \"Share\",\n \"BTN_EDIT\": \"Edit\",\n \"BTN_DELETE\": \"Delete\",\n \"BTN_ADD\": \"Add\",\n \"BTN_SEARCH\": \"Search\",\n \"BTN_REFRESH\": \"Refresh\",\n \"BTN_RETRY\": \"Retry\",\n \"BTN_START\": \"Start\",\n \"BTN_CONTINUE\": \"Continue\",\n \"BTN_CREATE\": \"Create\",\n \"BTN_UNDERSTOOD\": \"I understand\",\n \"BTN_OPTIONS\": \"Options\",\n \"BTN_HELP_TOUR\": \"Features tour\",\n \"BTN_HELP_TOUR_SCREEN\": \"Discover this screen\",\n \"BTN_DOWNLOAD\": \"Download\",\n \"BTN_DOWNLOAD_ACCOUNT_STATEMENT\": \"Download account statement\",\n \"BTN_MODIFY\": \"Modify\",\n \"CHOOSE_FILE\": \"Drag your file<br/>or click to select\",\n \"DAYS\": \"days\",\n \"NO_ACCOUNT_QUESTION\": \"Not a member yet? Register now!\",\n \"SEARCH_NO_RESULT\": \"No result found\",\n \"LOADING\": \"Loading...\",\n \"LOADING_WAIT\": \"Loading...<br/><small>(Waiting for node availability)</small>\",\n \"SEARCHING\": \"Searching...\",\n \"FROM\": \"From\",\n \"TO\": \"To\",\n \"COPY\": \"Copy\",\n \"LANGUAGE\": \"Language\",\n \"UNIVERSAL_DIVIDEND\": \"Universal dividend\",\n \"UD\": \"UD\",\n \"DATE_PATTERN\": \"DD/MM/YYYY HH:mm\",\n \"DATE_FILE_PATTERN\": \"YYYY-MM-DD\",\n \"DATE_SHORT_PATTERN\": \"DD/MM/YY\",\n \"DATE_MONTH_YEAR_PATTERN\": \"MM/YYYY\",\n \"EMPTY_PARENTHESIS\": \"(empty)\",\n \"UID\": \"Pseudonym\",\n \"ENABLE\": \"Enabled\",\n \"DISABLE\": \"Disabled\",\n \"RESULTS_LIST\": \"Results:\",\n \"RESULTS_COUNT\": \"{{count}} results\",\n \"EXECUTION_TIME\": \"executed in {{duration|formatDurationMs}}\",\n \"SHOW_VALUES\": \"Display values openly?\",\n \"POPOVER_ACTIONS_TITLE\": \"Options\",\n \"POPOVER_FILTER_TITLE\": \"Filters\",\n \"SHOW_MORE\": \"Show more\",\n \"SHOW_MORE_COUNT\": \"(current limit at {{limit}})\",\n \"POPOVER_SHARE\": {\n \"TITLE\": \"Share\",\n \"SHARE_ON_TWITTER\": \"Share on Twitter\",\n \"SHARE_ON_FACEBOOK\": \"Share on Facebook\",\n \"SHARE_ON_DIASPORA\": \"Share on Diaspora*\",\n \"SHARE_ON_GOOGLEPLUS\": \"Share on Google+\"\n },\n \"FILE\": {\n \"DATE\" : \"Date:\",\n \"TYPE\" : \"Type:\",\n \"SIZE\": \"Size:\",\n \"VALIDATING\": \"Validating...\"\n }\n },\n \"SYSTEM\": {\n \"PICTURE_CHOOSE_TYPE\": \"Choose source:\",\n \"BTN_PICTURE_GALLERY\": \"Gallery\",\n \"BTN_PICTURE_CAMERA\": \"<b>Camera</b>\"\n },\n \"MENU\": {\n \"HOME\": \"Home\",\n \"WOT\": \"Registry\",\n \"CURRENCY\": \"Currency\",\n \"ACCOUNT\": \"My Account\",\n \"WALLETS\": \"My wallets\",\n \"SETTINGS\": \"Settings\",\n \"NETWORK\": \"Network\",\n \"TRANSACTIONS\": \"My transactions\"\n },\n \"ABOUT\": {\n \"TITLE\": \"About\",\n \"LICENSE\": \"<b>Free/libre software</b> (License GNU AGPLv3).\",\n \"LATEST_RELEASE\": \"There is a <b>newer version</ b> of {{'COMMON.APP_NAME' | translate}} (<b>v{{version}}</b>)\",\n \"PLEASE_UPDATE\": \"Please update {{'COMMON.APP_NAME' | translate}} (latest version: <b>v{{version}}</b>)\",\n \"CODE\": \"Source code:\",\n \"OFFICIAL_WEB_SITE\": \"Official web site:\",\n \"DEVELOPERS\": \"Developers:\",\n \"FORUM\": \"Forum:\",\n \"PLEASE_REPORT_ISSUE\": \"Please report any issue to us!\",\n \"REPORT_ISSUE\": \"Report an issue\",\n \"BTN_OPEN_DEV_WINDOW\": \"Open the debug window\"\n },\n \"HOME\": {\n \"TITLE\": \"Cesium\",\n \"WELCOME\": \"Welcome to the Cesium application!\",\n \"WELCOME_READONLY\": \"Welcome to Cesium <span class='badge badge-balanced'>Monit</span> !\",\n \"MESSAGE\": \"Receive and send libre currency {{currency|abbreviate}}\",\n \"MESSAGE_READONLY\": \"Real-time monitoring of libre currency {{currency|abbreviate}}\",\n \"BTN_CURRENCY\": \"Explore currency {{currency|abbreviate}}\",\n \"BTN_ABOUT\": \"about\",\n \"BTN_HELP\": \"Help\",\n \"BTN_NETWORK\": \"Network status\",\n \"FREE_SOFTWARE\": \"Free software\",\n \"FORK_ME\": \"Fork me!\",\n \"SHOW_LICENSE\": \"Show license\",\n \"REPORT_ISSUE\": \"Report an issue\",\n \"NOT_YOUR_ACCOUNT_QUESTION\" : \"You do not own the account <b><i class=\\\"ion-key\\\"></i> {{pubkey|formatPubkey}}</b>?\",\n \"BTN_CHANGE_ACCOUNT\": \"Disconnect this account\",\n \"CONNECTION_ERROR\": \"Peer <b>{{server}}</b> unreachable or invalid address.<br/><br/>Check your Internet connection, or change node <a class=\\\"positive\\\" ng-click=\\\"doQuickFix('settings')\\\">in the settings</a>.\",\n \"SHOW_ALL_FEED\": \"Show all\",\n \"READ_MORE\": \"Read more\",\n \"FEED_SOURCE\": \"Source\"\n },\n \"SETTINGS\": {\n \"TITLE\": \"Settings\",\n \"DISPLAY_DIVIDER\": \"Display\",\n \"STORAGE_DIVIDER\": \"Storage\",\n \"NETWORK_SETTINGS\": \"Network\",\n \"PEER\": \"Duniter peer address\",\n \"PEER_SHORT\": \"Peer address\",\n \"PEER_CHANGED_TEMPORARY\": \"Address used temporarily\",\n \"PERSIST_CACHE\": \"Keep navigation data (experimental)\",\n \"PERSIST_CACHE_HELP\": \"Allows faster navigation, locally retaining the data received, for use from one session to another.\",\n \"USE_LOCAL_STORAGE\": \"Enable local storage\",\n \"USE_LOCAL_STORAGE_HELP\": \"Allows you to save your settings\",\n \"WALLETS_SETTINGS\": \"My wallets\",\n \"USE_WALLETS_ENCRYPTION\": \"Secure the list\",\n \"USE_WALLETS_ENCRYPTION_HELP\": \"Enables you to encrypt the list of your wallets. Authentication required to access it.\",\n \"ENABLE_HELPTIP\": \"Enable contextual help tips\",\n \"DISABLE_HELPTIP\": \"Disable contextual help tips\",\n \"ENABLE_UI_EFFECTS\": \"Enable visual effects\",\n \"HISTORY_SETTINGS\": \"Account operations\",\n \"DISPLAY_UD_HISTORY\": \"Display produced dividends?\",\n \"TX_HISTORY_AUTO_REFRESH\": \"Enable automatic refresh?\",\n \"TX_HISTORY_AUTO_REFRESH_HELP\": \"Updates the list of operations to each new block.\",\n \"AUTHENTICATION_SETTINGS\": \"Authentication\",\n \"KEEP_AUTH\": \"Expiration of authentication\",\n \"KEEP_AUTH_SHORT\": \"Expiration\",\n \"KEEP_AUTH_HELP\": \"Define when authentication is cleared from memory.\",\n \"KEEP_AUTH_OPTION\": {\n \"NEVER\": \"After each operation\",\n \"SECONDS\": \"After {{value}}s of inactivity\",\n \"MINUTE\": \"After {{value}}min of inactivity\",\n \"MINUTES\": \"After {{value}}min of inactivity\",\n \"HOUR\": \"After {{value}}h of inactivity\",\n \"ALWAYS\": \"At the end of the session\"\n },\n \"KEYRING_FILE\": \"Keyring file\",\n \"KEYRING_FILE_HELP\": \"Allow auto-connect at startup, or to authenticate (only if \\\"Expiration of authentication\\\" is \\\"at the end of the session\\\"\",\n \"REMEMBER_ME\": \"Remember me ?\",\n \"REMEMBER_ME_HELP\": \"Allows to remain identified from one session to another, keeping the public key locally.\",\n \"PLUGINS_SETTINGS\": \"Extensions\",\n \"BTN_RESET\": \"Restore default values\",\n \"EXPERT_MODE\": \"Enable expert mode\",\n \"EXPERT_MODE_HELP\": \"Allow to see more details\",\n \"BLOCK_VALIDITY_WINDOW\": \"Block uncertainty time\",\n \"BLOCK_VALIDITY_WINDOW_SHORT\": \"Time of uncertainty\",\n \"BLOCK_VALIDITY_WINDOW_HELP\": \"Time to wait before considering an information is validated\",\n \"BLOCK_VALIDITY_OPTION\": {\n \"NONE\": \"No delay\",\n \"N\": \"{{time | formatDuration}} ({{count}} blocks)\"\n },\n \"POPUP_PEER\": {\n \"TITLE\" : \"Duniter peer\",\n \"HOST\" : \"Address\",\n \"HOST_HELP\": \"Address: server:port\",\n \"USE_SSL\" : \"Secured?\",\n \"USE_SSL_HELP\" : \"(SSL Encryption)\",\n \"BTN_SHOW_LIST\" : \"Peer's list\"\n }\n },\n \"BLOCKCHAIN\": {\n \"HASH\": \"Hash: {{hash}}\",\n \"VIEW\": {\n \"HEADER_TITLE\": \"Block #{{number}}-{{hash|formatHash}}\",\n \"TITLE_CURRENT\": \"Current block\",\n \"TITLE\": \"Block #{{number|formatInteger}}\",\n \"COMPUTED_BY\": \"Computed by\",\n \"SHOW_RAW\": \"Show raw data\",\n \"TECHNICAL_DIVIDER\": \"Technical informations\",\n \"VERSION\": \"Format version\",\n \"HASH\": \"Computed hash\",\n \"UNIVERSAL_DIVIDEND_HELP\": \"Money co-produced by each of the {{membersCount}} members\",\n \"EMPTY\": \"Aucune donnée dans ce bloc\",\n \"POW_MIN\": \"Minimal difficulty\",\n \"POW_MIN_HELP\": \"Difficulty imposed in calculating hash\",\n \"DATA_DIVIDER\": \"Data\",\n \"IDENTITIES_COUNT\": \"New identities\",\n \"JOINERS_COUNT\": \"Joiners\",\n \"ACTIVES_COUNT\": \"Renewals\",\n \"ACTIVES_COUNT_HELP\": \"Members having renewed their membership\",\n \"LEAVERS_COUNT\": \"Leavers\",\n \"LEAVERS_COUNT_HELP\": \"Members that now refused certification\",\n \"EXCLUDED_COUNT\": \"Excluded members\",\n \"EXCLUDED_COUNT_HELP\": \"Old members, excluded because missing membreship renewal or certifications\",\n \"REVOKED_COUNT\": \"Revoked identities\",\n \"REVOKED_COUNT_HELP\": \"These accounts may no longer be member\",\n \"TX_COUNT\": \"Transactions\",\n \"CERT_COUNT\": \"Certifications\",\n \"TX_TO_HIMSELF\": \"Change\",\n \"TX_OUTPUT_UNLOCK_CONDITIONS\": \"Unlock conditions\",\n \"TX_OUTPUT_OPERATOR\": {\n \"AND\": \"and\",\n \"OR\": \"or\"\n },\n \"TX_OUTPUT_FUNCTION\": {\n \"SIG\": \"<b>Sign</b> of the public key\",\n \"XHX\": \"<b>Password</b>, including SHA256 =\",\n \"CSV\": \"Blocked during\",\n \"CLTV\": \"Bloqué until\"\n }\n },\n \"LOOKUP\": {\n \"TITLE\": \"Blocks\",\n \"NO_BLOCK\": \"No bloc\",\n \"LAST_BLOCKS\": \"Last blocks:\",\n \"BTN_COMPACT\": \"Compact\"\n }\n },\n \"CURRENCY\": {\n \"VIEW\": {\n \"TITLE\": \"Currency\",\n \"TAB_CURRENCY\": \"Currency\",\n \"TAB_WOT\": \"Web of trust\",\n \"TAB_NETWORK\": \"Network\",\n \"TAB_BLOCKS\": \"Blocks\",\n \"CURRENCY_SHORT_DESCRIPTION\": \"{{currency|capitalize}} is a <b>libre money</b>, started {{firstBlockTime | formatFromNow}}. It currently counts <b>{{N}} members </b>, who produce and collect a <a ng-click=\\\"showHelpModal('ud')\\\">Universal Dividend</a> (DU), each {{dt | formatPeriod}}.\",\n \"NETWORK_RULES_DIVIDER\": \"Network rules\",\n \"CURRENCY_NAME\": \"Currency name\",\n \"MEMBERS\": \"Members count\",\n \"MEMBERS_VARIATION\": \"Variation since {{duration|formatDuration}} (since last UD)\",\n \"MONEY_DIVIDER\": \"Money\",\n \"MASS\": \"Monetary mass\",\n \"SHARE\": \"Money share\",\n \"UD\": \"Universal Dividend\",\n \"C_ACTUAL\": \"Current growth\",\n \"MEDIAN_TIME\": \"Current blockchain time\",\n \"POW_MIN\": \"Common difficulty\",\n \"MONEY_RULES_DIVIDER\": \"Rules of currency\",\n \"C_RULE\": \"Theoretical growth target\",\n \"UD_RULE\": \"Universal dividend (formula)\",\n \"DT_REEVAL\": \"Period between two re-evaluation of the UD\",\n \"REEVAL_SYMBOL\": \"reeval\",\n \"DT_REEVAL_VALUE\": \"Every <b>{{dtReeval|formatDuration}}</b> ({{dtReeval/86400}} {{'COMMON.DAYS'|translate}})\",\n \"UD_REEVAL_TIME0\": \"Date of first reevaluation of the UD\",\n \"SIG_QTY_RULE\": \"Required number of certifications to become a member\",\n \"SIG_STOCK\": \"Maximum number of certifications sent by a member\",\n \"SIG_PERIOD\": \"Minimum delay between 2 certifications sent by one and the same issuer.\",\n \"SIG_WINDOW\": \"Maximum delay before a certification will be treated\",\n \"SIG_VALIDITY\": \"Lifetime of a certification that has been treated\",\n \"MS_WINDOW\": \"Maximum delay before a pending membership will be treated\",\n \"MS_VALIDITY\": \"Lifetime of a membership that has been treated\",\n \"STEP_MAX\": \"Maximum distance between a newcomer and each referring members.\",\n \"WOT_RULES_DIVIDER\": \"Rules for web of trust\",\n \"SENTRIES\": \"Required number of certifications (given <b>and</b> received) to become a referring member\",\n \"SENTRIES_FORMULA\": \"Required number of certifications to become a referring member (formula)\",\n \"XPERCENT\":\"Minimum percent of referring member to reach to match the distance rule\",\n \"AVG_GEN_TIME\": \"The average time between 2 blocks\",\n \"CURRENT\": \"current\",\n \"MATH_CEILING\": \"CEILING\",\n \"DISPLAY_ALL_RULES\": \"Display all rules?\",\n \"BTN_SHOW_LICENSE\": \"Show license\",\n \"WOT_DIVIDER\": \"Web of trust\"\n },\n \"LICENSE\": {\n \"TITLE\": \"Currency license\",\n \"BTN_DOWNLOAD\": \"Download file\",\n \"NO_LICENSE_FILE\": \"License file not found.\"\n }\n },\n \"NETWORK\": {\n \"VIEW\": {\n \"MEDIAN_TIME\": \"Blockchain time\",\n \"LOADING_PEERS\": \"Loading peers...\",\n \"NODE_ADDRESS\": \"Address:\",\n \"SOFTWARE\": \"Software:\",\n \"WARN_PRE_RELEASE\": \"Pre-release (latest stable: <b>{{version}}</b>)\",\n \"WARN_NEW_RELEASE\": \"Version <b>{{version}}</b> available\",\n \"WS2PID\": \"Identifier:\",\n \"PRIVATE_ACCESS\": \"Private access\",\n \"POW_PREFIX\": \"Proof of work prefix:\",\n \"ENDPOINTS\": {\n \"BMAS\": \"Secure endpoint (SSL)\",\n \"BMATOR\": \"TOR endpoint\",\n \"WS2P\": \"WS2P endpoint\",\n \"ES_USER_API\": \"Cesium+ data node\"\n }\n },\n \"INFO\": {\n \"ONLY_SSL_PEERS\": \"Non-SSL nodes have a degraded display because Cesium works in HTTPS mode.\"\n }\n },\n \"PEER\": {\n \"PEERS\": \"Peers\",\n \"SIGNED_ON_BLOCK\": \"Signed on block\",\n \"MIRROR\": \"mirror\",\n \"MIRRORS\": \"Mirrors\",\n \"MIRROR_PEERS\": \"Mirror peers\",\n \"PEER_LIST\" : \"Peer's list\",\n \"MEMBERS\" : \"Members\",\n \"MEMBER_PEERS\" : \"Member peers\",\n \"ALL_PEERS\" : \"All peers\",\n \"DIFFICULTY\" : \"Difficulty\",\n \"API\" : \"API\",\n \"CURRENT_BLOCK\" : \"Block #\",\n \"POPOVER_FILTER_TITLE\": \"Filter\",\n \"OFFLINE\": \"Offline\",\n \"OFFLINE_PEERS\": \"Offline peers\",\n \"BTN_SHOW_PEER\": \"Show peer\",\n \"VIEW\": {\n \"TITLE\": \"Peer\",\n \"OWNER\": \"Owned by \",\n \"SHOW_RAW_PEERING\": \"See peering document\",\n \"SHOW_RAW_CURRENT_BLOCK\": \"See current block (raw format)\",\n \"LAST_BLOCKS\": \"Last blocks\",\n \"KNOWN_PEERS\": \"Known peers :\",\n \"GENERAL_DIVIDER\": \"General information\",\n \"ERROR\": {\n \"LOADING_TOR_NODE_ERROR\": \"Could not get peer data, using the TOR network.\",\n \"LOADING_NODE_ERROR\": \"Could not get peer data\"\n }\n }\n },\n \"WOT\": {\n \"SEARCH_HELP\": \"Search (member or public key)\",\n \"SEARCH_INIT_PHASE_WARNING\": \"During the pre-registration phase, the search for pending registrations <b>may be long</b>. Please wait ...\",\n \"REGISTERED_SINCE\": \"Registered on\",\n \"REGISTERED_SINCE_BLOCK\": \"Registered since block #\",\n \"NO_CERTIFICATION\": \"No validated certification\",\n \"NO_GIVEN_CERTIFICATION\": \"No given certification\",\n \"NOT_MEMBER_PARENTHESIS\": \"(non-member)\",\n \"IDENTITY_REVOKED_PARENTHESIS\": \"(identity revoked)\",\n \"MEMBER_PENDING_REVOCATION_PARENTHESIS\": \"(being revoked)\",\n \"EXPIRE_IN\": \"Expires\",\n \"NOT_WRITTEN_EXPIRE_IN\": \"Deadline<br/>treatment\",\n \"EXPIRED\": \"Expired\",\n \"PSEUDO\": \"Pseudonym\",\n \"SIGNED_ON_BLOCK\": \"Emitted on block #{{block}}\",\n \"WRITTEN_ON_BLOCK\": \"Written on block #{{block}}\",\n \"GENERAL_DIVIDER\": \"General information\",\n \"NOT_MEMBER_ACCOUNT\": \"Non-member account\",\n \"NOT_MEMBER_ACCOUNT_HELP\": \"This is a simple wallet, with no pending membership application.\",\n \"TECHNICAL_DIVIDER\": \"Technical data\",\n \"BTN_CERTIFY\": \"Certify\",\n \"BTN_YES_CERTIFY\": \"Yes, certify\",\n \"BTN_SELECT_AND_CERTIFY\": \"New certification\",\n \"ACCOUNT_OPERATIONS\": \"Account operations\",\n \"VIEW\": {\n \"POPOVER_SHARE_TITLE\": \"Identity {{title}}\"\n },\n \"LOOKUP\": {\n \"TITLE\": \"Registry\",\n \"NEWCOMERS\": \"New members:\",\n \"NEWCOMERS_COUNT\": \"{{count}} members\",\n \"PENDING\": \"Pending registrations:\",\n \"PENDING_COUNT\": \"{{count}} pending registrations\",\n \"REGISTERED\": \"Registered {{sigDate | formatFromNow}}\",\n \"MEMBER_FROM\": \"Member since {{memberDate|medianFromNowShort}}\",\n \"BTN_NEWCOMERS\": \"Latest members\",\n \"BTN_PENDING\": \"Pending registrations\",\n \"SHOW_MORE\": \"Show more\",\n \"SHOW_MORE_COUNT\": \"(current limit to {{limit}})\",\n \"NO_PENDING\": \"No pending registrations.\",\n \"NO_NEWCOMERS\": \"No members.\"\n },\n \"CONTACTS\": {\n \"TITLE\": \"Contacts\"\n },\n \"MODAL\": {\n \"TITLE\": \"Search\"\n },\n \"CERTIFICATIONS\": {\n \"TITLE\": \"{{uid}} - Certifications\",\n \"SUMMARY\": \"Received certifications\",\n \"LIST\": \"Details of received certifications\",\n \"PENDING_LIST\": \"Pending certifications\",\n \"RECEIVED\": \"Received certifications\",\n \"RECEIVED_BY\": \"Certifications received by {{uid}}\",\n \"ERROR\": \"Received certifications in error\",\n \"SENTRY_MEMBER\": \"Referring member\"\n },\n \"OPERATIONS\": {\n \"TITLE\": \"{{uid}} - Operations\"\n },\n \"GIVEN_CERTIFICATIONS\": {\n \"TITLE\": \"{{uid}} - Certifications sent\",\n \"SUMMARY\": \"Sent certifications\",\n \"LIST\": \"Details of sent certifications\",\n \"PENDING_LIST\": \"Pending certifications\",\n \"SENT\": \"Sent certifications\",\n \"SENT_BY\": \"Certifications sent by {{uid}}\",\n \"ERROR\": \"Sent certifications with error\"\n }\n },\n \"LOGIN\": {\n \"TITLE\": \"<i class=\\\"icon ion-log-in\\\"></i> Login\",\n \"SCRYPT_FORM_HELP\": \"Please enter your credentials. <br> Remember to check the public key for your account.\",\n \"PUBKEY_FORM_HELP\": \"Please enter a public account key:\",\n \"FILE_FORM_HELP\": \"Choose the keychain file to use:\",\n \"SCAN_FORM_HELP\": \"Scan the QR code of a wallet.\",\n \"SALT\": \"Secret identifier\",\n \"SALT_HELP\": \"Secret identifier\",\n \"SHOW_SALT\": \"Display secret identifier?\",\n \"PASSWORD\": \"Password\",\n \"PASSWORD_HELP\": \"Password\",\n \"PUBKEY_HELP\": \"Public key or pseudonym\",\n \"NO_ACCOUNT_QUESTION\": \"Don't have an account yet?\",\n \"HAVE_ACCOUNT_QUESTION\": \"Already have an account ?\",\n \"CREATE_ACCOUNT\": \"Create an account\",\n \"CREATE_FREE_ACCOUNT\": \"Create a free account\",\n \"FORGOTTEN_ID\": \"Forgot password?\",\n \"ASSOCIATED_PUBKEY\": \"Public key :\",\n \"BTN_METHODS\": \"Other methods\",\n \"BTN_METHODS_DOTS\": \"Change method...\",\n \"METHOD_POPOVER_TITLE\": \"Methods\",\n \"MEMORIZE_AUTH_FILE\": \"Memorize this keychain during the navigation session\",\n \"SCRYPT_PARAMETERS\": \"Paramètres (Scrypt) :\",\n \"AUTO_LOGOUT\": {\n \"TITLE\": \"Information\",\n \"MESSAGE\": \"<i class=\\\"ion-android-time\\\"></i> You were <b>logout</ b> automatically, due to prolonged inactivity.\",\n \"BTN_RELOGIN\": \"Sign In\",\n \"IDLE_WARNING\": \"You will be logout... {{countdown}}\"\n },\n \"METHOD\": {\n \"SCRYPT_DEFAULT\": \"Secret identifier and password\",\n \"SCRYPT_ADVANCED\": \"Advanced salt\",\n \"FILE\": \"Keychain file\",\n \"PUBKEY\": \"Public key or pseudonym\",\n \"SCAN\": \"Scan a QR code\"\n },\n \"SCRYPT\": {\n \"SIMPLE\": \"Light salt\",\n \"DEFAULT\": \"Standard salt\",\n \"SECURE\": \"Secure salt\",\n \"HARDEST\": \"Hardest salt\",\n \"EXTREME\": \"Extreme salt\",\n \"USER\": \"Personal value\",\n \"N\": \"N (Loop):\",\n \"r\": \"r (RAM):\",\n \"p\": \"p (CPU):\"\n },\n \"FILE\": {\n \"HELP\": \"Expected file format: <b>.dunikey</b> (type PubSec). Other formats are under development (EWIF, WIF).\"\n }\n },\n \"AUTH\": {\n \"TITLE\": \"<i class=\\\"icon ion-locked\\\"></i> Authentication\",\n \"BTN_AUTH\": \"Authenticate\",\n \"GENERAL_HELP\": \"Please authenticate yourself:\",\n \"EXPECTED_UID_HELP\": \"Please authenticate to the account <i class=\\\"ion-person\\\"></i> {{uid}}:\",\n \"EXPECTED_PUBKEY_HELP\": \"Please authenticate to the wallet <i class=\\\"ion-key\\\"></i> {{pubkey|formatPubkey}}:\",\n \"SCAN_FORM_HELP\": \"Scan the QR code of the <b>private key</b> of the wallet.\"\n },\n \"ACCOUNT\": {\n \"TITLE\": \"My Account\",\n \"BALANCE\": \"Balance\",\n \"LAST_TX\": \"Latest validated transactions\",\n \"BALANCE_ACCOUNT\": \"Account balance\",\n \"NO_TX\": \"No transaction\",\n \"SHOW_MORE_TX\": \"Show more\",\n \"SHOW_ALL_TX\": \"Show all\",\n \"TX_FROM_DATE\": \"(current limit to {{fromTime|medianFromNowShort}})\",\n \"PENDING_TX\": \"Pending transactions\",\n \"VALIDATING_TX\": \"Transactions being validated\",\n \"ERROR_TX\": \"Transaction not executed\",\n \"ERROR_TX_SENT\": \"Sent transactions\",\n \"PENDING_TX_RECEIVED\": \"Transactions awaiting receipt\",\n \"EVENTS\": \"Events\",\n \"OUT_DISTANCED\": \"Your current certifications come from a group too isolated from the <a ng-click=\\\"showHelpModal('wot')\\\"> Web of Trust</a> (WoT): the <a ng-click=\\\"showHelpModal('distance_rule')\\\">maximum distance rule</a> is violated.<br/>You must obtain certifications from another area of the Web of Trust, or wait for it to tighten.\",\n \"WAITING_MEMBERSHIP\": \"Membership application sent. Waiting validation.\",\n \"WAITING_CERTIFICATIONS\": \"You need {{needCertificationCount}} certification(s) to become a member and produce the <a ng-click=\\\"showHelpModal('ud')\\\">Universal Dividend</a>. Your account is however already operational, to receive and send payments.\",\n \"WAITING_CERTIFICATIONS_HELP\": \"To get your certifications, only request members <b>who know you enough</b>, as required by <a ng-click=\\\"showLicenseModal()\\\">the currency license</a> that you have accepted.<br/>If you do not know enough members, let them know on <a ng-click=\\\"openLink($event, $root.settings.userForumUrl)\\\">the user forum</a>.\",\n \"WILL_MISSING_CERTIFICATIONS\": \"You will <b>lack certifications</b> soon (at least {{willNeedCertificationCount}} more are needed)\",\n \"WILL_NEED_RENEW_MEMBERSHIP\": \"Your membership <b>will expire {{membershipExpiresIn|formatDurationTo}}</b>. Remember to <a ng-click=\\\"doQuickFix('renew')\\\">renew your membership</a> before then.\",\n \"NEED_RENEW_MEMBERSHIP\": \"You are no longer a member because your membership <b>has expired</b>. Remember to <a ng-click=\\\"doQuickFix('renew')\\\">renew your membership</a>.\",\n \"NEED_RENEW_MEMBERSHIP_AFTER_CANCELLED\": \"You are no longer a member because your membership <b>has been cancelled</b> for lack of certifications. Remember to <a ng-click=\\\"doQuickFix('renew')\\\">renew your membership</a>.\",\n \"NO_WAITING_MEMBERSHIP\": \"No membership application pending. If you'd like to <b>become a member</ b>, please <a ng-click=\\\"doQuickFix('membership')\\\">send the membership application</a>.\",\n \"CERTIFICATION_COUNT\": \"Received certifications\",\n \"CERTIFICATION_COUNT_SHORT\": \"Certifications\",\n \"SIG_STOCK\": \"Stock of certifications to give\",\n \"BTN_RECEIVE_MONEY\": \"Receive\",\n \"BTN_SELECT_ALTERNATIVES_IDENTITIES\": \"Switch to another identity...\",\n \"BTN_FIX_MEMBERSHIP\": \"Resubmit membership request...\",\n \"BTN_MEMBERSHIP_RENEW\": \"Renew membership\",\n \"BTN_MEMBERSHIP_RENEW_DOTS\": \"Renew membership...\",\n \"BTN_MEMBERSHIP_OUT_DOTS\": \"Revoke membership...\",\n \"BTN_SECURITY_DOTS\": \"Sign-in and security...\",\n \"BTN_SHOW_DETAILS\": \"Display technical data\",\n \"LOCKED_OUTPUTS_POPOVER\": {\n \"TITLE\": \"Locked amount\",\n \"DESCRIPTION\": \"Here are the conditions for unlocking this amount:\",\n \"DESCRIPTION_MANY\": \"This transaction consists of several parts, of which the unlock conditions are:\",\n \"LOCKED_AMOUNT\": \"Conditions for the amount:\"\n },\n \"NEW\": {\n \"TITLE\": \"Registration\",\n \"INTRO_WARNING_TIME\": \"Creating an account on {{name|capitalize}} is very simple. Please take sufficient time to do this correctly (not to forget the usernames, passwords, etc.).\",\n \"INTRO_WARNING_SECURITY\": \"Check that the hardware you are currently using (computer, tablet, phone) <b>is secure and trustworthy </b>.\",\n \"INTRO_WARNING_SECURITY_HELP\": \"Up-to-date anti-virus, firewall enabled, session protected by password or pin code...\",\n \"INTRO_HELP\": \"Click <b> {{'COMMON.BTN_START'|translate}}</b> to begin creating an account. You will be guided step by step.\",\n \"REGISTRATION_NODE\": \"Your registration will be registered via the Duniter peer <b>{{server}}</b> node, which will then be distributed to the rest of the currency network.\",\n \"REGISTRATION_NODE_HELP\": \"If you do not trust this peer, please change <a ng-click=\\\"doQuickFix('settings')\\\">in the settings</a> of Cesium.\",\n \"SELECT_ACCOUNT_TYPE\": \"Choose the type of account to create:\",\n \"MEMBER_ACCOUNT\": \"Member account\",\n \"MEMBER_ACCOUNT_TITLE\": \"Create a member account\",\n \"MEMBER_ACCOUNT_HELP\": \"If you are not yet registered as an individual (one account possible per individual).\",\n \"WALLET_ACCOUNT\": \"Simple wallet\",\n \"WALLET_ACCOUNT_TITLE\": \"Create a wallet\",\n \"WALLET_ACCOUNT_HELP\": \"If you represent a company, association, etc. or simply need an additional wallet. No universal dividend will be created by this account.\",\n \"SALT_WARNING\": \"Choose a secret identifier.<br/>You need it for each connection to this account.<br/><br/><b>Make sure to remember this identifier</b>.<br/>If lost, there are no means to retrieve it!\",\n \"PASSWORD_WARNING\": \"Choose a password.<br/>You need it for each connection to this account.<br/><br/><b>Make sure to remember this password</b>.<br/>If lost, there are no means to retrieve it!\",\n \"PSEUDO_WARNING\": \"Choose a pseudonym.<br/>It may be used by other people to find you more easily.<br/><br/>.Use of <b>commas, spaces and accents</b> is not allowed.<br/><div class='hidden-xs'><br/>Example: <span class='gray'>JohnDalton, JackieChan, etc.</span>\",\n \"PSEUDO\": \"Pseudonym\",\n \"PSEUDO_HELP\": \"joe123\",\n \"SALT_CONFIRM\": \"Confirm\",\n \"SALT_CONFIRM_HELP\": \"Confirm the secret identifier\",\n \"PASSWORD_CONFIRM\": \"Confirm\",\n \"PASSWORD_CONFIRM_HELP\": \"Confirm the password\",\n \"SLIDE_6_TITLE\": \"Confirmation:\",\n \"COMPUTING_PUBKEY\": \"Computing...\",\n \"LAST_SLIDE_CONGRATULATION\": \"You completed all required fields.<br/><b>You can send the account creation request</b>.<br/><br/>For information, the public key below identifies your future account.<br/>It can be communicated to third parties to receive their payment.<br/>Once your account has been approved, you can find this key under <b>{{'ACCOUNT.TITLE'|translate}}</b>.\",\n \"CONFIRMATION_MEMBER_ACCOUNT\": \"<b class=\\\"assertive\\\">Warning:</b> your secret identifier, password and pseudonym can not be changed.<br/><b>Make sure you always remember it!</b><br/><b>Are you sure</b> you want to send this account creation request?\",\n \"CONFIRMATION_WALLET_ACCOUNT\": \"<b class=\\\"assertive\\\">Warning:</b> your password and pseudonym can not be changed.<br/><b>Make sure you always remember it!</b><br/><b>Are you sure</b> you want to continue?\",\n \"CHECKING_PSEUDO\": \"Checking...\",\n \"PSEUDO_AVAILABLE\": \"This pseudonym is available\",\n \"PSEUDO_NOT_AVAILABLE\": \"This pseudonym is not available\",\n \"INFO_LICENSE\": \"To be able to adhere to the currency, we ask you to kindly read and accept this license.\",\n \"BTN_ACCEPT\": \"I accept\",\n \"BTN_ACCEPT_LICENSE\": \"I accept the license\"\n },\n \"POPUP_REGISTER\": {\n \"TITLE\": \"Enter a pseudonym\",\n \"HELP\": \"A pseudonym is needed to let other members find you.\"\n },\n \"SELECT_IDENTITY_MODAL\": {\n \"TITLE\": \"Identity selection\",\n \"HELP\": \"Several <b>different identities</b> have been sent, for the public key <span class=\\\"gray\\\"> <i class=\\\"ion-key\\\"></i> {{pubkey | formatPubkey}}</span>.<br/>Please select the identity to use:\"\n },\n \"SELECT_WALLET_MODAL\": {\n \"TITLE\": \"Wallet selection\"\n },\n \"WALLET_LIST\": {\n \"TITLE\": \"My wallets\",\n \"BTN_NEW\": \"Add a wallet\",\n \"BTN_DOWNLOAD\": \"Download the list\",\n \"BTN_IMPORT_FILE_DOTS\": \"Import from a file...\",\n \"NO_WALLET\": \"No secondary wallet\",\n \"BTN_DELETE\": \"Remove a secondary wallet...\",\n \"BTN_RENAME\": \"Rename the wallet\",\n \"EXPORT_FILENAME\": \"my_wallets-{{pubkey|formatPubkey}}-{{currency}}.csv\",\n \"TOTAL_DOTS\": \"Total: \",\n \"EDIT_POPOVER\": {\n \"TITLE\": \"Rename the wallet\",\n \"HELP\": \"Fill in the new name\",\n \"NAME_HELP\": \"Wallet name\"\n },\n \"IMPORT_MODAL\": {\n \"TITLE\": \"Import secondary wallets\",\n \"HELP\": \"To <b>import secodnary wallets</b>, please drag the file in the box below, or click in the box to search for a file.\",\n \"WALLET_COUNT\": \"<b>{{count}}</b> new wallet{{count > 1 ? 's' : ''}}\",\n \"NO_NEW_WALLET\": \"No new wallet\"\n }\n },\n \"SECURITY\":{\n \"ADD_QUESTION\" : \"Add custom question\",\n \"BTN_CLEAN\" : \"Clean\",\n \"BTN_RESET\" : \"Reset\",\n \"DOWNLOAD_REVOKE\": \"Save a revocation file\",\n \"DOWNLOAD_REVOKE_HELP\" : \"Having a revocation file is important, for example in case of loss of identifiers. It allows you to <b>get this account out of the Web Of Trust</b>, thus becoming a simple wallet.\",\n \"GENERATE_KEYFILE\": \"Generate my keychain file ...\",\n \"GENERATE_KEYFILE_HELP\": \"Generate a file allowing you to authenticate without entering your identifiers.<br/><b>Warning:</b> this file will contain your secret key; It is therefore very important to put it in a safe place!\",\n \"KEYFILE_FILENAME\": \"keychain-{{pubkey|formatPubkey}}-{{currency}}-{{format}}.dunikey\",\n \"MEMBERSHIP_IN\": \"Register as member...\",\n \"MEMBERSHIP_IN_HELP\": \"Allows you to <b>transform </b> a simple wallet account <b>into a member account</b>, by sending a membership request. Useful only if you do not already have another member account.\",\n \"SEND_IDENTITY\": \"Publish identity...\",\n \"SEND_IDENTITY_HELP\": \"Allows you to associate a pseudonym to this account, but <b>without applying for membership</b> to become a member. This is not very useful because the validity of this pseudonym association is limited in time.\",\n \"HELP_LEVEL\": \"Choose <strong> at least {{nb}} questions </strong> :\",\n \"LEVEL\": \"Security level\",\n \"LOW_LEVEL\": \"Low <span class=\\\"hidden-xs\\\">(2 questions minimum)</span>\",\n \"MEDIUM_LEVEL\": \"Medium <span class=\\\"hidden-xs\\\">(4 questions minimum)</span>\",\n \"QUESTION_1\": \"What was your best friend's name when you were a teen ?\",\n \"QUESTION_2\": \"What was the name of your first pet ?\",\n \"QUESTION_3\": \"What is the first meal you have learned to cook ?\",\n \"QUESTION_4\": \"What is the first movie you saw in the cinema?\",\n \"QUESTION_5\": \"Where did you go the first time you flew ?\",\n \"QUESTION_6\": \"What was your favorite elementary school teacher's name ?\",\n \"QUESTION_7\": \"What would you consider the ideal job ?\",\n \"QUESTION_8\": \"Which children's book do you prefer?\",\n \"QUESTION_9\": \"What was the model of your first vehicle?\",\n \"QUESTION_10\": \"What was your nickname when you were a child ?\",\n \"QUESTION_11\": \"What was your favorite movie character or actor when you were a student ?\",\n \"QUESTION_12\": \"What was your favorite singer or band when you were a student ?\",\n \"QUESTION_13\": \"In which city did your parents meet ?\",\n \"QUESTION_14\": \"What was the name of your first boss ?\",\n \"QUESTION_15\": \"What is the name of the street where you grew up ?\",\n \"QUESTION_16\": \"What is the name of the first beach where you go swim ?\",\n \"QUESTION_17\": \"QWhat is the first album you bought ?\",\n \"QUESTION_18\": \"What is the name of your favorite sport team ?\",\n \"QUESTION_19\": \"What was your grand-father's job ?\",\n \"RECOVER_ID\": \"Recover my password...\",\n \"RECOVER_ID_HELP\": \"If you have a <b>backup file of your identifiers</b>, you can find them by answering your personal questions correctly.\",\n \"RECOVER_ID_SELECT_FILE\": \"Select the <b>backup file of your identifiers</b> to use:\",\n \"REVOCATION_WITH_FILE\" : \"Revoke my member account...\",\n \"REVOCATION_WITH_FILE_DESCRIPTION\": \"If you have <b>permanently lost your member account credentials (or if account security is compromised), you can use <b>the revocation file</b> of the account <b>to quit the Web Of Trust</b>.\",\n \"REVOCATION_WITH_FILE_HELP\": \"To <b>permanently revoke</ b> a member account, please drag the revocation file in the box below, or click in the box to search for a file.\",\n \"REVOCATION_WALLET\": \"Revoke this account immediately\",\n \"REVOCATION_WALLET_HELP\": \"Requesting revocation of your identity causes <b>will revoke your membership</ b> (definitely for the associated pseudonym and public key). The account will no longer be able to produce a Universal Dividend.<br/>However, you can still use it as a simple wallet.\",\n \"REVOCATION_FILENAME\": \"revocation-{{uid}}-{{pubkey|formatPubkey}}-{{currency}}.txt\",\n \"SAVE_ID\": \"Save my credentials...\",\n \"SAVE_ID_HELP\": \"Creating a backup file, to <b>retrieve your password</b> (and the secret identifier) <b> in case of forgetting</b>. The file is <b>secured</ b> (encrypted) using personal questions.\",\n \"STRONG_LEVEL\": \"Strong <span class=\\\"hidden-xs \\\">(6 questions minimum)</span>\",\n \"TITLE\": \"Account and security\",\n \"KEYFILE\": {\n \"PUBSEC_FORMAT\": \"PubSec format.\",\n \"PUBSEC_FORMAT_HELP\": \"This file format is compatible in particular with Cesium and Gannonce. Your keychain is stored <b>without encryption</b>: anyone with a copy of this file will be able to empty your account.\",\n \"WIF_FORMAT\": \"Wallet Import Format (WIF)\",\n \"WIF_FORMAT_HELP\": \"This format is used in particular by paper wallets. Your keychain is stored <b>without encryption</b>: anyone with a copy of this file will be able to empty your account.\",\n \"EWIF_FORMAT\": \"Encrypted Wallet Import Format (WIF)\",\n \"EWIF_FORMAT_HELP\": \"This format is used in particular by paper wallets. However, <b>the keychain is encrypted</b> from a passphrase of your choice.\",\n \"PASSWORD_POPUP\": {\n \"TITLE\": \"Keychain file encrypted\",\n \"HELP\": \"Please enter the passphrase:\",\n \"PASSWORD_HELP\": \"Passphrase\"\n },\n \"ERROR\": {\n \"BAD_PASSWORD\": \"Bad passphrase\",\n \"BAD_CHECKSUM\": \"Bad checksum\"\n }\n }\n },\n \"FILE_NAME\": \"{{currency}} - Account statement {{pubkey|formatPubkey}} to {{currentTime|formatDateForFile}}.csv\",\n \"HEADERS\": {\n \"TIME\": \"Date\",\n \"AMOUNT\": \"Amount\",\n \"COMMENT\": \"Comment\"\n }\n },\n \"TRANSFER\": {\n \"TITLE\": \"Transfer\",\n \"SUB_TITLE\": \"Transfer money\",\n \"SUB_TITLE_ALL\": \"Empty the account\",\n \"FROM\": \"From\",\n \"TO\": \"To\",\n \"AMOUNT\": \"Amount\",\n \"AMOUNT_HELP\": \"Amount\",\n \"COMMENT\": \"Comment\",\n \"COMMENT_HELP\": \"Comment (optional)\",\n \"BTN_SEND\": \"Send\",\n \"BTN_ADD_COMMENT\": \"Add a comment\",\n \"REST\": \"Rest of account\",\n \"REST_TO\": \"to\",\n \"WARN_COMMENT_IS_PUBLIC\": \"Please note that <b>comments are public</b> (not encrypted).\",\n \"MODAL\": {\n \"TITLE\": \"Transfer\"\n }\n },\n \"ERROR\": {\n \"UNKNOWN_URI_FORMAT\": \"Unknown URI format\",\n \"PUBKEY_INVALID_CHECKSUM\": \"Invalid public key (bad checksum).\",\n \"POPUP_TITLE\": \"Error\",\n \"UNKNOWN_ERROR\": \"Unknown error\",\n \"CRYPTO_UNKNOWN_ERROR\": \"Your browser is not compatible with cryptographic features.\",\n \"DOWNLOAD_KEYFILE_FAILED\": \"Failed to generate the keychain file.\",\n \"EQUALS_TO_PSEUDO\": \"Must be different from pseudonym\",\n \"EQUALS_TO_SALT\": \"Must be different from secret identifier\",\n \"FIELD_REQUIRED\": \"This field is required.\",\n \"FIELD_TOO_SHORT\": \"This field value is too short.\",\n \"FIELD_TOO_SHORT_WITH_LENGTH\": \"Value is too short (min {{minLength]] characters).\",\n \"FIELD_TOO_LONG\": \"Value is exceeding max length.\",\n \"FIELD_TOO_LONG_WITH_LENGTH\": \"Value is too long (max {{maxLength}} characters).\",\n \"FIELD_MIN\": \"Minimum value: {{min}}\",\n \"FIELD_MAX\": \"Maximal value: {{max}}\",\n \"FIELD_ACCENT\": \"Commas and accent characters not allowed\",\n \"FIELD_NOT_NUMBER\": \"Value is not a number\",\n \"FIELD_NOT_INT\": \"Value is not an integer\",\n \"FIELD_NOT_EMAIL\": \"Email adress not valid\",\n \"PASSWORD_NOT_CONFIRMED\": \"Must match previous password.\",\n \"SALT_NOT_CONFIRMED\": \"Must match previous identifier.\",\n \"SEND_IDENTITY_FAILED\": \"Error while trying to register.\",\n \"SEND_CERTIFICATION_FAILED\": \"Could not certify identity.\",\n \"NEED_MEMBER_ACCOUNT_TO_CERTIFY\": \"You could not send certification, because your account is <b>not a member account</b>.\",\n \"NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF\": \"You could not send certification now, because your are <b>not a member</b> yet.<br/><br/>You still need certification to become a member.\",\n \"IDENTITY_TO_CERTIFY_HAS_NO_SELF\": \"This account could not be certified. No registration found, or need to renew.\",\n \"LOGIN_FAILED\": \"Error while sign in.\",\n \"LOAD_IDENTITY_FAILED\": \"Could not load identity.\",\n \"LOAD_REQUIREMENTS_FAILED\": \"Could not load identity requirements.\",\n \"SEND_MEMBERSHIP_IN_FAILED\": \"Error while sending registration as member.\",\n \"SEND_MEMBERSHIP_OUT_FAILED\": \"Error while sending membership revocation.\",\n \"REFRESH_WALLET_DATA\": \"Could not refresh wallet.\",\n \"GET_CURRENCY_PARAMETER\": \"Could not get currency parameters.\",\n \"GET_CURRENCY_FAILED\": \"Could not load currency. Please retry later.\",\n \"SEND_TX_FAILED\": \"Could not send transaction.\",\n \"ALL_SOURCES_USED\": \"Please wait the next block computation (All transaction sources has been used).\",\n \"NOT_ENOUGH_SOURCES\": \"Not enough changes to send this amount in one time.<br/>Maximum amount: {{amount}} {{unit}}<sub>{{subUnit}}</sub>.\",\n \"ACCOUNT_CREATION_FAILED\": \"Error while creating your member account.\",\n \"RESTORE_WALLET_DATA_ERROR\": \"Error while reloading settings from local storage\",\n \"LOAD_WALLET_DATA_ERROR\": \"Error while loading wallet data.\",\n \"COPY_CLIPBOARD_FAILED\": \"Could not copy to clipboard\",\n \"TAKE_PICTURE_FAILED\": \"Could not get picture.\",\n \"SCAN_FAILED\": \"Could not scan QR code.\",\n \"SCAN_UNKNOWN_FORMAT\": \"Code not recognized.\",\n \"WOT_LOOKUP_FAILED\": \"Search failed.\",\n \"LOAD_PEER_DATA_FAILED\": \"Duniter peer not accessible. Please retry later.\",\n \"NEED_LOGIN_FIRST\": \"Please sign in first.\",\n \"AMOUNT_REQUIRED\": \"Amount is required.\",\n \"AMOUNT_NEGATIVE\": \"Negative amount not allowed.\",\n \"NOT_ENOUGH_CREDIT\": \"Not enough credit.\",\n \"INVALID_NODE_SUMMARY\": \"Unreachable peer or invalid address\",\n \"INVALID_USER_ID\": \"Field 'pseudonym' must not contains spaces or special characters.\",\n \"INVALID_COMMENT\": \"Field 'reference' has a bad format.\",\n \"INVALID_PUBKEY\": \"Public key has a bad format.\",\n \"INVALID_PUBKEY_CHECKSUM\": \"Invalid checksum.\",\n \"IDENTITY_REVOKED\": \"This identity <b>has been revoked</b>. It can no longer become a member.\",\n \"IDENTITY_REVOKED_WITH_TIME\": \"This identity <b>has been revoked {{revocationTime|medianFromNow}}</b> ({{revocationTime|medianDate}}). It can no longer become a member.\",\n \"IDENTITY_PENDING_REVOCATION\": \"The <b>revocation of this identity</b> has been requested and is awaiting processing. Certification is therefore disabled.\",\n \"IDENTITY_INVALID_BLOCK_HASH\": \"This membership application is no longer valid (because it references a block that network peers are cancelled): the person must renew its application for membership <b>before</b> being certified.\",\n \"IDENTITY_EXPIRED\": \"This identity has expired: this person must re-apply <b>before</b> being certified.\",\n \"IDENTITY_SANDBOX_FULL\": \"Could not register, because peer's sandbox is full.<br/><br/>Please retry later or choose another Duniter peer (in <b>Settings</b>).\",\n \"IDENTITY_NOT_FOUND\": \"Identity not found\",\n \"IDENTITY_TX_FAILED\": \"Error while getting identity's transactions\",\n \"WOT_PENDING_INVALID_BLOCK_HASH\": \"Membership not valid.\",\n \"WALLET_INVALID_BLOCK_HASH\": \"Your membership application is no longer valid (because it references a block that network peers are cancelled).<br/>You must <a ng-click=\\\"doQuickFix('renew')\\\">renew your application for membership</a> to fix this issue.\",\n \"WALLET_IDENTITY_EXPIRED\": \"The publication of your identity <b>has expired</b>.<br/>You must <a ng-click=\\\"doQuickFix('fixIdentity')\\\">re-issue your identity</a> to resolve this issue.\",\n \"WALLET_REVOKED\": \"Your identity has been <b>revoked</b>: neither your pseudonym nor your public key will be used in the future for a member account.\",\n \"WALLET_HAS_NO_SELF\": \"Your identity must first have been published, and not expired.\",\n \"AUTH_REQUIRED\": \"Authentication required.\",\n \"AUTH_INVALID_PUBKEY\": \"The public key does not match the connected account.\",\n \"AUTH_INVALID_SCRYPT\": \"Invalid username or password.\",\n \"AUTH_INVALID_FILE\": \"Invalid keychain file.\",\n \"AUTH_FILE_ERROR\": \"Failed to open keychain file\",\n \"IDENTITY_ALREADY_CERTIFY\": \"You have <b>already certified</b> that identity.<br/><br/>Your certificate is still valid (expires {{expiresIn|formatDuration}}).\",\n \"IDENTITY_ALREADY_CERTIFY_PENDING\": \"You have <b>already certified</b> that identity.<br/><br/>Your certification is still pending (Deadline for treatment {{expiresIn|formatDuration}}).\",\n \"UNABLE_TO_CERTIFY_TITLE\": \"Unable to certify\",\n \"LOAD_NEWCOMERS_FAILED\": \"Unable to load new members.\",\n \"LOAD_PENDING_FAILED\": \"Unable to load pending registrations.\",\n \"ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION\": \"You must <b>be a member</b> in order to perform this action.\",\n \"ONLY_MEMBER_OR_WAS_MEMBER_CAN_EXECUTE_THIS_ACTION\": \"You must <b>be a member (or old member)</b> in order to perform this action.\",\n \"ONLY_SELF_CAN_EXECUTE_THIS_ACTION\": \"You must have <b>published your identity</b> in order to perform this action.\",\n \"GET_BLOCK_FAILED\": \"Error while getting block\",\n \"INVALID_BLOCK_HASH\": \"Block not found (incorrect hash)\",\n \"DOWNLOAD_REVOCATION_FAILED\": \"Error while downloading revocation file.\",\n \"REVOCATION_FAILED\": \"Error while trying to revoke the identity.\",\n \"SALT_OR_PASSWORD_NOT_CONFIRMED\": \"Wrong secret identifier or password \",\n \"RECOVER_ID_FAILED\": \"Could not recover password\",\n \"LOAD_FILE_FAILED\" : \"Unable to load file\",\n \"NOT_VALID_REVOCATION_FILE\": \"Invalid revocation file (wrong file format)\",\n \"NOT_VALID_SAVE_ID_FILE\": \"Invalid credentials backup file (wrong file format)\",\n \"NOT_VALID_KEY_FILE\": \"Invalid keychain file (unrecognized format)\",\n \"EXISTING_ACCOUNT\": \"Your identifiers correspond to an already existing account, whose <a ng-click=\\\"showHelpModal('pubkey')\\\">public key</a> is:\",\n \"EXISTING_ACCOUNT_REQUEST\": \"Please modify your credentials so that they correspond to an unused account.\",\n \"GET_LICENSE_FILE_FAILED\": \"Unable to get license file\",\n \"CHECK_NETWORK_CONNECTION\": \"No peer appears to be accessible.<br/><br/>Please <b>check your Internet connection</b>.\",\n \"ISSUE_524_TX_FAILED\": \"Failed to transfer.<br/><br/>A message has been sent to developers to help solve the problem.<b>Thank you for your help</b>.\",\n \"ADD_SECONDARY_WALLET_FAILED\": \"Unable to add secondary wallet.\",\n \"REMOVE_SECONDARY_WALLET_FAILED\": \"Unable to remove secondary wallet.\",\n \"UPDATE_WALLET_LIST_FAILED\": \"Unable to refresh the list of wallets.\",\n \"LOAD_WALLET_LIST_FAILED\": \"Unable to load the list of wallets.\",\n \"SAVE_WALLET_LIST_FAILED\": \"Unable to save the list of wallets.\",\n \"COULD_NOT_ADD_MAIN_WALLET\": \"This wallet <b>is the main account</b> with which you are connected. Unable to add it as a secondary wallet.\",\n \"COULD_NOT_ADD_EXISTING_WALLET\": \"Wallet already existing in the list.\",\n \"UNKNOWN_WALLET_ID\": \"Unknown secondary wallet.\",\n \"RESTORE_WALLET_LIST_FAILED\": \"Unable to restore the list of wallets.\",\n \"INVALID_FILE_FORMAT\": \"Invalid file format.\",\n \"SAME_TX_RECIPIENT\": \"The recipient must be different from the issuer.\"\n },\n \"INFO\": {\n \"POPUP_TITLE\": \"Information\",\n \"CERTIFICATION_DONE\": \"Identity successfully signed\",\n \"NOT_ENOUGH_CREDIT\": \"Not enough credit\",\n \"TRANSFER_SENT\": \"Transfer request successfully sent\",\n \"COPY_TO_CLIPBOARD_DONE\": \"Copy succeeded\",\n \"MEMBERSHIP_OUT_SENT\": \"Membership revocation sent\",\n \"NOT_NEED_MEMBERSHIP\": \"Already a member.\",\n \"IDENTITY_WILL_MISSING_CERTIFICATIONS\": \"This identity will soon lack certification (at least {{willNeedCertificationCount}}).\",\n \"IDENTITY_NEED_MEMBERSHIP\": \"This identity did not send a membership request. She will have to if she wishes to become a member.\",\n \"HAS_ALTERNATIVE_IDENTITIES\": \"There are <b>multiple identities</b> attached to this public key. <b>Before any certification</b>, please <a ng-click=\\\"doQuickFix('showSelectIdentities')\\\">check other identities</a> to choose the correct one, or contact the wallet owner.\",\n \"REVOCATION_SENT\": \"Revocation sent successfully\",\n \"REVOCATION_SENT_WAITING_PROCESS\": \"Revocation <b>has been sent successfully</b>. It is awaiting processing.\",\n \"FEATURES_NOT_IMPLEMENTED\": \"This features is not implemented yet.<br/><br/>Why not to contribute to get it faster? ;)\",\n \"EMPTY_TX_HISTORY\": \"No operations to export\"\n },\n \"CONFIRM\": {\n \"POPUP_TITLE\": \"<b>Confirmation</b>\",\n \"POPUP_WARNING_TITLE\": \"<b>Warning</b>\",\n \"POPUP_SECURITY_WARNING_TITLE\": \"<i class=\\\"icon ion-alert-circled\\\"></i> <b>Security warning</b>\",\n \"CERTIFY_RULES_TITLE_UID\": \"Certify {{uid}}\",\n \"CERTIFY_RULES\": \"<b class=\\\"assertive\\\">Don't certify an account</b> if you believe that: <ul><li>1.) the issuers identity might be faked.<li>2.) the issuer already has another certified account.<li>3.) the issuer purposely or carelessly violates rule 1 or 2 (he certifies faked or double accounts).</ul></small><br/>Are you sure you want to certify this identity?\",\n \"FULLSCREEN\": \"View the application in full screen?\",\n \"EXIT_APP\": \"Close the application ?\",\n \"TRANSFER\": \"<b>Transfer summary:</b><br/><br/><ul><li> - From: <b>{{from}}</b></li><li> - To: <b>{{to}}</b></li><li> - Amount: <b>{{amount}} {{unit}}</b></li><li> - Comment: <i>{{comment}}</i></li></ul><br/><b>Are-you sure you want to do this transfer?</b>\",\n \"TRANSFER_ALL\": \"<b>Transfer summary:</b><br/><br/><ul><li> - From: <b>{{from}}</b></li><li> - To: <b>{{to}}</b></li><li> - Amount: <b>{{amount}} {{unit}}</b></li><li> - Comment: <i>{{comment}}</i></li><br/><li> - Rest : <b>{{restAmount}} {{unit}}</b> to <b>{{restTo}}</b></li></ul><br/><b>Are-you sure you want to do this transfer?</b>\",\n \"MEMBERSHIP_OUT\": \"This operation is <b>irreversible</b>.<br/></br/><b>Are you sure you want to terminate your membership?</b>\",\n \"MEMBERSHIP_OUT_2\": \"This operation is <b>irreversible</b>!<br/><br/>Are you sure you want to <b>terminate your membership</b>?\",\n \"LOGIN_UNUSED_WALLET_TITLE\": \"Typing error?\",\n \"LOGIN_UNUSED_WALLET\": \"The account seems to be <b>inactive</b>.<br/><br/>It's probably a <b>typing error</b> when sign in. Please try again, checking that <b>public key is yours<b/>.\",\n \"FIX_IDENTITY\": \"The pseudonym <b>{{uid}}</b> will be published again, replacing the old publication that has expired.<br/></br/><b>Are you sure</b> you want to continue?\",\n \"FIX_MEMBERSHIP\": \"Your application for membership will be sent.<br/></br/><b>Are you sure?</b>\",\n \"MEMBERSHIP\": \"Your membership request will be sent. <br/></br/><b>Are you sure?</b>\",\n \"RENEW_MEMBERSHIP\": \"Your membership will be renewed.<br/></br/><b>Are you sure?</b>\",\n \"REVOKE_IDENTITY\": \"You will <b>definitely revoke this identity</b>.<br/><br/>The public key and the associated pseudonym <b>will never be used again</b> (for a member account).<br/></br/><b>Are you sure</b> you want to revoke this identity?\",\n \"REVOKE_IDENTITY_2\": \"This operation is <b>irreversible</b>!<br/><br/>Are you sure you want to <b>revoke this identity</b>?\",\n \"NOT_NEED_RENEW_MEMBERSHIP\": \"Your membership does not need to be renewed (it will only expire in {{membershipExpiresIn|formatDuration}}).<br/></br/><b>Are you sure you</b> want to renew your membership?\",\n \"SAVE_BEFORE_LEAVE\": \"Do you want to <b>save your changes</b> before leaving the page?\",\n \"SAVE_BEFORE_LEAVE_TITLE\": \"Changes not saved\",\n \"LOGOUT\": \"Are you sure you want to logout?\",\n \"USE_FALLBACK_NODE\": \"Peer <b>{{old}}</b> unreachable or invalid address.<br/><br/>Do you want to temporarily use the <b>{{new}}</b> node?\",\n \"ISSUE_524_SEND_LOG\": \"The transaction was rejected because of a known problem (issue #524) but not reproduced.<br/><br/>To help developers correct this error, do you accept <b>the transmission of your logs</b> per message?<br/><small>(No confidential data is sent)</small>\"\n },\n \"MODE\": {\n \"DEMO\": {\n \"BADGE\": \"Demo\",\n \"MODE\": \"Demonstration mode\",\n \"FEATURE_NOT_AVAILABLE\": \"Functionality <b>not available</b> on this demonstration site.\",\n \"MODE_HELP\": \"Cesium works in <b>demonstration mode</b>: consultation on account is available, but no operation can be performed.\",\n \"INSTALL_HELP\": \"For <b>security reasons</b> we recommend <b>installing</b> your copy of the software.<br/> Visit the site <a href='https://cesium.app'>www.cesium.app</a> for help.\"\n },\n \"READONLY\": {\n \"BADGE\": \"Monit\",\n \"MODE\": \"Monitoring mode\",\n \"MODE_HELP\": \"Cesium works in <b>monitoring mode</b>: only currency monitoring features are available.\",\n \"INSTALL_HELP\": \"If you want to <b>create a wallet account</b> to send or received money, we recommend <b>installing</b> your copy of the software.<br/> Visit the site <a href='https://cesium.app'>www.cesium.app</a> for help.\"\n }\n },\n \"DOWNLOAD\": {\n \"POPUP_TITLE\": \"<b>Revocation file</b>\",\n \"POPUP_REVOKE_MESSAGE\": \"To safeguard your account, please download the <b>account revocation document</b>. It will allow you to cancel your account (in case of account theft, ID, an incorrectly created account, etc.).<br/><br/><b>Please store it in a safe place.</b>\"\n },\n \"HELP\": {\n \"TITLE\": \"Online help\",\n \"JOIN\": {\n \"SECTION\": \"Join\",\n \"SALT\": \"The secret identifier is very important. It is used to hash you password, which in turn is used to calculate your <span class=\\\"text-italic\\\">public account key</span> (its number) and the private key to access it.<br/><b>Please remeber this identifier well</b>, because there is no way to recover it when lost.<br/>Furthermore, it cannot be changed without having to create a new account.<br/><br/>A good secret identifier must be sufficiently long (8 characters at the very least) and as original as possible.\",\n \"PASSWORD\": \"The password is very important. Together with the secret identifier, it is use to calculate your account number (pblic key) and the private key to access it.<br/><b>Please remember it well</b>, because there is no way to recover it when lost.<br/>Furthermore, it cannot be changed without having to create a new account.<br/><br/>A good password is made (ideally) of at least 8 characters, with at least one capital and one number.\",\n \"PSEUDO\": \"A pseudonym is used only when joining as <span class=\\\"text-italic\\\">member</span>. It is always associated with a wallet (by its <span class=\\\"text-italic\\\">public key</span>).<br/>It is published on the network so that other users may identify it, certify or send money to the account.<br/>A pseudonym must be unique among all members (current and past).\"\n },\n \"LOGIN\": {\n \"SECTION\": \"Log in\",\n \"PUBKEY\": \"Account public key\",\n \"PUBKEY_DEF\": \"The public key of the keychain is generated from the entered identifiers (any), but does not correspond to an account already used.<br/><b>Make sure your public key is the same as your account</b>. Otherwise, you will be logged into an account that is probably never used, as the risk of collision with an existing account is very small.<br/><a href=\\\"https://en.wikipedia.org/wiki/Elliptic_curve_cryptography\\\" target=\\\"_ system\\\">Learn more about cryptography</a> by public key.\",\n \"METHOD\": \"Connection methods\",\n \"METHOD_DEF\": \"Several options are available to connect to a portfolios: <br/> - The connection <b>with salt (simple or advanced)</b> mixes your password with the secret identifier, to limit the attempts of piracy<br/> - The connection <b>using public key</b> prevents you from entering your credentials, which you will be asked only when an operation need it.<br/> - The connection <b>using keychain file</b> will read the public and private keys of the account from a file without the need to enter credentials. Several file formats are possible.\"\n },\n \"GLOSSARY\": {\n \"SECTION\": \"Glossary\",\n \"PUBKEY_DEF\": \"A public key always identifies a wallet. It may identify a member. In Cesium it is calculated using the secret identifier and the password.\",\n \"MEMBER\": \"Member\",\n \"MEMBER_DEF\": \"A member is a real and living human, wishing to participate freely to the monitary community. The member will receive universal dividend, according to the period and amount as defined in the <span class=\\\"text-italic\\\">currency parameters</span>.\",\n \"CURRENCY_RULES\": \"Currency rules\",\n \"CURRENCY_RULES_DEF\": \"The currency rules are defined only once, and for all. They set the parameters under which the currency will perform: universal dividend calculation, the amount of certifications needed to become a member, the maximum amount of certifications a member can send, etc.<br/><br/>The parameters cannot be modified because of the use of a <span class=\\\"text-italic\\\">Blockchain</span> which carries and executes these rules, and constantly verifies their correct application. <a href=\\\"#/app/currency\\\">See current parameters</a>.\",\n \"BLOCKCHAIN\": \"Blockchain\",\n \"BLOCKCHAIN_DEF\": \"The Blockchain is a decentralised system which, in case of Duniter, serves to carry and execute the <span class=\\\"text-italic\\\">currency rules</span>.<br/><a href=\\\"http://en.duniter.org/presentation/\\\" target=\\\"_blank\\\">Read more about Duniter</a> and the working of its blockchain.\",\n \"UNIVERSAL_DIVIDEND_DEF\": \"The Universal Dividend (UD) is the quantity of money co-created by each member, according to the period and the calculation defined in the <span class=\\\"text-italic\\\">currency rules</span>.<br/>Every term, the members receive an equal amount of new money on their account.<br/><br/>The UD undergoes a steady growth, to remain fair under its members (current and future), calculated by an average life expectancy, as demonstrated in the Relative Theory of Money (RTM).<br/><a href=\\\"http://trm.creationmonetaire.info\\\" target=\\\"_system\\\">Read more about RTM</a> and open money.\",\n \"WOT\": \"Web of Trust (WoT)\",\n \"WOT_DEF\": \"The Web of Trust is made up of all the members of the currency, and the links of certification which connect them.\",\n \"DISTANCE_RULE\": \"Distance rule\",\n \"DISTANCE_RULE_DEF\": \"The rule of distance defines <b>a maximum distance to meet</b> between an applicant and a minimum number of referring member. This distance is calculated using the certification links.\"\n },\n \"TIP\": {\n \"MENU_BTN_CURRENCY\": \"Menu <b>{{'MENU.CURRENCY'|translate}}</b> allows discovery of <b>currency parameters</b> and its state.\",\n \"CURRENCY_WOT\": \"The <b>member count</b> shows the <b>community's weight and evolution</b>.\",\n \"CURRENCY_MASS\": \"Shown here is the <b>total amount</b> currently in circulation and its <b>average distribution</b> per member.<br/><br/>This allows to estimate the <b>worth of any amount</b>, in respect to what <b>others own</b> on their account (on average).\",\n \"CURRENCY_UNIT_RELATIVE\": \"The unit used here (&ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;) signifies that the amounts in {{currency|capitalize}} have been devided by the <b>Universal Dividend</b> (UD).<br/><br/><small>This relative unit is <b>relevant</b> because it is stable in contrast to the permanently growing monitary mass.</small>\",\n \"CURRENCY_CHANGE_UNIT\": \"The option <b>{{'COMMON.BTN_RELATIVE_UNIT'|translate}}</b> allows to <b>switch the unit</b> to show amounts in <b>{{currency|capitalize}}</b>, undevided by the Universal Dividend (instead of in &ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;).\",\n \"CURRENCY_CHANGE_UNIT_TO_RELATIVE\": \"The option <b>{{'COMMON.BTN_RELATIVE_UNIT'|translate}}</b> allows to <b>switch the unit</b> to show amounts in &ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;, which is relative to the Universal Dividend (the amount co-produced by each member).\",\n \"CURRENCY_RULES\": \"The <b>rules</b> of the currency determine its <b>exact and predictible</b> performance.<br/><br/>As a true DNA of the currency these rules make the monetary code <b>transparent and understandable</b>.\",\n \"MENU_BTN_NETWORK\": \"Menu <b>{{'MENU.NETWORK'|translate}}</b> allows discovery of <b>network's state<b>.\",\n \"NETWORK_BLOCKCHAIN\": \"All monetary transactions are recoded in a <b>public and tamper proof</b> ledger, generally referred to as the <b>blockchain</b>.\",\n \"NETWORK_PEERS\": \"The <b>peers</b> shown here correspond to <b>computers that update and check</b> the blockchain.<br/><br/>The more active peers there are, the more <b>decentralised</b> and therefore trustworhty the currency becomes.\",\n \"NETWORK_PEERS_BLOCK_NUMBER\": \"This <b>number</b> (in green) indicates the peer's <b>latest validated block</b> (last page written in the ledger).<br/><br/>Green indicates that the block was equally validated by the <b>majority of other peers</b>.\",\n \"NETWORK_PEERS_PARTICIPATE\": \"<b>Each member</b>, equiped with a computer with Internet, <b>can participate, adding a peer</b> simply by <b>installing the Duniter software</b> (free/libre). <a target=\\\"_new\\\" href=\\\"{{installDocUrl}}\\\" target=\\\"_system\\\">Read the installation manual &gt;&gt;</a>.\",\n \"MENU_BTN_ACCOUNT\": \"<b>{{'ACCOUNT.TITLE'|translate}}</b> allows access to your account balance and transaction history.\",\n \"MENU_BTN_ACCOUNT_MEMBER\": \"Here you can consult your account status, transaction history and your certifications.\",\n \"WALLET_CERTIFICATIONS\": \"Click here to reveiw the details of your certifications (given and received).\",\n \"WALLET_RECEIVED_CERTIFICATIONS\": \"Click here to review the details of your <b>received certifications</b>.\",\n \"WALLET_GIVEN_CERTIFICATIONS\": \"Click here to review the details of your <b>given certifications</b>.\",\n \"WALLET_BALANCE\": \"Your account <b>balance</b> is shown here.\",\n \"WALLET_BALANCE_RELATIVE\": \"{{'HELP.TIP.WALLET_BALANCE'|translate}}<br/><br/>The used unit (&ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;) signifies that the amount in {{currency|capitalize}} has been divided by the <b>Universal Dividend</b> (UD) co-created by each member.<br/>At this moment, 1 UD equals {{currentUD}} {{currency|capitalize}}.\",\n \"WALLET_BALANCE_CHANGE_UNIT\": \"You can <b>change the unit</b> in which amounts are shown in <b><i class=\\\"icon ion-android-settings\\\"></i>&nbsp;{{'MENU.SETTINGS'|translate}}</b>.<br/><br/>For example, to display amounts <b>directly in {{currency|capitalize}}</b> instead of relative amounts.\",\n \"WALLET_PUBKEY\": \"This is your account public key. You can communicate it to a third party so that it more easily identifies your account.\",\n \"WALLET_SEND\": \"Issue a payment in just a few clicks.\",\n \"WALLET_SEND_NO_MONEY\": \"Issue a payment in just a few clicks.<br/>(Your balance does not allow this yet)\",\n \"WALLET_OPTIONS\": \"Please note that this button allows access to <b>other, less used actions</b>.<br/><br/>Don't forget to take a quick look, when you have a moment!\",\n \"WALLET_RECEIVED_CERTS\": \"This shows the list of persons that certified you.\",\n \"WALLET_CERTIFY\": \"The button <b>{{'WOT.BTN_SELECT_AND_CERTIFY'|translate}}</b> allows selecting an identity and certifying it.<br/><br/>Only users that are <b>already member</b> may certify others.\",\n \"WALLET_CERT_STOCK\": \"Your supply of certifications (to send) is limited to <b>{{sigStock}} certifications</b>.<br/><br/>This supply will replete itself over time, as and when earlier certifications expire.\",\n \"MENU_BTN_WALLETS\": \"The menu <b>{{'MENU.WALLETS'|translate}}</b> allows you to add additional wallets that you manage.\",\n \"MENU_BTN_TX\": \"The menu <b>{{'MENU.TRANSACTIONS'|translate}}</b> allow access to transactions history, and send new payments.\",\n \"MENU_BTN_WOT\": \"The menu <b>{{'MENU.WOT'|translate}}</b> allows searching <b>users</b> of the currency (member or not).\",\n \"WOT_SEARCH_TEXT_XS\": \"To search in the registry, type the <b>first letters of a users pseudonym or public key</b>.<br/><br/>The search will start automatically.\",\n \"WOT_SEARCH_TEXT\": \"To search in the registry, type the <b>first letters of a users pseudonym or public key</b>.<br/><br/>Then hit <b>Enter</b> to start the search.\",\n \"WOT_SEARCH_RESULT\": \"Simply click a user row to view the details sheet.\",\n \"WOT_VIEW_CERTIFICATIONS\": \"The row <b>{{'ACCOUNT.CERTIFICATION_COUNT'|translate}}</b> shows how many members members validated this identity.<br/><br/>These certifications testify that the account belongs to <b>a living human</b> and this person has <b>no other member account</b>.\",\n \"WOT_VIEW_CERTIFICATIONS_COUNT\": \"There are at least <b>{{sigQty}} certifications</b> needed to become a member and receive the <b>Universal Dividend</b>.\",\n \"WOT_VIEW_CERTIFICATIONS_CLICK\": \"Click here to open <b>a list of all certifications</b> given to and by this identity.\",\n \"WOT_VIEW_CERTIFY\": \"The button <b>{{'WOT.BTN_CERTIFY'|translate}}</b> allows to add your certification to this identity.\",\n \"CERTIFY_RULES\": \"<b>Attention:</b> Only certify <b>real and living persons</b> that do not own any other certified account.<br/><br/>The trust carried by the currency depends on each member's vigilance!\",\n \"MENU_BTN_SETTINGS\": \"The <b>{{'MENU.SETTINGS'|translate}}</b> allow you to configure the Cesium application.<br/><br/>For example, you can <b>change the unit</b> in which the currency will be shown.\",\n \"HEADER_BAR_BTN_PROFILE\": \"Click here to access your <b>user profile</b>\",\n \"SETTINGS_CHANGE_UNIT\": \"You can <b>change the display unit</b> of amounts by clicking here.<br/><br/>- Deactivate the option to show amounts in {{currency|capitalize}}.<br/>- Activate the option for relative amounts in {{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub> (<b>divided</b> by the current Universal Dividend).\",\n \"END_LOGIN\": \"This guided visit has <b>ended</b>.<br/><br/>Welcome to the <b>free economy</b>!\",\n \"END_NOT_LOGIN\": \"This guided visit has <b>ended</b>.<br/><br/>If you wish to join the currency {{currency|capitalize}}, simply click <b>{{'LOGIN.CREATE_FREE_ACCOUNT'|translate}}</b> below.\",\n \"END_READONLY\": \"This guided visit has <b>ended</b>.<br/><br/>{{'MODE.READONLY.INSTALL_HELP'|translate}}.\"\n }\n },\n \"API\" :{\n \"COMMON\": {\n \"LINK_DOC\": \"API documentation\",\n \"LINK_DOC_HELP\": \"API documentation for developers\",\n \"LINK_STANDARD_APP\": \"Standard version\",\n \"LINK_STANDARD_APP_HELP\": \"Open standard version of {{'COMMON.APP_NAME'|translate}}\",\n \"CONNECTION_ERROR\": \"Peer <b>{{server}}</b> unreachable or invalid address.<br/><br/>Check your Internet connection, or contact the web site administrator.\"\n },\n \"HOME\": {\n \"TITLE\": \"{{'COMMON.APP_NAME'|translate}} API Documentation\",\n \"MESSAGE\": \"Welcome to the {{'COMMON.APP_NAME'|translate}} <b>API documentation </b>.<br/>Connect your web site to <a href=\\\"http://duniter.org\\\" target=\\\"_system\\\">Duniter</a> very easily!\",\n \"MESSAGE_SHORT\": \"Connect your websites to <a href=\\\"http://duniter.org\\\" target=\\\"_system\\\">Duniter</a> very easily!\",\n \"DOC_HEADER\": \"Available services:\"\n },\n \"TRANSFER\": {\n \"TITLE\": \"{{'COMMON.APP_NAME'|translate}} - Online payment\",\n \"TITLE_SHORT\": \"Online payment\",\n \"SUMMARY\": \"Order summary:\",\n \"AMOUNT\": \"Amount:\",\n \"AMOUNTS_HELP\": \"Please select the amount:\",\n \"NAME\": \"Name:\",\n \"PUBKEY\": \"Public key of the recipient:\",\n \"COMMENT\": \"Order reference:\",\n \"NODE\": \"Peer address:\",\n \"DEMO\": {\n \"SALT\": \"demo\",\n \"PASSWORD\": \"demo\",\n \"PUBKEY\": \"3G28bL6deXQBYpPBpLFuECo46d3kfYMJwst7uhdVBnD1\",\n \"HELP\": \"<b>Demonstration mode</b>: No payment will actually be sent during this simulation.<br/>Please use credentials: <b>{{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}</b>\",\n \"BAD_CREDENTIALS\": \"Invalid credentials.<br/>In demonstration mode, credentials should be: {{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}\"\n },\n \"INFO\": {\n \"SUCCESS_REDIRECTING_WITH_NAME\": \"Payment sent.<br/>Redirect to <b>{{name}}</b>...\",\n \"SUCCESS_REDIRECTING\": \"Payment sent.<br/>Redirect to the seller's website...\",\n \"CANCEL_REDIRECTING_WITH_NAME\": \"Payment cancelled.<br/>Redirect to <b>{{name}}</b>...\",\n \"CANCEL_REDIRECTING\": \"Payment cancelled.<br/>Redirect to the seller's website...\"\n },\n \"ERROR\": {\n \"TRANSFER_FAILED\": \"Payment failed\"\n }\n },\n \"DOC\": {\n \"DESCRIPTION_DIVIDER\": \"Description\",\n \"URL_DIVIDER\": \"Calling address\",\n \"PARAMETERS_DIVIDER\": \"Parameters\",\n \"AVAILABLE_PARAMETERS\": \"Here is the list of al available parameters:\",\n \"DEMO_DIVIDER\": \"Try it !\",\n \"DEMO_HELP\": \"To test this service, click on this button. The result content will be display below.\",\n \"DEMO_RESULT\": \"Result returned by call:\",\n \"DEMO_RESULT_PEER\": \"Peer address used:\",\n \"DEMO_SUCCEED\": \"<i class=\\\"icon ion-checkmark\\\"></i> Success!\",\n \"DEMO_CANCELLED\": \"<i class=\\\"icon ion-close\\\"></i> Cancelled by user\",\n \"INTEGRATE_DIVIDER\": \"Website integration\",\n \"INTEGRATE_CODE\": \"Code:\",\n \"INTEGRATE_RESULT\": \"Result preview:\",\n \"INTEGRATE_PARAMETERS\": \"Parameters\",\n \"TRANSFER\": {\n \"TITLE\": \"Payments\",\n \"DESCRIPTION\": \"From a site (eg online marketplace) you can delegate payment in free currency to Cesium API. To do this, simply open a page at the following address:\",\n \"PARAM_PUBKEY\": \"Recipient's public key\",\n \"PARAM_PUBKEY_HELP\": \"Recipient's public key (required)\",\n \"PARAM_AMOUNT\": \"Amount\",\n \"PARAM_AMOUNT_HELP\": \"Transaction amount (required)\",\n \"PARAM_COMMENT\": \"Reference (or comment)\",\n \"PARAM_COMMENT_HELP\": \"Reference or comment. You will allow for example to identify the payment in the BlockChain.\",\n \"PARAM_NAME\": \"Name (of recipient or website)\",\n \"PARAM_NAME_HELP\": \"The name of your website. This can be a readable name (eg \\\"My online site\\\"), or a web address (eg \\\"www.MySite.com\\\").\",\n \"PARAM_REDIRECT_URL\": \"URL redirection\",\n \"PARAM_REDIRECT_URL_HELP\": \"URL redirection after sending payment, after the payment has been sent. Can contain the following strings, which will be replaced by the values of the transaction: \\\"{tx}\\\", \\\"{hash}\\\", \\\"{comment}\\\", \\\"{amount}\\\" and \\\"{pubkey}\\\".\",\n \"PARAM_CANCEL_URL\": \"URL if cancelled\",\n \"PARAM_CANCEL_URL_HELP\": \"URL in case of cancellation. Can contain the following strings, which will be replaced: \\\"{comment}\\\", \\\"{amount}\\\" and \\\"{pubkey}\\\".\",\n \"PARAM_PREFERRED_NODE\": \"Preferred Duniter peer\",\n \"PARAM_PREFERRED_NODE_HELP\": \"Peer address (URL) to use preferably (\\\"g1.domain.com:443\\\" or \\\"https://g1.domain.com\\\")\",\n \"EXAMPLES_HELP\": \"Examples of integration:\",\n \"EXAMPLE_BUTTON\": \"HTML Button\",\n \"EXAMPLE_BUTTON_DEFAULT_TEXT\": \"Pay in {{currency|abbreviate}}\",\n \"EXAMPLE_BUTTON_DEFAULT_STYLE\": \"Custom style\",\n \"EXAMPLE_BUTTON_TEXT_HELP\": \"Button text\",\n \"EXAMPLE_BUTTON_BG_COLOR\": \"Background color\",\n \"EXAMPLE_BUTTON_BG_COLOR_HELP\": \"eg: #fbc14c, yellow, lightgrey, rgb(180,180,180)\",\n \"EXAMPLE_BUTTON_FONT_COLOR\": \"Font color\",\n \"EXAMPLE_BUTTON_FONT_COLOR_HELP\": \"eg: black, orange, rgb(180,180,180)\",\n \"EXAMPLE_BUTTON_TEXT_ICON\": \"Icon\",\n \"EXAMPLE_BUTTON_TEXT_WIDTH\": \"Width\",\n \"EXAMPLE_BUTTON_TEXT_WIDTH_HELP\": \"eg: 200px, 50%\",\n \"EXAMPLE_BUTTON_ICON_NONE\": \"No icon\",\n \"EXAMPLE_BUTTON_ICON_DUNITER\": \"Duniter logo\",\n \"EXAMPLE_BUTTON_ICON_CESIUM\": \"Cesium logo\",\n \"EXAMPLE_BUTTON_ICON_G1_COLOR\": \"Ğ1 logo\",\n \"EXAMPLE_BUTTON_ICON_G1_BLACK\": \"Ğ1 logo (outline)\"\n }\n }\n }\n}\n);\n\n$translateProvider.translations(\"en\", {\n \"COMMON\": {\n \"APP_NAME\": \"Cesium\",\n \"APP_VERSION\": \"v{{version}}\",\n \"APP_BUILD\": \"build {{build}}\",\n \"PUBKEY\": \"Public key\",\n \"MEMBER\": \"Member\",\n \"BLOCK\" : \"Block\",\n \"BTN_OK\": \"OK\",\n \"BTN_YES\": \"Yes\",\n \"BTN_NO\": \"No\",\n \"BTN_SEND\": \"Send\",\n \"BTN_SEND_MONEY\": \"Transfer money\",\n \"BTN_SEND_MONEY_SHORT\": \"Transfer\",\n \"BTN_SAVE\": \"Save\",\n \"BTN_YES_SAVE\": \"Yes, Save\",\n \"BTN_YES_CONTINUE\": \"Yes, Continue\",\n \"BTN_SHOW\": \"Show\",\n \"BTN_SHOW_PUBKEY\": \"Show key\",\n \"BTN_RELATIVE_UNIT\": \"Display amounts in UD?\",\n \"BTN_BACK\": \"Back\",\n \"BTN_NEXT\": \"Next\",\n \"BTN_IMPORT\": \"Import\",\n \"BTN_CANCEL\": \"Cancel\",\n \"BTN_CLOSE\": \"Close\",\n \"BTN_LATER\": \"Later\",\n \"BTN_LOGIN\": \"Sign In\",\n \"BTN_LOGOUT\": \"Logout\",\n \"BTN_ADD_ACCOUNT\": \"New Account\",\n \"BTN_SHARE\": \"Share\",\n \"BTN_EDIT\": \"Edit\",\n \"BTN_DELETE\": \"Delete\",\n \"BTN_ADD\": \"Add\",\n \"BTN_SEARCH\": \"Search\",\n \"BTN_REFRESH\": \"Refresh\",\n \"BTN_RETRY\": \"Retry\",\n \"BTN_START\": \"Start\",\n \"BTN_CONTINUE\": \"Continue\",\n \"BTN_CREATE\": \"Create\",\n \"BTN_UNDERSTOOD\": \"I understand\",\n \"BTN_OPTIONS\": \"Options\",\n \"BTN_HELP_TOUR\": \"Features tour\",\n \"BTN_HELP_TOUR_SCREEN\": \"Discover this screen\",\n \"BTN_DOWNLOAD\": \"Download\",\n \"BTN_DOWNLOAD_ACCOUNT_STATEMENT\": \"Download account statement\",\n \"BTN_MODIFY\": \"Modify\",\n \"CHOOSE_FILE\": \"Drag your file<br/>or click to select\",\n \"DAYS\": \"days\",\n \"NO_ACCOUNT_QUESTION\": \"Not a member yet? Register now!\",\n \"SEARCH_NO_RESULT\": \"No result found\",\n \"LOADING\": \"Loading...\",\n \"LOADING_WAIT\": \"Loading...<br/><small>(Waiting for node availability)</small>\",\n \"SEARCHING\": \"Searching...\",\n \"FROM\": \"From\",\n \"TO\": \"To\",\n \"COPY\": \"Copy\",\n \"LANGUAGE\": \"Language\",\n \"UNIVERSAL_DIVIDEND\": \"Universal dividend\",\n \"UD\": \"UD\",\n \"DATE_PATTERN\": \"MM/DD/YYYY HH:mm\",\n \"DATE_FILE_PATTERN\": \"YYYY-MM-DD\",\n \"DATE_SHORT_PATTERN\": \"MM/DD/YY\",\n \"DATE_MONTH_YEAR_PATTERN\": \"MM/YYYY\",\n \"EMPTY_PARENTHESIS\": \"(empty)\",\n \"UID\": \"Pseudonym\",\n \"ENABLE\": \"Enabled\",\n \"DISABLE\": \"Disabled\",\n \"RESULTS_LIST\": \"Results:\",\n \"RESULTS_COUNT\": \"{{count}} results\",\n \"EXECUTION_TIME\": \"executed in {{duration|formatDurationMs}}\",\n \"SHOW_VALUES\": \"Display values openly?\",\n \"POPOVER_ACTIONS_TITLE\": \"Options\",\n \"POPOVER_FILTER_TITLE\": \"Filters\",\n \"SHOW_MORE\": \"Show more\",\n \"SHOW_MORE_COUNT\": \"(current limit at {{limit}})\",\n \"POPOVER_SHARE\": {\n \"TITLE\": \"Share\",\n \"SHARE_ON_TWITTER\": \"Share on Twitter\",\n \"SHARE_ON_FACEBOOK\": \"Share on Facebook\",\n \"SHARE_ON_DIASPORA\": \"Share on Diaspora*\",\n \"SHARE_ON_GOOGLEPLUS\": \"Share on Google+\"\n },\n \"FILE\": {\n \"DATE\" : \"Date:\",\n \"TYPE\" : \"Type:\",\n \"SIZE\": \"Size:\",\n \"VALIDATING\": \"Validating...\"\n }\n },\n \"SYSTEM\": {\n \"PICTURE_CHOOSE_TYPE\": \"Choose source:\",\n \"BTN_PICTURE_GALLERY\": \"Gallery\",\n \"BTN_PICTURE_CAMERA\": \"<b>Camera</b>\"\n },\n \"MENU\": {\n \"HOME\": \"Home\",\n \"WOT\": \"Registry\",\n \"CURRENCY\": \"Currency\",\n \"ACCOUNT\": \"My Account\",\n \"WALLETS\": \"My wallets\",\n \"SETTINGS\": \"Settings\",\n \"NETWORK\": \"Network\",\n \"TRANSACTIONS\": \"My transactions\"\n },\n \"ABOUT\": {\n \"TITLE\": \"About\",\n \"LICENSE\": \"<b>Free/libre software</b> (License GNU AGPLv3).\",\n \"LATEST_RELEASE\": \"There is a <b>newer version</ b> of {{'COMMON.APP_NAME' | translate}} (<b>v{{version}}</b>)\",\n \"PLEASE_UPDATE\": \"Please update {{'COMMON.APP_NAME' | translate}} (latest version: <b>v{{version}}</b>)\",\n \"CODE\": \"Source code:\",\n \"OFFICIAL_WEB_SITE\": \"Official web site:\",\n \"DEVELOPERS\": \"Developers:\",\n \"FORUM\": \"Forum:\",\n \"PLEASE_REPORT_ISSUE\": \"Please report any issue to us!\",\n \"REPORT_ISSUE\": \"Report an issue\",\n \"BTN_OPEN_DEV_WINDOW\": \"Open the debug window\"\n },\n \"HOME\": {\n \"TITLE\": \"Cesium\",\n \"WELCOME\": \"Welcome to the Cesium application!\",\n \"WELCOME_READONLY\": \"Welcome to Cesium <span class='badge badge-balanced'>Monit</span> !\",\n \"MESSAGE\": \"Receive and send libre currency {{currency|abbreviate}}\",\n \"MESSAGE_READONLY\": \"Real-time monitoring of libre currency {{currency|abbreviate}}\",\n \"BTN_CURRENCY\": \"Explore currency {{currency|abbreviate}}\",\n \"BTN_ABOUT\": \"about\",\n \"BTN_HELP\": \"Help\",\n \"BTN_NETWORK\": \"Network status\",\n \"FREE_SOFTWARE\": \"Free software\",\n \"FORK_ME\": \"Fork me!\",\n \"SHOW_LICENSE\": \"Show license\",\n \"REPORT_ISSUE\": \"Report an issue\",\n \"NOT_YOUR_ACCOUNT_QUESTION\" : \"You do not own the account <b><i class=\\\"ion-key\\\"></i> {{pubkey|formatPubkey}}</b>?\",\n \"BTN_CHANGE_ACCOUNT\": \"Disconnect this account\",\n \"CONNECTION_ERROR\": \"Peer <b>{{server}}</b> unreachable or invalid address.<br/><br/>Check your Internet connection, or change node <a class=\\\"positive\\\" ng-click=\\\"doQuickFix('settings')\\\">in the settings</a>.\",\n \"SHOW_ALL_FEED\": \"Show all\",\n \"READ_MORE\": \"Read more\",\n \"FEED_SOURCE\": \"Source\"\n },\n \"SETTINGS\": {\n \"TITLE\": \"Settings\",\n \"DISPLAY_DIVIDER\": \"Display\",\n \"STORAGE_DIVIDER\": \"Storage\",\n \"NETWORK_SETTINGS\": \"Network\",\n \"PEER\": \"Duniter peer address\",\n \"PEER_SHORT\": \"Peer address\",\n \"PEER_CHANGED_TEMPORARY\": \"Address used temporarily\",\n \"PERSIST_CACHE\": \"Keep navigation data (experimental)\",\n \"PERSIST_CACHE_HELP\": \"Allows faster navigation, locally retaining the data received, for use from one session to another.\",\n \"USE_LOCAL_STORAGE\": \"Enable local storage\",\n \"USE_LOCAL_STORAGE_HELP\": \"Allows you to save your settings\",\n \"WALLETS_SETTINGS\": \"My wallets\",\n \"USE_WALLETS_ENCRYPTION\": \"Secure the list\",\n \"USE_WALLETS_ENCRYPTION_HELP\": \"Enables you to encrypt the list of your wallets. Authentication required to access it.\",\n \"ENABLE_HELPTIP\": \"Enable contextual help tips\",\n \"DISABLE_HELPTIP\": \"Disable contextual help tips\",\n \"ENABLE_UI_EFFECTS\": \"Enable visual effects\",\n \"HISTORY_SETTINGS\": \"Account operations\",\n \"DISPLAY_UD_HISTORY\": \"Display produced dividends?\",\n \"TX_HISTORY_AUTO_REFRESH\": \"Enable automatic refresh?\",\n \"TX_HISTORY_AUTO_REFRESH_HELP\": \"Updates the list of operations to each new block.\",\n \"AUTHENTICATION_SETTINGS\": \"Authentication\",\n \"KEEP_AUTH\": \"Expiration of authentication\",\n \"KEEP_AUTH_SHORT\": \"Expiration\",\n \"KEEP_AUTH_HELP\": \"Define when authentication is cleared from memory.\",\n \"KEEP_AUTH_OPTION\": {\n \"NEVER\": \"After each operation\",\n \"SECONDS\": \"After {{value}}s of inactivity\",\n \"MINUTE\": \"After {{value}}min of inactivity\",\n \"MINUTES\": \"After {{value}}min of inactivity\",\n \"HOUR\": \"After {{value}}h of inactivity\",\n \"ALWAYS\": \"At the end of the session\"\n },\n \"KEYRING_FILE\": \"Keyring file\",\n \"KEYRING_FILE_HELP\": \"Allow auto-connect at startup, or to authenticate (only if \\\"Expiration of authentication\\\" is \\\"at the end of the session\\\"\",\n \"REMEMBER_ME\": \"Remember me ?\",\n \"REMEMBER_ME_HELP\": \"Allows to remain identified from one session to another, keeping the public key locally.\",\n \"PLUGINS_SETTINGS\": \"Extensions\",\n \"BTN_RESET\": \"Restore default values\",\n \"EXPERT_MODE\": \"Enable expert mode\",\n \"EXPERT_MODE_HELP\": \"Allow to see more details\",\n \"BLOCK_VALIDITY_WINDOW\": \"Block uncertainty time\",\n \"BLOCK_VALIDITY_WINDOW_SHORT\": \"Time of uncertainty\",\n \"BLOCK_VALIDITY_WINDOW_HELP\": \"Time to wait before considering an information is validated\",\n \"BLOCK_VALIDITY_OPTION\": {\n \"NONE\": \"No delay\",\n \"N\": \"{{time | formatDuration}} ({{count}} blocks)\"\n },\n \"POPUP_PEER\": {\n \"TITLE\" : \"Duniter peer\",\n \"HOST\" : \"Address\",\n \"HOST_HELP\": \"Address: server:port\",\n \"USE_SSL\" : \"Secured?\",\n \"USE_SSL_HELP\" : \"(SSL Encryption)\",\n \"BTN_SHOW_LIST\" : \"Peer's list\"\n }\n },\n \"BLOCKCHAIN\": {\n \"HASH\": \"Hash: {{hash}}\",\n \"VIEW\": {\n \"HEADER_TITLE\": \"Block #{{number}}-{{hash|formatHash}}\",\n \"TITLE_CURRENT\": \"Current block\",\n \"TITLE\": \"Block #{{number|formatInteger}}\",\n \"COMPUTED_BY\": \"Computed by\",\n \"SHOW_RAW\": \"Show raw data\",\n \"TECHNICAL_DIVIDER\": \"Technical informations\",\n \"VERSION\": \"Format version\",\n \"HASH\": \"Computed hash\",\n \"UNIVERSAL_DIVIDEND_HELP\": \"Money co-produced by each of the {{membersCount}} members\",\n \"EMPTY\": \"Aucune donnée dans ce bloc\",\n \"POW_MIN\": \"Minimal difficulty\",\n \"POW_MIN_HELP\": \"Difficulty imposed in calculating hash\",\n \"DATA_DIVIDER\": \"Data\",\n \"IDENTITIES_COUNT\": \"New identities\",\n \"JOINERS_COUNT\": \"Joiners\",\n \"ACTIVES_COUNT\": \"Renewals\",\n \"ACTIVES_COUNT_HELP\": \"Members having renewed their membership\",\n \"LEAVERS_COUNT\": \"Leavers\",\n \"LEAVERS_COUNT_HELP\": \"Members that now refused certification\",\n \"EXCLUDED_COUNT\": \"Excluded members\",\n \"EXCLUDED_COUNT_HELP\": \"Old members, excluded because missing membreship renewal or certifications\",\n \"REVOKED_COUNT\": \"Revoked identities\",\n \"REVOKED_COUNT_HELP\": \"These accounts may no longer be member\",\n \"TX_COUNT\": \"Transactions\",\n \"CERT_COUNT\": \"Certifications\",\n \"TX_TO_HIMSELF\": \"Change\",\n \"TX_OUTPUT_UNLOCK_CONDITIONS\": \"Unlock conditions\",\n \"TX_OUTPUT_OPERATOR\": {\n \"AND\": \"and\",\n \"OR\": \"or\"\n },\n \"TX_OUTPUT_FUNCTION\": {\n \"SIG\": \"<b>Sign</b> of the public key\",\n \"XHX\": \"<b>Password</b>, including SHA256 =\",\n \"CSV\": \"Blocked during\",\n \"CLTV\": \"Bloqué until\"\n }\n },\n \"LOOKUP\": {\n \"TITLE\": \"Blocks\",\n \"NO_BLOCK\": \"No bloc\",\n \"LAST_BLOCKS\": \"Last blocks:\",\n \"BTN_COMPACT\": \"Compact\"\n }\n },\n \"CURRENCY\": {\n \"VIEW\": {\n \"TITLE\": \"Currency\",\n \"TAB_CURRENCY\": \"Currency\",\n \"TAB_WOT\": \"Web of trust\",\n \"TAB_NETWORK\": \"Network\",\n \"TAB_BLOCKS\": \"Blocks\",\n \"CURRENCY_SHORT_DESCRIPTION\": \"{{currency|capitalize}} is a <b>libre money</b>, started {{firstBlockTime | formatFromNow}}. It currently counts <b>{{N}} members </b>, who produce and collect a <a ng-click=\\\"showHelpModal('ud')\\\">Universal Dividend</a> (DU), each {{dt | formatPeriod}}.\",\n \"NETWORK_RULES_DIVIDER\": \"Network rules\",\n \"CURRENCY_NAME\": \"Currency name\",\n \"MEMBERS\": \"Members count\",\n \"MEMBERS_VARIATION\": \"Variation since {{duration|formatDuration}} (since last UD)\",\n \"MONEY_DIVIDER\": \"Money\",\n \"MASS\": \"Monetary mass\",\n \"SHARE\": \"Money share\",\n \"UD\": \"Universal Dividend\",\n \"C_ACTUAL\": \"Current growth\",\n \"MEDIAN_TIME\": \"Current blockchain time\",\n \"POW_MIN\": \"Common difficulty\",\n \"MONEY_RULES_DIVIDER\": \"Rules of currency\",\n \"C_RULE\": \"Theoretical growth target\",\n \"UD_RULE\": \"Universal dividend (formula)\",\n \"DT_REEVAL\": \"Period between two re-evaluation of the UD\",\n \"REEVAL_SYMBOL\": \"reeval\",\n \"DT_REEVAL_VALUE\": \"Every <b>{{dtReeval|formatDuration}}</b> ({{dtReeval/86400}} {{'COMMON.DAYS'|translate}})\",\n \"UD_REEVAL_TIME0\": \"Date of first reevaluation of the UD\",\n \"SIG_QTY_RULE\": \"Required number of certifications to become a member\",\n \"SIG_STOCK\": \"Maximum number of certifications sent by a member\",\n \"SIG_PERIOD\": \"Minimum delay between 2 certifications sent by one and the same issuer.\",\n \"SIG_WINDOW\": \"Maximum delay before a certification will be treated\",\n \"SIG_VALIDITY\": \"Lifetime of a certification that has been treated\",\n \"MS_WINDOW\": \"Maximum delay before a pending membership will be treated\",\n \"MS_VALIDITY\": \"Lifetime of a membership that has been treated\",\n \"STEP_MAX\": \"Maximum distance between a newcomer and each referring members.\",\n \"WOT_RULES_DIVIDER\": \"Rules for web of trust\",\n \"SENTRIES\": \"Required number of certifications (given <b>and</b> received) to become a referring member\",\n \"SENTRIES_FORMULA\": \"Required number of certifications to become a referring member (formula)\",\n \"XPERCENT\":\"Minimum percent of referring member to reach to match the distance rule\",\n \"AVG_GEN_TIME\": \"The average time between 2 blocks\",\n \"CURRENT\": \"current\",\n \"MATH_CEILING\": \"CEILING\",\n \"DISPLAY_ALL_RULES\": \"Display all rules?\",\n \"BTN_SHOW_LICENSE\": \"Show license\",\n \"WOT_DIVIDER\": \"Web of trust\"\n },\n \"LICENSE\": {\n \"TITLE\": \"Currency license\",\n \"BTN_DOWNLOAD\": \"Download file\",\n \"NO_LICENSE_FILE\": \"License file not found.\"\n }\n },\n \"NETWORK\": {\n \"VIEW\": {\n \"MEDIAN_TIME\": \"Blockchain time\",\n \"LOADING_PEERS\": \"Loading peers...\",\n \"NODE_ADDRESS\": \"Address:\",\n \"SOFTWARE\": \"Software:\",\n \"WARN_PRE_RELEASE\": \"Pre-release (latest stable: <b>{{version}}</b>)\",\n \"WARN_NEW_RELEASE\": \"Version <b>{{version}}</b> available\",\n \"WS2PID\": \"Identifier:\",\n \"PRIVATE_ACCESS\": \"Private access\",\n \"POW_PREFIX\": \"Proof of work prefix:\",\n \"ENDPOINTS\": {\n \"BMAS\": \"Secure endpoint (SSL)\",\n \"BMATOR\": \"TOR endpoint\",\n \"WS2P\": \"WS2P endpoint\",\n \"ES_USER_API\": \"Cesium+ data node\"\n }\n },\n \"INFO\": {\n \"ONLY_SSL_PEERS\": \"Non-SSL nodes have a degraded display because Cesium works in HTTPS mode.\"\n }\n },\n \"PEER\": {\n \"PEERS\": \"Peers\",\n \"SIGNED_ON_BLOCK\": \"Signed on block\",\n \"MIRROR\": \"mirror\",\n \"MIRRORS\": \"Mirrors\",\n \"MIRROR_PEERS\": \"Mirror peers\",\n \"PEER_LIST\" : \"Peer's list\",\n \"MEMBERS\" : \"Members\",\n \"MEMBER_PEERS\" : \"Member peers\",\n \"ALL_PEERS\" : \"All peers\",\n \"DIFFICULTY\" : \"Difficulty\",\n \"API\" : \"API\",\n \"CURRENT_BLOCK\" : \"Block #\",\n \"POPOVER_FILTER_TITLE\": \"Filter\",\n \"OFFLINE\": \"Offline\",\n \"OFFLINE_PEERS\": \"Offline peers\",\n \"BTN_SHOW_PEER\": \"Show peer\",\n \"VIEW\": {\n \"TITLE\": \"Peer\",\n \"OWNER\": \"Owned by \",\n \"SHOW_RAW_PEERING\": \"See peering document\",\n \"SHOW_RAW_CURRENT_BLOCK\": \"See current block (raw format)\",\n \"LAST_BLOCKS\": \"Last blocks\",\n \"KNOWN_PEERS\": \"Known peers :\",\n \"GENERAL_DIVIDER\": \"General information\",\n \"ERROR\": {\n \"LOADING_TOR_NODE_ERROR\": \"Could not get peer data, using the TOR network.\",\n \"LOADING_NODE_ERROR\": \"Could not get peer data\"\n }\n }\n },\n \"WOT\": {\n \"SEARCH_HELP\": \"Search (member or public key)\",\n \"SEARCH_INIT_PHASE_WARNING\": \"During the pre-registration phase, the search for pending registrations <b>may be long</b>. Please wait ...\",\n \"REGISTERED_SINCE\": \"Registered on\",\n \"REGISTERED_SINCE_BLOCK\": \"Registered since block #\",\n \"NO_CERTIFICATION\": \"No validated certification\",\n \"NO_GIVEN_CERTIFICATION\": \"No given certification\",\n \"NOT_MEMBER_PARENTHESIS\": \"(non-member)\",\n \"IDENTITY_REVOKED_PARENTHESIS\": \"(identity revoked)\",\n \"MEMBER_PENDING_REVOCATION_PARENTHESIS\": \"(being revoked)\",\n \"EXPIRE_IN\": \"Expires\",\n \"NOT_WRITTEN_EXPIRE_IN\": \"Deadline<br/>treatment\",\n \"EXPIRED\": \"Expired\",\n \"PSEUDO\": \"Pseudonym\",\n \"SIGNED_ON_BLOCK\": \"Emitted on block #{{block}}\",\n \"WRITTEN_ON_BLOCK\": \"Written on block #{{block}}\",\n \"GENERAL_DIVIDER\": \"General information\",\n \"NOT_MEMBER_ACCOUNT\": \"Non-member account\",\n \"NOT_MEMBER_ACCOUNT_HELP\": \"This is a simple wallet, with no pending membership application.\",\n \"TECHNICAL_DIVIDER\": \"Technical data\",\n \"BTN_CERTIFY\": \"Certify\",\n \"BTN_YES_CERTIFY\": \"Yes, certify\",\n \"BTN_SELECT_AND_CERTIFY\": \"New certification\",\n \"ACCOUNT_OPERATIONS\": \"Account operations\",\n \"VIEW\": {\n \"POPOVER_SHARE_TITLE\": \"Identity {{title}}\"\n },\n \"LOOKUP\": {\n \"TITLE\": \"Registry\",\n \"NEWCOMERS\": \"New members:\",\n \"NEWCOMERS_COUNT\": \"{{count}} members\",\n \"PENDING\": \"Pending registrations:\",\n \"PENDING_COUNT\": \"{{count}} pending registrations\",\n \"REGISTERED\": \"Registered {{sigDate | formatFromNow}}\",\n \"MEMBER_FROM\": \"Member since {{memberDate|medianFromNowShort}}\",\n \"BTN_NEWCOMERS\": \"Latest members\",\n \"BTN_PENDING\": \"Pending registrations\",\n \"SHOW_MORE\": \"Show more\",\n \"SHOW_MORE_COUNT\": \"(current limit to {{limit}})\",\n \"NO_PENDING\": \"No pending registrations.\",\n \"NO_NEWCOMERS\": \"No members.\"\n },\n \"CONTACTS\": {\n \"TITLE\": \"Contacts\"\n },\n \"MODAL\": {\n \"TITLE\": \"Search\"\n },\n \"CERTIFICATIONS\": {\n \"TITLE\": \"{{uid}} - Certifications\",\n \"SUMMARY\": \"Received certifications\",\n \"LIST\": \"Details of received certifications\",\n \"PENDING_LIST\": \"Pending certifications\",\n \"RECEIVED\": \"Received certifications\",\n \"RECEIVED_BY\": \"Certifications received by {{uid}}\",\n \"ERROR\": \"Received certifications in error\",\n \"SENTRY_MEMBER\": \"Referring member\"\n },\n \"OPERATIONS\": {\n \"TITLE\": \"{{uid}} - Operations\"\n },\n \"GIVEN_CERTIFICATIONS\": {\n \"TITLE\": \"{{uid}} - Certifications sent\",\n \"SUMMARY\": \"Sent certifications\",\n \"LIST\": \"Details of sent certifications\",\n \"PENDING_LIST\": \"Pending certifications\",\n \"SENT\": \"Sent certifications\",\n \"SENT_BY\": \"Certifications sent by {{uid}}\",\n \"ERROR\": \"Sent certifications with error\"\n }\n },\n \"LOGIN\": {\n \"TITLE\": \"<i class=\\\"icon ion-log-in\\\"></i> Login\",\n \"SCRYPT_FORM_HELP\": \"Please enter your credentials. <br> Remember to check the public key for your account.\",\n \"PUBKEY_FORM_HELP\": \"Please enter a public account key:\",\n \"FILE_FORM_HELP\": \"Choose the keychain file to use:\",\n \"SCAN_FORM_HELP\": \"Scan the QR code of a wallet.\",\n \"SALT\": \"Secret identifier\",\n \"SALT_HELP\": \"Secret identifier\",\n \"SHOW_SALT\": \"Display secret identifier?\",\n \"PASSWORD\": \"Password\",\n \"PASSWORD_HELP\": \"Password\",\n \"PUBKEY_HELP\": \"Public key or pseudonym\",\n \"NO_ACCOUNT_QUESTION\": \"Don't have an account yet?\",\n \"HAVE_ACCOUNT_QUESTION\": \"Already have an account ?\",\n \"CREATE_ACCOUNT\": \"Create an account\",\n \"CREATE_FREE_ACCOUNT\": \"Create a free account\",\n \"FORGOTTEN_ID\": \"Forgot password?\",\n \"ASSOCIATED_PUBKEY\": \"Public key :\",\n \"BTN_METHODS\": \"Other methods\",\n \"BTN_METHODS_DOTS\": \"Change method...\",\n \"METHOD_POPOVER_TITLE\": \"Methods\",\n \"MEMORIZE_AUTH_FILE\": \"Memorize this keychain during the navigation session\",\n \"SCRYPT_PARAMETERS\": \"Paramètres (Scrypt) :\",\n \"AUTO_LOGOUT\": {\n \"TITLE\": \"Information\",\n \"MESSAGE\": \"<i class=\\\"ion-android-time\\\"></i> You were <b>logout</ b> automatically, due to prolonged inactivity.\",\n \"BTN_RELOGIN\": \"Sign In\",\n \"IDLE_WARNING\": \"You will be logout... {{countdown}}\"\n },\n \"METHOD\": {\n \"SCRYPT_DEFAULT\": \"Secret identifier and password\",\n \"SCRYPT_ADVANCED\": \"Advanced salt\",\n \"FILE\": \"Keychain file\",\n \"PUBKEY\": \"Public key or pseudonym\",\n \"SCAN\": \"Scan a QR code\"\n },\n \"SCRYPT\": {\n \"SIMPLE\": \"Light salt\",\n \"DEFAULT\": \"Standard salt\",\n \"SECURE\": \"Secure salt\",\n \"HARDEST\": \"Hardest salt\",\n \"EXTREME\": \"Extreme salt\",\n \"USER\": \"Personal value\",\n \"N\": \"N (Loop):\",\n \"r\": \"r (RAM):\",\n \"p\": \"p (CPU):\"\n },\n \"FILE\": {\n \"HELP\": \"Expected file format: <b>.dunikey</b> (type PubSec). Other formats are under development (EWIF, WIF).\"\n }\n },\n \"AUTH\": {\n \"TITLE\": \"<i class=\\\"icon ion-locked\\\"></i> Authentication\",\n \"BTN_AUTH\": \"Authenticate\",\n \"GENERAL_HELP\": \"Please authenticate yourself:\",\n \"EXPECTED_UID_HELP\": \"Please authenticate to the account <i class=\\\"ion-person\\\"></i> {{uid}}:\",\n \"EXPECTED_PUBKEY_HELP\": \"Please authenticate to the wallet <i class=\\\"ion-key\\\"></i> {{pubkey|formatPubkey}}:\",\n \"SCAN_FORM_HELP\": \"Scan the QR code of the <b>private key</b> of the wallet.\"\n },\n \"ACCOUNT\": {\n \"TITLE\": \"My Account\",\n \"BALANCE\": \"Balance\",\n \"LAST_TX\": \"Latest validated transactions\",\n \"BALANCE_ACCOUNT\": \"Account balance\",\n \"NO_TX\": \"No transaction\",\n \"SHOW_MORE_TX\": \"Show more\",\n \"SHOW_ALL_TX\": \"Show all\",\n \"TX_FROM_DATE\": \"(current limit to {{fromTime|medianFromNowShort}})\",\n \"PENDING_TX\": \"Pending transactions\",\n \"VALIDATING_TX\": \"Transactions being validated\",\n \"ERROR_TX\": \"Transaction not executed\",\n \"ERROR_TX_SENT\": \"Sent transactions\",\n \"PENDING_TX_RECEIVED\": \"Transactions awaiting receipt\",\n \"EVENTS\": \"Events\",\n \"OUT_DISTANCED\": \"Your current certifications come from a group too isolated from the <a ng-click=\\\"showHelpModal('wot')\\\"> Web of Trust</a> (WoT): the <a ng-click=\\\"showHelpModal('distance_rule')\\\">maximum distance rule</a> is violated.<br/>You must obtain certifications from another area of the Web of Trust, or wait for it to tighten.\",\n \"WAITING_MEMBERSHIP\": \"Membership application sent. Waiting validation.\",\n \"WAITING_CERTIFICATIONS\": \"You need {{needCertificationCount}} certification(s) to become a member and produce the <a ng-click=\\\"showHelpModal('ud')\\\">Universal Dividend</a>. Your account is however already operational, to receive and send payments.\",\n \"WAITING_CERTIFICATIONS_HELP\": \"To get your certifications, only request members <b>who know you enough</b>, as required by <a ng-click=\\\"showLicenseModal()\\\">the currency license</a> that you have accepted.<br/>If you do not know enough members, let them know on <a ng-click=\\\"openLink($event, $root.settings.userForumUrl)\\\">the user forum</a>.\",\n \"WILL_MISSING_CERTIFICATIONS\": \"You will <b>lack certifications</b> soon (at least {{willNeedCertificationCount}} more are needed)\",\n \"WILL_NEED_RENEW_MEMBERSHIP\": \"Your membership <b>will expire {{membershipExpiresIn|formatDurationTo}}</b>. Remember to <a ng-click=\\\"doQuickFix('renew')\\\">renew your membership</a> before then.\",\n \"NEED_RENEW_MEMBERSHIP\": \"You are no longer a member because your membership <b>has expired</b>. Remember to <a ng-click=\\\"doQuickFix('renew')\\\">renew your membership</a>.\",\n \"NEED_RENEW_MEMBERSHIP_AFTER_CANCELLED\": \"You are no longer a member because your membership <b>has been canceled</b> for lack of certifications. Remember to <a ng-click=\\\"doQuickFix('renew')\\\">renew your membership</a>.\",\n \"NO_WAITING_MEMBERSHIP\": \"No membership application pending. If you'd like to <b>become a member</ b>, please <a ng-click=\\\"doQuickFix('membership')\\\">send the membership application</a>.\",\n \"CERTIFICATION_COUNT\": \"Received certifications\",\n \"CERTIFICATION_COUNT_SHORT\": \"Certifications\",\n \"SIG_STOCK\": \"Stock of certifications to give\",\n \"BTN_RECEIVE_MONEY\": \"Receive\",\n \"BTN_SELECT_ALTERNATIVES_IDENTITIES\": \"Switch to another identity...\",\n \"BTN_FIX_MEMBERSHIP\": \"Resubmit membership request...\",\n \"BTN_MEMBERSHIP_RENEW\": \"Renew membership\",\n \"BTN_MEMBERSHIP_RENEW_DOTS\": \"Renew membership...\",\n \"BTN_MEMBERSHIP_OUT_DOTS\": \"Revoke membership...\",\n \"BTN_SECURITY_DOTS\": \"Sign-in and security...\",\n \"BTN_SHOW_DETAILS\": \"Display technical data\",\n \"LOCKED_OUTPUTS_POPOVER\": {\n \"TITLE\": \"Locked amount\",\n \"DESCRIPTION\": \"Here are the conditions for unlocking this amount:\",\n \"DESCRIPTION_MANY\": \"This transaction consists of several parts, of which the unlock conditions are:\",\n \"LOCKED_AMOUNT\": \"Conditions for the amount:\"\n },\n \"NEW\": {\n \"TITLE\": \"Registration\",\n \"INTRO_WARNING_TIME\": \"Creating an account on {{name|capitalize}} is very simple. Please take sufficient time to do this correctly (not to forget the usernames, passwords, etc.).\",\n \"INTRO_WARNING_SECURITY\": \"Check that the hardware you are currently using (computer, tablet, phone) <b>is secure and trustworthy </b>.\",\n \"INTRO_WARNING_SECURITY_HELP\": \"Up-to-date anti-virus, firewall enabled, session protected by password or pin code...\",\n \"INTRO_HELP\": \"Click <b> {{'COMMON.BTN_START'|translate}}</b> to begin creating an account. You will be guided step by step.\",\n \"REGISTRATION_NODE\": \"Your registration will be registered via the Duniter peer <b>{{server}}</b> node, which will then be distributed to the rest of the currency network.\",\n \"REGISTRATION_NODE_HELP\": \"If you do not trust this peer, please change <a ng-click=\\\"doQuickFix('settings')\\\">in the settings</a> of Cesium.\",\n \"SELECT_ACCOUNT_TYPE\": \"Choose the type of account to create:\",\n \"MEMBER_ACCOUNT\": \"Member account\",\n \"MEMBER_ACCOUNT_TITLE\": \"Create a member account\",\n \"MEMBER_ACCOUNT_HELP\": \"If you are not yet registered as an individual (one account possible per individual).\",\n \"WALLET_ACCOUNT\": \"Simple wallet\",\n \"WALLET_ACCOUNT_TITLE\": \"Create a wallet\",\n \"WALLET_ACCOUNT_HELP\": \"If you represent a company, association, etc. or simply need an additional wallet. No universal dividend will be created by this account.\",\n \"SALT_WARNING\": \"Choose a secret identifier.<br/>You need it for each connection to this account.<br/><br/><b>Make sure to remember this identifier</b>.<br/>If lost, there are no means to retrieve it!\",\n \"PASSWORD_WARNING\": \"Choose a password.<br/>You need it for each connection to this account.<br/><br/><b>Make sure to remember this password</b>.<br/>If lost, there are no means to retrieve it!\",\n \"PSEUDO_WARNING\": \"Choose a pseudonym.<br/>It may be used by other people to find you more easily.<br/><br/>.Use of <b>commas, spaces and accents</b> is not allowed.<br/><div class='hidden-xs'><br/>Example: <span class='gray'>JohnDalton, JackieChan, etc.</span>\",\n \"PSEUDO\": \"Pseudonym\",\n \"PSEUDO_HELP\": \"joe123\",\n \"SALT_CONFIRM\": \"Confirm\",\n \"SALT_CONFIRM_HELP\": \"Confirm the secret identifier\",\n \"PASSWORD_CONFIRM\": \"Confirm\",\n \"PASSWORD_CONFIRM_HELP\": \"Confirm the password\",\n \"SLIDE_6_TITLE\": \"Confirmation:\",\n \"COMPUTING_PUBKEY\": \"Computing...\",\n \"LAST_SLIDE_CONGRATULATION\": \"You completed all required fields.<br/><b>You can send the account creation request</b>.<br/><br/>For information, the public key below identifies your future account.<br/>It can be communicated to third parties to receive their payment.<br/>Once your account has been approved, you can find this key under <b>{{'ACCOUNT.TITLE'|translate}}</b>.\",\n \"CONFIRMATION_MEMBER_ACCOUNT\": \"<b class=\\\"assertive\\\">Warning:</b> your secret identifier, password and pseudonym can not be changed.<br/><b>Make sure you always remember it!</b><br/><b>Are you sure</b> you want to send this account creation request?\",\n \"CONFIRMATION_WALLET_ACCOUNT\": \"<b class=\\\"assertive\\\">Warning:</b> your password and pseudonym can not be changed.<br/><b>Make sure you always remember it!</b><br/><b>Are you sure</b> you want to continue?\",\n \"CHECKING_PSEUDO\": \"Checking...\",\n \"PSEUDO_AVAILABLE\": \"This pseudonym is available\",\n \"PSEUDO_NOT_AVAILABLE\": \"This pseudonym is not available\",\n \"INFO_LICENSE\": \"To be able to adhere to the currency, we ask you to kindly read and accept this license.\",\n \"BTN_ACCEPT\": \"I accept\",\n \"BTN_ACCEPT_LICENSE\": \"I accept the license\"\n },\n \"POPUP_REGISTER\": {\n \"TITLE\": \"Enter a pseudonym\",\n \"HELP\": \"A pseudonym is needed to let other members find you.\"\n },\n \"SELECT_IDENTITY_MODAL\": {\n \"TITLE\": \"Identity selection\",\n \"HELP\": \"Several <b>different identities</b> have been sent, for the public key <span class=\\\"gray\\\"> <i class=\\\"ion-key\\\"></i> {{pubkey | formatPubkey}}</span>.<br/>Please select the identity to use:\"\n },\n \"SELECT_WALLET_MODAL\": {\n \"TITLE\": \"Wallet selection\"\n },\n \"WALLET_LIST\": {\n \"TITLE\": \"My wallets\",\n \"BTN_NEW\": \"Add a wallet\",\n \"BTN_DOWNLOAD\": \"Download the list\",\n \"BTN_IMPORT_FILE_DOTS\": \"Import from a file...\",\n \"NO_WALLET\": \"No secondary wallet\",\n \"BTN_DELETE\": \"Remove a secondary wallet...\",\n \"BTN_RENAME\": \"Rename the wallet\",\n \"EXPORT_FILENAME\": \"my_wallets-{{pubkey|formatPubkey}}-{{currency}}.csv\",\n \"TOTAL_DOTS\": \"Total: \",\n \"EDIT_POPOVER\": {\n \"TITLE\": \"Rename the wallet\",\n \"HELP\": \"Fill in the new name\",\n \"NAME_HELP\": \"Wallet name\"\n },\n \"IMPORT_MODAL\": {\n \"TITLE\": \"Import secondary wallets\",\n \"HELP\": \"To <b>import secodnary wallets</b>, please drag the file in the box below, or click in the box to search for a file.\",\n \"WALLET_COUNT\": \"<b>{{count}}</b> new wallet{{count > 1 ? 's' : ''}}\",\n \"NO_NEW_WALLET\": \"No new wallet\"\n }\n },\n \"SECURITY\":{\n \"ADD_QUESTION\" : \"Add custom question\",\n \"BTN_CLEAN\" : \"Clean\",\n \"BTN_RESET\" : \"Reset\",\n \"DOWNLOAD_REVOKE\": \"Save a revocation file\",\n \"DOWNLOAD_REVOKE_HELP\" : \"Having a revocation file is important, for example in case of loss of identifiers. It allows you to <b>get this account out of the Web Of Trust</b>, thus becoming a simple wallet.\",\n \"GENERATE_KEYFILE\": \"Generate my keychain file ...\",\n \"GENERATE_KEYFILE_HELP\": \"Generate a file allowing you to authenticate without entering your identifiers.<br/><b>Warning:</b> this file will contain your secret key; It is therefore very important to put it in a safe place!\",\n \"KEYFILE_FILENAME\": \"keychain-{{pubkey|formatPubkey}}-{{currency}}-{{format}}.dunikey\",\n \"MEMBERSHIP_IN\": \"Register as member...\",\n \"MEMBERSHIP_IN_HELP\": \"Allows you to <b>transform </b> a simple wallet account <b>into a member account</b>, by sending a membership request. Useful only if you do not already have another member account.\",\n \"SEND_IDENTITY\": \"Publish identity...\",\n \"SEND_IDENTITY_HELP\": \"Allows you to associate a pseudonym to this account, but <b>without applying for membership</b> to become a member. This is not very useful because the validity of this pseudonym association is limited in time.\",\n \"HELP_LEVEL\": \"Choose <strong> at least {{nb}} questions </strong> :\",\n \"LEVEL\": \"Security level\",\n \"LOW_LEVEL\": \"Low <span class=\\\"hidden-xs\\\">(2 questions minimum)</span>\",\n \"MEDIUM_LEVEL\": \"Medium <span class=\\\"hidden-xs\\\">(4 questions minimum)</span>\",\n \"QUESTION_1\": \"What was your best friend's name when you were a teen ?\",\n \"QUESTION_2\": \"What was the name of your first pet ?\",\n \"QUESTION_3\": \"What is the first meal you have learned to cook ?\",\n \"QUESTION_4\": \"What is the first movie you saw in the cinema?\",\n \"QUESTION_5\": \"Where did you go the first time you flew ?\",\n \"QUESTION_6\": \"What was your favorite elementary school teacher's name ?\",\n \"QUESTION_7\": \"What would you consider the ideal job ?\",\n \"QUESTION_8\": \"Which children's book do you prefer?\",\n \"QUESTION_9\": \"What was the model of your first vehicle?\",\n \"QUESTION_10\": \"What was your nickname when you were a child ?\",\n \"QUESTION_11\": \"What was your favorite movie character or actor when you were a student ?\",\n \"QUESTION_12\": \"What was your favorite singer or band when you were a student ?\",\n \"QUESTION_13\": \"In which city did your parents meet ?\",\n \"QUESTION_14\": \"What was the name of your first boss ?\",\n \"QUESTION_15\": \"What is the name of the street where you grew up ?\",\n \"QUESTION_16\": \"What is the name of the first beach where you go swim ?\",\n \"QUESTION_17\": \"QWhat is the first album you bought ?\",\n \"QUESTION_18\": \"What is the name of your favorite sport team ?\",\n \"QUESTION_19\": \"What was your grand-father's job ?\",\n \"RECOVER_ID\": \"Recover my password...\",\n \"RECOVER_ID_HELP\": \"If you have a <b>backup file of your identifiers</b>, you can find them by answering your personal questions correctly.\",\n \"RECOVER_ID_SELECT_FILE\": \"Select the <b>backup file of your identifiers</b> to use:\",\n \"REVOCATION_WITH_FILE\" : \"Revoke my member account...\",\n \"REVOCATION_WITH_FILE_DESCRIPTION\": \"If you have <b>permanently lost your member account credentials (or if account security is compromised), you can use <b>the revocation file</b> of the account <b>to quit the Web Of Trust</b>.\",\n \"REVOCATION_WITH_FILE_HELP\": \"To <b>permanently revoke</ b> a member account, please drag the revocation file in the box below, or click in the box to search for a file.\",\n \"REVOCATION_WALLET\": \"Revoke this account immediately\",\n \"REVOCATION_WALLET_HELP\": \"Requesting revocation of your identity causes <b>will revoke your membership</ b> (definitely for the associated pseudonym and public key). The account will no longer be able to produce a Universal Dividend.<br/>However, you can still use it as a simple wallet.\",\n \"REVOCATION_FILENAME\": \"revocation-{{uid}}-{{pubkey|formatPubkey}}-{{currency}}.txt\",\n \"SAVE_ID\": \"Save my credentials...\",\n \"SAVE_ID_HELP\": \"Creating a backup file, to <b>retrieve your password</b> (and the secret identifier) <b> in case of forgetting</b>. The file is <b>secured</ b> (encrypted) using personal questions.\",\n \"STRONG_LEVEL\": \"Strong <span class=\\\"hidden-xs \\\">(6 questions minimum)</span>\",\n \"TITLE\": \"Account and security\",\n \"KEYFILE\": {\n \"PUBSEC_FORMAT\": \"PubSec format.\",\n \"PUBSEC_FORMAT_HELP\": \"This file format is compatible in particular with Cesium and Gannonce. Your keychain is stored <b>without encryption</b>: anyone with a copy of this file will be able to empty your account.\",\n \"WIF_FORMAT\": \"Wallet Import Format (WIF)\",\n \"WIF_FORMAT_HELP\": \"This format is used in particular by paper wallets. Your keychain is stored <b>without encryption</b>: anyone with a copy of this file will be able to empty your account.\",\n \"EWIF_FORMAT\": \"Encrypted Wallet Import Format (WIF)\",\n \"EWIF_FORMAT_HELP\": \"This format is used in particular by paper wallets. However, <b>the keychain is encrypted</b> from a passphrase of your choice.\",\n \"PASSWORD_POPUP\": {\n \"TITLE\": \"Keychain file encrypted\",\n \"HELP\": \"Please enter the passphrase:\",\n \"PASSWORD_HELP\": \"Passphrase\"\n },\n \"ERROR\": {\n \"BAD_PASSWORD\": \"Bad passphrase\",\n \"BAD_CHECKSUM\": \"Bad checksum\"\n }\n }\n },\n \"FILE_NAME\": \"{{currency}} - Account statement {{pubkey|formatPubkey}} to {{currentTime|formatDateForFile}}.csv\",\n \"HEADERS\": {\n \"TIME\": \"Date\",\n \"AMOUNT\": \"Amount\",\n \"COMMENT\": \"Comment\"\n }\n },\n \"TRANSFER\": {\n \"TITLE\": \"Transfer\",\n \"SUB_TITLE\": \"Transfer money\",\n \"SUB_TITLE_ALL\": \"Empty the account\",\n \"FROM\": \"From\",\n \"TO\": \"To\",\n \"AMOUNT\": \"Amount\",\n \"AMOUNT_HELP\": \"Amount\",\n \"COMMENT\": \"Comment\",\n \"COMMENT_HELP\": \"Comment (optional)\",\n \"BTN_SEND\": \"Send\",\n \"BTN_ADD_COMMENT\": \"Add a comment\",\n \"REST\": \"Rest of account\",\n \"REST_TO\": \"to\",\n \"WARN_COMMENT_IS_PUBLIC\": \"Please note that <b>comments are public</b> (not encrypted).\",\n \"MODAL\": {\n \"TITLE\": \"Transfer\"\n }\n },\n \"ERROR\": {\n \"UNKNOWN_URI_FORMAT\": \"Unknown URI format\",\n \"PUBKEY_INVALID_CHECKSUM\": \"Invalid public key (bad checksum).\",\n \"POPUP_TITLE\": \"Error\",\n \"UNKNOWN_ERROR\": \"Unknown error\",\n \"CRYPTO_UNKNOWN_ERROR\": \"Your browser is not compatible with cryptographic features.\",\n \"DOWNLOAD_KEYFILE_FAILED\": \"Failed to generate the keychain file.\",\n \"EQUALS_TO_PSEUDO\": \"Must be different from pseudonym\",\n \"EQUALS_TO_SALT\": \"Must be different from secret identifier\",\n \"FIELD_REQUIRED\": \"This field is required.\",\n \"FIELD_TOO_SHORT\": \"This field value is too short.\",\n \"FIELD_TOO_SHORT_WITH_LENGTH\": \"Value is too short (min {{minLength]] characters).\",\n \"FIELD_TOO_LONG\": \"Value is exceeding max length.\",\n \"FIELD_TOO_LONG_WITH_LENGTH\": \"Value is too long (max {{maxLength}} characters).\",\n \"FIELD_MIN\": \"Minimum value: {{min}}\",\n \"FIELD_MAX\": \"Maximal value: {{max}}\",\n \"FIELD_ACCENT\": \"Commas and accent characters not allowed\",\n \"FIELD_NOT_NUMBER\": \"Value is not a number\",\n \"FIELD_NOT_INT\": \"Value is not an integer\",\n \"FIELD_NOT_EMAIL\": \"Email adress not valid\",\n \"PASSWORD_NOT_CONFIRMED\": \"Must match previous password.\",\n \"SALT_NOT_CONFIRMED\": \"Must match previous identifier.\",\n \"SEND_IDENTITY_FAILED\": \"Error while trying to register.\",\n \"SEND_CERTIFICATION_FAILED\": \"Could not certify identity.\",\n \"NEED_MEMBER_ACCOUNT_TO_CERTIFY\": \"You could not send certification, because your account is <b>not a member account</b>.\",\n \"NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF\": \"You could not send certification now, because your are <b>not a member</b> yet.<br/><br/>You still need certification to become a member.\",\n \"IDENTITY_TO_CERTIFY_HAS_NO_SELF\": \"This account could not be certified. No registration found, or need to renew.\",\n \"LOGIN_FAILED\": \"Error while sign in.\",\n \"LOAD_IDENTITY_FAILED\": \"Could not load identity.\",\n \"LOAD_REQUIREMENTS_FAILED\": \"Could not load identity requirements.\",\n \"SEND_MEMBERSHIP_IN_FAILED\": \"Error while sending registration as member.\",\n \"SEND_MEMBERSHIP_OUT_FAILED\": \"Error while sending membership revocation.\",\n \"REFRESH_WALLET_DATA\": \"Could not refresh wallet.\",\n \"GET_CURRENCY_PARAMETER\": \"Could not get currency parameters.\",\n \"GET_CURRENCY_FAILED\": \"Could not load currency. Please retry later.\",\n \"SEND_TX_FAILED\": \"Could not send transaction.\",\n \"ALL_SOURCES_USED\": \"Please wait the next block computation (All transaction sources has been used).\",\n \"NOT_ENOUGH_SOURCES\": \"Not enough changes to send this amount in one time.<br/>Maximum amount: {{amount}} {{unit}}<sub>{{subUnit}}</sub>.\",\n \"ACCOUNT_CREATION_FAILED\": \"Error while creating your member account.\",\n \"RESTORE_WALLET_DATA_ERROR\": \"Error while reloading settings from local storage\",\n \"LOAD_WALLET_DATA_ERROR\": \"Error while loading wallet data.\",\n \"COPY_CLIPBOARD_FAILED\": \"Could not copy to clipboard\",\n \"TAKE_PICTURE_FAILED\": \"Could not get picture.\",\n \"SCAN_FAILED\": \"Could not scan QR code.\",\n \"SCAN_UNKNOWN_FORMAT\": \"Code not recognized.\",\n \"WOT_LOOKUP_FAILED\": \"Search failed.\",\n \"LOAD_PEER_DATA_FAILED\": \"Duniter peer not accessible. Please retry later.\",\n \"NEED_LOGIN_FIRST\": \"Please sign in first.\",\n \"AMOUNT_REQUIRED\": \"Amount is required.\",\n \"AMOUNT_NEGATIVE\": \"Negative amount not allowed.\",\n \"NOT_ENOUGH_CREDIT\": \"Not enough credit.\",\n \"INVALID_NODE_SUMMARY\": \"Unreachable peer or invalid address\",\n \"INVALID_USER_ID\": \"Field 'pseudonym' must not contains spaces or special characters.\",\n \"INVALID_COMMENT\": \"Field 'reference' has a bad format.\",\n \"INVALID_PUBKEY\": \"Public key has a bad format.\",\n \"INVALID_PUBKEY_CHECKSUM\": \"Invalid checksum.\",\n \"IDENTITY_REVOKED\": \"This identity <b>has been revoked</b>. It can no longer become a member.\",\n \"IDENTITY_REVOKED_WITH_TIME\": \"This identity <b>has been revoked {{revocationTime|medianFromNow}}</b> ({{revocationTime|medianDate}}). It can no longer become a member.\",\n \"IDENTITY_PENDING_REVOCATION\": \"The <b>revocation of this identity</b> has been requested and is awaiting processing. Certification is therefore disabled.\",\n \"IDENTITY_INVALID_BLOCK_HASH\": \"This membership application is no longer valid (because it references a block that network peers are cancelled): the person must renew its application for membership <b>before</b> being certified.\",\n \"IDENTITY_EXPIRED\": \"This identity has expired: this person must re-apply <b>before</b> being certified.\",\n \"IDENTITY_SANDBOX_FULL\": \"Could not register, because peer's sandbox is full.<br/><br/>Please retry later or choose another Duniter peer (in <b>Settings</b>).\",\n \"IDENTITY_NOT_FOUND\": \"Identity not found\",\n \"IDENTITY_TX_FAILED\": \"Error while getting identity's transactions\",\n \"WOT_PENDING_INVALID_BLOCK_HASH\": \"Membership not valid.\",\n \"WALLET_INVALID_BLOCK_HASH\": \"Your membership application is no longer valid (because it references a block that network peers are cancelled).<br/>You must <a ng-click=\\\"doQuickFix('renew')\\\">renew your application for membership</a> to fix this issue.\",\n \"WALLET_IDENTITY_EXPIRED\": \"The publication of your identity <b>has expired</b>.<br/>You must <a ng-click=\\\"doQuickFix('fixIdentity')\\\">re-issue your identity</a> to resolve this issue.\",\n \"WALLET_REVOKED\": \"Your identity has been <b>revoked</b>: neither your pseudonym nor your public key will be used in the future for a member account.\",\n \"WALLET_HAS_NO_SELF\": \"Your identity must first have been published, and not expired.\",\n \"AUTH_REQUIRED\": \"Authentication required.\",\n \"AUTH_INVALID_PUBKEY\": \"The public key does not match the connected account.\",\n \"AUTH_INVALID_SCRYPT\": \"Invalid username or password.\",\n \"AUTH_INVALID_FILE\": \"Invalid keychain file.\",\n \"AUTH_FILE_ERROR\": \"Failed to open keychain file\",\n \"IDENTITY_ALREADY_CERTIFY\": \"You have <b>already certified</b> that identity.<br/><br/>Your certificate is still valid (expires {{expiresIn|formatDuration}}).\",\n \"IDENTITY_ALREADY_CERTIFY_PENDING\": \"You have <b>already certified</b> that identity.<br/><br/>Your certification is still pending (Deadline for treatment {{expiresIn|formatDuration}}).\",\n \"UNABLE_TO_CERTIFY_TITLE\": \"Unable to certify\",\n \"LOAD_NEWCOMERS_FAILED\": \"Unable to load new members.\",\n \"LOAD_PENDING_FAILED\": \"Unable to load pending registrations.\",\n \"ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION\": \"You must <b>be a member</b> in order to perform this action.\",\n \"ONLY_MEMBER_OR_WAS_MEMBER_CAN_EXECUTE_THIS_ACTION\": \"You must <b>be a member (or old member)</b> in order to perform this action.\",\n \"ONLY_SELF_CAN_EXECUTE_THIS_ACTION\": \"You must have <b>published your identity</b> in order to perform this action.\",\n \"GET_BLOCK_FAILED\": \"Error while getting block\",\n \"INVALID_BLOCK_HASH\": \"Block not found (incorrect hash)\",\n \"DOWNLOAD_REVOCATION_FAILED\": \"Error while downloading revocation file.\",\n \"REVOCATION_FAILED\": \"Error while trying to revoke the identity.\",\n \"SALT_OR_PASSWORD_NOT_CONFIRMED\": \"Wrong secret identifier or password \",\n \"RECOVER_ID_FAILED\": \"Could not recover password\",\n \"LOAD_FILE_FAILED\" : \"Unable to load file\",\n \"NOT_VALID_REVOCATION_FILE\": \"Invalid revocation file (wrong file format)\",\n \"NOT_VALID_SAVE_ID_FILE\": \"Invalid credentials backup file (wrong file format)\",\n \"NOT_VALID_KEY_FILE\": \"Invalid keychain file (unrecognized format)\",\n \"EXISTING_ACCOUNT\": \"Your identifiers correspond to an already existing account, whose <a ng-click=\\\"showHelpModal('pubkey')\\\">public key</a> is:\",\n \"EXISTING_ACCOUNT_REQUEST\": \"Please modify your credentials so that they correspond to an unused account.\",\n \"GET_LICENSE_FILE_FAILED\": \"Unable to get license file\",\n \"CHECK_NETWORK_CONNECTION\": \"No peer appears to be accessible.<br/><br/>Please <b>check your Internet connection</b>.\",\n \"ISSUE_524_TX_FAILED\": \"Failed to transfer.<br/><br/>A message has been sent to developers to help solve the problem.<b>Thank you for your help</b>.\",\n \"ADD_SECONDARY_WALLET_FAILED\": \"Unable to add secondary wallet.\",\n \"REMOVE_SECONDARY_WALLET_FAILED\": \"Unable to remove secondary wallet.\",\n \"UPDATE_WALLET_LIST_FAILED\": \"Unable to refresh the list of wallets.\",\n \"LOAD_WALLET_LIST_FAILED\": \"Unable to load the list of wallets.\",\n \"SAVE_WALLET_LIST_FAILED\": \"Unable to save the list of wallets.\",\n \"COULD_NOT_ADD_MAIN_WALLET\": \"This wallet <b>is the main account</b> with which you are connected. Unable to add it as a secondary wallet.\",\n \"COULD_NOT_ADD_EXISTING_WALLET\": \"Wallet already existing in the list.\",\n \"UNKNOWN_WALLET_ID\": \"Unknown secondary wallet.\",\n \"RESTORE_WALLET_LIST_FAILED\": \"Unable to restore the list of wallets.\",\n \"INVALID_FILE_FORMAT\": \"Invalid file format.\",\n \"SAME_TX_RECIPIENT\": \"The recipient must be different from the issuer.\"\n },\n \"INFO\": {\n \"POPUP_TITLE\": \"Information\",\n \"CERTIFICATION_DONE\": \"Identity successfully signed\",\n \"NOT_ENOUGH_CREDIT\": \"Not enough credit\",\n \"TRANSFER_SENT\": \"Transfer request successfully sent\",\n \"COPY_TO_CLIPBOARD_DONE\": \"Copy succeeded\",\n \"MEMBERSHIP_OUT_SENT\": \"Membership revocation sent\",\n \"NOT_NEED_MEMBERSHIP\": \"Already a member.\",\n \"IDENTITY_WILL_MISSING_CERTIFICATIONS\": \"This identity will soon lack certification (at least {{willNeedCertificationCount}}).\",\n \"IDENTITY_NEED_MEMBERSHIP\": \"This identity did not send a membership request. She will have to if she wishes to become a member.\",\n \"HAS_ALTERNATIVE_IDENTITIES\": \"There are <b>multiple identities</b> attached to this public key. <b>Before any certification</b>, please <a ng-click=\\\"doQuickFix('showSelectIdentities')\\\">check other identities</a> to choose the correct one, or contact the wallet owner.\",\n \"REVOCATION_SENT\": \"Revocation sent successfully\",\n \"REVOCATION_SENT_WAITING_PROCESS\": \"Revocation <b>has been sent successfully</b>. It is awaiting processing.\",\n \"FEATURES_NOT_IMPLEMENTED\": \"This features is not implemented yet.<br/><br/>Why not to contribute to get it faster? ;)\",\n \"EMPTY_TX_HISTORY\": \"No operations to export\"\n },\n \"CONFIRM\": {\n \"POPUP_TITLE\": \"<b>Confirmation</b>\",\n \"POPUP_WARNING_TITLE\": \"<b>Warning</b>\",\n \"POPUP_SECURITY_WARNING_TITLE\": \"<i class=\\\"icon ion-alert-circled\\\"></i> <b>Security warning</b>\",\n \"CERTIFY_RULES_TITLE_UID\": \"Certify {{uid}}\",\n \"CERTIFY_RULES\": \"<b class=\\\"assertive\\\">Don't certify an account</b> if you believe that: <ul><li>1.) the issuers identity might be faked.<li>2.) the issuer already has another certified account.<li>3.) the issuer purposely or carelessly violates rule 1 or 2 (he certifies faked or double accounts).</ul></small><br/>Are you sure you want to certify this identity?\",\n \"FULLSCREEN\": \"View the application in full screen?\",\n \"EXIT_APP\": \"Close the application ?\",\n \"TRANSFER\": \"<b>Transfer summary:</b><br/><br/><ul><li> - From: <b>{{from}}</b></li><li> - To: <b>{{to}}</b></li><li> - Amount: <b>{{amount}} {{unit}}</b></li><li> - Comment: <i>{{comment}}</i></li></ul><br/><b>Are-you sure you want to do this transfer?</b>\",\n \"TRANSFER_ALL\": \"<b>Transfer summary:</b><br/><br/><ul><li> - From: <b>{{from}}</b></li><li> - To: <b>{{to}}</b></li><li> - Amount: <b>{{amount}} {{unit}}</b></li><li> - Comment: <i>{{comment}}</i></li><br/><li> - Rest : <b>{{restAmount}} {{unit}}</b> to <b>{{restTo}}</b></li></ul><br/><b>Are-you sure you want to do this transfer?</b>\",\n \"MEMBERSHIP_OUT\": \"This operation is <b>irreversible</b>.<br/></br/><b>Are you sure you want to terminate your membership?</b>\",\n \"MEMBERSHIP_OUT_2\": \"This operation is <b>irreversible</b>!<br/><br/>Are you sure you want to <b>terminate your membership</b>?\",\n \"LOGIN_UNUSED_WALLET_TITLE\": \"Typing error?\",\n \"LOGIN_UNUSED_WALLET\": \"The account seems to be <b>inactive</b>.<br/><br/>It's probably a <b>typing error</b> when sign in. Please try again, checking that <b>public key is yours<b/>.\",\n \"FIX_IDENTITY\": \"The pseudonym <b>{{uid}}</b> will be published again, replacing the old publication that has expired.<br/></br/><b>Are you sure</b> you want to continue?\",\n \"FIX_MEMBERSHIP\": \"Your application for membership will be sent.<br/></br/><b>Are you sure?</b>\",\n \"MEMBERSHIP\": \"Your membership request will be sent. <br/></br/><b>Are you sure?</b>\",\n \"RENEW_MEMBERSHIP\": \"Your membership will be renewed.<br/></br/><b>Are you sure?</b>\",\n \"REVOKE_IDENTITY\": \"You will <b>definitely revoke this identity</b>.<br/><br/>The public key and the associated pseudonym <b>will never be used again</b> (for a member account).<br/></br/><b>Are you sure</b> you want to revoke this identity?\",\n \"REVOKE_IDENTITY_2\": \"This operation is <b>irreversible</b>!<br/><br/>Are you sure you want to <b>revoke this identity</b>?\",\n \"NOT_NEED_RENEW_MEMBERSHIP\": \"Your membership does not need to be renewed (it will only expire in {{membershipExpiresIn|formatDuration}}).<br/></br/><b>Are you sure you</b> want to renew your membership?\",\n \"SAVE_BEFORE_LEAVE\": \"Do you want to <b>save your changes</b> before leaving the page?\",\n \"SAVE_BEFORE_LEAVE_TITLE\": \"Changes not saved\",\n \"LOGOUT\": \"Are you sure you want to logout?\",\n \"USE_FALLBACK_NODE\": \"Peer <b>{{old}}</b> unreachable or invalid address.<br/><br/>Do you want to temporarily use the <b>{{new}}</b> node?\",\n \"ISSUE_524_SEND_LOG\": \"The transaction was rejected because of a known problem (issue #524) but not reproduced.<br/><br/>To help developers correct this error, do you accept <b>the transmission of your logs</b> per message?<br/><small>(No confidential data is sent)</small>\"\n },\n \"MODE\": {\n \"DEMO\": {\n \"BADGE\": \"Demo\",\n \"MODE\": \"Demonstration mode\",\n \"FEATURE_NOT_AVAILABLE\": \"Functionality <b>not available</b> on this demonstration site.\",\n \"MODE_HELP\": \"Cesium works in <b>demonstration mode</b>: consultation on account is available, but no operation can be performed.\",\n \"INSTALL_HELP\": \"For <b>security reasons</b> we recommend <b>installing</b> your copy of the software.<br/> Visit the site <a href='https://cesium.app'>www.cesium.app</a> for help.\"\n },\n \"READONLY\": {\n \"BADGE\": \"Monit\",\n \"MODE\": \"Monitoring mode\",\n \"MODE_HELP\": \"Cesium works in <b>monitoring mode</b>: only currency monitoring features are available.\",\n \"INSTALL_HELP\": \"If you want to <b>create a wallet account</b> to send or received money, we recommend <b>installing</b> your copy of the software.<br/> Visit the site <a href='https://cesium.app'>www.cesium.app</a> for help.\"\n }\n },\n \"DOWNLOAD\": {\n \"POPUP_TITLE\": \"<b>Revocation file</b>\",\n \"POPUP_REVOKE_MESSAGE\": \"To safeguard your account, please download the <b>account revocation document</b>. It will allow you to cancel your account (in case of account theft, ID, an incorrectly created account, etc.).<br/><br/><b>Please store it in a safe place.</b>\"\n },\n \"HELP\": {\n \"TITLE\": \"Online help\",\n \"JOIN\": {\n \"SECTION\": \"Join\",\n \"SALT\": \"The secret identifier is very important. It is used to hash you password, which in turn is used to calculate your <span class=\\\"text-italic\\\">public account key</span> (its number) and the private key to access it.<br/><b>Please remeber this identifier well</b>, because there is no way to recover it when lost.<br/>Furthermore, it cannot be changed without having to create a new account.<br/><br/>A good secret identifier must be sufficiently long (8 characters at the very least) and as original as possible.\",\n \"PASSWORD\": \"The password is very important. Together with the secret identifier, it is use to calculate your account number (pblic key) and the private key to access it.<br/><b>Please remember it well</b>, because there is no way to recover it when lost.<br/>Furthermore, it cannot be changed without having to create a new account.<br/><br/>A good password is made (ideally) of at least 8 characters, with at least one capital and one number.\",\n \"PSEUDO\": \"A pseudonym is used only when joining as <span class=\\\"text-italic\\\">member</span>. It is always associated with a wallet (by its <span class=\\\"text-italic\\\">public key</span>).<br/>It is published on the network so that other users may identify it, certify or send money to the account.<br/>A pseudonym must be unique among all members (current and past).\"\n },\n \"LOGIN\": {\n \"SECTION\": \"Log in\",\n \"PUBKEY\": \"Account public key\",\n \"PUBKEY_DEF\": \"The public key of the keychain is generated from the entered identifiers (any), but does not correspond to an account already used.<br/><b>Make sure your public key is the same as your account</b>. Otherwise, you will be logged into an account that is probably never used, as the risk of collision with an existing account is very small.<br/><a href=\\\"https://en.wikipedia.org/wiki/Elliptic_curve_cryptography\\\" target=\\\"_ system\\\">Learn more about cryptography</a> by public key.\",\n \"METHOD\": \"Connection methods\",\n \"METHOD_DEF\": \"Several options are available to connect to a portfolios: <br/> - The connection <b>with salt (simple or advanced)</b> mixes your password with the secret identifier, to limit the attempts of piracy<br/> - The connection <b>using public key</b> prevents you from entering your credentials, which you will be asked only when an operation need it.<br/> - The connection <b>using keychain file</b> will read the public and private keys of the account from a file without the need to enter credentials. Several file formats are possible.\"\n },\n \"GLOSSARY\": {\n \"SECTION\": \"Glossary\",\n \"PUBKEY_DEF\": \"A public key always identifies a wallet. It may identify a member. In Cesium it is calculated using the secret identifier and the password.\",\n \"MEMBER\": \"Member\",\n \"MEMBER_DEF\": \"A member is a real and living human, wishing to participate freely to the monitary community. The member will receive universal dividend, according to the period and amount as defined in the <span class=\\\"text-italic\\\">currency parameters</span>.\",\n \"CURRENCY_RULES\": \"Currency rules\",\n \"CURRENCY_RULES_DEF\": \"The currency rules are defined only once, and for all. They set the parameters under which the currency will perform: universal dividend calculation, the amount of certifications needed to become a member, the maximum amount of certifications a member can send, etc.<br/><br/>The parameters cannot be modified because of the use of a <span class=\\\"text-italic\\\">Blockchain</span> which carries and executes these rules, and constantly verifies their correct application. <a href=\\\"#/app/currency\\\">See current parameters</a>.\",\n \"BLOCKCHAIN\": \"Blockchain\",\n \"BLOCKCHAIN_DEF\": \"The Blockchain is a decentralised system which, in case of Duniter, serves to carry and execute the <span class=\\\"text-italic\\\">currency rules</span>.<br/><a href=\\\"http://en.duniter.org/presentation/\\\" target=\\\"_blank\\\">Read more about Duniter</a> and the working of its blockchain.\",\n \"UNIVERSAL_DIVIDEND_DEF\": \"The Universal Dividend (UD) is the quantity of money co-created by each member, according to the period and the calculation defined in the <span class=\\\"text-italic\\\">currency rules</span>.<br/>Every term, the members receive an equal amount of new money on their account.<br/><br/>The UD undergoes a steady growth, to remain fair under its members (current and future), calculated by an average life expectancy, as demonstrated in the Relative Theory of Money (RTM).<br/><a href=\\\"http://trm.creationmonetaire.info\\\" target=\\\"_system\\\">Read more about RTM</a> and open money.\",\n \"WOT\": \"Web of Trust (WoT)\",\n \"WOT_DEF\": \"The Web of Trust is made up of all the members of the currency, and the links of certification which connect them.\",\n \"DISTANCE_RULE\": \"Distance rule\",\n \"DISTANCE_RULE_DEF\": \"The rule of distance defines <b>a maximum distance to meet</b> between an applicant and a minimum number of referring member. This distance is calculated using the certification links.\"\n },\n \"TIP\": {\n \"MENU_BTN_CURRENCY\": \"Menu <b>{{'MENU.CURRENCY'|translate}}</b> allows discovery of <b>currency parameters</b> and its state.\",\n \"CURRENCY_WOT\": \"The <b>member count</b> shows the <b>community's weight and evolution</b>.\",\n \"CURRENCY_MASS\": \"Shown here is the <b>total amount</b> currently in circulation and its <b>average distribution</b> per member.<br/><br/>This allows to estimate the <b>worth of any amount</b>, in respect to what <b>others own</b> on their account (on average).\",\n \"CURRENCY_UNIT_RELATIVE\": \"The unit used here (&ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;) signifies that the amounts in {{currency|capitalize}} have been devided by the <b>Universal Dividend</b> (UD).<br/><br/><small>This relative unit is <b>relevant</b> because it is stable in contrast to the permanently growing monitary mass.</small>\",\n \"CURRENCY_CHANGE_UNIT\": \"The option <b>{{'COMMON.BTN_RELATIVE_UNIT'|translate}}</b> allows to <b>switch the unit</b> to show amounts in <b>{{currency|capitalize}}</b>, undevided by the Universal Dividend (instead of in &ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;).\",\n \"CURRENCY_CHANGE_UNIT_TO_RELATIVE\": \"The option <b>{{'COMMON.BTN_RELATIVE_UNIT'|translate}}</b> allows to <b>switch the unit</b> to show amounts in &ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;, which is relative to the Universal Dividend (the amount co-produced by each member).\",\n \"CURRENCY_RULES\": \"The <b>rules</b> of the currency determine its <b>exact and predictible</b> performance.<br/><br/>As a true DNA of the currency these rules make the monetary code <b>transparent and understandable</b>.\",\n \"MENU_BTN_NETWORK\": \"Menu <b>{{'MENU.NETWORK'|translate}}</b> allows discovery of <b>network's state<b>.\",\n \"NETWORK_BLOCKCHAIN\": \"All monetary transactions are recoded in a <b>public and tamper proof</b> ledger, generally referred to as the <b>blockchain</b>.\",\n \"NETWORK_PEERS\": \"The <b>peers</b> shown here correspond to <b>computers that update and check</b> the blockchain.<br/><br/>The more active peers there are, the more <b>decentralised</b> and therefore trustworhty the currency becomes.\",\n \"NETWORK_PEERS_BLOCK_NUMBER\": \"This <b>number</b> (in green) indicates the peer's <b>latest validated block</b> (last page written in the ledger).<br/><br/>Green indicates that the block was equally validated by the <b>majority of other peers</b>.\",\n \"NETWORK_PEERS_PARTICIPATE\": \"<b>Each member</b>, equiped with a computer with Internet, <b>can participate, adding a peer</b> simply by <b>installing the Duniter software</b> (free/libre). <a target=\\\"_new\\\" href=\\\"{{installDocUrl}}\\\" target=\\\"_system\\\">Read the installation manual &gt;&gt;</a>.\",\n \"MENU_BTN_ACCOUNT\": \"<b>{{'ACCOUNT.TITLE'|translate}}</b> allows access to your account balance and transaction history.\",\n \"MENU_BTN_ACCOUNT_MEMBER\": \"Here you can consult your account status, transaction history and your certifications.\",\n \"WALLET_CERTIFICATIONS\": \"Click here to reveiw the details of your certifications (given and received).\",\n \"WALLET_RECEIVED_CERTIFICATIONS\": \"Click here to review the details of your <b>received certifications</b>.\",\n \"WALLET_GIVEN_CERTIFICATIONS\": \"Click here to review the details of your <b>given certifications</b>.\",\n \"WALLET_BALANCE\": \"Your account <b>balance</b> is shown here.\",\n \"WALLET_BALANCE_RELATIVE\": \"{{'HELP.TIP.WALLET_BALANCE'|translate}}<br/><br/>The used unit (&ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;) signifies that the amount in {{currency|capitalize}} has been divided by the <b>Universal Dividend</b> (UD) co-created by each member.<br/>At this moment, 1 UD equals {{currentUD}} {{currency|capitalize}}.\",\n \"WALLET_BALANCE_CHANGE_UNIT\": \"You can <b>change the unit</b> in which amounts are shown in <b><i class=\\\"icon ion-android-settings\\\"></i>&nbsp;{{'MENU.SETTINGS'|translate}}</b>.<br/><br/>For example, to display amounts <b>directly in {{currency|capitalize}}</b> instead of relative amounts.\",\n \"WALLET_PUBKEY\": \"This is your account public key. You can communicate it to a third party so that it more easily identifies your account.\",\n \"WALLET_SEND\": \"Issue a payment in just a few clicks.\",\n \"WALLET_SEND_NO_MONEY\": \"Issue a payment in just a few clicks.<br/>(Your balance does not allow this yet)\",\n \"WALLET_OPTIONS\": \"Please note that this button allows access to <b>other, less used actions</b>.<br/><br/>Don't forget to take a quick look, when you have a moment!\",\n \"WALLET_RECEIVED_CERTS\": \"This shows the list of persons that certified you.\",\n \"WALLET_CERTIFY\": \"The button <b>{{'WOT.BTN_SELECT_AND_CERTIFY'|translate}}</b> allows selecting an identity and certifying it.<br/><br/>Only users that are <b>already member</b> may certify others.\",\n \"WALLET_CERT_STOCK\": \"Your supply of certifications (to send) is limited to <b>{{sigStock}} certifications</b>.<br/><br/>This supply will replete itself over time, as and when earlier certifications expire.\",\n \"MENU_BTN_WALLETS\": \"The menu <b>{{'MENU.WALLETS'|translate}}</b> allows you to add additional wallets that you manage.\",\n \"MENU_BTN_TX\": \"The menu <b>{{'MENU.TRANSACTIONS'|translate}}</b> allow access to transactions history, and send new payments.\",\n \"MENU_BTN_WOT\": \"The menu <b>{{'MENU.WOT'|translate}}</b> allows searching <b>users</b> of the currency (member or not).\",\n \"WOT_SEARCH_TEXT_XS\": \"To search in the registry, type the <b>first letters of a users pseudonym or public key</b>.<br/><br/>The search will start automatically.\",\n \"WOT_SEARCH_TEXT\": \"To search in the registry, type the <b>first letters of a users pseudonym or public key</b>.<br/><br/>Then hit <b>Enter</b> to start the search.\",\n \"WOT_SEARCH_RESULT\": \"Simply click a user row to view the details sheet.\",\n \"WOT_VIEW_CERTIFICATIONS\": \"The row <b>{{'ACCOUNT.CERTIFICATION_COUNT'|translate}}</b> shows how many members members validated this identity.<br/><br/>These certifications testify that the account belongs to <b>a living human</b> and this person has <b>no other member account</b>.\",\n \"WOT_VIEW_CERTIFICATIONS_COUNT\": \"There are at least <b>{{sigQty}} certifications</b> needed to become a member and receive the <b>Universal Dividend</b>.\",\n \"WOT_VIEW_CERTIFICATIONS_CLICK\": \"Click here to open <b>a list of all certifications</b> given to and by this identity.\",\n \"WOT_VIEW_CERTIFY\": \"The button <b>{{'WOT.BTN_CERTIFY'|translate}}</b> allows to add your certification to this identity.\",\n \"CERTIFY_RULES\": \"<b>Attention:</b> Only certify <b>real and living persons</b> that do not own any other certified account.<br/><br/>The trust carried by the currency depends on each member's vigilance!\",\n \"MENU_BTN_SETTINGS\": \"The <b>{{'MENU.SETTINGS'|translate}}</b> allow you to configure the Cesium application.<br/><br/>For example, you can <b>change the unit</b> in which the currency will be shown.\",\n \"HEADER_BAR_BTN_PROFILE\": \"Click here to access your <b>user profile</b>\",\n \"SETTINGS_CHANGE_UNIT\": \"You can <b>change the display unit</b> of amounts by clicking here.<br/><br/>- Deactivate the option to show amounts in {{currency|capitalize}}.<br/>- Activate the option for relative amounts in {{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub> (<b>divided</b> by the current Universal Dividend).\",\n \"END_LOGIN\": \"This guided visit has <b>ended</b>.<br/><br/>Welcome to the <b>free economy</b>!\",\n \"END_NOT_LOGIN\": \"This guided visit has <b>ended</b>.<br/><br/>If you wish to join the currency {{currency|capitalize}}, simply click <b>{{'LOGIN.CREATE_FREE_ACCOUNT'|translate}}</b> below.\",\n \"END_READONLY\": \"This guided visit has <b>ended</b>.<br/><br/>{{'MODE.READONLY.INSTALL_HELP'|translate}}.\"\n }\n },\n \"API\" :{\n \"COMMON\": {\n \"LINK_DOC\": \"API documentation\",\n \"LINK_DOC_HELP\": \"API documentation for developers\",\n \"LINK_STANDARD_APP\": \"Standard version\",\n \"LINK_STANDARD_APP_HELP\": \"Open standard version of {{'COMMON.APP_NAME'|translate}}\",\n \"CONNECTION_ERROR\": \"Peer <b>{{server}}</b> unreachable or invalid address.<br/><br/>Check your Internet connection, or contact the web site administrator.\"\n },\n \"HOME\": {\n \"TITLE\": \"{{'COMMON.APP_NAME'|translate}} API Documentation\",\n \"MESSAGE\": \"Welcome to the {{'COMMON.APP_NAME'|translate}} <b>API documentation </b>.<br/>Connect your web site to <a href=\\\"http://duniter.org\\\" target=\\\"_system\\\">Duniter</a> very easily!\",\n \"MESSAGE_SHORT\": \"Connect your websites to <a href=\\\"http://duniter.org\\\" target=\\\"_system\\\">Duniter</a> very easily!\",\n \"DOC_HEADER\": \"Available services:\"\n },\n \"TRANSFER\": {\n \"TITLE\": \"{{'COMMON.APP_NAME'|translate}} - Online payment\",\n \"TITLE_SHORT\": \"Online payment\",\n \"SUMMARY\": \"Order summary:\",\n \"AMOUNT\": \"Amount:\",\n \"AMOUNTS_HELP\": \"Please select the amount:\",\n \"NAME\": \"Name:\",\n \"PUBKEY\": \"Public key of the recipient:\",\n \"COMMENT\": \"Order reference:\",\n \"NODE\": \"Peer address:\",\n \"DEMO\": {\n \"SALT\": \"demo\",\n \"PASSWORD\": \"demo\",\n \"PUBKEY\": \"3G28bL6deXQBYpPBpLFuECo46d3kfYMJwst7uhdVBnD1\",\n \"HELP\": \"<b>Demonstration mode</b>: No payment will actually be sent during this simulation.<br/>Please use credentials: <b>{{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}</b>\",\n \"BAD_CREDENTIALS\": \"Invalid credentials.<br/>In demonstration mode, credentials should be: {{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}\"\n },\n \"INFO\": {\n \"SUCCESS_REDIRECTING_WITH_NAME\": \"Payment sent.<br/>Redirect to <b>{{name}}</b>...\",\n \"SUCCESS_REDIRECTING\": \"Payment sent.<br/>Redirect to the seller's website...\",\n \"CANCEL_REDIRECTING_WITH_NAME\": \"Payment cancelled.<br/>Redirect to <b>{{name}}</b>...\",\n \"CANCEL_REDIRECTING\": \"Payment cancelled.<br/>Redirect to the seller's website...\"\n },\n \"ERROR\": {\n \"TRANSFER_FAILED\": \"Payment failed\"\n }\n },\n \"DOC\": {\n \"DESCRIPTION_DIVIDER\": \"Description\",\n \"URL_DIVIDER\": \"Calling address\",\n \"PARAMETERS_DIVIDER\": \"Parameters\",\n \"AVAILABLE_PARAMETERS\": \"Here is the list of al available parameters:\",\n \"DEMO_DIVIDER\": \"Try it !\",\n \"DEMO_HELP\": \"To test this service, click on this button. The result content will be display below.\",\n \"DEMO_RESULT\": \"Result returned by call:\",\n \"DEMO_RESULT_PEER\": \"Peer address used:\",\n \"DEMO_SUCCEED\": \"<i class=\\\"icon ion-checkmark\\\"></i> Success!\",\n \"DEMO_CANCELLED\": \"<i class=\\\"icon ion-close\\\"></i> Canceled by user\",\n \"INTEGRATE_DIVIDER\": \"Website integration\",\n \"INTEGRATE_CODE\": \"Code:\",\n \"INTEGRATE_RESULT\": \"Result preview:\",\n \"INTEGRATE_PARAMETERS\": \"Parameters\",\n \"TRANSFER\": {\n \"TITLE\": \"Payments\",\n \"DESCRIPTION\": \"From a site (eg online marketplace) you can delegate payment in free currency to Cesium API. To do this, simply open a page at the following address:\",\n \"PARAM_PUBKEY\": \"Recipient's public key\",\n \"PARAM_PUBKEY_HELP\": \"Recipient's public key (required)\",\n \"PARAM_AMOUNT\": \"Amount\",\n \"PARAM_AMOUNT_HELP\": \"Transaction amount (required)\",\n \"PARAM_COMMENT\": \"Reference (or comment)\",\n \"PARAM_COMMENT_HELP\": \"Reference or comment. You will allow for example to identify the payment in the BlockChain.\",\n \"PARAM_NAME\": \"Name (of recipient or website)\",\n \"PARAM_NAME_HELP\": \"The name of your website. This can be a readable name (eg \\\"My online site\\\"), or a web address (eg \\\"www.MySite.com\\\").\",\n \"PARAM_REDIRECT_URL\": \"URL redirection\",\n \"PARAM_REDIRECT_URL_HELP\": \"URL redirection after sending payment, after the payment has been sent. Can contain the following strings, which will be replaced by the values of the transaction: \\\"{tx}\\\", \\\"{hash}\\\", \\\"{comment}\\\", \\\"{amount}\\\" and \\\"{pubkey}\\\".\",\n \"PARAM_CANCEL_URL\": \"URL if cancelled\",\n \"PARAM_CANCEL_URL_HELP\": \"URL in case of cancellation. Can contain the following strings, which will be replaced: \\\"{comment}\\\", \\\"{amount}\\\" and \\\"{pubkey}\\\".\",\n \"PARAM_PREFERRED_NODE\": \"Preferred Duniter peer\",\n \"PARAM_PREFERRED_NODE_HELP\": \"Peer address (URL) to use preferably (\\\"g1.domain.com:443\\\" or \\\"https://g1.domain.com\\\")\",\n \"EXAMPLES_HELP\": \"Examples of integration:\",\n \"EXAMPLE_BUTTON\": \"HTML Button\",\n \"EXAMPLE_BUTTON_DEFAULT_TEXT\": \"Pay in {{currency|abbreviate}}\",\n \"EXAMPLE_BUTTON_DEFAULT_STYLE\": \"Custom style\",\n \"EXAMPLE_BUTTON_TEXT_HELP\": \"Button text\",\n \"EXAMPLE_BUTTON_BG_COLOR\": \"Background color\",\n \"EXAMPLE_BUTTON_BG_COLOR_HELP\": \"eg: #fbc14c, yellow, lightgrey, rgb(180,180,180)\",\n \"EXAMPLE_BUTTON_FONT_COLOR\": \"Font color\",\n \"EXAMPLE_BUTTON_FONT_COLOR_HELP\": \"eg: black, orange, rgb(180,180,180)\",\n \"EXAMPLE_BUTTON_TEXT_ICON\": \"Icon\",\n \"EXAMPLE_BUTTON_TEXT_WIDTH\": \"Width\",\n \"EXAMPLE_BUTTON_TEXT_WIDTH_HELP\": \"eg: 200px, 50%\",\n \"EXAMPLE_BUTTON_ICON_NONE\": \"No icon\",\n \"EXAMPLE_BUTTON_ICON_DUNITER\": \"Duniter logo\",\n \"EXAMPLE_BUTTON_ICON_CESIUM\": \"Cesium logo\",\n \"EXAMPLE_BUTTON_ICON_G1_COLOR\": \"Ğ1 logo\",\n \"EXAMPLE_BUTTON_ICON_G1_BLACK\": \"Ğ1 logo (outline)\"\n }\n }\n }\n}\n);\n\n$translateProvider.translations(\"eo-EO\", {\n \"COMMON\": {\n \"APP_NAME\": \"Cesium\",\n \"APP_VERSION\": \"v{{version}}\",\n \"APP_BUILD\": \"date : {{build}}\",\n \"PUBKEY\": \"Publika ŝlosilo\",\n \"MEMBER\": \"Membro\",\n \"BLOCK\" : \"Bloko\",\n \"BTN_OK\": \"OK\",\n \"BTN_YES\": \"Jes\",\n \"BTN_NO\": \"Ne\",\n \"BTN_SEND\": \"Sendi\",\n \"BTN_SEND_MONEY\": \"Fari elspezon\",\n \"BTN_SEND_MONEY_SHORT\": \"Elspezo\",\n \"BTN_SAVE\": \"Konservi\",\n \"BTN_YES_SAVE\": \"Jes, Konservi\",\n \"BTN_YES_CONTINUE\": \"Jes, Daŭrigi\",\n \"BTN_SHOW\": \"Vidi\",\n \"BTN_SHOW_PUBKEY\": \"Afiŝi la publikan ŝlosilon\",\n \"BTN_RELATIVE_UNIT\": \"Afiŝi la sumojn en UD?\",\n \"BTN_BACK\": \"Reiro\",\n \"BTN_NEXT\": \"Sekva\",\n \"BTN_IMPORT\": \"Enporti\",\n \"BTN_CANCEL\": \"Nuligi\",\n \"BTN_CLOSE\": \"Fermi\",\n \"BTN_LATER\": \"Poste\",\n \"BTN_LOGIN\": \"Konektiĝi\",\n \"BTN_LOGOUT\": \"Malkonektiĝo\",\n \"BTN_ADD_ACCOUNT\": \"Nova konto\",\n \"BTN_SHARE\": \"Diskonigi\",\n \"BTN_EDIT\": \"Modifi\",\n \"BTN_DELETE\": \"Forigi\",\n \"BTN_ADD\": \"Aldoni\",\n \"BTN_SEARCH\": \"Serĉi\",\n \"BTN_REFRESH\": \"Aktualigi\",\n \"BTN_RETRY\": \"Rekomenci\",\n \"BTN_START\": \"Komenci\",\n \"BTN_CONTINUE\": \"Daŭrigi\",\n \"BTN_CREATE\": \"Krei\",\n \"BTN_UNDERSTOOD\": \"Mi komprenis\",\n \"BTN_OPTIONS\": \"Kromeblecoj\",\n \"BTN_HELP_TOUR\": \"Gvidata vizito\",\n \"BTN_HELP_TOUR_SCREEN\": \"Malkovri tiun ĉi paĝon\",\n \"BTN_DOWNLOAD\": \"Elŝuti\",\n \"BTN_DOWNLOAD_ACCOUNT_STATEMENT\": \"Elŝuti la konto-tabelon\",\n \"BTN_MODIFY\": \"Modifi\",\n \"CHOOSE_FILE\": \"Almetu vian dosieron <br/>aŭ klaku por elekti ĝin\",\n \"DAYS\": \"tagoj\",\n \"NO_ACCOUNT_QUESTION\": \"Ankoraŭ sen konto? Kreu ĝin senpage!\",\n \"SEARCH_NO_RESULT\": \"Neniu rezulto trovita\",\n \"LOADING\": \"Bonvolu pacienci...\",\n \"LOADING_WAIT\": \"Bonvolu pacienci...<br/><small>(Atendado pri disponebleco de la nodo)</small>\",\n \"SEARCHING\": \"Serĉanta...\",\n \"FROM\": \"De\",\n \"TO\": \"Al\",\n \"COPY\": \"Kopii\",\n \"LANGUAGE\": \"Lingvo\",\n \"UNIVERSAL_DIVIDEND\": \"Universala dividendo\",\n \"UD\": \"UD\",\n \"DATE_PATTERN\": \"DD/MM/YY HH:mm\",\n \"DATE_FILE_PATTERN\": \"YYYY-MM-DD\",\n \"DATE_SHORT_PATTERN\": \"DD/MM/YY\",\n \"DATE_MONTH_YEAR_PATTERN\": \"MM/YYYY\",\n \"EMPTY_PARENTHESIS\": \"(malplena)\",\n \"UID\": \"Pseŭdonimo\",\n \"ENABLE\": \"Aktiva\",\n \"DISABLE\": \"Malaktiva\",\n \"RESULTS_LIST\": \"Rezultoj\",\n \"RESULTS_COUNT\": \"{{count}} rezultoj\",\n \"EXECUTION_TIME\": \"Plenumita en {{duration|formatDurationMs}}\",\n \"SHOW_VALUES\": \"Afiŝi la signojn klare?\",\n \"POPOVER_ACTIONS_TITLE\": \"Kromeblecoj\",\n \"POPOVER_FILTER_TITLE\": \"Filtriloj\",\n \"SHOW_MORE\": \"Afiŝi pli\",\n \"SHOW_MORE_COUNT\": \"(nuna limo je {{limit}})\",\n \"POPOVER_SHARE\": {\n \"TITLE\": \"Diskonigi\",\n \"SHARE_ON_TWITTER\": \"Diskonigi ĉe Twitter\",\n \"SHARE_ON_FACEBOOK\": \"Diskonigi ĉe Facebook\",\n \"SHARE_ON_DIASPORA\": \"Diskonigi ĉe Diaspora*\",\n \"SHARE_ON_GOOGLEPLUS\": \"Diskonigi ĉe Google+\"\n },\n \"FILE\": {\n \"DATE\": \"Dato:\",\n \"TYPE\": \"Tipo:\",\n \"SIZE\": \"Pezo:\",\n \"VALIDATING\": \"Validiĝanta...\"\n }\n },\n \"SYSTEM\": {\n \"PICTURE_CHOOSE_TYPE\": \"Elekti la fonton:\",\n \"BTN_PICTURE_GALLERY\": \"Bildaro\",\n \"BTN_PICTURE_CAMERA\": \"<b>Kamerao</b>\"\n },\n \"MENU\": {\n \"HOME\": \"Hejmpaĝo\",\n \"WOT\": \"Kontaro\",\n \"CURRENCY\": \"Mono\",\n \"ACCOUNT\": \"Mia konto\",\n \"WALLETS\": \"Miaj monujoj\",\n \"SETTINGS\": \"Parametroj\",\n \"NETWORK\": \"Reto\",\n \"TRANSACTIONS\": \"Miaj spezoj\"\n },\n \"ABOUT\": {\n \"TITLE\": \"Prie\",\n \"LICENSE\": \"Programo <b>libera</b> (Licenco GNU AGPLv3).\",\n \"LATEST_RELEASE\": \"Ekzistas <b>pli freŝdata versio</b> de {{'COMMON.APP_NAME'|translate}} (<b>v{{version}}</b>)\",\n \"PLEASE_UPDATE\": \"Bonvolu ĝisdatigi {{'COMMON.APP_NAME'|translate}} (lasta versio: <b>v{{version}}</b>)\",\n \"CODE\": \"Fonto-kodo:\",\n \"OFFICIAL_WEB_SITE\": \"Oficiala retejo:\",\n \"DEVELOPERS\": \"Programita de:\",\n \"FORUM\": \"Forumo:\",\n \"PLEASE_REPORT_ISSUE\": \"Ne hezitu sciigi al ni la renkontitajn fuŝaĵojn\",\n \"REPORT_ISSUE\": \"Sciigi problemon\",\n \"BTN_OPEN_DEV_WINDOW\": \"Malfermi la fenestron pri malfuŝigado\"\n },\n \"HOME\": {\n \"TITLE\": \"Cesium\",\n \"WELCOME\": \"Bonvenon ĉe la programo Cesium!\",\n \"MESSAGE\": \"Ricevu kaj sendu liberan monon {{currency|abbreviate}}\",\n \"BTN_CURRENCY\": \"Esploru la monon {{name|abbreviate}}\",\n \"BTN_ABOUT\": \"prie\",\n \"BTN_HELP\": \"Reta helpo\",\n \"REPORT_ISSUE\": \"fuŝaĵo\",\n \"NOT_YOUR_ACCOUNT_QUESTION\" : \"Vi ne posedas la konton <b><i class=\\\"ion-key\\\"></i> {{pubkey|formatPubkey}}</b> ?\",\n \"BTN_CHANGE_ACCOUNT\": \"Malkonektu tiun ĉi konton\",\n \"CONNECTION_ERROR\": \"Nodo <b>{{server}}</b> neatingebla aŭ adreso nevalida.<br/><br/>Kontrolu vian retkonekton, aŭ elektu alian nodon <a class=\\\"positive\\\" ng-click=\\\"doQuickFix('settings')\\\">ĉe la parametroj</a>.\"\n },\n \"SETTINGS\": {\n \"TITLE\": \"Parametroj\",\n \"DISPLAY_DIVIDER\": \"Afiŝado\",\n \"STORAGE_DIVIDER\": \"Stokado\",\n \"NETWORK_SETTINGS\": \"Reto\",\n \"PEER\": \"Adreso de la nodo Duniter\",\n \"PEER_SHORT\": \"Adreso de la nodo\",\n \"PEER_CHANGED_TEMPORARY\": \"Adreso provizore uzata\",\n \"USE_LOCAL_STORAGE\": \"Aktivigi lokan stokadon\",\n \"USE_LOCAL_STORAGE_HELP\": \"Ebligas konservi viajn parametrojn\",\n \"WALLETS_SETTINGS\": \"Miaj monujoj\",\n \"USE_WALLETS_ENCRYPTION\": \"Sekurigi la liston?\",\n \"USE_WALLETS_ENCRYPTION_HELP\": \"Ebligas sekurigi la liston de viaj monujoj (per ĉifrado), postulante aŭtentigado por aliri ilin.\",\n \"ENABLE_HELPTIP\": \"Aktivigi la rilatigajn help-vezikojn\",\n \"ENABLE_UI_EFFECTS\": \"Aktivigi la vid-efikojn\",\n \"HISTORY_SETTINGS\": \"Miaj spezoj\",\n \"DISPLAY_UD_HISTORY\": \"Afiŝi la produktitajn dividendojn?\",\n \"TX_HISTORY_AUTO_REFRESH\": \"Aktualigi aŭtomate\",\n \"TX_HISTORY_AUTO_REFRESH_HELP\": \"Aktualigas la saldon kaj la spezojn aŭtomate, por ĉiu nova bloko de la reto.\",\n \"AUTHENTICATION_SETTINGS\": \"Aŭtentigado\",\n \"KEEP_AUTH\": \"Aŭtomata malaŭtentigado\",\n \"KEEP_AUTH_SHORT\": \"Malaŭtentigado\",\n \"KEEP_AUTH_HELP\": \"Difinas la momenton, kiam la aŭtentigado estas forviŝita de la memoro.\",\n \"KEEP_AUTH_OPTION\": {\n \"NEVER\": \"Post ĉiu ago\",\n \"SECONDS\": \"Post {{value}}s de neatktiveco\",\n \"MINUTE\": \"Post {{value}}min de neatktiveco\",\n \"MINUTES\": \"Post {{value}}min de neatktiveco\",\n \"HOUR\": \"Post {{value}}h de neatktiveco\",\n \"ALWAYS\": \"Fine de la sesio\"\n },\n \"KEYRING_FILE\": \"Dosiero pri ŝlosilaro\",\n \"KEYRING_FILE_HELP\": \"Ebligas <b>konektiĝi</b> aŭtomate por ĉiu ekuzo<br/>kaj eĉ <b>aŭtentiĝi</b> (nur se \\\"Finiĝo de la aŭtentiĝo\\\" estas agordita kiel \\\"fine de la sesio\\\").\",\n \"REMEMBER_ME\": \"Memori min?\",\n \"REMEMBER_ME_HELP\": \"Ebligas resti identigita de sesio al alia, loke konservante la publikan ŝlosilon.\",\n \"PLUGINS_SETTINGS\": \"Krom-programoj\",\n \"BTN_RESET\": \"Restarigi la originajn valorojn\",\n \"EXPERT_MODE\": \"Aktivigi la spertan moduson\",\n \"EXPERT_MODE_HELP\": \"Ebligas pli detalan afiŝadon.\",\n \"BLOCK_VALIDITY_WINDOW\": \"Limtempo pri necerteco de la blokoj\",\n \"BLOCK_VALIDITY_WINDOW_SHORT\": \"Limtempo pri necerteco\",\n \"BLOCK_VALIDITY_WINDOW_HELP\": \"Limtempo antaŭ ol taksi, ke iu informo estas validigita\",\n \"BLOCK_VALIDITY_OPTION\": {\n \"NONE\": \"Neniu limtempo\",\n \"N\": \"{{time | formatDuration}} ({{count}} blokoj)\"\n },\n \"POPUP_PEER\": {\n \"TITLE\": \"Nodo Duniter\",\n \"HOST\": \"Adreso\",\n \"HOST_HELP\": \"Adreso: servilo: konektujo\",\n \"USE_SSL\": \"Sekurigita?\",\n \"USE_SSL_HELP\": \"(SSL-ĉifrado)\",\n \"BTN_SHOW_LIST\": \"Listo de la nodoj\"\n }\n },\n \"BLOCKCHAIN\": {\n \"HASH\": \"Haketo: {{hash}}\",\n \"VIEW\": {\n \"HEADER_TITLE\": \"Bloko #{{number}}-{{hash|formatHash}}\",\n \"TITLE_CURRENT\": \"Nuna bloko\",\n \"TITLE\": \"Bloko #{{number|formatInteger}}\",\n \"COMPUTED_BY\": \"Kalkulita de la nodo de\",\n \"SHOW_RAW\": \"Vidi la kompletan dosieron\",\n \"TECHNICAL_DIVIDER\": \"Teknikaj informoj\",\n \"VERSION\": \"Versio de la daten-strukturo\",\n \"HASH\": \"Kalkulita haketo\",\n \"UNIVERSAL_DIVIDEND_HELP\": \"Mono kunproduktita de ĉiu el la {{membersCount}} membroj\",\n \"EMPTY\": \"Neniu dateno en tiu ĉi bloko\",\n \"POW_MIN\": \"Minimuma malfacileco\",\n \"POW_MIN_HELP\": \"Malfacileco trudita por la haket-kalkulo\",\n \"DATA_DIVIDER\": \"Datenoj\",\n \"IDENTITIES_COUNT\": \"Novaj identecoj\",\n \"JOINERS_COUNT\": \"Novaj membroj\",\n \"ACTIVES_COUNT\": \"Revalidigoj\",\n \"ACTIVES_COUNT_HELP\": \"Membroj revalidigintaj sian membrecon\",\n \"LEAVERS_COUNT\": \"Membroj elirintaj\",\n \"LEAVERS_COUNT_HELP\": \"Membroj ne plu dezirantaj atestaĵon\",\n \"EXCLUDED_COUNT\": \"Membroj eksigitaj\",\n \"EXCLUDED_COUNT_HELP\": \"Malnovaj membroj eksigitaj pro nerevalidiĝo aŭ manko de atestaĵoj\",\n \"REVOKED_COUNT\": \"Nuligitaj identecoj\",\n \"REVOKED_COUNT_HELP\": \"Tiuj kontoj ne plu povos esti membroj\",\n \"TX_COUNT\": \"Spezoj\",\n \"CERT_COUNT\": \"Atestaĵoj\",\n \"TX_TO_HIMSELF\": \"Operacio pri monŝanĝo\",\n \"TX_OUTPUT_UNLOCK_CONDITIONS\": \"Kondiĉoj por malblokado\",\n \"TX_OUTPUT_OPERATOR\": {\n \"AND\": \"kaj\",\n \"OR\": \"aŭ\"\n },\n \"TX_OUTPUT_FUNCTION\": {\n \"SIG\": \"<b>Subskribo</b> de \",\n \"XHX\": \"<b>Pasvorto</b>, el kiu SHA256 =\",\n \"CSV\": \"Blokita dum\",\n \"CLTV\": \"Blokita ĝis\"\n }\n },\n \"LOOKUP\": {\n \"TITLE\": \"Blokoj\",\n \"NO_BLOCK\": \"Neniu bloko\",\n \"LAST_BLOCKS\": \"Lastaj blokoj:\",\n \"BTN_COMPACT\": \"Densigi\"\n }\n },\n \"CURRENCY\": {\n \"VIEW\": {\n \"TITLE\": \"Mono\",\n \"TAB_CURRENCY\": \"Mono\",\n \"TAB_WOT\": \"Reto de fido\",\n \"TAB_NETWORK\": \"Reto\",\n \"TAB_BLOCKS\": \"Blokoj\",\n \"CURRENCY_SHORT_DESCRIPTION\": \"{{currency|abbreviate}} estas <b>libera mono</b>, kiu ekis {{firstBlockTime|formatFromNow}}. Ĝi nombras nun <b>{{N}} membrojn</b>, kiuj produktas kaj ricevas <a ng-click=\\\"showHelpModal('ud')\\\">Universalan Dividendon</a> (UD), ĉiun {{dt|formatPeriod}}n.\",\n \"NETWORK_RULES_DIVIDER\": \"Reguloj de la reto\",\n \"CURRENCY_NAME\": \"Nomo de la mono\",\n \"MEMBERS\": \"Nombro de membroj\",\n \"MEMBERS_VARIATION\": \"Variado depost la lasta UD\",\n \"MONEY_DIVIDER\": \"Mono\",\n \"MASS\": \"Mona maso\",\n \"SHARE\": \"Maso por membro\",\n \"UD\": \"Universala Dividendo\",\n \"C_ACTUAL\": \"Nuna kreskado\",\n \"MEDIAN_TIME\": \"Horo de la blokĉeno\",\n \"POW_MIN\": \"Minimuma nivelo pri malfacileco de kalkulo\",\n \"MONEY_RULES_DIVIDER\": \"Reguloj de la mono\",\n \"C_RULE\": \"Teoria kreskado celata\",\n \"UD_RULE\": \"Kalkulo de la universala dividendo\",\n \"DT_REEVAL\": \"Periodo de revalorigo de la UD\",\n \"REEVAL_SYMBOL\": \"reval\",\n \"DT_REEVAL_VALUE\": \"Ĉiuj <b>{{dtReeval|formatDuration}}</b> ({{dtReeval/86400}} {{'COMMON.DAYS'|translate}})\",\n \"UD_REEVAL_TIME0\": \"Dato de la unua revalorigo\",\n \"SIG_QTY_RULE\": \"Nombro de necesaj atestaĵoj por fariĝi membro\",\n \"SIG_STOCK\": \"Maksimuma nombro da senditaj atestaĵoj por membro\",\n \"SIG_PERIOD\": \"Minimuma daŭro de atendado inter 2 sinsekvaj atestaĵoj senditaj de sama persono\",\n \"SIG_WINDOW\": \"Limdaŭro por akcepti atestaĵon\",\n \"SIG_VALIDITY\": \"Vivdaŭro de atestaĵo, kiu estis akceptita\",\n \"MS_WINDOW\": \"Limdaŭro por akcepti aliĝ-peton kiel membron\",\n \"MS_VALIDITY\": \"Vivdaŭro de aliĝo, kiu estis akceptita\",\n \"STEP_MAX\": \"Maksimuma distanco, per la atestaĵoj, inter nova eniranto kaj la referencaj membroj\",\n \"WOT_RULES_DIVIDER\": \"Reguloj de la reto de fido\",\n \"SENTRIES\": \"Nombro de atestaĵoj (senditaj <b>kaj</b> ricevitaj) por fariĝi referenca membro\",\n \"SENTRIES_FORMULA\": \"Nombro de atestaĵoj (senditaj <b>kaj</b> ricevitaj) por fariĝi referenca membro (formulo)\",\n \"XPERCENT\":\"Minimuma procento da referencaj membroj atingenda por konformiĝi al la regulo pri distanco\",\n \"AVG_GEN_TIME\": \"Meza daŭro inter du blokoj\",\n \"CURRENT\": \"nuna\",\n \"MATH_CEILING\": \"PLAFONO\",\n \"DISPLAY_ALL_RULES\": \"Afiŝi ĉiujn regulojn?\",\n \"BTN_SHOW_LICENSE\": \"Vidi la licencon\",\n \"WOT_DIVIDER\": \"Reto de fido\"\n },\n \"LICENSE\": {\n \"TITLE\": \"Licenco de la mono\",\n \"BTN_DOWNLOAD\": \"Elŝuti la dosieron\",\n \"NO_LICENSE_FILE\": \"Dosiero pri licenco ne trovita.\"\n }\n },\n \"NETWORK\": {\n \"VIEW\": {\n \"MEDIAN_TIME\": \"Horo de la blokĉeno\",\n \"LOADING_PEERS\": \"Nodoj ŝarĝiĝantaj...\",\n \"NODE_ADDRESS\": \"Adreso:\",\n \"SOFTWARE\": \"Programo\",\n \"WARN_PRE_RELEASE\": \"Antaŭ-versio (lasta stabila versio: <b>{{version}}</b>)\",\n \"WARN_NEW_RELEASE\": \"Versio <b>{{version}}</b> disponebla\",\n \"WS2PID\": \"Identigilo:\",\n \"PRIVATE_ACCESS\": \"Privata aliro\",\n \"POW_PREFIX\": \"Prefikso pri labor-pruvo:\",\n \"ENDPOINTS\": {\n \"BMAS\": \"Sekurigita interfaco (SSL)\",\n \"BMATOR\": \"Reta interfaco TOR\",\n \"WS2P\": \"Interfaco WS2P\",\n \"ES_USER_API\": \"Nodo de datenoj Cesium+\"\n }\n },\n \"INFO\": {\n \"ONLY_SSL_PEERS\": \"La nodoj ne-SSL estas mis-afiŝitaj, ĉar Cesium funkcias laŭ moduso HTTPS.\"\n }\n },\n \"PEER\": {\n \"PEERS\": \"Nodoj\",\n \"SIGNED_ON_BLOCK\": \"Skribita en la bloko\",\n \"MIRROR\": \"spegulo\",\n \"MIRRORS\": \"Speguloj\",\n \"MIRROR_PEERS\": \"Spegul-nodoj\",\n \"PEER_LIST\" : \"Listo de la nodoj\",\n \"MEMBERS\" : \"Membroj\",\n \"MEMBER_PEERS\" : \"Membro-nodoj\",\n \"ALL_PEERS\" : \"Ĉiuj nodoj\",\n \"DIFFICULTY\" : \"Malfacileco\",\n \"API\" : \"API\",\n \"CURRENT_BLOCK\" : \"Bloko #\",\n \"POPOVER_FILTER_TITLE\": \"Filtrilo\",\n \"OFFLINE\": \"Nekonektita\",\n \"OFFLINE_PEERS\": \"Nekonektitaj nodoj\",\n \"BTN_SHOW_PEER\": \"Vidi la nodon\",\n \"VIEW\": {\n \"TITLE\": \"Nodo\",\n \"OWNER\": \"Apartenas al\",\n \"SHOW_RAW_PEERING\": \"Vidi la samrangan dokumenton\",\n \"SHOW_RAW_CURRENT_BLOCK\": \"Vidi la lastan blokon (kompleta strukturo)\",\n \"LAST_BLOCKS\": \"Lastaj blokoj konataj\",\n \"KNOWN_PEERS\": \"Konataj nodoj:\",\n \"GENERAL_DIVIDER\": \"Ĝeneralaj informoj\",\n \"ERROR\": {\n \"LOADING_TOR_NODE_ERROR\": \"Neeblas ricevi la informojn de la nodo. La limdaŭro de atendado estas transpasita.\",\n \"LOADING_NODE_ERROR\": \"Neeblas ricevi la informojn de la nodo\"\n }\n }\n },\n \"WOT\": {\n \"SEARCH_HELP\": \"Traserĉado (pseŭdo aŭ publika ŝlosilo)\",\n \"SEARCH_INIT_PHASE_WARNING\": \"Dum la periodo de antaŭ-aliĝo, la traserĉado de la atendantaj aliĝoj <b>povas esti longa</b>. Bonvolu pacienci...\",\n \"REGISTERED_SINCE\": \"Enskribita la\",\n \"REGISTERED_SINCE_BLOCK\": \"Enskribita en la bloko #\",\n \"NO_CERTIFICATION\": \"Neniu atestaĵo validigita\",\n \"NO_GIVEN_CERTIFICATION\": \"Neniu atestaĵo sendita\",\n \"NOT_MEMBER_PARENTHESIS\": \"(ne membro)\",\n \"IDENTITY_REVOKED_PARENTHESIS\": \"(identeco nuligita)\",\n \"MEMBER_PENDING_REVOCATION_PARENTHESIS\": \"(nuliĝanta)\",\n \"EXPIRE_IN\": \"Finiĝo\",\n \"NOT_WRITTEN_EXPIRE_IN\": \"Limdato<br/>de traktado\",\n \"EXPIRED\": \"Finiĝinta\",\n \"PSEUDO\": \"Pseŭdonimo\",\n \"SIGNED_ON_BLOCK\": \"Sendita en la bloko #{{block}}\",\n \"WRITTEN_ON_BLOCK\": \"Enskribita en la bloko #{{block}}\",\n \"GENERAL_DIVIDER\": \"Ĝeneralaj informoj\",\n \"NOT_MEMBER_ACCOUNT\": \"Simpla konto (ne membro)\",\n \"NOT_MEMBER_ACCOUNT_HELP\": \"Temas pri simpla monujo, sen aliĝ-peto atendanta.\",\n \"TECHNICAL_DIVIDER\": \"Teknikaj informoj\",\n \"BTN_CERTIFY\": \"Atesti\",\n \"BTN_YES_CERTIFY\": \"Jes, atesti\",\n \"BTN_SELECT_AND_CERTIFY\": \"Nova atestaĵo\",\n \"ACCOUNT_OPERATIONS\": \"Spezoj en la konto\",\n \"VIEW\": {\n \"POPOVER_SHARE_TITLE\": \"Identeco {{title}}\"\n },\n \"LOOKUP\": {\n \"TITLE\": \"Reto de fido\",\n \"NEWCOMERS\": \"Novaj membroj\",\n \"NEWCOMERS_COUNT\": \"{{count}} membroj\",\n \"PENDING\": \"Atendantaj enskribiĝoj\",\n \"PENDING_COUNT\": \"{{count}} atendantaj enskribiĝoj\",\n \"REGISTERED\": \"Enskribita {{sigDate | formatFromNow}}\",\n \"MEMBER_FROM\": \"Membro depost {{memberDate|medianFromNowShort}}\",\n \"BTN_NEWCOMERS\": \"Novaj membroj\",\n \"BTN_PENDING\": \"Atendantaj enskribiĝoj\",\n \"SHOW_MORE\": \"Afiŝi pli\",\n \"SHOW_MORE_COUNT\": \"(nuna limo je {{limit}})\",\n \"NO_PENDING\": \"Neniu enskribiĝo atendanta.\",\n \"NO_NEWCOMERS\": \"Neniu membro.\"\n },\n \"CONTACTS\": {\n \"TITLE\": \"Kontaktoj\"\n },\n \"MODAL\": {\n \"TITLE\": \"Traserĉado\"\n },\n \"CERTIFICATIONS\": {\n \"TITLE\": \"{{uid}} - Atestaĵoj\",\n \"SUMMARY\": \"Ricevitaj atestaĵoj\",\n \"LIST\": \"Detalo pri la ricevitaj atestaĵoj\",\n \"PENDING_LIST\": \"Atestaĵoj atendantaj traktadon\",\n \"RECEIVED\": \"Ricevitaj atestaĵoj\",\n \"RECEIVED_BY\": \"Atestaĵoj ricevitaj de {{uid}}\",\n \"ERROR\": \"Atestaĵoj erare ricevitaj\",\n \"SENTRY_MEMBER\": \"Referenca membro\"\n },\n \"OPERATIONS\": {\n \"TITLE\": \"{{uid}} - Spezoj\"\n },\n \"GIVEN_CERTIFICATIONS\": {\n \"TITLE\": \"{{uid}} - Senditaj atestaĵoj\",\n \"SUMMARY\": \"Senditaj atestaĵoj\",\n \"LIST\": \"Detalo pri la senditaj atestaĵoj\",\n \"PENDING_LIST\": \"Atestaĵoj atendantaj traktadon\",\n \"SENT\": \"Senditaj atestaĵoj\",\n \"SENT_BY\": \"Atestaĵoj senditaj de {{uid}}\",\n \"ERROR\": \"Atestaĵoj erare senditaj\"\n }\n },\n \"LOGIN\": {\n \"TITLE\": \"<i class=\\\"icon ion-log-in\\\"></i> Konektiĝo\",\n \"SCRYPT_FORM_HELP\": \"Bonvolu tajpi viajn identigilojn.<br>Pensu kontroli, ke la publika ŝlosilo estas tiu de via konto.\",\n \"PUBKEY_FORM_HELP\": \"Bonvolu tajpi publikan ŝlosilon de konto:\",\n \"FILE_FORM_HELP\": \"Elektu la ŝlosilaro-dosieron uzotan:\",\n \"SCAN_FORM_HELP\": \"Skani la QR-kodon de monujo.\",\n \"SALT\": \"Sekreta identigilo\",\n \"SALT_HELP\": \"Sekreta identigilo\",\n \"SHOW_SALT\": \"Afiŝi la sekretan identigilon?\",\n \"PASSWORD\": \"Pasvorto\",\n \"PASSWORD_HELP\": \"Pasvorto\",\n \"PUBKEY_HELP\": \"Publika ŝlosilo aŭ pseŭdonimo\",\n \"NO_ACCOUNT_QUESTION\": \"Vi ankoraŭ ne havas konton?\",\n \"HAVE_ACCOUNT_QUESTION\": \"Vi jam havas konton?\",\n \"CREATE_ACCOUNT\": \"Krei konton...\",\n \"CREATE_FREE_ACCOUNT\": \"Krei konton senpage\",\n \"FORGOTTEN_ID\": \"Pasvorto forgesita?\",\n \"ASSOCIATED_PUBKEY\": \"Publika ŝlosilo de la ŝlosilaro:\",\n \"BTN_METHODS\": \"Aliaj metodoj\",\n \"BTN_METHODS_DOTS\": \"Ŝanĝi metodon...\",\n \"METHOD_POPOVER_TITLE\": \"Metodoj\",\n \"MEMORIZE_AUTH_FILE\": \"Memorigi tiun ŝlosilaron por la daŭro de la sesio de retumado\",\n \"SCRYPT_PARAMETERS\": \"Parametroj (Skripto):\",\n \"AUTO_LOGOUT\": {\n \"TITLE\": \"Informo\",\n \"MESSAGE\": \"<i class=\\\"ion-android-time\\\"></i> Vi estis <b>malkonektita</b> aŭtomate, pro tro longa senaktiveco.\",\n \"BTN_RELOGIN\": \"Rekonektiĝi\",\n \"IDLE_WARNING\": \"Vi estos malkonektita... {{countdown}}\"\n },\n \"METHOD\": {\n \"SCRYPT_DEFAULT\": \"Sekreta identigilo kaj pasvorto\",\n \"SCRYPT_ADVANCED\": \"Sperta salumado\",\n \"FILE\": \"Dosiero pri ŝlosilaro\",\n \"PUBKEY\": \"Publika ŝlosilo aŭ pseŭdonimo\",\n \"SCAN\": \"Skani QR-kodon\"\n },\n \"SCRYPT\": {\n \"SIMPLE\": \"Malpeza salumado\",\n \"DEFAULT\": \"Kutima salumado\",\n \"SECURE\": \"Sekura salumado\",\n \"HARDEST\": \"Plej sekura salumado\",\n \"EXTREME\": \"Ekstrema salumado\",\n \"USER\": \"Personigita salumado\",\n \"N\": \"N (Loop):\",\n \"r\": \"r (RAM):\",\n \"p\": \"p (CPU):\"\n },\n \"FILE\": {\n \"HELP\": \"Atendita strukturo de dosiero: <b>.yml</b> aŭ <b>.dunikey</b> (tipo PubSec, WIF aŭ EWIF).\"\n }\n },\n \"AUTH\": {\n \"TITLE\": \"<i class=\\\"icon ion-locked\\\"></i> Aŭtentigado\",\n \"BTN_AUTH\": \"Aŭtentiĝi\",\n \"GENERAL_HELP\": \"Bonvolu aŭtentiĝi:\",\n \"EXPECTED_UID_HELP\": \"Bonvolu aŭtentiĝi ĉe la konto <i class=\\\"ion-person\\\"></i> {{uid}} :\",\n \"EXPECTED_PUBKEY_HELP\": \"Bonvolu aŭtentiĝi ĉe la monujo <br class=\\\"visible-xs\\\"/><i class=\\\"ion-key\\\"></i> {{pubkey|formatPubkey}} :\",\n \"SCAN_FORM_HELP\": \"Skani la QR-kodon de la <b>privata ŝlosilo</b> de la monujo.\"\n },\n \"ACCOUNT\": {\n \"TITLE\": \"Mia konto\",\n \"BALANCE\": \"Saldo\",\n \"LAST_TX\": \"Lastaj spezoj validigitaj\",\n \"BALANCE_ACCOUNT\": \"Konto-saldo\",\n \"NO_TX\": \"Neniu spezo\",\n \"SHOW_MORE_TX\": \"Afiŝi pli\",\n \"SHOW_ALL_TX\": \"Afiŝi ĉion\",\n \"TX_FROM_DATE\": \"(nuna limo je {{fromTime|medianFromNowShort}})\",\n \"PENDING_TX\": \"Spezoj atendantaj traktadon\",\n \"VALIDATING_TX\": \"Spezoj traktitaj, ne validigitaj\",\n \"ERROR_TX\": \"Spezoj ne realigitaj\",\n \"ERROR_TX_SENT\": \"Spezoj malsukcesintaj\",\n \"PENDING_TX_RECEIVED\": \"Spezoj atendantaj ricevon\",\n \"EVENTS\": \"Okazaĵoj\",\n \"OUT_DISTANCED\": \"Viaj nunaj atestaĵoj venas de tro izolita grupo de la <a ng-click=\\\"showHelpModal('wot')\\\">Reto de Fido</a> (RdF): al la <a ng-click=\\\"showHelpModal('distance_rule')\\\">regulo de maksimuma distanco</a> vi ne konformiĝas.<br/>Vi devas akiri atestaĵojn venantajn de aliaj lokoj de la RdF, aŭ atendi ke tiu ĉi densiĝos.\",\n \"WAITING_MEMBERSHIP\": \"Aliĝo-peto sendita. Atendanta akcepton.\",\n \"WAITING_CERTIFICATIONS\": \"Vi devas <b>akiri {{needCertificationCount}} atestaĵo(j)n</b> por fariĝi membro kaj produkti la <a ng-click=\\\"showHelpModal('ud')\\\">Universalan Dividendon</a>. Via konto tamen estas jam funkcianta, por ricevi kaj efektivigi pagojn.\",\n \"WAITING_CERTIFICATIONS_HELP\": \"Por akiri viajn atestaĵojn, petu nur membrojn <b>kiuj sufiĉe konas vin</b>, kiel postulas <a ng-click=\\\"showLicenseModal()\\\">la licenco de la mono</a>, kiun vi akceptis.<br/>Se vi ne konas sufiĉe da membroj, sciigu tion ĉe <a ng-click=\\\"openLink($event, $root.settings.userForumUrl)\\\">la forumo por uzantoj</a>.\",\n \"WILL_MISSING_CERTIFICATIONS\": \"Baldaŭ <b>mankos al vi atestaĵoj</b> (almenaŭ {{willNeedCertificationCount}} estas necesaj)\",\n \"WILL_NEED_RENEW_MEMBERSHIP\": \"Via aliĝo kiel membro <b>estas finiĝonta {{membershipExpiresIn|formatDurationTo}}</b>. Pensu <a ng-click=\\\"doQuickFix('renew')\\\">revalidigi vian aliĝon</a> ĝis tiam.\",\n \"NEED_RENEW_MEMBERSHIP\": \"Vi ne plu estas membro de la mono, ĉar <b>via aliĝo finiĝis</b>. Pensu <a ng-click=\\\"doQuickFix('renew')\\\">revalidigi vian aliĝon</a>.\",\n \"NEED_RENEW_MEMBERSHIP_AFTER_CANCELLED\": \"Vi ne plu estas membro de la mono, <b>pro manko da atestaĵoj</b>. Pensu <a ng-click=\\\"doQuickFix('renew')\\\">revalidigi vian aliĝon</a>.\",\n \"NO_WAITING_MEMBERSHIP\": \"Neniu aliĝo-peto atendanta. Se vi deziras <b>fariĝi membro</b>, pensu <a ng-click=\\\"doQuickFix('membership')\\\">sendi la aliĝo-peton</a>.\",\n \"CERTIFICATION_COUNT\": \"Ricevitaj atestaĵoj\",\n \"CERTIFICATION_COUNT_SHORT\": \"Atestaĵoj\",\n \"SIG_STOCK\": \"Senditaj atestaĵoj\",\n \"BTN_RECEIVE_MONEY\": \"Enkasigi\",\n \"BTN_SELECT_ALTERNATIVES_IDENTITIES\": \"Aliri alian identecon...\",\n \"BTN_FIX_MEMBERSHIP\": \"Resendi la aliĝo-peton...\",\n \"BTN_MEMBERSHIP_RENEW\": \"Revalidigi la aliĝon\",\n \"BTN_MEMBERSHIP_RENEW_DOTS\": \"Revalidigi la aliĝon...\",\n \"BTN_MEMBERSHIP_OUT_DOTS\": \"Ĉesigi la aliĝon...\",\n \"BTN_SECURITY_DOTS\": \"Konto kaj sekureco...\",\n \"BTN_SHOW_DETAILS\": \"Afiŝi la teknikajn informojn\",\n \"LOCKED_OUTPUTS_POPOVER\": {\n \"TITLE\": \"Sumo blokita\",\n \"DESCRIPTION\": \"Jen la kondiĉoj de malblokado de tiu sumo:\",\n \"DESCRIPTION_MANY\": \"Tiu spezo entenas plurajn partojn, pri kiuj la kondiĉoj de malblokado estas:\",\n \"LOCKED_AMOUNT\": \"Kondiĉoj por la sumo:\"\n },\n \"NEW\": {\n \"TITLE\": \"Kreado de konto\",\n \"INTRO_WARNING_TIME\": \"La kreado de konto ĉe {{name|capitalize}} estas tre simpla. Bonvolu tamen dediĉi sufiĉe da tempo por ĝuste efektivigi tiun proceduron (por ne forgesi la identigilojn, pasvortojn, ktp.).\",\n \"INTRO_WARNING_SECURITY\": \"Kontrolu ke la aparatoj, kiujn vi nun uzas (komputilo, tabuleto, telefono), <b>estas sekurigitaj kaj fidindaj</b>.\",\n \"INTRO_WARNING_SECURITY_HELP\": \"Senvirusigilo ĝisdata, fajroŝirmilo aktivigita, sesio protektita per pasvorto aŭ PIN-kodo, ktp.\",\n \"INTRO_HELP\": \"Alklaku <b>{{'COMMON.BTN_START'|translate}}</b> por ekigi la kreadon de konto. Vi estos gvidata paŝon post paŝo.\",\n \"REGISTRATION_NODE\": \"Via aliĝo estos registrita tra la nodo Duniter <b>{{server}}</b>, kiu dissendos ĝin poste al la cetero de la mon-reto.\",\n \"REGISTRATION_NODE_HELP\": \"Se vi ne fidas tiun nodon, bonvolu ŝanĝi ĝin <a ng-click=\\\"doQuickFix('settings')\\\">en la parametroj</a> de Cesium.\",\n \"SELECT_ACCOUNT_TYPE\": \"Elektu la tipon de konto kreota:\",\n \"MEMBER_ACCOUNT\": \"Membro-konto\",\n \"MEMBER_ACCOUNT_TITLE\": \"Kreado de membro-konto\",\n \"MEMBER_ACCOUNT_HELP\": \"Se vi ankoraŭ ne enskribiĝis kiel individuo (nur unu konto eblas por unu individuo). Tia konto ebligas kunprodukti la monon, ricevante <b> universalan dividendon</b> ĉiun {{parameters.dt|formatPeriod}}n.\",\n \"WALLET_ACCOUNT\": \"Simpla monujo\",\n \"WALLET_ACCOUNT_TITLE\": \"Kreado de monujo\",\n \"WALLET_ACCOUNT_HELP\": \"Por ĉiuj aliaj kazoj, ekzemple se vi bezonas plian konton.<br/>Neniu universala dividendo estos kreita per tia konto.\",\n \"SALT_WARNING\": \"Elektu vian sekretan identigilon.<br/>Oni petos ĝin de vi ĉiufoje, kiam vi konektiĝos al tiu konto.<br/><br/><b>Bone memorigu ĝin</b>: kaze de perdo, neniu alia povos aliri vian konton!\",\n \"PASSWORD_WARNING\": \"Elektu pasvorton.<br/>Oni petos ĝin de vi ĉiufoje, kiam vi konektiĝos al tiu konto.<br/><br/><b>Bone memorigu tiun pasvorton</b: kaze de perdo, neniu alia povos aliri vian konton!\",\n \"PSEUDO_WARNING\": \"Elektu pseŭdonimon.<br/>Ĝi utilas al la aliaj membroj, por identigi vin pli facile.<div class='hidden-xs'><br/>Ĝi <b>ne povos esti modifita</b>, sen rekrei konton.</div><br/><br/>Ĝi entenu <b>nek spacon, nek diakritan literon (kun supersigno, ktp.)</b>.<div class='hidden-xs'><br/>Ekzemple: <span class='gray'>NataljaBelulino, JohanoStelaro, ktp.</span>\",\n \"PSEUDO\": \"Pseŭdonimo\",\n \"PSEUDO_HELP\": \"Pseŭdonimo\",\n \"SALT_CONFIRM\": \"Konfirmo\",\n \"SALT_CONFIRM_HELP\": \"Konfirmo de la sekreta identigilo\",\n \"PASSWORD_CONFIRM\": \"Konfirmo\",\n \"PASSWORD_CONFIRM_HELP\": \"Konfirmo de la pasvorto\",\n \"SLIDE_6_TITLE\": \"Konfirmo:\",\n \"COMPUTING_PUBKEY\": \"Kalkulanta...\",\n \"LAST_SLIDE_CONGRATULATION\": \"Vi tajpis ĉiujn necesajn informojn: Gratulon!<br/>Vi nun povas <b>sendi la peton por kreado</b> de la konto.</b><br/><br/>Por informo, la publika ŝlosilo ĉi-sube identigos vian estontan konton.<br/>Ĝi povos estis sciigita al aliuloj por ricevi iliajn pagojn.<br/><b>Ne estas devige</b> noti ĝin nun, vi ankaŭ povos fari tion poste.\",\n \"CONFIRMATION_MEMBER_ACCOUNT\": \"<b class=\\\"assertive\\\">Averto:</b> la sekreta identigilo, la pasvorto kaj la pseŭdonimo ne plu povos esti modifitaj.<br/><br/><b>Certiĝu, ke vi ĉiam rememorigos ĝin!</b><br/><br/><b>Ĉu vi certas</b>, ke vi deziras sendi tiun ĉi aliĝo-peton?\",\n \"CONFIRMATION_WALLET_ACCOUNT\": \"<b class=\\\"assertive\\\">Averto:</b> la sekreta identigilo kaj la pasvorto ne plu povos esti modifitaj.<br/><br/><b>Certiĝu, ke vi ĉiam rememorigos ĝin!</b><br/><br/><b>Ĉu vi certas</b>, ke vi deziras daŭrigi per tiuj ĉi identigiloj?\",\n \"CHECKING_PSEUDO\": \"Kontrolo...\",\n \"PSEUDO_AVAILABLE\": \"Pseŭdonimo disponebla\",\n \"PSEUDO_NOT_AVAILABLE\": \"Pseŭdonimo ne disponebla\",\n \"INFO_LICENSE\": \"Antaŭ ol krei membro-konton, <b>bonvolu legi kaj akcepti la licencon</b> pri uzado de la mono:\",\n \"BTN_ACCEPT\": \"Mi akceptas\",\n \"BTN_ACCEPT_LICENSE\": \"Mi akceptas la licencon\"\n },\n \"POPUP_REGISTER\": {\n \"TITLE\": \"Elektu pseŭdonimon\",\n \"HELP\": \"Pseŭdonimo estas deviga por fariĝi membro.\"\n },\n \"SELECT_IDENTITY_MODAL\": {\n \"TITLE\": \"Elekto de la identeco\",\n \"HELP\": \"Pluraj <b>malsamaj identecoj</b> estis senditaj, por la publika ŝlosilo <span class=\\\"gray\\\"><i class=\\\"ion-key\\\"></i> {{pubkey|formatPubkey}}</span>.<br/>Bonvolu elekti la dosierujon uzotan:\"\n },\n \"SELECT_WALLET_MODAL\": {\n \"TITLE\": \"Elekto de la monujo\"\n },\n \"WALLET_LIST\": {\n \"TITLE\": \"Miaj monujoj\",\n \"BTN_NEW\": \"Aldoni monujon\",\n \"BTN_DOWNLOAD\": \"Elŝuti la liston\",\n \"BTN_IMPORT_FILE_DOTS\": \"Enporti el dosiero...\",\n \"NO_WALLET\": \"Neniu kroma monujo\",\n \"BTN_DELETE\": \"Forigi kroman monujon...\",\n \"BTN_RENAME\": \"Renomi la monujon\",\n \"EXPORT_FILENAME\": \"miaj_monujoj-{{pubkey|formatPubkey}}-{{currency}}.csv\",\n \"TOTAL_DOTS\": \"Sumo: \",\n \"EDIT_POPOVER\": {\n \"TITLE\": \"Renomi la monujon\",\n \"HELP\": \"Sciigu la novan nomon\",\n \"NAME_HELP\": \"Nomo de la monujo\"\n },\n \"IMPORT_MODAL\": {\n \"TITLE\": \"Enporti monujojn\",\n \"HELP\": \"Por <b>enporti monujojn</b>, bonvolu glitigi en la ĉi-suban zonon la dosieron pri la listo de monujoj, aŭ alklaki la zonon por serĉadi dosieron.\",\n \"WALLET_COUNT\": \"<b>{{count}}</b> nova{{count > 1 ? 'j' : ''}} monujo{{count > 1 ? 'j' : ''}}\",\n \"NO_NEW_WALLET\": \"Neniu nova monujo\"\n }\n },\n \"SECURITY\": {\n \"ADD_QUESTION\": \"Aldoni personigitan demandon\",\n \"BTN_CLEAN\": \"Malplenigi\",\n \"BTN_RESET\": \"Restartigi\",\n \"DOWNLOAD_REVOKE\": \"Konservi mian dosieron pri nuligo\",\n \"DOWNLOAD_REVOKE_HELP\": \"Disponi dosieron pri nuligo estas grave, ekzemple kaze de perdo de viaj identigiloj. Ĝi ebligas al vi <b>elirigi tiun konton el la reto de fido</b>, tiel ke ĝi refariĝu simpla monujo.\",\n \"GENERATE_KEYFILE\": \"Krei mian dosieron pri ŝlosilaro...\",\n \"GENERATE_KEYFILE_HELP\": \"Kreas dosieron, kiu ebligas al vi aŭtentiĝi sen tajpi viajn identigilojn.<br/><b>Atenton:</b> tiu dosiero entenos vian konto-ŝlosilaron (publikan kaj sekretan ŝlosilojn); do tre gravas meti ĝin en sekuran lokon!\",\n \"KEYFILE_FILENAME\": \"ŝlosilaro-{{pubkey|formatPubkey}}-{{currency}}-{{format}}.dunikey\",\n \"MEMBERSHIP_IN\": \"Transformi en membro-konton...\",\n \"MEMBERSHIP_IN_HELP\": \"Ebligas <b>transformi</b> simplan monujo-konton <b>en membro-konton</b>, sendante aliĝo-peton. Utilas nur se vi ne havas jam alian membro-konton.\",\n \"SEND_IDENTITY\": \"Publikigi sian identecon...\",\n \"SEND_IDENTITY_HELP\": \"Ebligas kunligi pseŭdonimon kun tiu ĉi konto, sed <b>sen fari aliĝo-peton</b> por iĝi membro. Tiu kunligo kutime ne utilas, ĉar la valideco de tiu kunligo de pseŭdonimo estas limigita en la tempo.\",\n \"HELP_LEVEL\": \"Por krei konserv-dosieron pri viaj identigiloj, elektu <strong> almenaŭ {{nb}} demandojn:</strong>\",\n \"LEVEL\": \"Nivelo de sekureco\",\n \"LOW_LEVEL\": \"Malforta <span class=\\\"hidden-xs\\\">(2 demandoj minimume)</span>\",\n \"MEDIUM_LEVEL\": \"Meza <span class=\\\"hidden-xs\\\">(4 demandoj minimume)</span>\",\n \"QUESTION_1\": \"Kiel nomiĝis via plej bona amik.in.o, kiam vi estis adoleskant.in.o?\",\n \"QUESTION_2\": \"Kiel nomiĝis via unua hejm-besto?\",\n \"QUESTION_3\": \"Kiun pladon vi unue lernis kuiradi?\",\n \"QUESTION_4\": \"Kiun filmon vi unue spektis en kinejo?\",\n \"QUESTION_5\": \"Kien vi iris la unuan fojon, kiam vi vojaĝis per aviadilo?\",\n \"QUESTION_6\": \"Kiel nomiĝis via preferata instruist.i.no en bazlernejo?\",\n \"QUESTION_7\": \"Kio estus laŭ vi la ideala profesio?\",\n \"QUESTION_8\": \"Kiun libron por infanoj vi preferas?\",\n \"QUESTION_9\": \"Kio estis la marko de via unua veturilo?\",\n \"QUESTION_10\": \"Kio estis via kromnomo, kiam vi estis infano?\",\n \"QUESTION_11\": \"Kiun rolant.in.on aŭ aktor.in.on vi preferis en kino, kiam vi estis student.in.o?\",\n \"QUESTION_12\": \"Kiun kanzonist.ino.n aŭ muzikgrupon vi preferis, kiam vi estis student.in.o?\",\n \"QUESTION_13\": \"En kiu urbo renkontiĝis viaj gepatroj?\",\n \"QUESTION_14\": \"Kiel nomiĝis via unua ĉefo?\",\n \"QUESTION_15\": \"Kiel nomiĝas la strato, kie vi kreskis?\",\n \"QUESTION_16\": \"Kiel nomiĝas la marbordo, kie vi unuafoje baniĝis?\",\n \"QUESTION_17\": \"Kiun muzik-albumon vi unuafoje aĉetis?\",\n \"QUESTION_18\": \"Kiel nomiĝas via preferata sporto-teamo?\",\n \"QUESTION_19\": \"Kio estis la profesio de via avo?\",\n \"RECOVER_ID\": \"Retrovi mian pasvorton...\",\n \"RECOVER_ID_HELP\": \"Se vi disponas <b>konserv-dosieron pri viaj identigiloj</b>, vi povas retrovi ilin respondante ĝuste viajn personajn demandojn.\",\n \"REVOCATION_WITH_FILE\": \"Nuligi mian membro-konton...\",\n \"REVOCATION_WITH_FILE_DESCRIPTION\": \"Se vi <b>definitive perdis viajn identigilojn</b> pri via membro-konto (aŭ ke la sekureco de la konto estas endanĝerigita), vi povas uzi <b>la dosieron pri nuligo</b> de la konto por <b>trudi ties definitivan eliradon el la reto de fido</b>.\",\n \"REVOCATION_WITH_FILE_HELP\": \"Por <b>definitive nuligi</b> membro-konton, bonvolu glitigi en la ĉi-suban zonon vian dosieron pri nuligo, aŭ alklaki la zonon por serĉadi dosieron.\",\n \"REVOCATION_WALLET\": \"Nuligi tiun ĉi konton tuj\",\n \"REVOCATION_WALLET_HELP\": \"Peti la nuligon de via identeco estigas la <b>eliradon el la reto de fido</b> (definitivan por la pseŭdonimo kaj la publika ŝlosilo kunligitaj). La konto ne plu povos produkti Universalan Dividendon.<br/>Vi tamen daŭre povos konektiĝi al ĝi, kiel al simpla monujo.\",\n \"REVOCATION_FILENAME\": \"nuligo-{{uid}}-{{pubkey|formatPubkey}}-{{currency}}.txt\",\n \"SAVE_ID\": \"Konservi miajn identigilojn...\",\n \"SAVE_ID_HELP\": \"Kreado de konserv-dosiero, por <b>retrovi vian pasvorton</b> (kaj la sekretan identigilon) <b>kaze de forgeso</b>. La dosiero estas <b>sekurigita</b> (ĉifrita) dank'al personaj demandoj.\",\n \"STRONG_LEVEL\": \"Forta <span class=\\\"hidden-xs \\\">(6 demandoj minimume)</span>\",\n \"TITLE\": \"Konto kaj sekureco\",\n \"KEYFILE\": {\n \"PUBSEC_FORMAT\": \"Strukturo PubSec.\",\n \"PUBSEC_FORMAT_HELP\": \"Tiu strukturo stokas vian ŝlosilaron laŭ tre simpla maniero. Ĝi kongruas aparte kun Cesium, ğannonce kaj Duniter.<br/><b>Atenton:</b>La dosiero <b>ne estas ĉifrita</b> (la sekreta ŝlosilo klare aperas en ĝi); bonvolu do stoki ĝin en sekura loko!\",\n \"WIF_FORMAT\": \"Strukturo WIF (Wallet Import Format) - v1\",\n \"WIF_FORMAT_HELP\": \"Tiu strukturo stokas vian ŝlosilaron inkluzivante en ĝin kontrol-sumon por kontroli la sendifektecon de la dosiero. Ĝi kongruas aparte kun la paper-monujoj (Duniter paper wallet).<br/><b>Atenton:</b>La dosiero <b>ne estas ĉifrita</b> (la sekreta ŝlosilo klare aperas en ĝi); bonvolu do stoki ĝin en sekura loko!\",\n \"EWIF_FORMAT\": \"Strukturo EWIF (Encrypted Wallet Import Format) - v1\",\n \"EWIF_FORMAT_HELP\": \"Tiu strukturo stokas vian ŝlosilaron <b>laŭ ĉifrita maniero</b> dank'al sekreta frazo elektita de vi. Ĝi ankaŭ inkluzivas kontrol-sumon por kontroli la sendifektecon de la dosiero.<br/><b>Atenton:</b> Zorgu, ke vi ĉiam rememoru vian sekretan frazon!\",\n\t\t\"PASSWORD_POPUP\": {\n \"TITLE\": \"Ĉifrita dosiero pri ŝlosilaro\",\n \"HELP\": \"Bonvolu indiki la la sekretan frazon:\",\n \"PASSWORD_HELP\": \"Sekreta frazo\"\n },\n \"ERROR\": {\n \"BAD_PASSWORD\": \"Sekreta frazo malĝusta\",\n \"BAD_CHECKSUM\": \"Kontrol-sumo malĝusta\"\n }\n }\n },\n \"FILE_NAME\": \"{{currency}} - Konto-tabelo {{pubkey|formatPubkey}} je {{currentTime|formatDateForFile}}.csv\",\n \"HEADERS\": {\n \"TIME\": \"Dato\",\n \"AMOUNT\": \"Sumo\",\n \"COMMENT\": \"Komento\"\n }\n },\n \"TRANSFER\": {\n \"TITLE\": \"Elspezo\",\n \"SUB_TITLE\": \"Fari elspezon\",\n \"SUB_TITLE_ALL\": \"Malplenigi la konton\",\n \"FROM\": \"De\",\n \"TO\": \"Al\",\n \"AMOUNT\": \"Sumo\",\n \"AMOUNT_HELP\": \"Sumo\",\n \"COMMENT\": \"Komento\",\n \"COMMENT_HELP\": \"Komento\",\n \"BTN_SEND\": \"Sendi\",\n \"BTN_ADD_COMMENT\": \"Aldoni komenton\",\n \"REST\": \"Resto de la konto\",\n \"REST_TO\": \"al\",\n \"WARN_COMMENT_IS_PUBLIC\": \"Bonvolu noti, ke <b>la komentoj estas publikaj</b> (ne ĉifritaj).\",\n \"MODAL\": {\n \"TITLE\": \"Elspezo\"\n }\n },\n \"ERROR\": {\n \"UNKNOWN_URI_FORMAT\": \"URI-strukturo nekonata\",\n \"PUBKEY_INVALID_CHECKSUM\": \"Publika ŝlosilo nevalida (bad checksum).\",\n \"POPUP_TITLE\": \"Eraro\",\n \"UNKNOWN_ERROR\": \"Eraro nekonata\",\n \"CRYPTO_UNKNOWN_ERROR\": \"Via retumilo ŝajnas ne kongrua kun la kriptografiaj funkcioj.\",\n \"DOWNLOAD_KEYFILE_FAILED\": \"Malsukceso por la kreado de la dosiero pri ŝlosilaro.\",\n \"EQUALS_TO_PSEUDO\": \"Devas esti malsama ol la pseŭdonimo\",\n \"EQUALS_TO_SALT\": \"Devas esti malsama ol la sekreta identigilo\",\n \"FIELD_REQUIRED\": \"Deviga kampo\",\n \"FIELD_TOO_SHORT\": \"Signaro tro mallonga\",\n \"FIELD_TOO_SHORT_WITH_LENGTH\": \"Signaro tro mallonga ({{minLength}} signoj minimume)\",\n \"FIELD_TOO_LONG\": \"Signaro tro longa\",\n \"FIELD_TOO_LONG_WITH_LENGTH\": \"Signaro tro longa ({{maxLength}} signoj maksimume)\",\n \"FIELD_MIN\": \"Minimuma longeco: {{min}}\",\n \"FIELD_MAX\": \"Maksimuma longeco: {{max}}\",\n \"FIELD_ACCENT\": \"Diakritaj literoj kaj komoj ne permesataj\",\n \"FIELD_NOT_NUMBER\": \"Nombra valoro atendata\",\n \"FIELD_NOT_INT\": \"Entjera nombro atendata\",\n \"FIELD_NOT_EMAIL\": \"Retadreso nevalida\",\n \"PASSWORD_NOT_CONFIRMED\": \"Ne kongruas kun la pasvorto\",\n \"SALT_NOT_CONFIRMED\": \"Ne kongruas kun la sekreta identigilo\",\n \"SEND_IDENTITY_FAILED\": \"Aliĝo malsukcesa\",\n \"SEND_CERTIFICATION_FAILED\": \"Atestado malsukcesa\",\n \"NEED_MEMBER_ACCOUNT_TO_CERTIFY\": \"Vi ne povas efektivigi atestadon, ĉar via konto <b>ne estas membro</b>.\",\n \"NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF\": \"Vi ne povas efektivigi atestadon, ĉar via konto ankoraŭ ne estas membro.<br/><br/>Ankoraŭ mankas al vi atestaĵoj, aŭ tiuj ĉi ankoraŭ ne estis validigitaj.\",\n \"IDENTITY_TO_CERTIFY_HAS_NO_SELF\": \"Konto ne atestebla. Neniu aliĝo-peto estis farita, aŭ la aliĝo ne estis revalidigita.\",\n \"LOGIN_FAILED\": \"Eraro dum konektiĝo.\",\n \"LOAD_IDENTITY_FAILED\": \"Eraro por ŝarĝi la identecon.\",\n \"LOAD_REQUIREMENTS_FAILED\": \"Eraro por ŝarĝi la antaŭ-necesaĵoj de la identeco.\",\n \"SEND_MEMBERSHIP_IN_FAILED\": \"Malsukceso pri la provado eniri la komunumon.\",\n \"SEND_MEMBERSHIP_OUT_FAILED\": \"Malsukceso pri la ĉesigo de la aliĝo.\",\n \"REFRESH_WALLET_DATA\": \"Malsukceso pri la ĝisdatigo de la monujo.\",\n \"GET_CURRENCY_PARAMETER\": \"Malsukceso por ricevi la regulojn de la mono.\",\n \"GET_CURRENCY_FAILED\": \"Ne eblis ŝarĝi la monon. Bonvolu reprovi pli poste.\",\n \"SEND_TX_FAILED\": \"Elspezado malsukcesa.\",\n \"ALL_SOURCES_USED\": \"Bonvolu atendi la kalkulon de la venonta bloko (ĉiuj viaj monfontoj estis uzitaj).\",\n \"NOT_ENOUGH_SOURCES\": \"Ne sufiĉe da mono por sendi tiun ĉi sumon per ununura spezo.<br/>Maksimuma sumo: {{amount}} {{unit}}<sub>{{subUnit}}</sub>.\",\n \"ACCOUNT_CREATION_FAILED\": \"Malsukceso por krei la membro-konton.\",\n \"RESTORE_WALLET_DATA_ERROR\": \"Malsukceso por reŝarĝi la parametrojn de la loka stokaĵo\",\n \"LOAD_WALLET_DATA_ERROR\": \"Malsukceso por ŝarĝi la datenojn de la monujo.\",\n \"COPY_CLIPBOARD_FAILED\": \"Ne eblis kopii la valoron.\",\n \"TAKE_PICTURE_FAILED\": \"Malsukceso por ricevi la foton.\",\n \"SCAN_FAILED\": \"Malsukceso por skani la QR-kodon.\",\n \"SCAN_UNKNOWN_FORMAT\": \"Kodo nerekonata.\",\n \"WOT_LOOKUP_FAILED\": \"Serĉado malsukcesa.\",\n \"LOAD_PEER_DATA_FAILED\": \"Ne eblis legi la nodon Duniter. Bonvolu reprovi poste.\",\n \"NEED_LOGIN_FIRST\": \"Bonvolu unue konektiĝi.\",\n \"AMOUNT_REQUIRED\": \"La monsumo estas deviga.\",\n \"AMOUNT_NEGATIVE\": \"Negativa sumo nepermesata.\",\n \"NOT_ENOUGH_CREDIT\": \"Saldo nesufiĉa.\",\n \"INVALID_NODE_SUMMARY\": \"Nodo neatingebla aŭ adreso nevalida.\",\n \"INVALID_USER_ID\": \"La pseŭdonimo devas enteni nek spacon nek signon specialan aŭ kun supersigno.\",\n \"INVALID_COMMENT\": \"La kampo 'referenco' ne devas enteni literojn kun supersigno.\",\n \"INVALID_PUBKEY\": \"La publika ŝlosilo ne havas la atenditan strukturon.\",\n \"INVALID_PUBKEY_CHECKSUM\": \"Kontrol-sumo nevalida.\",\n \"IDENTITY_REVOKED\": \"Tiu ĉi identeco <b>estis nuligita</b>. Ĝi ne plu povas fariĝi membro.\",\n \"IDENTITY_REVOKED_WITH_TIME\": \"Tiu ĉi identeco <b>estis nuligita {{revocationTime|medianFromNow}}</b> ({{revocationTime|medianDate}}). Ĝi ne plu povas fariĝi membro.\",\n \"IDENTITY_PENDING_REVOCATION\": \"La <b>nuligo de tiu ĉi identeco</b> estis petita kaj atendas traktadon. La atestado estas do malaktivigita.\",\n \"IDENTITY_INVALID_BLOCK_HASH\": \"Tiu ĉi aliĝo-peto ne plu validas (ĉar ĝi rilatas al bloko, kiun nuligis la nodoj de la reto): tiu persono devas refari sian aliĝo-peton <b>antaŭ ol</b> esti atestita.\",\n \"IDENTITY_EXPIRED\": \"La publikigo de tiu ĉi identeco finiĝis: tiu persono devas fari novan aliĝo-peton <b>antaŭ ol</b> esti atestita.\",\n \"IDENTITY_SANDBOX_FULL\": \"La nodo Duniter uzata de Cesium ne plu povas ricevi novajn identecojn, ĉar ĝia atendo-vico estas plena.<br/><br/>Bonvolu reprovi poste aŭ ŝanĝi la nodon (per la menuo <b>Parametroj</b>).\",\n \"IDENTITY_NOT_FOUND\": \"Identeco ne trovita.\",\n \"IDENTITY_TX_FAILED\": \"Malsukceso por ŝarĝi la spezojn.\",\n \"WOT_PENDING_INVALID_BLOCK_HASH\": \"Aliĝo ne valida.\",\n \"WALLET_INVALID_BLOCK_HASH\": \"Via aliĝo-peto ne plu validas (ĉar ĝi rilatas al bloko, kiun nuligis la nodoj de la reto).<br/>Vi devas <a ng-click=\\\"doQuickFix('fixMembership')\\\">sendi novan peton</a> por solvi tiun ĉi problemon.\",\n \"WALLET_IDENTITY_EXPIRED\": \"La publikigo de <b>via identeco finiĝis</b>.<br/>Vi devas <a ng-click=\\\"doQuickFix('fixIdentity')\\\">publikigi denove vian identecon</a> por solvi tiun ĉi problemon.\",\n \"WALLET_REVOKED\": \"Via identeco estis <b>nuligita</b>: nek via pseŭdonimo nek via publika ŝlosilo povos esti uzata en la estonteco por membro-konto.\",\n \"WALLET_HAS_NO_SELF\": \"Via identeco devas unue esti publikigita, kaj ne esti finiĝinta.\",\n \"AUTH_REQUIRED\": \"Aŭtentigado necesa.\",\n \"AUTH_INVALID_PUBKEY\": \"La atendata ŝlosilo estas <i class=\\\"ion-key\\\"></i> {{pubkey|formatPubkey}}...\",\n \"AUTH_INVALID_SCRYPT\": \"Identigilo aŭ pasvorto nevalida.\",\n \"AUTH_INVALID_FILE\": \"Dosiero pri ŝlosilaro nevalida.\",\n \"AUTH_FILE_ERROR\": \"Malsukceso por malfermi la dosieron pri ŝlosilaro.\",\n \"IDENTITY_ALREADY_CERTIFY\": \"Vi <b>jam atestis</b> tiun identecon.<br/><br/>Tiu atestado daŭre validas (finiĝo {{expiresIn|formatDurationTo}}).\",\n \"IDENTITY_ALREADY_CERTIFY_PENDING\": \"Vi <b>jam atestis</b> tiun identecon.<br/><br/>Tiu atestado atendas traktadon (limdato de traktado {{expiresIn|formatDurationTo}}).\",\n \"UNABLE_TO_CERTIFY_TITLE\": \"Atestado neebla\",\n \"LOAD_NEWCOMERS_FAILED\": \"Malsukceso por ŝarĝi la novajn membrojn.\",\n \"LOAD_PENDING_FAILED\": \"Malsukceso por ŝarĝi la atendantajn aliĝojn.\",\n \"ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION\": \"Vi devas <b>esti membro</b> por rajti efektivigi tiun ĉi agon.\",\n \"ONLY_MEMBER_OR_WAS_MEMBER_CAN_EXECUTE_THIS_ACTION\": \"Vi devas <b>esti membro (aŭ eksa membro)</b> por rajti efektivigi tiun ĉi agon.\",\n \"ONLY_SELF_CAN_EXECUTE_THIS_ACTION\": \"Via identeco devas <b>jam esti publikigita</b>, por ke vi rajtu efektivigi tiun ĉi agon.\",\n \"GET_BLOCK_FAILED\": \"Malsukceso por ricevi la blokon.\",\n \"INVALID_BLOCK_HASH\": \"Bloko ne trovita (haketo malsama)\",\n \"DOWNLOAD_REVOCATION_FAILED\": \"Malsukceso por elŝuti la dosieron pri nuligo.\",\n \"REVOCATION_FAILED\": \"Malsukceso pri nuligo.\",\n \"SALT_OR_PASSWORD_NOT_CONFIRMED\": \"Sekreta identigilo aŭ pasvorto malĝusta.\",\n \"RECOVER_ID_FAILED\": \"Malsukceso por ricevi la identigilojn\",\n \"LOAD_FILE_FAILED\" : \"Malsukceso por ŝarĝi la dosieron\",\n \"NOT_VALID_REVOCATION_FILE\": \"Dosiero pri nuligo ne valida (malĝusta strukturo de dosiero)\",\n \"NOT_VALID_SAVE_ID_FILE\": \"Dosiero pri konservado ne valida (malĝusta strukturo de dosiero)\",\n \"NOT_VALID_KEY_FILE\": \"Dosiero pri ŝlosilaro ne valida (strukturo ne rekonata)\",\n \"EXISTING_ACCOUNT\": \"Viaj identigiloj rilatas al jam ekzistanta konto, kies <a ng-click=\\\"showHelpModal('pubkey')\\\">publika ŝlosilo</a> estas:\",\n \"EXISTING_ACCOUNT_REQUEST\": \"Bonvolu modifi viajn identigilojn, por ke ili rilatu al ne uzata konto.\",\n \"GET_LICENSE_FILE_FAILED\": \"La ricevo de la dosiero pri licenco ne eblis.\",\n \"CHECK_NETWORK_CONNECTION\": \"Neniu nodo ŝajnas atingebla.<br/><br/>Bonvolu <b>kontroli vian retkonekton</b>.\",\n \"ISSUE_524_TX_FAILED\": \"Malsukcesa elspezo.<br/><br/>Mesaĝo estis sendita al la programistoj por faciligi la solvadon de la problemo. <b>Dankon pro via helpo</b>.\",\n \"ADD_SECONDARY_WALLET_FAILED\": \"Malsukceso por aldoni kroman monujon.\",\n \"UPDATE_WALLET_LIST_FAILED\": \"Malsukceso por ĝisdatigi la kromajn monujojn.\",\n \"LOAD_WALLET_LIST_FAILED\": \"Malsukceso por ŝarĝi la kromajn monujojn.\",\n \"SAVE_WALLET_LIST_FAILED\": \"Malsukceso por konservi la kromajn monujojn.\",\n \"COULD_NOT_ADD_MAIN_WALLET\": \"Tiu ĉi monujo <b>rilatas al la ĉefa konto</b>, kun kiu vi estas konektita.<br/>Ne eblas aldoni ĝin kiel kroman monujon.\",\n \"COULD_NOT_ADD_EXISTING_WALLET\": \"Monujo jam ekzistanta en la listo.\",\n \"UNKNOWN_WALLET_ID\": \"Kroma monujo nekonata.\",\n \"RESTORE_WALLET_LIST_FAILED\": \"Malsukceso por restarigi la kromajn monujojn.\",\n \"INVALID_FILE_FORMAT\": \"Strukturo de dosiero nevalida.\"\n },\n \"INFO\": {\n \"POPUP_TITLE\": \"Informo\",\n \"CERTIFICATION_DONE\": \"Atestaĵo sendita\",\n \"NOT_ENOUGH_CREDIT\": \"Saldo nesufiĉa\",\n \"TRANSFER_SENT\": \"Elspezo sendita\",\n \"COPY_TO_CLIPBOARD_DONE\": \"Kopiita en la memoreto\",\n \"MEMBERSHIP_OUT_SENT\": \"Eksiĝo sendita\",\n \"NOT_NEED_MEMBERSHIP\": \"Vi jam estas membro.\",\n \"IDENTITY_WILL_MISSING_CERTIFICATIONS\": \"Al tiu ĉi identeco baldaŭ mankos atestaĵoj (almenaŭ {{willNeedCertificationCount}}).\",\n \"IDENTITY_NEED_MEMBERSHIP\": \"Tiu ĉi identeco ne sendis aliĝo-peton. Tion ĝi devos fari, se ĝi deziras fariĝi membro.\",\n \"HAS_ALTERNATIVE_IDENTITIES\": \"Ekzistas <b>pluraj identecoj</b> ligitaj kun tiu ĉi publika ŝlosilo. <b>Antaŭ ĉia atestado</b>, pensu <a ng-click=\\\"doQuickFix('showSelectIdentities')\\\">trarigardi la aliajn identecojn</a> por elekti la ĝustan, aŭ kontaktu la posedanton de la konto.\",\n \"REVOCATION_SENT\": \"Nuligo sendita\",\n \"REVOCATION_SENT_WAITING_PROCESS\": \"La <b>nuligo de tiu ĉi identeco</b> estis petita kaj atendas traktadon.\",\n \"FEATURES_NOT_IMPLEMENTED\": \"Tiu ĉi funkciaro ankoraŭ estas programiĝanta.<br/>Kial ne <b>kontribui al Cesium</b>, por ekhavi ĝin pli rapide? ;)\",\n \"EMPTY_TX_HISTORY\": \"Neniu spezo elportota\"\n },\n \"CONFIRM\": {\n \"POPUP_TITLE\": \"<b>Konfirmo</b>\",\n \"POPUP_WARNING_TITLE\": \"<b>Averto</b>\",\n \"POPUP_SECURITY_WARNING_TITLE\": \"<i class=\\\"icon ion-alert-circled\\\"></i> <b>Averto pri sekureco</b>\",\n \"CERTIFY_RULES_TITLE_UID\": \"Atesti {{uid}}\",\n \"CERTIFY_RULES\": \"<b class=\\\"assertive\\\">NE atestu</b> konton, se vi pensas ke:<br/><br/><ul><li>1.) ĝi ne rilatas al persono <b>fizika kaj vivanta</b>.<li>2.) ĝia posedanto <b>havas alian konton</b> jam atestitan.<li>3.) ĝia posedanto malobservas (vole aŭ ne) la regulon 1 aŭ 2 (ekzemple atestante falsajn kontojn aŭ duoblajn).</ul><br/><b>Ĉu vi certas,</b> ke vi tamen volas atesti tiun ĉi identecon?\",\n \"FULLSCREEN\": \"Afiŝi la programon plen-ekrane?\",\n \"EXIT_APP\": \"Fermi la programon?\",\n \"TRANSFER\": \"<b>Resumo de la elspezo</b> :<br/><br/><ul><li> - De: {{from}}</li><li> - Al: <b>{{to}}</b></li><li> - Sumo: <b>{{amount}} {{unit}}</b></li><li> - Komento: <i>{{comment}}</i></li></ul><br/><b>Ĉu vi certas, ke vi volas efektivigi tiun ĉi elspezon?</b>\",\n \"TRANSFER_ALL\": \"<b>Resumo de la elspezo</b>:<br/><br/><ul><li> - De : {{from}}</li><li> - Al : <b>{{to}}</b></li><li> - Sumo: <b>{{amount}} {{unit}}</b></li><li> - Komento: <i>{{comment}}</i></li><br/><li> - Resto: <b>{{restAmount}} {{unit}}</b> al <b>{{restTo}}</b></li></ul><br/><b>Ĉu vi certas, ke vi volas efektivigi tiun ĉi elspezon?</b>\",\n \"MEMBERSHIP_OUT\": \"Tiu ĉi ago estas <b>neinversigebla</b>.<br/></br/>Ĉu vi certas, ke vi volas <b>nuligi vian membro-konton</b>?\",\n \"MEMBERSHIP_OUT_2\": \"Tiu ĉi ago estas <b>neinversigebla</b> !<br/><br/>Ĉu vi vere certas, ke vi volas <b>nuligi vian aliĝon</b> kiel membron?\",\n \"LOGIN_UNUSED_WALLET_TITLE\": \"Tajperaro?\",\n \"LOGIN_UNUSED_WALLET\": \"La konektita konto ŝajnas <b>neaktiva</b>.<br/><br/>Temas probable pri <b>tajperaro</b> en viaj konekto-identigiloj. Bonvolu rekomenci, kontrolante ke <b>la publika ŝlosilo estas tiu de via konto</b>.\",\n \"FIX_IDENTITY\": \"La pseŭdonimo <b>{{uid}}</b> estos denove publikigita, anstataŭigante la malnovan publikigon, kiu finiĝis.<br/></br/><b>Ĉu vi certas</b>, ke vi volas daŭrigi?\",\n \"FIX_MEMBERSHIP\": \"Via aliĝo-peto kiel membro tuj estos resendita.<br/></br/><b>Ĉu vi certas</b>, ke vi volas daŭrigi?\",\n \"MEMBERSHIP\": \"Via aliĝo-peto kiel membro tuj estos sendita.<br/></br/><b>Ĉu vi certas</b>, ke vi volas daŭrigi?\",\n \"RENEW_MEMBERSHIP\": \"Via aliĝo kiel membro tuj estos revalidigita.<br/></br/><b>Ĉu vi certas</b>, ke vi volas daŭrigi?\",\n \"REVOKE_IDENTITY\": \"Vi estas <b>nuligonta definitive tiun ĉi identecon</b>.<br/><br/>La publika ŝlosilo kaj la ligita pseŭdonimo <b>neniam plu povos esti uzataj</b> (por membro-konto). <br/></br/><b>Ĉu vi certas</b>, ke vi volas definitive nuligi tiun ĉi konton?\",\n \"REVOKE_IDENTITY_2\": \"Tiu ĉi ago estas <b>neinversigebla</b>!<br/><br/>Ĉu vi vere certas, ke vi volas <b>definitive nuligi</b> tiun ĉi konton?\",\n \"NOT_NEED_RENEW_MEMBERSHIP\": \"Via aliĝo ne bezonas esti revalidigita (ĝi finiĝos nur post {{membershipExpiresIn|formatDuration}}).<br/></br/><b>Ĉu vi certas</b>, ke vi volas revalidigi vian aliĝon?\",\n \"SAVE_BEFORE_LEAVE\": \"Ĉu vi volas <b>konservi viajn modifojn</b> antaŭ ol eliri el la paĝo?\",\n \"SAVE_BEFORE_LEAVE_TITLE\": \"Modifoj ne registritaj\",\n \"LOGOUT\": \"Ĉu vi certas, ke vi volas malkonektiĝi?\",\n \"USE_FALLBACK_NODE\": \"Nodo <b>{{old}}</b> neatingebla aŭ adreso nevalida.<br/><br/>Ĉu vi volas provizore uzi la nodon <b>{{new}}</b> ?\",\n \"ISSUE_524_SEND_LOG\": \"La spezo estis forĵetita, pro konata anomalio (petslipo #524) sed <b>ne ripetita</b>.<br/><br/>Por helpi la programistojn korekti tiun eraron, <b>ĉu vi akceptas la sendadon de viaj protokolaj dosieroj</b> per mesaĝo?<br/><small>(neniu konfidenca dateno estas sendita)</small>.\"\n },\n \"DOWNLOAD\": {\n \"POPUP_TITLE\": \"<b>Dosiero pri nuligo</b>\",\n \"POPUP_REVOKE_MESSAGE\": \"Por sekurigi vian konton, bonvolu elŝuti la <b>dokumenton pri konto-nuligo</b>. Ĝi ebligos al vi eventuale nuligi vian konton (kaze de konto-ŝtelo, ŝanĝo de identigilo, konto erare kreita, ktp.).<br/><br/><b>Bonvolu stoki ĝin en sekura loko.</b>\"\n },\n \"HELP\": {\n \"TITLE\": \"Ret-helpo\",\n \"JOIN\": {\n \"SECTION\": \"Enskribiĝo\",\n \"SALT\": \"La sekreta identigilo estas tre grava. Ĝi utilas por miksi la pasvorton, antaŭ ol ĝi servos por kalkuli la <span class=\\\"text-italic\\\">publikan ŝlosilon</span> de via konto (ties numeron) kaj la sekretan ŝlosilon por aliri ĝin.<br/><b>Zorgu pri ĝia bona memorigado</b>, ĉar neniu rimedo estas nuntempe planita por retrovi ĝin kaze de perdo.<br/>Krom tio, ĝi ne povas esti modifita sen devige krei novan konton.<br/><br/>Bona sekreta identigilo devas esti sufiĉe longa (kun almenaŭ 8 signoj) kaj kiel eble plej originala.\",\n \"PASSWORD\": \"La pasvorto estas tre grava. Kun la sekreta identigilo, ĝi servas por kalkuli la numeron (la publikan ŝlosilon) de via konto, kaj la sekretan ŝlosilon por aliri ĝin.<br/><b>Zorgu pri ĝia bona memorigado</b>, ĉar neniu rimedo estas planita por retrovi ĝin kaze de perdo (krom se oni generas konserv-dosieron).<br/>Krom tio, ĝi ne povas esti modifita sen devige krei novan konton.<br/><br/>Bona pasvorto entenas (ideale) almenaŭ 8 signojn, inter kiuj estas almenaŭ unu majusklo kaj unu cifero.\",\n \"PSEUDO\": \"La pseŭdonimo estas utila nur kaze de enskribiĝo kiel <span class=\\\"text-italic\\\">membro</span>. Ĝi ĉiam estas ligita kun monujo (tra ĝia <span class=\\\"text-italic\\\">publika ŝlosilo</span>).<br/>Ĝi estas publikigita en la reto, tiel ke la aliaj uzantoj povu identigi ĝin, atesti ĝin aŭ sendi monon al ĝia konto.<br/>Pseŭdonimo devas esti unika ene de la membroj (<u>nunaj</u> kaj eksaj).\"\n },\n \"LOGIN\": {\n \"SECTION\": \"Konekto\",\n \"PUBKEY\": \"Publika ŝlosilo de la ŝlosilaro\",\n \"PUBKEY_DEF\": \"La publika ŝlosilo de la ŝlosilaro estas kreita per la tajpitaj identigiloj (iuj ajn), sen ke ili necese rilatu al konto jam uzata.<br/><b>Atente kontrolu, ke la publika ŝlosilo estas tiu de via konto</b>. Alikaze, vi estos konektita al konto probable neniam uzita, la risko de kolizio kun ekzistanta konto estante tre eta.<br/><a href=\\\"https://fr.wikipedia.org/wiki/Cryptographie_asym%C3%A9trique\\\" target=\\\"_system\\\">Scii pli pri kriptografio</a> per publika ŝlosilo.\",\n \"METHOD\": \"Konekto-metodoj\",\n \"METHOD_DEF\": \"Pluraj eblecoj disponeblas por konekti vin al monujo:<br/> - La konekto <b>per salumado (simpla aŭ sperta)</b> miksas vian pasvorton dank'al la sekreta identigilo, por limigi la provojn de <a href=\\\"https://fr.wikipedia.org/wiki/Attaque_par_force_brute\\\" target=\\\"_system\\\">kodrompado per kruda forto</a> (ekzemple per konataj vortoj.<br/> - La konekto <b>per publika ŝlosilo</b> evitigas tajpi viajn identigilojn, kiuj estos petataj de vi, nur kiam venos la momento dum operacio ĉe la konto.<br/> - La konekto <b>per dosiero pri ŝlosilaro</b> legas la ŝlosilojn (publikan kaj privatan) de la konto, per dosiero, sen la bezono tajpi identigilojn. Pluraj strukturoj de dosiero eblas.\"\n },\n \"GLOSSARY\": {\n \"SECTION\": \"Glosaro\",\n \"PUBKEY_DEF\": \"Publika ŝlosilo identigas monujon, kiu povas identigi membron aŭ rilati al anonima monujo. Ĉe Cesium la publika ŝlosilo estas kalkulita (implicite) dank'al la sekreta identigilo kaj la pasvorto.<br/><a href=\\\"https://fr.wikipedia.org/wiki/Cryptographie_asym%C3%A9trique\\\" target=\\\"_system\\\">Scii pli pri kriptografio</a> per publika ŝlosilo.\",\n \"MEMBER\": \"Membro\",\n \"MEMBER_DEF\": \"Membro estas homa persono fizika kaj vivanta, kiu deziras libere partopreni en la mona komunumo. Li/ŝi kunproduktas universalan dividendon, laŭ periodo kaj sumo tiel difinitaj kiel en la <span class=\\\"text-italic\\\">reguloj de la mono</span>\",\n \"CURRENCY_RULES\": \"Reguloj de la mono\",\n \"CURRENCY_RULES_DEF\": \"La reguloj de la mono estas difinitaj definitive. Ili fiksas la funkciadon de la mono: la kalkulon de la universala dividendo, la nombron de necesaj atestaĵoj por esti membro, la maksimuman nombron da atestaĵoj, kiujn povas doni unu membro, ktp. <a href=\\\"#/app/currency\\\">Vidi la nuntempajn regulojn</a>.<br/>La nemodifo de la reguloj tra la tempo eblas per uzado de <span class=\\\"text-italic\\\">Blokĉeno</span>, kiu entenas kaj plenumas tiujn regulojn, kaj konstante kontrolas ties ĝustan aplikadon.\",\n \"BLOCKCHAIN\": \"Ĉeno de blokoj (<span class=\\\"text-italic\\\">Blokchain/Blokĉeno</span>)\",\n \"BLOCKCHAIN_DEF\": \"La Blokĉeno estas malcentrigita sistemo, kiu, kaze de Duniter, servas por enteni kaj plenumi la <span class=\\\"text-italic\\\">regulojn de la mono</span>.<br/><a href=\\\"https://duniter.org/fr/comprendre/\\\" target=\\\"_system\\\">Scii pli pri Duniter</a> kaj la funkciado de ties blokĉeno.\",\n \"UNIVERSAL_DIVIDEND_DEF\": \"La Universala Dividendo (UD) estas la kvanto de mono kunkreita de ĉiu membro, laŭ la periodo kaj kalkulo difinitaj en la <span class=\\\"text-italic\\\">reguloj de la mono</span>.<br/>Por ĉiu perioda dato, la membroj ricevas en sian konton la saman kvanton da nova mono.<br/><br/>La UD spertas regulan kreskon, por resti justa inter la membroj (nunaj kaj venontaj), kalkulitan depende de la meza vivespero, kiel estas demonstrite en la Teorio Relativa pri la Mono (TRM).<br/><a href=\\\"http://trm.creationmonetaire.info\\\" target=\\\"_system\\\">Scii pli pri la TRM</a> kaj la liberaj monoj.\",\n \"WOT\": \"Reto de Fido (RdF)\",\n \"WOT_DEF\": \"La Reto de Fido konsistas el la tuto de la membroj de la mono, kaj el la atesto-ligoj, kiuj kunligas ilin.\",\n \"DISTANCE_RULE\": \"Regulo pri distanco\",\n \"DISTANCE_RULE_DEF\": \"La regulo pri distanco de la Reto de Fido difinas <b>maksimuman distancon nepran</b> inter petanto kaj minimuma nombro da referencaj membroj (aŭ centraj membroj). Tiu distanco estas kalkulita uzante la ligojn inter atestaĵoj.\"\n },\n \"TIP\": {\n \"MENU_BTN_CURRENCY\": \"La menuo <b>{{'MENU.CURRENCY'|translate}}</b> ebligas konsulti la <b>regulojn de la mono</b> kaj ties staton.\",\n \"CURRENCY_WOT\": \"La <b>nombro de membroj</b> montras la gravecon de la komunumo kaj ebligas <b>sekvi ties evoluon</b>.\",\n \"CURRENCY_MASS\": \"Sekvu ĉi tie la <b>ĉioman kvanton da mono</b> ekzistanta kaj ties <b>mezan distribuon</b> por membro.<br/><br/>Tio ĉi ebligas taksi la <b>gravecon de iu sumo</b>, kompare kun tio, kion <b>posedas la aliuloj</b> en sia konto (mezume).\",\n \"CURRENCY_UNIT_RELATIVE\": \"La unuo uzata (&ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;) signifas, ke la sumoj en {{currency|capitalize}} estis dividitaj per la <b> Universala Dividendo</b> (UD).<br/><br/><small>Tiu relativa unuo estas <b>trafa</b>, ĉar stabila malgraŭ la kvanto de mono, kiu kreskas seninterrompe.</small>\",\n \"CURRENCY_CHANGE_UNIT\": \"La kromaĵo <b>{{'COMMON.BTN_RELATIVE_UNIT'|translate}}</b> ebligas <b>ŝanĝi la unuon</b>, por vidigi la sumojn <b>rekte en {{currency|capitalize}}</b> (prefere ol en &ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;).\",\n \"CURRENCY_CHANGE_UNIT_TO_RELATIVE\": \"La kromaĵo <b>{{'COMMON.BTN_RELATIVE_UNIT'|translate}}</b> ebligas <b>ŝanĝi la unuon</b>, por vidigi la sumojn en &ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;, tio estas rilate al la Universala Dividendo (la sumo kunproduktita de ĉiu membro).\",\n \"CURRENCY_RULES\": \"La <b>reguloj</b> de la mono fiksas ties funkciadon <b>ĝustan kaj antaŭvideblan</b>.<br/><br/>Vera DNA de la mono, ili igas sian monan kodon <b>legebla kaj travidebla</b>.\",\n \"MENU_BTN_NETWORK\": \"La menuo <b>{{'MENU.NETWORK'|translate}}</b> ebligas konsulti la staton de la reto.\",\n \"NETWORK_BLOCKCHAIN\": \"Ĉiuj operacioj pri la mono estas registritaj en granda konto-libro <b>publika kaj nefalsigebla</b>, ankaŭ nomata <b>blokĉeno</b> (<em>BlockChain</em> en la angla).\",\n \"NETWORK_PEERS\": \"La <b>nodoj</b> videblaj ĉi tie rilatas al la <b>komputiloj, kiuj ĝisdatigas kaj kontrolas</b> la blokĉenon.<br/><br/>Ju pli estas nodoj, des pli la mono havas administradon <b>malcentrigitan</b> kaj fidindan.\",\n \"NETWORK_PEERS_BLOCK_NUMBER\": \"Tiu ĉi <b>numero</b> (verda) indikas la <b>lastan blokon validigitan</b> por tiu ĉi nodo (lasta paĝo skribita en la granda konto-libro).<br/><br/>La verda koloro indikas, ke tiu ĉi bloko estas validigita ankaŭ de <b>la plej multaj el la aliaj nodoj</b>.\",\n \"NETWORK_PEERS_PARTICIPATE\": \"<b>Ĉiu membro</b>, ekipita per komputilo kun interreto, <b>povas partopreni aldonante nodon</b>. Sufiĉas <b>instali la programon Duniter</b> (libera kaj senpaga). <a href=\\\"{{installDocUrl}}\\\" target=\\\"_system\\\">Vidi la gvidilon pri instalado &gt;&gt;</a>.\",\n \"MENU_BTN_ACCOUNT\": \"La menuo <b>{{'ACCOUNT.TITLE'|translate}}</b> ebligas aliri la administradon de via konto.\",\n \"MENU_BTN_ACCOUNT_MEMBER\": \"Konsultu ĉi tie la staton de via konto kaj la informojn pri viaj atestaĵoj.\",\n \"WALLET_CERTIFICATIONS\": \"Alklaku ĉi tien por konsulti la detalon pri viaj atestaĵoj (ricevitaj kaj senditaj).\",\n \"WALLET_RECEIVED_CERTIFICATIONS\": \"Alklaku ĉi tien por konsulti la detalon pri viaj <b>ricevitaj atestaĵoj</b>.\",\n \"WALLET_GIVEN_CERTIFICATIONS\": \"Alklaku ĉi tien por konsulti la detalon pri viaj <b>senditaj atestaĵoj</b>.\",\n \"WALLET_BALANCE\": \"La <b>saldo</b> de via konto afiŝiĝas tie ĉi.\",\n \"WALLET_BALANCE_RELATIVE\": \"{{'HELP.TIP.WALLET_BALANCE'|translate}}<br/><br/>La uzata unuo (&ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;) signifas, ke la sumo en {{currency|capitalize}} estis dividita per la <b>Universala Dividendo</b> (UD) kunkreita de ĉiu membro.<br/><br/>Nuntempe 1 UD valoras {{currentUD|formatInteger}} {{currency|capitalize}}j.\",\n \"WALLET_BALANCE_CHANGE_UNIT\": \"Vi povos <b>ŝanĝi la unuon</b> afiŝitan por la sumoj en la <b><i class=\\\"icon ion-android-settings\\\"></i>&nbsp;{{'MENU.SETTINGS'|translate}}</b>.<br/><br/>Ekzemple por vidigi la sumojn <b>rekte en {{currency|capitalize}}</b>, prefere ol en relativa unuo.\",\n \"WALLET_PUBKEY\": \"Jen la publika ŝlosilo de via konto. Vi povas sciigi ĝin al aliulo, por ke li identigu pli simple vian konton.\",\n \"WALLET_SEND\": \"Efektivigi pagon per kelkaj klakoj.\",\n \"WALLET_SEND_NO_MONEY\": \"Efektivigi pagon per kelkaj klakoj.<br/>(Via saldo ankoraŭ ne permesas tion)\",\n \"WALLET_OPTIONS\": \"Tiu ĉi butono ebligas aliri la <b>agojn pri aliĝo</b> kaj sekureco.<br/><br/>Ne forgesu okulumi al ĝi!\",\n \"WALLET_RECEIVED_CERTS\": \"Afiŝiĝos ĉi tie la listo de la personoj, kiuj atestis vin.\",\n \"WALLET_CERTIFY\": \"La butono <b>{{'WOT.BTN_SELECT_AND_CERTIFY'|translate}}</b> ebligas elekti identecon kaj atesti ĝin.<br/><br/>Nur uzantoj <b>jam membroj</b> povas atesti aliajn.\",\n \"WALLET_CERT_STOCK\": \"Via stoko da atestaĵoj (senditaj) estas limigita je <b>{{sigStock}} atestaĵoj</b>.<br/><br/>Tiu stoko plu evoluas laŭ la tempo, samtempe kiam la atestaĵoj malvalidiĝas.\",\n \"MENU_BTN_TX\": \"La menuo <b>{{'MENU.TRANSACTIONS'|translate}}</b> ebligas konsulti vian konton, la liston de viaj spezoj, kaj sendi pagon.\",\n \"MENU_BTN_WOT\": \"La menuo <b>{{'MENU.WOT'|translate}}</b> ebligas traserĉi inter la <b>uzantoj</b> de la mono (membroj aŭ ne).\",\n \"WOT_SEARCH_TEXT_XS\": \"Por traserĉi en la kontaro, tajpu la <b>unuajn literojn de pseŭdonimo</b> (aŭ de publika ŝlosilo).<br/><br/>La serĉado ekos aŭtomate.\",\n \"WOT_SEARCH_TEXT\": \"Por traserĉi en la kontaro, tajpu la <b>unuajn literojn de de pseŭdonimo</b> (aŭ de publika ŝlosilo). <br/><br/>Premu poste sur la klavon <b>Enigi</b> por ekigi la serĉadon.\",\n \"WOT_SEARCH_RESULT\": \"Vidigu la detalan slipon simple <b>alklakante</b> linion.\",\n \"WOT_VIEW_CERTIFICATIONS\": \"La linio <b>{{'ACCOUNT.CERTIFICATION_COUNT'|translate}}</b> montras kiom da membroj validigis tiun ĉi identecon.<br/><br/>Tiuj atestaĵoj pruvas, ke la konto apartenas al <b>persono homa kaj vivanta</b>, havanta <b>neniun alian membro-konton</b>.\",\n \"WOT_VIEW_CERTIFICATIONS_COUNT\": \"Necesas almenaŭ <b>{{sigQty}} atestaĵoj</b> por fariĝi membro kaj ricevi la <b>Universalan Dividendon</b>.\",\n \"WOT_VIEW_CERTIFICATIONS_CLICK\": \"Alklaki ĉi tien ebligas malfermi <b>la liston de ĉiuj atestaĵoj</b> de la identeco (ricevitaj kaj senditaj).\",\n \"WOT_VIEW_CERTIFY\": \"La butono <b>{{'WOT.BTN_CERTIFY'|translate}}</b> ebligas aldoni vian atestaĵon al tiu identeco.\",\n \"CERTIFY_RULES\": \"<b>Atenton:</b> Atestu nur <b>personojn fizikajn vivantajn</b>, posedantajn neniun alian membro-konton.<br/><br/>La sekureco de la mono dependas de ĉies atentego!\",\n \"MENU_BTN_SETTINGS\": \"La <b>{{'MENU.SETTINGS'|translate}}</b> ebligos al vi agordi la programon.\",\n \"HEADER_BAR_BTN_PROFILE\": \"Alklaku ĉi tien por aliri vian <b>uzanto-profilon.</b>\",\n \"SETTINGS_CHANGE_UNIT\": \"Vi povos <b>ŝanĝi la afiŝ-unuon</b> de la sumoj alklakante ĉi-supren.<br/><br/>- Malaktivigu la kromaĵon por afiŝi sumojn en {{currency|capitalize}}.<br/>- Aktivigu la kromaĵon por relativa afiŝado en {{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub> (ĉiuj sumoj estos <b>dividitaj</b> per la Universala Dividendo aktuala).\",\n \"END_LOGIN\": \"Tiu ĉi gvidata vizito <b>finiĝis</b>!<br/><br/>Bonan daŭrigon al vi, en la nova mondo de la<b>libera ekonomio</b>!\",\n \"END_NOT_LOGIN\": \"Tiu ĉi gvidata vizito <b>finiĝis</b>!<br/><br/>Se vi deziras partopreni en la mono {{currency|capitalize}}, sufiĉos al vi alklaki <b>{{'LOGIN.CREATE_ACCOUNT'|translate}}</b> ĉi-sube.\"\n }\n },\n \"API\" :{\n \"COMMON\": {\n \"LINK_DOC\": \"Dokumentaro API\",\n \"LINK_DOC_HELP\": \"Dokumentaro por la programistoj\",\n \"LINK_STANDARD_APP\": \"Klasika versio\",\n \"LINK_STANDARD_APP_HELP\": \"Malfermi la klasikan version de {{'COMMON.APP_NAME'|translate}}\",\n \"CONNECTION_ERROR\": \"Nodo <b>{{server}}</b> neatingebla aŭ adreso nevalida.<br/><br/>Kontrolu vian interretan konekton, aŭ kontaktu la administranton de la retejo</a>.\"\n },\n \"HOME\": {\n \"TITLE\": \"Dokumentaro API {{'COMMON.APP_NAME'|translate}}\",\n \"MESSAGE\": \"Bonvenon en la <b>dokumentaro de la API</b> {{'COMMON.APP_NAME'|translate}}.<br/>Konektu viajn retejojn al <a href=\\\"http://duniter.org\\\" target=\\\"_system\\\">Duniter</a> tre simple!\",\n \"MESSAGE_SHORT\": \"Konektu viajn retejojn al <a href=\\\"http://duniter.org\\\" target=\\\"_system\\\">Duniter</a> tre simple!\",\n \"DOC_HEADER\": \"Servoj disponeblaj:\"\n },\n \"TRANSFER\": {\n \"TITLE\": \"{{'COMMON.APP_NAME'|translate}} - Reta pago\",\n \"TITLE_SHORT\": \"Reta pago\",\n \"SUMMARY\": \"Resumo de la pago:\",\n \"AMOUNT\": \"Sumo:\",\n \"AMOUNTS_HELP\": \"Bonvolu elekti la sumon:\",\n \"NAME\": \"Nomo:\",\n \"PUBKEY\": \"Publika ŝlosilo de la ricevonto:\",\n \"COMMENT\": \"Referenco de la spezo:\",\n \"NODE\": \"Adreso de la nodo:\",\n \"DEMO\": {\n \"SALT\": \"demo\",\n \"PASSWORD\": \"demo\",\n \"PUBKEY\": \"3G28bL6deXQBYpPBpLFuECo46d3kfYMJwst7uhdVBnD1\",\n \"HELP\": \"<b>Demonstra moduso</b>: Neniu pago reale estos sendita dum tiu simulado.<br/>Bonvolu uzi la identigilojn: <b>{{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}</b>\",\n \"BAD_CREDENTIALS\": \"Kontrolu vian tajpaĵon.<br/>En demonstra moduso, la identigiloj estas: {{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}\"\n },\n \"INFO\": {\n \"SUCCESS_REDIRECTING_WITH_NAME\": \"Pago sendita.<br/>Redirektiĝo al <b>{{name}}</b>...\",\n \"SUCCESS_REDIRECTING\": \"Pago sendita.<br/>Redirektiĝo al la retejo de la vendanto...\",\n \"CANCEL_REDIRECTING_WITH_NAME\": \"Pago nuligita.<br/>Redirektiĝo al <b>{{name}}</b>...\",\n \"CANCEL_REDIRECTING\": \"Pago nuligita.<br/>Redirektiĝo al la retejo de la vendanto...\"\n },\n \"ERROR\": {\n \"TRANSFER_FAILED\": \"Pago malsukcesa\"\n }\n },\n \"DOC\": {\n \"DESCRIPTION_DIVIDER\": \"Priskribo\",\n \"URL_DIVIDER\": \"Adreso alvokita\",\n \"PARAMETERS_DIVIDER\": \"Parametroj\",\n \"AVAILABLE_PARAMETERS\": \"Jen la listo de la eblaj parametroj:\",\n \"DEMO_DIVIDER\": \"Testi\",\n \"DEMO_HELP\": \"Por testi tiun servon, alklaku la butonon ĉi-apude. La rezulto afiŝiĝos sube.\",\n \"DEMO_RESULT\": \"Rezulto sendita de la alvoko:\",\n \"DEMO_RESULT_PEER\": \"Adreso de la uzata nodo:\",\n \"DEMO_SUCCEED\": \"<i class=\\\"icon ion-checkmark\\\"></i> Sukceso!\",\n \"DEMO_CANCELLED\": \"<i class=\\\"icon ion-close\\\"></i> Nuligita de la uzanto\",\n \"INTEGRATE_DIVIDER\": \"Integri\",\n \"INTEGRATE_CODE\": \"Kodo:\",\n \"INTEGRATE_RESULT\": \"Antaŭvidigo de la rezulto:\",\n \"INTEGRATE_PARAMETERS\": \"Parametroj\",\n \"TRANSFER\": {\n \"TITLE\": \"Pagoj\",\n \"DESCRIPTION\": \"De retejo (ekz.: ret-vendado) vi povas komisii la pagon en libera mono al Cesium API. Por tio, sufiĉas al vi ekigi la malfermon de paĝo ĉe la sekvanta adreso:\",\n \"PARAM_PUBKEY\": \"Publika ŝlosilo de la ricevonto\",\n \"PARAM_PUBKEY_HELP\": \"Publika ŝlosilo de la ricevonto (devige)\",\n \"PARAM_AMOUNT\": \"Sumo\",\n \"PARAM_AMOUNT_HELP\": \"Sumo de la spezo (devige). Pluraj valoroj permesataj, uzante apartigilon (punkto-komo, vertikala streko aŭ spaco).\",\n \"PARAM_COMMENT\": \"Referenco (aŭ komento)\",\n \"PARAM_COMMENT_HELP\": \"Referenco aŭ komento. Tio ekzemple ebligos al vi identigi la pagon en la blokĉeno.\",\n \"PARAM_NAME\": \"Nomo (de la ricevonto aŭ de la retejo)\",\n \"PARAM_NAME_HELP\": \"La nomo de la ricevonto, aŭ de la retejo alvokanta. Tio povas estis legebla nomo (\\\"Mia retejo\\\"), aŭ alie pseŭdo-retadreso (\\\"MiaRetejo.com\\\").\",\n \"PARAM_REDIRECT_URL\": \"Retadreso por redirektiĝo\",\n \"PARAM_REDIRECT_URL_HELP\": \"Retadreso (URL) por redirektiĝo, alvokita kiam la pago estis sendita. Ĝi povas enteni la sekvantajn signojn, kiuj estos anstataŭigitaj per la valoroj de la spezo: \\\"{tx}\\\", \\\"{hash}\\\", \\\"{comment}\\\", \\\"{amount}\\\", \\\"{pubkey}\\\" kaj \\\"{node}\\\".\",\n \"PARAM_CANCEL_URL\": \"Retadreso por nuligo\",\n \"PARAM_CANCEL_URL_HELP\": \"Retadreso (URL) kaze de nuligo de la pago, fare de la uzanto. Ĝi povas enteni la sekvantajn signojn, kiuj estos anstataŭigitaj lastmomente: \\\"{comment}\\\", \\\"{amount}\\\" kaj {pubkey}.\",\n \"PARAM_PREFERRED_NODE\": \"Adreso de la preferata nodo\",\n \"PARAM_PREFERRED_NODE_HELP\": \"Adreso (URL) de la nodo Duniter preferinde uzota (\\\"g1.domaine.com:443\\\" aŭ \\\"https://g1.domaine.com\\\").\",\n \"EXAMPLES_HELP\": \"Jen ekzemploj pri integrado:\",\n \"EXAMPLE_BUTTON\": \"Butono HTML\",\n \"EXAMPLE_BUTTON_DEFAULT_TEXT\": \"Pagi en {{currency|currencySymbol}}\",\n \"EXAMPLE_BUTTON_DEFAULT_STYLE\": \"Personigita stilo\",\n \"EXAMPLE_BUTTON_TEXT_HELP\": \"Buton-teksto\",\n \"EXAMPLE_BUTTON_BG_COLOR\": \"Fon-koloro\",\n \"EXAMPLE_BUTTON_BG_COLOR_HELP\": \"Ekzemplo: #fbc14c, nigra, helgriza, rgb(180,180,180)\",\n \"EXAMPLE_BUTTON_FONT_COLOR\": \"Teksto-koloro\",\n \"EXAMPLE_BUTTON_FONT_COLOR_HELP\": \"Ekzemplo: nigra, oranĝa, rgb(180,180,180)\",\n \"EXAMPLE_BUTTON_TEXT_ICON\": \"Ikono\",\n \"EXAMPLE_BUTTON_TEXT_WIDTH\": \"Larĝeco\",\n \"EXAMPLE_BUTTON_TEXT_WIDTH_HELP\": \"Ekzemplo: 200px, 50%\",\n \"EXAMPLE_BUTTON_ICON_NONE\": \"Neniu\",\n \"EXAMPLE_BUTTON_ICON_DUNITER\": \"Insigno Duniter\",\n \"EXAMPLE_BUTTON_ICON_CESIUM\": \"Insigno Cesium\",\n \"EXAMPLE_BUTTON_ICON_G1_COLOR\": \"Insigno Ğ1\",\n \"EXAMPLE_BUTTON_ICON_G1_BLACK\": \"Insigno Ğ1 (nigra)\"\n }\n }\n }\n}\n);\n\n$translateProvider.translations(\"es-ES\", {\n \"COMMON\": {\n \"APP_NAME\": \"Cesium\",\n \"APP_VERSION\": \"v{{version}}\",\n \"APP_BUILD\": \"fecha: {{build}}\",\n \"PUBKEY\": \"Llave pública\",\n \"MEMBER\": \"Miembro\",\n \"BLOCK\": \"Bloque\",\n \"BTN_OK\": \"OK\",\n \"BTN_YES\": \"Sí\",\n \"BTN_NO\": \"No\",\n \"BTN_SEND\": \"Enviar\",\n \"BTN_SEND_MONEY\": \"Hacer un pago\",\n \"BTN_SEND_MONEY_SHORT\": \"Pago\",\n \"BTN_SAVE\": \"Guardar\",\n \"BTN_YES_SAVE\": \"Sí, guardar\",\n \"BTN_YES_CONTINUE\": \"Sí, continuar\",\n \"BTN_SHOW\": \"Ver\",\n \"BTN_SHOW_PUBKEY\": \"Ver la llave\",\n \"BTN_RELATIVE_UNIT\": \"Mostrar importes en DU\",\n \"BTN_BACK\": \"Anterior\",\n \"BTN_NEXT\": \"Siguiente\",\n \"BTN_IMPORT\": \"Importar\",\n \"BTN_CANCEL\": \"Cancelar\",\n \"BTN_CLOSE\": \"Cerrar\",\n \"BTN_LATER\": \"Más tarde\",\n \"BTN_LOGIN\": \"Conectarse\",\n \"BTN_LOGOUT\": \"Desconexión\",\n \"BTN_ADD_ACCOUNT\": \"Nueva cuenta\",\n \"BTN_SHARE\": \"Compartir\",\n \"BTN_EDIT\": \"Modificar\",\n \"BTN_DELETE\": \"Suprimir\",\n \"BTN_ADD\": \"Añadir\",\n \"BTN_SEARCH\": \"Buscar\",\n \"BTN_REFRESH\": \"Actualizar\",\n \"BTN_RETRY\": \"Empezar de nuevo\",\n \"BTN_START\": \"Empezar\",\n \"BTN_CONTINUE\": \"Continuar\",\n \"BTN_CREATE\": \"Crear\",\n \"BTN_UNDERSTOOD\": \"Entendido\",\n \"BTN_OPTIONS\": \"Opciones\",\n \"BTN_HELP_TOUR\": \"Visita guiada\",\n \"BTN_HELP_TOUR_SCREEN\": \"Explicar esta pantalla\",\n \"BTN_DOWNLOAD\": \"Descargar\",\n \"BTN_DOWNLOAD_ACCOUNT_STATEMENT\": \"Descargar historial de cuenta\",\n \"BTN_MODIFY\": \"Modificar\",\n \"CHOOSE_FILE\": \"Arrastre el archivo<br/>o haga clic para seleccionarlo\",\n \"DAYS\": \"Días\",\n \"NO_ACCOUNT_QUESTION\": \"¿Todavía no es miembro? ¡Crear una cuenta!\",\n \"SEARCH_NO_RESULT\": \"Ningún resultado encontrado\",\n \"LOADING\": \"Espere por favor…\",\n \"LOADING_WAIT\": \"Espere por favor…<br/><small>(Esperando disponibilidad de nodo)</small>\",\n \"SEARCHING\": \"Búsqueda en proceso…\",\n \"FROM\": \"De\",\n \"TO\": \"A\",\n \"COPY\": \"Copiar\",\n \"LANGUAGE\": \"Idioma\",\n \"UNIVERSAL_DIVIDEND\": \"Dividendo universal\",\n \"UD\": \"DU\",\n \"DATE_PATTERN\": \"DD/MM/YYYY HH:mm\",\n \"DATE_FILE_PATTERN\": \"YYYY-MM-DD\",\n \"DATE_SHORT_PATTERN\": \"DD/MM/YY\",\n \"DATE_MONTH_YEAR_PATTERN\": \"MM/YYYY\",\n \"EMPTY_PARENTHESIS\": \"(vacío)\",\n \"UID\": \"Seudónimo\",\n \"ENABLE\": \"Activado\",\n \"DISABLE\": \"Desactivado\",\n \"RESULTS_LIST\": \"Resultados:\",\n \"RESULTS_COUNT\": \"{{count}} resultados\",\n \"EXECUTION_TIME\": \"ejecutado en {{duration|formatDurationMs}}\",\n \"SHOW_VALUES\": \"¿Publicar los valores no codificados?\",\n \"POPOVER_ACTIONS_TITLE\": \"Opciones\",\n \"POPOVER_FILTER_TITLE\": \"Filtros\",\n \"SHOW_MORE\": \"Mostrar más\",\n \"SHOW_MORE_COUNT\": \"(límite actual {{limit}})\",\n \"POPOVER_SHARE\": {\n \"TITLE\": \"Compartir\",\n \"SHARE_ON_TWITTER\": \"Compartir en Twitter\",\n \"SHARE_ON_FACEBOOK\": \"Compartir en Facebook\",\n \"SHARE_ON_DIASPORA\": \"Compartir en Diaspora*\",\n \"SHARE_ON_GOOGLEPLUS\": \"Compartir en Google+\"\n },\n \"FILE\": {\n \"DATE\" : \"Fecha:\",\n \"TYPE\" : \"Tipo:\",\n \"SIZE\": \"Tamaño:\",\n \"VALIDATING\": \"Validando…\"\n }\n },\n \"SYSTEM\": {\n \"PICTURE_CHOOSE_TYPE\": \"Elegir la fuente:\",\n \"BTN_PICTURE_GALLERY\": \"Galería\",\n \"BTN_PICTURE_CAMERA\": \"<b>Cámara</b>\"\n },\n \"MENU\": {\n \"HOME\": \"Inicio\",\n \"WOT\": \"Directorio\",\n \"CURRENCY\": \"Moneda\",\n \"ACCOUNT\": \"Mi cuenta\",\n \"WALLETS\": \"Mis monederos\",\n \"SETTINGS\": \"Ajustes\",\n \"NETWORK\": \"Red\",\n \"TRANSACTIONS\": \"Mis transacciones\"\n },\n \"ABOUT\": {\n \"BTN_OPEN_DEV_WINDOW\": \"Abrir ventana de depuración\",\n \"TITLE\": \"Acerca de\",\n \"LICENSE\": \"Software <b>libre</b> (licencia GNU AGPLv3).\",\n \"LATEST_RELEASE\": \"Existe una <b>versión más nueva</b> de {{'COMMON.APP_NAME' | translate}} (<b>v{{version}}</b>)\",\n \"PLEASE_UPDATE\": \"Por favor actualice {{'COMMON.APP_NAME' | translate}} (última versión: <b>v{{version}}</b>)\",\n \"CODE\": \"Código fuente:\",\n \"OFFICIAL_WEB_SITE\": \"Web oficial:\",\n \"DEVELOPERS\": \"Desarrollado por:\",\n \"FORUM\": \"Foro:\",\n \"PLEASE_REPORT_ISSUE\": \"No dude en informarnos de anomalías encontradas\",\n \"REPORT_ISSUE\": \"Reportar un problema\"\n },\n \"HOME\": {\n \"FEED_SOURCE\": \"Fuente\",\n \"READ_MORE\": \"Leer más\",\n \"SHOW_ALL_FEED\": \"Ver todo\",\n \"TITLE\": \"Cesium\",\n \"WELCOME\": \"¡Bienvenida/o a la aplicación Cesium!\",\n \"MESSAGE\": \"Reciba y envíe moneda libre {{currency|abbreviate}} fácilmente\",\n \"BTN_CURRENCY\": \"Explorar la moneda\",\n \"BTN_ABOUT\": \"Acerca de\",\n \"BTN_HELP\": \"Ayuda en línea\",\n \"REPORT_ISSUE\": \"Reportar anomalía\",\n \"NOT_YOUR_ACCOUNT_QUESTION\": \"¿No es suya la cuenta <b><i class=\\\"ion-key\\\"></i> {{pubkey|formatPubkey}}</b>?\",\n \"BTN_CHANGE_ACCOUNT\": \"Desconectar esta cuenta\",\n \"CONNECTION_ERROR\": \"Nodo <b>{{server}}</b> inalcanzable o dirección inválida.<br/><br/>Compruebe su conexión a Internet, o nodo de conmutación <a class=\\\"positive\\\" ng-click=\\\"doQuickFix('settings')\\\">en los ajustes</a>.\"\n },\n \"SETTINGS\": {\n \"TITLE\": \"Ajustes\",\n \"DISPLAY_DIVIDER\": \"Visualización\",\n \"STORAGE_DIVIDER\": \"Almacenamiento\",\n \"NETWORK_SETTINGS\": \"Red\",\n \"PEER\": \"Dirección del nodo Duniter\",\n \"PEER_CHANGED_TEMPORARY\": \"Dirección utilizada temporalmente\",\n \"PEER_SHORT\": \"Nodo Duniter\",\n \"PERSIST_CACHE\": \"Conservar los datos de navegación (experimental)\",\n \"PERSIST_CACHE_HELP\": \"Permite una navegación más rápida, conservando localmente los datos recibidos, para usar de una sesión a otra.\",\n \"USE_LOCAL_STORAGE\": \"Activar el almacenamiento local\",\n \"USE_LOCAL_STORAGE_HELP\": \"Permitir conservar sus ajustes\",\n \"WALLETS_SETTINGS\": \"Mis monederos\",\n \"USE_WALLETS_ENCRYPTION\": \"Cifrar el listado\",\n \"USE_WALLETS_ENCRYPTION_HELP\": \"Permite proteger la lista de sus monederos (mediante cifrado), exigiendo una autenticación para acceder.\",\n \"ENABLE_HELPTIP\": \"Activar la ayuda contextual\",\n \"ENABLE_UI_EFFECTS\": \"Activar los efectos visuales\",\n \"HISTORY_SETTINGS\": \"Transacciones de la cuenta\",\n \"DISPLAY_UD_HISTORY\": \"Mostrar los DU creados\",\n \"TX_HISTORY_AUTO_REFRESH\": \"Activar actualización automática\",\n \"TX_HISTORY_AUTO_REFRESH_HELP\": \"Actualizar el saldo y las transacciones automáticamente, con cada nuevo bloque.\",\n \"AUTHENTICATION_SETTINGS\": \"Autenticación\",\n \"KEEP_AUTH\": \"Caducidad de la autenticación\",\n \"KEEP_AUTH_SHORT\": \"Caducidad\",\n \"KEEP_AUTH_HELP\": \"Defina cuándo expira su sesión\",\n \"KEEP_AUTH_OPTION\": {\n \"NEVER\": \"Después de cada operación\",\n \"SECONDS\": \"Después de {{value}} segundos de inactividad\",\n \"MINUTE\": \"Después de {{value}}min de inactividad\",\n \"MINUTES\": \"Después de {{value}}mins de inactividad\",\n \"HOUR\": \"Después de {{value}}h de inactividad\",\n \"ALWAYS\": \"Al finalizar la sesión\"\n },\n \"KEYRING_FILE\": \"Archivo de llaves\",\n \"KEYRING_FILE_HELP\": \"Le permite <b>conectarse</b> automáticamente en cada inicio <br/>e incluso de <b>autenticarse</b> (solo si \\\"Caducidad de la autenticación\\\" está configurada en modo: \\\"al finalizar la sesión\\\").\",\n \"REMEMBER_ME\": \"Recordarme\",\n \"REMEMBER_ME_HELP\": \"Permite mantenerse siempre conectado (no recomendado), conservando localmente la llave pública.\",\n \"PLUGINS_SETTINGS\": \"Extensiones\",\n \"BTN_RESET\": \"Restaurar los valores por defecto\",\n \"EXPERT_MODE\": \"Modo experto\",\n \"EXPERT_MODE_HELP\": \"Permite una visualización más detallada\",\n \"BLOCK_VALIDITY_WINDOW\": \"Tiempo de incertitud de los bloques\",\n \"DISABLE_HELPTIP\": \"Desactivar la opción de ayuda contextual\",\n \"BLOCK_VALIDITY_WINDOW_SHORT\": \"Tiempo de incertitud\",\n \"BLOCK_VALIDITY_WINDOW_HELP\": \"Tiempo de espera antes de considerar una información como validada\",\n \"BLOCK_VALIDITY_OPTION\": {\n \"NONE\": \"Sin espera\",\n \"N\": \"{{time | formatDuration}} ({{count}} bloques)\"\n },\n \"POPUP_PEER\": {\n \"TITLE\": \"Nodo Duniter\",\n \"HOST\": \"Dirección\",\n \"HOST_HELP\": \"Dirección: servidor:puerto\",\n \"USE_SSL\": \"Conexión segura\",\n \"USE_SSL_HELP\": \"(Cifrado SSL)\",\n \"BTN_SHOW_LIST\": \"Lista de nodos\"\n }\n },\n \"BLOCKCHAIN\": {\n \"HASH\": \"Hash: {{hash}}\",\n \"VIEW\": {\n \"HEADER_TITLE\": \"Bloque #{{number}}-{{hash|formatHash}}\",\n \"TITLE_CURRENT\": \"Bloque actual\",\n \"TITLE\": \"Bloque #{{number|formatInteger}}\",\n \"COMPUTED_BY\": \"Calculado por el nodo de\",\n \"SHOW_RAW\": \"Ver el fichero en bruto\",\n \"TECHNICAL_DIVIDER\": \"Informaciones técnicas\",\n \"VERSION\": \"Versión del formato\",\n \"HASH\": \"Hash calculado\",\n \"UNIVERSAL_DIVIDEND_HELP\": \"Moneda co-producida por cada uno de los {{membersCount}} miembros\",\n \"EMPTY\": \"Ningún dato en este bloque\",\n \"POW_MIN\": \"Dificultad mínima\",\n \"POW_MIN_HELP\": \"Dificultad impuesta por el cálculo del hash\",\n \"DATA_DIVIDER\": \"Datos\",\n \"IDENTITIES_COUNT\": \"Nuevas identidades\",\n \"JOINERS_COUNT\": \"Nuevos miembros\",\n \"ACTIVES_COUNT\": \"Renovaciones\",\n \"ACTIVES_COUNT_HELP\": \"Miembros que han renovado sus adhesiones\",\n \"LEAVERS_COUNT\": \"Miembros salientes\",\n \"LEAVERS_COUNT_HELP\": \"Miembros salientes que ya no quieren estar certificados\",\n \"EXCLUDED_COUNT\": \"Miembros excluidos\",\n \"EXCLUDED_COUNT_HELP\": \"Antiguos miembros excluidos por no renovación o falta de certificaciones\",\n \"REVOKED_COUNT\": \"Identidades revocadas\",\n \"REVOKED_COUNT_HELP\": \"Estas cuentas no podrán ser miembros\",\n \"TX_COUNT\": \"Transacciones\",\n \"CERT_COUNT\": \"Certificaciones\",\n \"TX_TO_HIMSELF\": \"Operación de cambio\",\n \"TX_OUTPUT_UNLOCK_CONDITIONS\": \"Condiciones de desbloqueo\",\n \"TX_OUTPUT_OPERATOR\": {\n \"AND\": \"y\",\n \"OR\": \"o\"\n },\n \"TX_OUTPUT_FUNCTION\": {\n \"SIG\": \"<b>Firma</b> de \",\n \"XHX\": \"<b>Contraseña</b>, cuyo SHA256 =\",\n \"CSV\": \"Bloqueado durante\",\n \"CLTV\": \"Bloqueado hasta\"\n }\n },\n \"LOOKUP\": {\n \"TITLE\": \"Bloques\",\n \"NO_BLOCK\": \"Ningún bloque\",\n \"LAST_BLOCKS\": \"Últimos bloques:\",\n \"BTN_COMPACT\": \"Compactar\"\n }\n },\n \"CURRENCY\": {\n \"VIEW\": {\n \"TITLE\": \"Moneda\",\n \"TAB_CURRENCY\": \"Moneda\",\n \"TAB_WOT\": \"Red de confianza\",\n \"TAB_NETWORK\": \"Red\",\n \"TAB_BLOCKS\": \"Bloques\",\n \"CURRENCY_SHORT_DESCRIPTION\": \"{{currency|abbreviate}} es una <b>moneda libre</b>, originada {{firstBlockTime|formatFromNow}}. Cuenta actualmente con <b>{{N}} miembros</b>, que producen y reciben un <a ng-click=\\\"showHelpModal('ud')\\\">Dividendo Universal</a> (DU) cada {{dt|formatPeriod}}.\",\n \"NETWORK_RULES_DIVIDER\": \"Reglas de la red\",\n \"CURRENCY_NAME\": \"Nombre de la moneda\",\n \"MEMBERS\": \"Cantidad de miembros\",\n \"MEMBERS_VARIATION\": \"Variación desde último DU\",\n \"MONEY_DIVIDER\": \"Moneda\",\n \"MASS\": \"Masa monetaria\",\n \"SHARE\": \"Masa media por miembro\",\n \"UD\": \"Dividendo Universal\",\n \"C_ACTUAL\": \"Crecimiento actual\",\n \"MEDIAN_TIME\": \"Hora de la cadena de bloques\",\n \"POW_MIN\": \"Nivel mínimo de dificultad de cálculo\",\n \"MONEY_RULES_DIVIDER\": \"Reglas de la moneda\",\n \"C_RULE\": \"Crecimiento teórico objetivo\",\n \"UD_RULE\": \"Cálculo del dividendo universal\",\n \"DT_REEVAL\": \"Periodo de revalorización del DU\",\n \"REEVAL_SYMBOL\": \"reval\",\n \"DT_REEVAL_VALUE\": \"Todos los <b>{{dtReeval|formatDuration}}</b> ({{dtReeval/86400}} {{'COMMON.DAYS'|translate}})\",\n \"UD_REEVAL_TIME0\": \"Fecha de la primera revalorización\",\n \"SIG_QTY_RULE\": \"Certificaciones requeridas para ser miembro\",\n \"SIG_STOCK\": \"Máximo de certificaciones emitibles por miembros\",\n \"SIG_PERIOD\": \"Espera mínima entre 2 certificaciones sucesivas emitidas por la misma persona\",\n \"SIG_WINDOW\": \"Límite para tener en cuenta una certificación\",\n \"SIG_VALIDITY\": \"Duración de una certificación tenida en cuenta\",\n \"MS_WINDOW\": \"Límite para aprobar una solicitud de membresía\",\n \"MS_VALIDITY\": \"Duración de una membresía aprobada\",\n \"STEP_MAX\": \"Distancia máxima entre una nueva candidatura y cada miembro referente\",\n \"WOT_RULES_DIVIDER\": \"Reglas de la red de confianza\",\n \"SENTRIES\": \"Certificaciones necesarias para ser miembro referente\",\n \"SENTRIES_FORMULA\": \"Fórmula de las certificaciones necesarias para ser miembro referente\",\n \"XPERCENT\":\"Porcentaje mínimo necesario de miembros referentes respentando la regla de distancia máxima\",\n \"AVG_GEN_TIME\": \"Tiempo medio entre dos bloques\",\n \"CURRENT\": \"actual\",\n \"MATH_CEILING\": \"TECHO\",\n \"DISPLAY_ALL_RULES\": \"¿Ver todas las reglas?\",\n \"BTN_SHOW_LICENSE\": \"Ver la licencia\",\n \"WOT_DIVIDER\": \"Red de confianza\"\n },\n \"LICENSE\": {\n \"TITLE\": \"Licencia de la moneda\",\n \"BTN_DOWNLOAD\": \"Descargar el fichero\",\n \"NO_LICENSE_FILE\": \"Fichero de licencia no encontrado.\"\n }\n },\n \"NETWORK\": {\n \"VIEW\": {\n \"MEDIAN_TIME\": \"Hora de la cadena de bloques\",\n \"LOADING_PEERS\": \"Cargando nodos…\",\n \"NODE_ADDRESS\": \"Dirección:\",\n \"SOFTWARE\": \"Software:\",\n \"WARN_PRE_RELEASE\": \"Prelanzamiento (última versión estable: <b>{{version}}</b>)\",\n \"WARN_NEW_RELEASE\": \"Versión <b>{{version}}</b> disponible\",\n \"WS2PID\": \"ID:\",\n \"PRIVATE_ACCESS\": \"Acceso privado\",\n \"POW_PREFIX\": \"Prefijo de la prueba de trabajo:\",\n \"ENDPOINTS\": {\n \"BMAS\": \"Interfaz segura (SSL)\",\n \"BMATOR\": \"Interfaz red TOR\",\n \"WS2P\": \"Interfaz WS2P\",\n \"ES_USER_API\": \"Nodo de datos Cesium+\"\n }\n },\n \"INFO\": {\n \"ONLY_SSL_PEERS\": \"La visualización de los nodos sin SSL está deteriorada porque Cesium funciona en modo HTTPS.\"\n }\n },\n \"PEER\": {\n \"PEERS\": \"Nodos\",\n \"SIGNED_ON_BLOCK\": \"Firmado sobre el bloque\",\n \"MIRROR\": \"espejo\",\n \"MIRRORS\": \"Espejo\",\n \"MIRROR_PEERS\": \"Nodos espejo\",\n \"PEER_LIST\": \"Lista de nodos\",\n \"MEMBERS\": \"Miembro\",\n \"MEMBER_PEERS\": \"Nodos miembro\",\n \"ALL_PEERS\": \"Todos los nodos\",\n \"DIFFICULTY\": \"Dificultad\",\n \"API\": \"API\",\n \"CURRENT_BLOCK\": \"Bloque #\",\n \"POPOVER_FILTER_TITLE\": \"Filtro\",\n \"OFFLINE\": \"Fuera de línea\",\n \"OFFLINE_PEERS\": \"Nodos fuera de línea\",\n \"BTN_SHOW_PEER\": \"Ver nodo\",\n \"VIEW\": {\n \"TITLE\": \"Nodo\",\n \"OWNER\": \"Propiedad de\",\n \"SHOW_RAW_PEERING\": \"Ver la ficha del par\",\n \"SHOW_RAW_CURRENT_BLOCK\": \"Ver el último bloque (formato bruto)\",\n \"LAST_BLOCKS\": \"Bloques recientes\",\n \"KNOWN_PEERS\": \"Nodos conocidos:\",\n \"GENERAL_DIVIDER\": \"Información general\",\n \"ERROR\": {\n \"LOADING_TOR_NODE_ERROR\": \"No se pudo obtener la información del nodo usando la red TOR.\",\n \"LOADING_NODE_ERROR\": \"No se pudo obtener la información del nodo\"\n }\n }\n },\n \"WOT\": {\n \"SEARCH_HELP\": \"Buscar (seudónimo o llave pública)\",\n \"SEARCH_INIT_PHASE_WARNING\": \"Durante la etapa de preinscripción, el tiempo de búsqueda de las candidaturas en espera <b>puede tardar</b>. Por favor espere…\",\n \"REGISTERED_SINCE\": \"Se registró en\",\n \"REGISTERED_SINCE_BLOCK\": \"Se registró en el bloque #\",\n \"NO_CERTIFICATION\": \"Ninguna certificación validada\",\n \"NO_GIVEN_CERTIFICATION\": \"Ninguna certificación emitida\",\n \"NOT_MEMBER_PARENTHESIS\": \"(no miembro)\",\n \"IDENTITY_REVOKED_PARENTHESIS\": \"(identidad revocada)\",\n \"MEMBER_PENDING_REVOCATION_PARENTHESIS\": \"(revocación en proceso)\",\n \"EXPIRE_IN\": \"Expira\",\n \"NOT_WRITTEN_EXPIRE_IN\": \"Fecha límite<br/>de procesamiento\",\n \"EXPIRED\": \"Expirado\",\n \"PSEUDO\": \"Seudónimo\",\n \"SIGNED_ON_BLOCK\": \"Emitida en el bloque #{{block}}\",\n \"WRITTEN_ON_BLOCK\": \"Escrita en el bloque #{{block}}\",\n \"GENERAL_DIVIDER\": \"Informaciones generales\",\n \"NOT_MEMBER_ACCOUNT\": \"Cuenta no miembro\",\n \"NOT_MEMBER_ACCOUNT_HELP\": \"Se trata de un monedero simple, sin solicitud de membresía en espera\",\n \"TECHNICAL_DIVIDER\": \"Informaciones técnicas\",\n \"BTN_CERTIFY\": \"Certificar\",\n \"BTN_YES_CERTIFY\": \"Sí, certificar\",\n \"BTN_SELECT_AND_CERTIFY\": \"Nueva certificación\",\n \"ACCOUNT_OPERATIONS\": \"Transacciones de la cuenta\",\n \"VIEW\": {\n \"POPOVER_SHARE_TITLE\": \"Identidad {{title}}\"\n },\n \"LOOKUP\": {\n \"TITLE\": \"Directorio\",\n \"NEWCOMERS\": \"Nuevos miembros:\",\n \"NEWCOMERS_COUNT\": \"{{count}} miembros\",\n \"PENDING\": \"Inscripciones en espera:\",\n \"PENDING_COUNT\": \"{{count}} inscripciones en espera\",\n \"REGISTERED\": \"Se inscribió {{sigDate | formatFromNow}}\",\n \"MEMBER_FROM\": \"Miembro desde {{memberDate|medianFromNowShort}}\",\n \"BTN_NEWCOMERS\": \"Miembros recientes\",\n \"BTN_PENDING\": \"Candidaturas en espera\",\n \"SHOW_MORE\": \"Mostrar más\",\n \"SHOW_MORE_COUNT\": \"(mostrar solo {{limit}})\",\n \"NO_PENDING\": \"Ninguna candidatura en espera.\",\n \"NO_NEWCOMERS\": \"Sin miembros.\"\n },\n \"CONTACTS\": {\n \"TITLE\": \"Contactos\"\n },\n \"MODAL\": {\n \"TITLE\": \"Buscar\"\n },\n \"CERTIFICATIONS\": {\n \"TITLE\": \"{{uid}} - Certificaciones\",\n \"SUMMARY\": \"Certificaciones recibidas\",\n \"LIST\": \"Detalle de las certificaciones recibidas\",\n \"PENDING_LIST\": \"Certificaciones en espera de tratamiento\",\n \"RECEIVED\": \"Certificaciones recibidas\",\n \"RECEIVED_BY\": \"Certificaciones recibidas por {{uid}}\",\n \"ERROR\": \"Certificaciones recibidas por error\",\n \"SENTRY_MEMBER\": \"Miembro referente\"\n },\n \"OPERATIONS\": {\n \"TITLE\": \"{{uid}} - Transacciones\"\n },\n \"GIVEN_CERTIFICATIONS\": {\n \"TITLE\": \"{{uid}} - Certificaciones emitidas\",\n \"SUMMARY\": \"Certificaciones emitidas\",\n \"LIST\": \"Detalle de las certificaciones emitidas\",\n \"PENDING_LIST\": \"Certificaciones en espera a ser procesadas\",\n \"SENT\": \"Certificaciones emitidas\",\n \"SENT_BY\": \"Certificaciones emitidas por {{uid}}\",\n \"ERROR\": \"Certificaciones emitidas por error\"\n }\n },\n \"LOGIN\": {\n \"TITLE\": \"<i class=\\\"icon ion-locked\\\"></i> Conexión\",\n \"SCRYPT_FORM_HELP\": \"Ingrese sus credenciales.<br>Recuerde comprobar que la llave pública pertenece a su cuenta.\",\n \"PUBKEY_FORM_HELP\": \"Por favor ingrese una llave pública de cuenta:\",\n \"FILE_FORM_HELP\": \"Elija el archivo de llaves a usar:\",\n \"SCAN_FORM_HELP\": \"Escanee el código QR de un monedero.\",\n \"SALT\": \"Identificador secreto\",\n \"SALT_HELP\": \"Identificador secreto\",\n \"SHOW_SALT\": \"Mostrar el identificador secreto\",\n \"PASSWORD\": \"Contraseña\",\n \"PASSWORD_HELP\": \"Contraseña\",\n \"PUBKEY_HELP\": \"llave pública\",\n \"NO_ACCOUNT_QUESTION\": \"¿Aún no tiene cuenta? \",\n \"HAVE_ACCOUNT_QUESTION\": \"¿Ya tiene cuenta?\",\n \"CREATE_ACCOUNT\": \"Crear una cuenta\",\n \"CREATE_FREE_ACCOUNT\": \"Crear una cuenta gratis\",\n \"FORGOTTEN_ID\": \"¿Olvidó su contraseña?\",\n \"ASSOCIATED_PUBKEY\": \"Llave pública del archivo de llaves:\",\n \"BTN_METHODS\": \"Otros métodos\",\n \"BTN_METHODS_DOTS\": \"Otras vías…\",\n \"METHOD_POPOVER_TITLE\": \"Métodos\",\n \"MEMORIZE_AUTH_FILE\": \"Memorizar las llaves durante la sesión de navegación\",\n \"SCRYPT_PARAMETERS\": \"Ajustes (Scrypt) :\",\n \"AUTO_LOGOUT\": {\n \"TITLE\": \"Información\",\n \"MESSAGE\": \"<i class=\\\"ion-android-time\\\"></i> Se ha <b>desconectado</b> de forma automática, después de un periodo de inactividad prolongada.\",\n \"BTN_RELOGIN\": \"Volver a conectarme\",\n \"IDLE_WARNING\": \"Será desconectado en… {{countdown}}\"\n },\n \"METHOD\": {\n \"SCRYPT_DEFAULT\": \"Estándar (por defecto)\",\n \"SCRYPT_ADVANCED\": \"Aleatoriedad avanzada\",\n \"FILE\": \"Archivo de llaves\",\n \"PUBKEY\": \"Llave pública o seudónimo\",\n \"SCAN\": \"Escanear un código QR\"\n },\n \"SCRYPT\": {\n \"SIMPLE\": \"Ligero\",\n \"DEFAULT\": \"Predeterminado\",\n \"SECURE\": \"Seguro\",\n \"HARDEST\": \"El más seguro\",\n \"EXTREME\": \"Extremo\",\n \"USER\": \"Personalizado\",\n \"N\": \"N (Loop):\",\n \"r\": \"r (RAM):\",\n \"p\": \"p (CPU):\"\n },\n \"FILE\": {\n \"HELP\": \"Formato de archivo esperado: <b>.yml</b> o <b>.dunikey</b> (tipo PubSec, WIF o EWIF).\"\n }\n },\n \"API\": {\n \"COMMON\": {\n \"CONNECTION_ERROR\": \"Nodo <b>{{server}}</b> inalcanzable o dirección inválida.<br/><br/>Verifique su conexión a Internet, o contacte con la administración del sitio.</a>.\",\n \"LINK_DOC\": \"Documentación API\",\n \"LINK_DOC_HELP\": \"Documentación para desarrolladores\",\n \"LINK_STANDARD_APP\": \"Versión clásica\",\n \"LINK_STANDARD_APP_HELP\": \"Abrir la versión clásica de {{'COMMON.APP_NAME'|translate}}\"\n },\n \"DOC\": {\n \"AVAILABLE_PARAMETERS\": \"Lista de parámetros disponibles :\",\n \"DEMO_CANCELLED\": \"<i class=\\\"icon ion-close\\\"></i> Cancelado por el usuario\",\n \"DEMO_DIVIDER\": \"Probar\",\n \"DEMO_HELP\": \"Para probar este servicio, haga clic en este botón. El resultado se mostrará debajo.\",\n \"DEMO_RESULT\": \"Resultado retornado por la llamada :\",\n \"DEMO_RESULT_PEER\": \"Dirección del nodo utilizado :\",\n \"DEMO_SUCCEED\": \"<i class=\\\"icon ion-checkmark\\\"></i> ¡ Éxito !\",\n \"DESCRIPTION_DIVIDER\": \"Descripción\",\n \"INTEGRATE_CODE\": \"Código :\",\n \"INTEGRATE_DIVIDER\": \"Integrar\",\n \"INTEGRATE_PARAMETERS\": \"Parámetros\",\n \"INTEGRATE_RESULT\": \"Previsualización del resultado :\",\n \"PARAMETERS_DIVIDER\": \"Parámetros\",\n \"TRANSFER\": {\n \"DESCRIPTION\": \"Desde una web (ej: tienda online) puede delegar el pago en moneda libre con la API de Cesium. Para eso, simplemente ponga un link a la siguiente dirección :\",\n \"EXAMPLE_BUTTON\": \"Botón HTML\",\n \"EXAMPLE_BUTTON_BG_COLOR\": \"Color de fondo\",\n \"EXAMPLE_BUTTON_BG_COLOR_HELP\": \"Ejemplo : #fbc14c, black, lightgrey, rgb(180,180,180)\",\n \"EXAMPLE_BUTTON_DEFAULT_STYLE\": \"Estilo personalizado\",\n \"EXAMPLE_BUTTON_DEFAULT_TEXT\": \"Pagar en {{currency|currencySymbol}}\",\n \"EXAMPLE_BUTTON_FONT_COLOR\": \"Color del texto\",\n \"EXAMPLE_BUTTON_FONT_COLOR_HELP\": \"Ejemplo : black, orange, rgb(180,180,180)\",\n \"EXAMPLE_BUTTON_ICON_CESIUM\": \"Logo Cesium\",\n \"EXAMPLE_BUTTON_ICON_DUNITER\": \"Logo Duniter\",\n \"EXAMPLE_BUTTON_ICON_G1_BLACK\": \"Logo Ğ1 (negro)\",\n \"EXAMPLE_BUTTON_ICON_G1_COLOR\": \"Logo Ğ1\",\n \"EXAMPLE_BUTTON_ICON_NONE\": \"Ninguno\",\n \"EXAMPLE_BUTTON_TEXT_HELP\": \"Texto del botón\",\n \"EXAMPLE_BUTTON_TEXT_ICON\": \"Icono\",\n \"EXAMPLE_BUTTON_TEXT_WIDTH\": \"Anchura\",\n \"EXAMPLE_BUTTON_TEXT_WIDTH_HELP\": \"Ejemplo : 200px, 50%\",\n \"EXAMPLES_HELP\": \"Ejemplos de integración :\",\n \"PARAM_AMOUNT\": \"Cuantía\",\n \"PARAM_AMOUNT_HELP\": \"Cuantía de la transición (obligatorio). Valores múltiples permitidos utilizando un separador (punto y coma, barra vertical o espacio).\",\n \"PARAM_CANCEL_URL\": \"Dirección web de cancelación\",\n \"PARAM_CANCEL_URL_HELP\": \"Dirección web (URL) en caso de anulación del pago por parte del usuario. Puede contener las siguientes palabras que serán remplazadas por sus valores dinámicamente en cada caso: \\\"{comment}\\\", \\\"{amount}\\\" y \\\"{pubkey}\\\".\",\n \"PARAM_COMMENT\": \"Concepto (o comentario)\",\n \"PARAM_COMMENT_HELP\": \"Concepto o comentario. Le permitirá por ejemplo identificar el pago en la cadena de bloques (blockchain).\",\n \"PARAM_NAME\": \"Nombre (del destinatario o de su sitio web)\",\n \"PARAM_NAME_HELP\": \"El nombre del destinatario, o de su sitio web. Puede ser un nombre leíble (\\\"Mi tienda en línea\\\"), o un dominio (\\\"Mitienda.com\\\").\",\n \"PARAM_PREFERRED_NODE\": \"Dirección del nodo preferido\",\n \"PARAM_PREFERRED_NODE_HELP\": \"Dirección (URL) del nodo Duniter a utilizar preferentemente (\\\"g1.domaine.com:443\\\" o \\\"https://g1.domaine.com\\\").\",\n \"PARAM_PUBKEY\": \"Llave pública del destinatario\",\n \"PARAM_PUBKEY_HELP\": \"La llave pública del destinatario (obligatoria)\",\n \"PARAM_REDIRECT_URL\": \"Dirección web de redirección\",\n \"PARAM_REDIRECT_URL_HELP\": \"Dirección web (URL) de redirección, llamada cuanda el pago ha sido enviado. Puede contener las palabras siguientes, que serán remplazadas por los valores de la transacción dinámicanente : \\\"{tx}\\\", \\\"{hash}\\\", \\\"{comment}\\\", \\\"{amount}\\\", \\\"{pubkey}\\\" y \\\"{node}\\\".\",\n \"TITLE\": \"Pagos\"\n },\n \"URL_DIVIDER\": \"Dirección de llamada\"\n },\n \"HOME\": {\n \"DOC_HEADER\": \"Servicios disponibles :\",\n \"MESSAGE\": \"Bienvenido/a a la <b>documentación de la API</b> {{'COMMON.APP_NAME'|translate}}.<br/>Conecte sus sitios webs a la cadena de bloques <a href=\\\"http://duniter.org\\\" target=\\\"_system\\\">Duniter</a> muy fácilmente !\",\n \"MESSAGE_SHORT\": \"Conecte sus sitios a <a href=\\\"http://duniter.org\\\" target=\\\"_system\\\">Duniter</a> muy fácilmente !\",\n \"TITLE\": \"Documentación API {{'COMMON.APP_NAME'|translate}}\"\n },\n \"TRANSFER\": {\n \"AMOUNT\": \"Cuantía :\",\n \"AMOUNTS_HELP\": \"Elija la cuantía :\",\n \"COMMENT\": \"Concepto/Comentario de la operación :\",\n \"DEMO\": {\n \"BAD_CREDENTIALS\": \"Verifique sus credenciales.<br/>En modo demostración, las credenciales son : {{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}\",\n \"HELP\": \"<b>Modo demostración</b> : Ningún pago será enviado realmente durante esta simulación.<br/>Utilice las credenciales : <b>{{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}</b>\",\n \"PASSWORD\": \"demo\",\n \"PUBKEY\": \"3G28bL6deXQBYpPBpLFuECo46d3kfYMJwst7uhdVBnD1\",\n \"SALT\": \"demo\"\n },\n \"ERROR\": {\n \"TRANSFER_FAILED\": \"Error en el pago\"\n },\n \"INFO\": {\n \"CANCEL_REDIRECTING\": \"Pago cancelado.<br/>Redirigiendo al sitio del vendedor...\",\n \"CANCEL_REDIRECTING_WITH_NAME\": \"Pago cancelado.<br/>Redirigiendo a <b>{{name}}</b>...\",\n \"SUCCESS_REDIRECTING\": \"Pago enviado.<br/>Redirigiendo al sitio del vendedor...\",\n \"SUCCESS_REDIRECTING_WITH_NAME\": \"Pago enviado.<br/>Redirigiendo a <b>{{name}}</b>...\"\n },\n \"NAME\": \"Nombre :\",\n \"NODE\": \"Dirección del nodo :\",\n \"PUBKEY\": \"Llave pública del destinatario :\",\n \"SUMMARY\": \"Resumen del pago :\",\n \"TITLE\": \"{{'COMMON.APP_NAME'|translate}} - Pago en línea\",\n \"TITLE_SHORT\": \"Pago en línea\"\n }\n },\n \"AUTH\": {\n \"TITLE\": \"<i class=\\\"icon ion-locked\\\"></i> Autenticación\",\n \"BTN_AUTH\": \"Autenticar\",\n \"GENERAL_HELP\": \"Por favor, autentíquese:\",\n \"EXPECTED_UID_HELP\": \"Por favor inicie sesión en la cuenta de <i class=\\\"ion-person\\\"></i> {{uid}}:\",\n \"EXPECTED_PUBKEY_HELP\": \"Por favor, autentíquese en el monedero <br class=\\\"visible-xs\\\"/><i class=\\\"ion-key\\\"></i> {{pubkey|formatPubkey}} :\",\n \"SCAN_FORM_HELP\": \"Escanee el código QR de la <b>llave privada</b> del monedero.\"\n },\n \"ACCOUNT\": {\n \"TITLE\": \"Mi cuenta\",\n \"BALANCE\": \"Saldo\",\n \"LAST_TX\": \"Últimas transacciones validadas\",\n \"BALANCE_ACCOUNT\": \"Saldo de la cuenta\",\n \"NO_TX\": \"Ninguna transacción\",\n \"SHOW_MORE_TX\": \"Mostrar más\",\n \"SHOW_ALL_TX\": \"Mostrar todo\",\n \"TX_FROM_DATE\": \"(mostrar solo {{fromTime|medianFromNowShort}})\",\n \"OUT_DISTANCED\": \"Sus certificaciones recibidas provienen de un grupo demasiado aislado de la <a ng-click=\\\"showHelpModal('wot')\\\">Red de Confianza</a> (RdC) : la <a ng-click=\\\"showHelpModal('distance_rule')\\\">regla de distancia máxima</a> no se cumple.<br/>Deberá obtener certificaciones provinientes de otros sectores de la RdC, o esperar a que ésta estreche sus vínculos.\",\n \"PENDING_TX\": \"Transacciones pendientes\",\n \"VALIDATING_TX\": \"Transacciones validadas\",\n \"ERROR_TX\": \"Transacciones no ejecutadas\",\n \"ERROR_TX_SENT\": \"Transacciones ejecutadas fallidas\",\n \"PENDING_TX_RECEIVED\": \"Tansacciones en espera de recepción\",\n \"EVENTS\": \"Eventos\",\n \"WAITING_MEMBERSHIP\": \"Solicitud de membresía emitida. En espera de aceptación.\",\n \"WAITING_CERTIFICATIONS\": \"Debe obtener {{needCertificationCount}} certificación(es) para ser miembro.\",\n \"WAITING_CERTIFICATIONS_HELP\": \"Para obtener sus certificaciones, solicitelas únicamente a miembros <b>que le conozcan bien (y en persona)</b>, como exige <a ng-click=\\\"showLicenseModal()\\\">la licencia de la moneda</a> que usted ha aceptado.<br/>Si no conoce lo suficiente a miembros, hágalo saber en <a ng-click=\\\"openLink($event, $root.settings.userForumUrl)\\\">el foro</a> para conocerlos en persona o asistir a algún encuentro.\",\n \"WILL_MISSING_CERTIFICATIONS\": \"Pronto le van a <b>faltar certificaciones</b> (al menos {{willNeedCertificationCount}} son necesarias)\",\n \"WILL_NEED_RENEW_MEMBERSHIP\": \"Su adhesión como miembro <b>va a expirar {{membershipExpiresIn|formatDurationTo}}</b>. Piense en <a ng-click=\\\"doQuickFix('renew')\\\">renovar su adhesión</a> mientras tanto.\",\n \"NEED_RENEW_MEMBERSHIP\": \"Ya no es miembro porque su adhesión <b>ha expirado</b>. Piense en <a ng-click=\\\"doQuickFix('renew')\\\">renovar su adhesión</a>.\",\n \"NEED_RENEW_MEMBERSHIP_AFTER_CANCELLED\": \"Ya no es miembro de la moneda, <b>por falta de certificaciones</b>. Considere <a ng-click=\\\"doQuickFix('renew')\\\">renovar su adhesión</a>.\",\n \"NO_WAITING_MEMBERSHIP\": \"No hay adhesión miembro en espera. Si desea <b>convertirse en miembro</b>, por favor <a ng-click=\\\"doQuickFix('membership')\\\">envíe su adhesión como miembro</a>.\",\n \"CERTIFICATION_COUNT\": \"Certificaciones recibidas\",\n \"CERTIFICATION_COUNT_SHORT\": \"Certificaciones\",\n \"SIG_STOCK\": \"Certificaciones emitidas\",\n \"BTN_RECEIVE_MONEY\": \"Recibir\",\n \"BTN_SELECT_ALTERNATIVES_IDENTITIES\": \"Cambiar a otra identidad…\",\n \"BTN_FIX_MEMBERSHIP\": \"Volver a enviar la candidatura…\",\n \"BTN_MEMBERSHIP_RENEW\": \"Renovar la membresía\",\n \"BTN_MEMBERSHIP_RENEW_DOTS\": \"Renovar la membresía…\",\n \"BTN_MEMBERSHIP_OUT_DOTS\": \"Cancelar la membresía…\",\n \"BTN_SECURITY_DOTS\": \"Cuenta y seguridad…\",\n \"BTN_SHOW_DETAILS\": \"Publicar la información técnica\",\n \"LOCKED_OUTPUTS_POPOVER\": {\n \"TITLE\": \"Importe bloqueado\",\n \"DESCRIPTION\": \"Aquí están las condiciones para desbloquear este importe:\",\n \"DESCRIPTION_MANY\": \"Esta transacción esta compuesta de varias partes, cuyas condiciones de desbloqueo son:\",\n \"LOCKED_AMOUNT\": \"Condiciones del importe:\"\n },\n \"NEW\": {\n \"TITLE\": \"Registrarse\",\n \"INTRO_WARNING_TIME\": \"Crear una cuenta en {{name|capitalize}} es muy simple. Sin embargo, por favor tome el tiempo suficiente para hacerlo correctamente (generar y memorizar bien las credenciales, etc.)\",\n \"INTRO_WARNING_SECURITY\": \"Asegúrese de que el dispositivo actual (ordenador, tablet, teléfono) <b>es seguro y de confianza</b>.\",\n \"INTRO_WARNING_SECURITY_HELP\": \"Antivirus, cortafuegos, sesión protegida por contraseña o número PIN, etc.\",\n \"INTRO_HELP\": \"Haga clic en <b>{{'COMMON.BTN_START'|translate}}</b> para iniciar la creación de la cuenta. Se le guiará paso a paso.\",\n \"REGISTRATION_NODE\": \"Su registro será grabado a través del nodo Duniter <b>{{server}}</b>, que luego se transmitirá al resto del sistema de la moneda.\",\n \"REGISTRATION_NODE_HELP\": \"Si no confía en este nodo, <a ng-click=\\\"doQuickFix('settings')\\\">cambie los ajustes</a> de Cesium.\",\n \"SELECT_ACCOUNT_TYPE\": \"Elegir el tipo de cuenta a crear:\",\n \"MEMBER_ACCOUNT\": \"Cuenta miembro\",\n \"MEMBER_ACCOUNT_TITLE\": \"Crear una cuenta miembro\",\n \"MEMBER_ACCOUNT_HELP\": \"Si todavía no tiene membresía (solamente una cuenta miembro posible por persona).\",\n \"WALLET_ACCOUNT\": \"Simple monedero\",\n \"WALLET_ACCOUNT_TITLE\": \"Crear una cuenta simple\",\n \"WALLET_ACCOUNT_HELP\": \"Monedero simple para todos los otros casos, por ejemplo si necesita una cuenta suplementaria.<br/>El Dividendo Universal no será producido para esta cuenta.\",\n \"SALT_WARNING\": \"Elija su identificador secreto.<br/>Se solicitará cada vez que se conectará con esta cuenta.<br/><br/><b>Conserve bien este identificador secreto</b>.<br/>¡En caso de pérdida, nadie podrá acceder a su cuenta!\",\n \"PASSWORD_WARNING\": \"Elija su contraseña.<br/>Se solicitará cada vez que se conectará con esta cuenta.<br/><br/><b>Conserve bien esta contraseña</b>.<br/>¡En caso de pérdida, nadie podrá acceder su cuenta!\",\n \"PSEUDO_WARNING\": \"Elija un seudónimo.<br/>Sirve para que los otros miembros puedan encontrarlo más fácilmente.<br/><br/>No debe contener <b>ni espacios ni caracteres acentuados</b>.<div class='hidden-xs'><br/>Ejemplo: <span class='gray'>SophieDupond, MarcelChemin, etc.</span>\",\n \"PSEUDO\": \"Seudónimo\",\n \"PSEUDO_HELP\": \"Seudónimo\",\n \"SALT_CONFIRM\": \"Confirmación\",\n \"SALT_CONFIRM_HELP\": \"Confirmación del identificador secreto\",\n \"PASSWORD_CONFIRM\": \"Confirmación\",\n \"PASSWORD_CONFIRM_HELP\": \"Confirmación de la contraseña\",\n \"SLIDE_6_TITLE\": \"Confirmación:\",\n \"COMPUTING_PUBKEY\": \"Cálculo en proceso…\",\n \"LAST_SLIDE_CONGRATULATION\": \"<b>¡Bien!</b> Ha introducido todas los datos necesarios.<br/><b>Puede solicitar</b> la creación de su cuenta.</b><br/><br/>Para su información, la llave pública que se muestra más abajo identificará su futura cuenta.<br/>Esta podrá ser comunicada a terceros para recibir pagos.\",\n \"CONFIRMATION_MEMBER_ACCOUNT\": \"<b class=\\\"assertive\\\">Advertencia:</b> el identificador secreto, la contraseña y el seudónimo no podrán ser modificados.<br/><b>¡Asegúrese siempre de recordarlos!</b><br/><br/><b>¿Desea</b> solicitar la inscripción?\",\n \"CONFIRMATION_WALLET_ACCOUNT\": \"<b class=\\\"assertive\\\">Advertencia:</b> el identificador secreto y la contraseña no podrán ser modificados.<br/><b>¡Asegúrese de recordarlos siempre!</b><br/><br/><b>¿Desea</b> continuar?\",\n \"CHECKING_PSEUDO\": \"Verificando…\",\n \"PSEUDO_AVAILABLE\": \"Este nombre está disponible\",\n \"PSEUDO_NOT_AVAILABLE\": \"Este nombre de usuario no está disponible\",\n \"INFO_LICENSE\": \"Para unirse a la moneda, le pedimos leer y aceptar esta licencia.\",\n \"BTN_ACCEPT\": \"Acepto\",\n \"BTN_ACCEPT_LICENSE\": \"Acepto la licencia\"\n },\n \"POPUP_REGISTER\": {\n \"TITLE\": \"Elija un seudónimo\",\n \"HELP\": \"Un seudónimo es obligatorio para ser miembro.\"\n },\n \"SELECT_IDENTITY_MODAL\": {\n \"TITLE\": \"Selección de identidad\",\n \"HELP\": \"Se han enviado varias <b>identidades diferentes</b> para la llave pública <span class=\\\"gray\\\"><i class=\\\"ion-key\\\"></i>{{pubkey | formatPubkey}}</span>.<br/>Por favor, selecciona la carpeta para usar:\"\n },\n \"SELECT_WALLET_MODAL\": {\n \"TITLE\": \"Selección de monedero\"\n },\n \"WALLET_LIST\": {\n \"IMPORT_MODAL\": {\n \"HELP\": \"Para <b>importar monederos</b>, haga clic para seleccionar o arrastre en la zona de abajo el archivo con la lista de monederos.\",\n \"NO_NEW_WALLET\": \"Ningún monedero nuevo\",\n \"TITLE\": \"Importar monederos\",\n \"WALLET_COUNT\": \"<b>{{count}}</b> nuevo{{count > 1 ? 's' : ''}} monedero{{count > 1 ? 's' : ''}}\"\n },\n \"TITLE\": \"Mis monederos\",\n \"BTN_NEW\": \"Añadir un monedero\",\n \"BTN_DOWNLOAD\": \"Descargue el listado\",\n \"BTN_IMPORT_FILE_DOTS\": \"Importar desde fichero…\",\n \"NO_WALLET\": \"Sin monedero secundario\",\n \"BTN_DELETE\": \"Eliminar un monedero secundario…\",\n \"BTN_RENAME\": \"Renombrar el monedero\",\n \"EXPORT_FILENAME\": \"monederos-{{pubkey|formatPubkey}}-{{currency}}.csv\",\n \"TOTAL_DOTS\": \"Total : \",\n \"EDIT_POPOVER\": {\n \"TITLE\": \"Renombrar el monedero\",\n \"HELP\": \"Escribe el nuevo nombre\",\n \"NAME_HELP\": \"Nombre del monedero\"\n }\n },\n \"SECURITY\": {\n \"KEYFILE\": {\n \"ERROR\": {\n \"BAD_CHECKSUM\": \"Suma de control (checksum) incorrecta\",\n \"BAD_PASSWORD\": \"Frase secreta incorrecta\"\n },\n \"EWIF_FORMAT\": \"Formato EWIF (Encrypted Wallet Import Format) - v1\",\n \"EWIF_FORMAT_HELP\": \"Este formato almacena su archivo de llaves <b>de forma cifrada</b> a partir de una frase secreta de su elección. También guarda una suma de control (checksum) para verificar la integridad del archivo.<br/><b>Atención :</b>¡ Asegúrese siempre de recordar su frase secreta !\",\n \"PASSWORD_POPUP\": {\n \"HELP\": \"Indique la frase secreta :\",\n \"PASSWORD_HELP\": \"Frase secreta\",\n \"TITLE\": \"Archivo de llaves cifrado\"\n },\n \"PUBSEC_FORMAT\": \"Formato PubSec\",\n \"PUBSEC_FORMAT_HELP\": \"Este formato almacena su archivo de llaves de forma simple. Es compatible con Cesium, ğannonce y Duniter.<br/><b>Atención :</b>El archivo <b>no está cifrado</b> (la llave privada aparece en claro) ; ¡ guárdelo en un lugar seguro !\",\n \"WIF_FORMAT\": \"Formato WIF (Wallet Import Format) - v1\",\n \"WIF_FORMAT_HELP\": \"Este formato almacena su archivo de llaves con una suma de control (checksum) para verificar la integridad del archivo. Es compatible con los monederos en papel (Duniter paper wallet).<br/><b>Atención :</b>El archivo <b>no está cifrado</b> (la llave privada aparece en claro) ; ¡ guárdelo en un lugar seguro !\"\n },\n \"ADD_QUESTION\": \"Añadir pregunta personalizada\",\n \"BTN_CLEAN\": \"Limpiar\",\n \"BTN_RESET\": \"Reiniciar\",\n \"DOWNLOAD_REVOKE\": \"Guardar un archivo de revocación\",\n \"DOWNLOAD_REVOKE_HELP\" : \"Tener un archivo de revocación es importante, en caso de perdida de las credenciales. Le permitirá <b>invalidar y sacar su cuenta miembro fuera de la Red de Confianza</b>, convirtíendose en un monedero simple.\",\n \"RECOVER_ID_SELECT_FILE\": \"Elija el <b>archivo para salvaguardar sus credenciales</b> a utilizar :\",\n \"GENERATE_KEYFILE\": \"Generar mi archivo de llaves…\",\n \"GENERATE_KEYFILE_HELP\": \"Genera un archivo que le permitirá atenticarse sin tener que introducir las credenciales.<br/><b>Cuidado:</b> este archivo contendrá su llave secreta; ¡Es muy importante conservarlo en un lugar seguro!\",\n \"KEYFILE_FILENAME\": \"llavero-{{pubkey|formatPubkey}}-{{currency}}-{{format}}.dunikey\",\n \"MEMBERSHIP_IN\": \"Registrarse como miembro…\",\n \"MEMBERSHIP_IN_HELP\": \"Le permite <b>transformar</b> una cuenta de monedero simple <b>en una cuenta miembro</b>, enviando una petición de membresía. Solo si todavía no tiene una cuenta miembro.\",\n \"SEND_IDENTITY\": \"Publicar identidad…\",\n \"SEND_IDENTITY_HELP\": \"Le permite asociar un seudónimo a esta cuenta, pero <b>sin pedir ser miembro</b>. La validez de este seudónimo tiene un plazo limitado.\",\n \"HELP_LEVEL\": \"Elija <strong> al menos {{nb}} preguntas:</strong>\",\n \"LEVEL\": \"Nivel de seguridad\",\n \"LOW_LEVEL\": \"Bajo <span class=\\\"hidden-xs\\\">(2 preguntas min.)</span>\",\n \"MEDIUM_LEVEL\": \"Medio <span class=\\\"hidden-xs\\\">(4 preguntas min.)</span>\",\n \"QUESTION_1\": \"¿Cómo se llamaba su mejor amigo de la adolescencia?\",\n \"QUESTION_2\": \"¿Cómo se llamaba su primer animal de compañía?\",\n \"QUESTION_3\": \"¿Cuál es el primer plato que aprendió a cocinar?\",\n \"QUESTION_4\": \"¿Cuál es la primera película que vió en un cine?\",\n \"QUESTION_5\": \"¿Cuál era el destino del primer avión que cogió?\",\n \"QUESTION_6\": \"¿Cómo se llamaba su docente favorito en la escuela primaria?\",\n \"QUESTION_7\": \"¿Cuál sería para usted el mejor oficio?\",\n \"QUESTION_8\": \"¿Cuál es su libro infantil preferido?\",\n \"QUESTION_9\": \"¿Cuál fue el modelo de su primer vehículo?\",\n \"QUESTION_10\": \"¿Cuál fue su sobrenombre durante su infancia?\",\n \"QUESTION_11\": \"¿Cuál fue su personaje o actor/actriz preferido/a cuando era estudiante?\",\n \"QUESTION_12\": \"¿Cuál fue su cantante o grupo preferido cuando era estudiante?\",\n \"QUESTION_13\": \"¿En qué ciudad sus padres se encontraron?\",\n \"QUESTION_14\": \"¿Cómo se llamaba su primer jefe/a?\",\n \"QUESTION_15\": \"¿Cómo se llama la calle donde creció?\",\n \"QUESTION_16\": \"¿Cómo se llama la primera playa donde se bañó?\",\n \"QUESTION_17\": \"¿Cuál es el primer álbum que compró?\",\n \"QUESTION_18\": \"¿Cuál es el nombre de su equipo deportivo preferido?\",\n \"QUESTION_19\": \"¿Cuál fue el oficio de su abuelo?\",\n \"RECOVER_ID\": \"Recuperar sus credenciales\",\n \"REVOCATION_WITH_FILE\": \"Revocar una identidad a partir de un fichero\",\n \"REVOCATION_WITH_FILE_DESCRIPTION\": \"Si ha perdido de forma permanente las credenciales de su cuenta miembro (o la seguridad de la cuenta se ve comprometida), puede usar <b>el archivo de revocación de la cuenta</b> para forzar la salida de la Red de Confianza.\",\n \"REVOCATION_WITH_FILE_HELP\": \"Para <b>revocar permanentemente</b> una cuenta miembro, arrastre el archivo de revocación en el cuadro siguiente o haga clic en el cuadro para seleccionar un archivo.\",\n \"REVOCATION_FILENAME\": \"revocacion-{{uid}}-{{pubkey|formatPubkey}}-{{currency}}.txt\",\n \"REVOCATION_WALLET\": \"Revocar esta identidad\",\n \"SAVE_ID\": \"Guardar mis credenciales\",\n \"STRONG_LEVEL\": \"Alto <span class=\\\"hidden-xs \\\">(6 preguntas min.)</span>\",\n \"TITLE\": \"Cuenta y seguridad\",\n \"RECOVER_ID_HELP\": \"Si dispone de un <b>archivo de recuperación de sus credenciales</b>, las puede reobtener respondiendo correctamente a las preguntas personales elegidas en su momento.\",\n \"REVOCATION_WALLET_HELP\": \"Pedir la revocación de vuestra identidad comporta la <b>salida de la red de confianza</b> (definitiva para el seudónimo y la llave pública asociada). La cuenta no producirá ya más el Dividendo Universal.<br/>Podrá seguir usándola como monedero simple.\",\n \"SAVE_ID_HELP\": \"Creación de un archivo de recuperación, para <b>reobtener su contraseña</b> (e identificador secreto) en caso de olvido. El archivo se <b>cifra</b> con ayuda de las preguntas personales elegidas.\"\n },\n \"FILE_NAME\": \"{{currency}}_HistorialDeCuenta_{{pubkey|formatPubkey}}_{{currentTime|formatDateForFile}}.csv\",\n \"HEADERS\": {\n \"TIME\": \"Fecha\",\n \"AMOUNT\": \"Cantidad\",\n \"COMMENT\": \"Comentario\"\n }\n },\n \"TRANSFER\": {\n \"TITLE\": \"Transferencia\",\n \"SUB_TITLE\": \"Hacer una transferencia\",\n \"FROM\": \"De\",\n \"TO\": \"A\",\n \"AMOUNT\": \"Importe\",\n \"AMOUNT_HELP\": \"Importe\",\n \"COMMENT\": \"Comentario\",\n \"COMMENT_HELP\": \"Comentario\",\n \"BTN_SEND\": \"Enviar\",\n \"BTN_ADD_COMMENT\": \"Añadir un comentario\",\n \"REST\": \"Resto de cuenta\",\n \"REST_TO\": \"a\",\n \"WARN_COMMENT_IS_PUBLIC\": \"Tenga en cuenta que los <b>comentarios son públicos</b> (sin encriptar).\",\n \"MODAL\": {\n \"TITLE\": \"Transferencia\"\n }\n },\n \"ERROR\": {\n \"ADD_SECONDARY_WALLET_FAILED\": \"Error añadiendo el monedero secundario.\",\n \"COULD_NOT_ADD_EXISTING_WALLET\": \"Monedero ya existe en la lista.\",\n \"COULD_NOT_ADD_MAIN_WALLET\": \"Este monedero <b>corresponde a la cuenta principal</b> con la que se conecta.<br/>Imposible añadirlo como monedero secundario.\",\n \"ISSUE_524_TX_FAILED\": \"Error en la transferencia.<br/><br/>Un mensaje ha sido enviado a los/as desarrolladores/as para facilitar la resolución del problema. <b>Gracias por su ayuda</b>.\",\n \"LOAD_WALLET_LIST_FAILED\": \"Error cargando los monederos secundarios.\",\n \"ONLY_MEMBER_OR_WAS_MEMBER_CAN_EXECUTE_THIS_ACTION\": \"Usted debe <b>ser miembro (o haber sido miembro)</b> para poder efectuar esta acción.\",\n \"RESTORE_WALLET_LIST_FAILED\": \"Error en la restauración de los monederos secundarios.\",\n \"SAVE_WALLET_LIST_FAILED\": \"Error al guardar los monederos secundarios.\",\n \"UNKNOWN_WALLET_ID\": \"Monedero secundario desconocido.\",\n \"UPDATE_WALLET_LIST_FAILED\": \"Error en la actualización de los monederos secundarios.\",\n \"UNKNOWN_URI_FORMAT\": \"Formato URI desconocido\",\n \"PUBKEY_INVALID_CHECKSUM\": \"Llave pública no válida (suma de comprobación incorrecta).\",\n \"POPUP_TITLE\": \"Error\",\n \"UNKNOWN_ERROR\": \"Error desconocido\",\n \"CRYPTO_UNKNOWN_ERROR\": \"Su navegador parece incompatible con las funcionalidades de cryptografía.\",\n \"DOWNLOAD_KEYFILE_FAILED\": \"Error al generar el archivo de llaves.\",\n \"EQUALS_TO_PSEUDO\": \"Debe ser diferente del seudónimo.\",\n \"EQUALS_TO_SALT\": \"Debe ser diferente del identificador secreto.\",\n \"FIELD_REQUIRED\": \"Campo obligatorio.\",\n \"FIELD_TOO_SHORT\": \"Valor demasiado corta.\",\n \"FIELD_TOO_SHORT_WITH_LENGTH\": \"Valor demasiado corta ({{minLength}} carácteres mín)\",\n \"FIELD_TOO_LONG\": \"Valor demasiado largo\",\n \"FIELD_TOO_LONG_WITH_LENGTH\": \"Valor demasiado largo, ({{maxLength}} carácteres máx)\",\n \"FIELD_MIN\": \"Valor mínimo: {{min}}\",\n \"FIELD_MAX\": \"Valor máximo: {{max}}\",\n \"FIELD_ACCENT\": \"Caracteres acentuados y comas no autorizados\",\n \"FIELD_NOT_NUMBER\": \"Valor numérico esperado\",\n \"FIELD_NOT_INT\": \"Valor entero esperado\",\n \"FIELD_NOT_EMAIL\": \"Correo electrónico no válido\",\n \"PASSWORD_NOT_CONFIRMED\": \"No coincide con la contraseña anterior.\",\n \"SALT_NOT_CONFIRMED\": \"No corresponde al identificador secreto anterior.\",\n \"SEND_IDENTITY_FAILED\": \"Error de la inscripción.\",\n \"SEND_CERTIFICATION_FAILED\": \"Error de la certificación.\",\n \"NEED_MEMBER_ACCOUNT_TO_CERTIFY\": \"No se puede certificar, porque su cuenta no <b>es miembro</b>.\",\n \"NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF\": \"No se puede certificar, porque su cuenta todavía no es miembro.<br/><br/>Todavía faltan certificaciones para serlo.\",\n \"IDENTITY_TO_CERTIFY_HAS_NO_SELF\": \"Esta cuenta no se pudo certificar. No se ha solicitado la membresía, o se necesita renovarla.\",\n \"LOGIN_FAILED\": \"Error durante la autentificación.\",\n \"LOAD_IDENTITY_FAILED\": \"Error de carga de la identidad.\",\n \"LOAD_REQUIREMENTS_FAILED\": \"Error de carga de las condiciones de la identidad.\",\n \"SEND_MEMBERSHIP_IN_FAILED\": \"Error en el intento de entrada en la comunidad.\",\n \"SEND_MEMBERSHIP_OUT_FAILED\": \"Error en la interrupción de adhesión.\",\n \"REFRESH_WALLET_DATA\": \"Error en la actualización del monedero.\",\n \"GET_CURRENCY_PARAMETER\": \"Error en la recuperación de las reglas de moneda.\",\n \"GET_CURRENCY_FAILED\": \"Carga de la moneda imposible. Por favor, intente más tarde.\",\n \"SEND_TX_FAILED\": \"Error en la transferencia.\",\n \"ALL_SOURCES_USED\": \"Por favor, espera el cálculo del bloque siguiente (Todas sus fuentes de moneda fueron utilizada).\",\n \"NOT_ENOUGH_SOURCES\": \"No lo bastante cambio para mandar este importe en una sola transacción.<br/>Importe máximo: {{amount}} {{unit}}<sub>{{subUnit}}</sub>.\",\n \"ACCOUNT_CREATION_FAILED\": \"Error en la creación de la cuenta miembro.\",\n \"RESTORE_WALLET_DATA_ERROR\": \"Error en la recarga de los ajustes desde el almacenamiento local\",\n \"LOAD_WALLET_DATA_ERROR\": \"Error en la carga de los datos del monedero.\",\n \"COPY_CLIPBOARD_FAILED\": \"Copia de la valor imposible.\",\n \"TAKE_PICTURE_FAILED\": \"Error en la recuperación de la foto.\",\n \"SCAN_FAILED\": \"Error en el escán del Codigo QR\",\n \"SCAN_UNKNOWN_FORMAT\": \"Codigo no reconocido.\",\n \"WOT_LOOKUP_FAILED\": \"Error en la búsqueda\",\n \"LOAD_PEER_DATA_FAILED\": \"Lectura del nodo Duniter imposible. Por favor, intente más tarde.\",\n \"NEED_LOGIN_FIRST\": \"Por favor, conéctese en primer lugar.\",\n \"AMOUNT_REQUIRED\": \"El importe es obligatorio.\",\n \"AMOUNT_NEGATIVE\": \"Importe negativo no autorizado.\",\n \"NOT_ENOUGH_CREDIT\": \"Crédito insuficiente.\",\n \"INVALID_NODE_SUMMARY\": \"Nodo ilocalizable o dirección inválida.\",\n \"INVALID_USER_ID\": \"El seudónimo no debe contener ni espacios ni caracteres especiales o acentuado.\",\n \"INVALID_COMMENT\": \"El campo 'referencia no debe contener carácteres acentuados.\",\n \"INVALID_PUBKEY\": \"La llave pública no tiene el formato esperado.\",\n \"INVALID_PUBKEY_CHECKSUM\": \"Suma de comprobación inválida.\",\n \"IDENTITY_REVOKED\": \"Esta identidad <b>fue revocada</b>. No puede volver a convertirla en miembro.\",\n \"IDENTITY_REVOKED_WITH_TIME\": \"Esta identidad <b>fue revocada {{revocationTime|medianFromNow}}</b> ({{revocationTime|medianDate}}). No puede volver a convertirla en miembro.\",\n \"IDENTITY_PENDING_REVOCATION\": \"La <b>revocación de esta identidad</b> fue solicitado y esta en espera de tratamiento. Por lo que, la certificación es desactivada.\",\n \"IDENTITY_INVALID_BLOCK_HASH\": \"Esta solicitud de adhesión no es valida (porque denomina un bloque los nodos de la red han anulado): esta persona debe renovelar su solicitud de adhesión <b>antes que</b> estar certificada.\",\n \"IDENTITY_EXPIRED\": \"La publicación de esta identidad ha caducada: esta persona debe realizar una nueva solicitud de adhesión <b>antes que</b> estar certificada.\",\n \"IDENTITY_SANDBOX_FULL\": \"EL nodo Duniter utilizado por Cesium ya no puede recibir más nuevas identidades, porque la fila de espera es llena.<br/><br/>Por favor, intenta ulteriormente o cambia de nodo (vía el menú <b>Ajustes</b>).\",\n \"IDENTITY_NOT_FOUND\": \"Identidad no encontrada\",\n \"IDENTITY_TX_FAILED\": \"Error cargando las transacciones de la identidad\",\n \"WOT_PENDING_INVALID_BLOCK_HASH\": \"Adhesión no validada.\",\n \"WALLET_INVALID_BLOCK_HASH\": \"Su solicitud de adhesión ya no está validada (porque denomina un bloque los nodos de la red han anulado).<br/>Debe <a ng-click=\\\"doQuickFix('fixMembership')\\\">mandar una nueva solicitud</a> para resolver este problema.\",\n \"WALLET_IDENTITY_EXPIRED\": \"La publicación de <b>su identidad ha caducada</b>.<br/>Debe <a ng-click=\\\"doQuickFix('fixIdentity')\\\">publicar une outra vez su identidad</a> para resolver este problema.\",\n \"WALLET_REVOKED\": \"Su identidad fue <b>revocada</b>: ni su seudónimo ni su llave pública podrán estar utilizados en el futuro por una cuenta miembro.\",\n \"WALLET_HAS_NO_SELF\": \"Su identidad debe en primer lugar haber estado publicado, y no estar caducada.\",\n \"AUTH_REQUIRED\": \"Autenticación requerida.\",\n \"AUTH_INVALID_PUBKEY\": \"La llave pública no se corresponde con la cuenta conectada\",\n \"AUTH_INVALID_SCRYPT\": \"De usuario o contraseña no válidos.\",\n \"AUTH_INVALID_FILE\": \"archivo de llave no válido.\",\n \"AUTH_FILE_ERROR\": \"No se pudo abrir el archivo de llave\",\n \"IDENTITY_ALREADY_CERTIFY\": \"Ha <b>ya certificado</b> esta identidad.<br/><br/>Esta certificación todavía es valida (expiration {{expiresIn|formatDurationTo}}).\",\n \"IDENTITY_ALREADY_CERTIFY_PENDING\": \"Ha <b>ya certificado</b> esta identidad.<br/><br/>Esta certificación está en espera de tratamiento (fecha límite de tratamiento {{expiresIn|formatDurationTo}}).\",\n \"UNABLE_TO_CERTIFY_TITLE\": \"Certificación imposible\",\n \"LOAD_NEWCOMERS_FAILED\": \"No se pudo cargar las nuevas membresías.\",\n \"LOAD_PENDING_FAILED\": \"No se pudo cargar las inscripciones pendientes.\",\n \"ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION\": \"Debe <b>ser miembro</b> para poder realizar esta acción.\",\n \"ONLY_SELF_CAN_EXECUTE_THIS_ACTION\": \"Debe haber <b>publicado su identidad</b> para poder realizar esta acción.\",\n \"GET_BLOCK_FAILED\": \"Error en la recuperación del bloque\",\n \"INVALID_BLOCK_HASH\": \"Bloque no encontrado (hash diferente)\",\n \"DOWNLOAD_REVOCATION_FAILED\": \"Debe seleccionar un fichero de texto\",\n \"REVOCATION_FAILED\": \"Error en la revocación.\",\n \"SALT_OR_PASSWORD_NOT_CONFIRMED\": \"Identificador secreto o contraseña incorrectos\",\n \"RECOVER_ID_FAILED\": \"Error en la recuperación de las credenciales\",\n \"LOAD_FILE_FAILED\": \"Error en la carga del archivo\",\n \"NOT_VALID_REVOCATION_FILE\": \"Archivo de revocación no válido (formato de archivo erróneo)\",\n \"NOT_VALID_SAVE_ID_FILE\": \"Archivo no válido (formato de archivo erróneo)\",\n \"NOT_VALID_KEY_FILE\": \"Archivo no válido (formato de archivo erróneo)\",\n \"EXISTING_ACCOUNT\": \"Sus credenciales corresponden a una cuenta existente, la <a ng-click=\\\"showHelpModal('pubkey')\\\">llave pública</a> es:\",\n \"EXISTING_ACCOUNT_REQUEST\": \"Por favor, cambie sus credenciales para que coincida con una cuenta sin usar.\",\n \"GET_LICENSE_FILE_FAILED\": \"Error al obtener el archivo de licencia\",\n \"CHECK_NETWORK_CONNECTION\": \"No se puede conectar a ningún nodo.<br/><br/><b>Compruebe la conexión a Internet</b>.\",\n \"INVALID_FILE_FORMAT\": \"Formato de archivo inválido.\",\n \"SAME_TX_RECIPIENT\": \"El destinatario debe ser diferente del emisor.\"\n },\n \"INFO\": {\n \"POPUP_TITLE\": \"Información\",\n \"CERTIFICATION_DONE\": \"Certificación enviada\",\n \"NOT_ENOUGH_CREDIT\": \"Crédito insuficiente\",\n \"TRANSFER_SENT\": \"Transferencia enviada\",\n \"COPY_TO_CLIPBOARD_DONE\": \"Copia realizada\",\n \"MEMBERSHIP_OUT_SENT\": \"Anulación enviada\",\n \"NOT_NEED_MEMBERSHIP\": \"Ya es miembro.\",\n \"IDENTITY_WILL_MISSING_CERTIFICATIONS\": \"Esta identidad pronto va a necesitar certificaciones (al menos {{willNeedCertificationCount}}).\",\n \"IDENTITY_NEED_MEMBERSHIP\": \"Esta identidad no envió una solicitud de membresía. Ella tendrá que hacerlo si desea hacerse miembro.\",\n \"HAS_ALTERNATIVE_IDENTITIES\": \"Hay <b>identidades múltiples</b> adjuntas a esta llave pública. <b>Antes de cualquier certificación</b>, <a ng-click=\\\"doQuickFix('showSelectIdentities')\\\">verifique otras identidades</a> para elegir la correcta o comuníquese con el propietario de la cuenta.\",\n \"REVOCATION_SENT\": \"Revocación enviada\",\n \"REVOCATION_SENT_WAITING_PROCESS\": \"La <b>revocación de esta identidad</b> fue solicitada y está en espera de ser procesada.\",\n \"FEATURES_NOT_IMPLEMENTED\": \"Esta funcionalidad todavía está en proceso de desarrollo.<br/><br/>¿Por qué no <b>contribuir a Cesium</b>, para obtenerla más rápido? ;)\",\n \"EMPTY_TX_HISTORY\": \"Ninguna operación a exportar\"\n },\n \"CONFIRM\": {\n \"POPUP_TITLE\": \"<b>Confirmación</b>\",\n \"POPUP_WARNING_TITLE\": \"<b>Advertencia</b>\",\n \"POPUP_SECURITY_WARNING_TITLE\": \"<i class=\\\"icon ion-alert-circled\\\"></i> <b>Advertencia de seguridad</b>\",\n \"CERTIFY_RULES_TITLE_UID\": \"Certificar {{uid}}\",\n \"CERTIFY_RULES\": \"<b class=\\\"assertive\\\">NO CERTIFICAR</b> una cuenta si piensa que :<br/><br/><ul><li>1.) no corresponde a una persona <b>física y viva</b>.<li>2.) su propietario <b>posee otra cuenta</b> ya certificada.<li>3.) su propietario viola (voluntariamente o no) la regla 1 o 2 (por ejemplo certificando cuentas falsas o duplicadas).</ul><br/><b>¿Desea</b> todavía certificar esta identidad?\",\n \"FULLSCREEN\": \"¿ Mostrar la aplicación en pantalla completa ?\",\n \"EXIT_APP\": \"¿ Cerrar la aplicación ?\",\n \"TRANSFER\": \"<b>Resumen de la transferencia</b>:<br/><br/><ul><li> - De: {{from}}</li><li> - A: <b>{{to}}</b></li><li> - Importe: <b>{{amount}} {{unit}}</b></li><li> - Comentario: <i>{{comment}}</i></li></ul><br/><b>Desea realizar esta transferencia?</b>\",\n \"TRANSFER_ALL\": \"<b>Resumen de la transferencia</b>:<br/><br/><ul><li> - De: {{from}}</li><li> - A: <b>{{to}}</b></li><li> - Importe: <b>{{amount}} {{unit}}</b></li><li> - Comentario: <i>{{comment}}</i></li><br/><li> - Resto: <b>{{restAmount}} {{unit}}</b> para <b>{{restTo}}</b></li></ul><br/><b>¿Desea realizar esta transferencia?</b>\",\n \"MEMBERSHIP_OUT\": \"Esta operación es <b>irreversible</b>.<br/></br/>¿Desea <b>anular su cuenta miembro</b>?\",\n \"MEMBERSHIP_OUT_2\": \"¡Esta operación es <b>irreversible</b>!<br/><br/>¿Desea <b>anular su candidatura</b> como miembro?\",\n \"LOGIN_UNUSED_WALLET_TITLE\": \"¿Error de introducción de datos?\",\n \"LOGIN_UNUSED_WALLET\": \"Las credenciales introducidas corresponden a una cuenta que parece <b>inactiva</b>.<br/></br/><b>¿Quiere sin embargo continuar con esta cuenta?</b>\",\n \"FIX_IDENTITY\": \"El seudónimo <b>{{uid}}</b> va a ser publicado de nuevo, en reemplazo del antiguo que caducó.<br/></br/><b>¿Desea</b> continuar?\",\n \"FIX_MEMBERSHIP\": \"Su solicitud de adhesión como miembro va a ser enviada de nuevo.<br/></br/><b>¿Desea</b> continuar?\",\n \"MEMBERSHIP\": \"Se enviará su solicitud de membresía como miembro.<br/></br/><b>¿Desea</b> continuar?\",\n \"RENEW_MEMBERSHIP\": \"Su adhesión como miembro va a estar renovada.<br/></br/><b>¿Desea</b> continuar?\",\n \"REVOKE_IDENTITY\": \"Va a <b>revocar definitivamente esta identidad</b>.<br/><br/>La llave pública y el seudónimo asociados <b>jamás podrán ser utilizados</b> (para una cuenta miembro). <br/><br/><b>¿Desea</b> revocar definitivamente esta cuenta?\",\n \"REVOKE_IDENTITY_2\": \"¡Esta operación es <b>irreversible</b>!<br/><br/>¿Desea <b>revocar definitivamente</b> esta cuenta?\",\n \"NOT_NEED_RENEW_MEMBERSHIP\": \"Su membresía no necesita ser renovada actualmente (caducará en {{membershipExpiresIn|formatDuration}}).<br/></br/><b>¿Confirma</b> querer renovar su membresía?\",\n \"SAVE_BEFORE_LEAVE\": \"¿Desea <b>guardar sus cambios</b> antes de abandonar la página?\",\n \"SAVE_BEFORE_LEAVE_TITLE\": \"Cambios no registrados\",\n \"LOGOUT\": \"¿Desea desconectarse?\",\n \"USE_FALLBACK_NODE\": \"Nodo <b>{{old}}</b> inalcanzable o dirección inválida.<br/><br/>¿Desea utilizar temporalmente el nodo <b>{{new}}</b>?\",\n \"ISSUE_524_SEND_LOG\": \"La transacción ha sido rechazada a causa de una anomalía conocida (ticket #524) pero todavía <b>no replicable</b>.<br/><br/>Para ayudar a los/as desarrolladores/as a corregir este error, ¿ <b>acepta el envío de los logs(trazas del programa)</b> ?<br/><small>(ningún dato confidencia será enviado)</small>.\"\n },\n \"MODE\": {\n \"DEMO\": {\n \"BADGE\": \"Demo\",\n \"MODE\": \"Modo de demostración\",\n \"FEATURE_NOT_AVAILABLE\": \"Funcionalidad <b>no disponible</b> en este sitio de demostración.\",\n \"MODE_HELP\": \"Cesium funciona en <b> modo de demostración </b>: la consulta está disponible, pero no se puede realizar ninguna operación.\",\n \"INSTALL_HELP\": \"Por <b>razones de seguridad</b> recomendamos <b>instalar</b> su copia del software.<br/>Visite el sitio de Internet <a href='https://cesium.app'> www.cesium.app </a> para obtener ayuda.\"\n },\n \"READONLY\": {\n \"BADGE\": \"Monit\",\n \"MODE\": \"Modo de supervisión\",\n \"MODE_HELP\": \"Cesium funciona en <b> modo de supervisión </b>: solo están disponibles las funciones de monitoreo de divisas.\",\n \"INSTALL_HELP\": \"Si desea <b>crear una cuenta</b> para enviar o recibir dinero, le recomendamos <b>instalar</b> su copia del software.<br/>Visite el sitio de Internet <a href='https://cesium.app'> www.cesium.app </a> para obtener ayuda.\"\n }\n },\n \"DOWNLOAD\": {\n \"POPUP_TITLE\": \"<b>Revocación del archivo</b>\",\n \"POPUP_REVOKE_MESSAGE\": \"Para proteger su cuenta, descargue el <b>documento de revocación de cuenta</b>. Le permitirá cancelar su cuenta (en caso de robo, cambio de identificador, cuenta creada incorrectamente, etc.).<br/><br/><b>Por favor, almacénelo en un lugar seguro.</b>\"\n },\n \"HELP\": {\n \"TITLE\": \"Ayuda en línea\",\n \"JOIN\": {\n \"SECTION\": \"Inscripción\",\n \"SALT\": \"El identificador secreto es muy importante. Sirve para mezclar(<span class=\\\"text-italic\\\">hash</span>) la contraseña, antes de calcular la <span class=\\\"text-italic\\\">llave pública</span> (el número de cuenta) y la <span class=\\\"text-italic\\\">llave privada</span> para acceder a esta.<br/><b>Por favor, memorícelo muy bien</b> porque no existe ninguna forma de recuperarlo en caso de pérdida.<br/>No puede ser modificado. Deberá crear una nueva cuenta si lo pierde o se olvida.<br/><br/>Un buen identificador secreto debe ser suficientemente largo (al menos 8 carácteres) y lo más original posible.\",\n \"PASSWORD\": \"La contraseña es muy importante. Junto al identificador secreto, sirve para calcular la llave pública (el número de cuenta), y la llave privada para acceder a ella.<br/><b>Por favor, memorícela muy bien</b> porque no existe ninguna forma de recuperarla en caso de pérdida (excepto si se tuviese un fichero de respaldo o <span class=\\\"text-italic\\\">backup</span>.).<br/>No puede ser modificada. Deberá crear una nueva cuenta si la pierde o se olvida.<br/><br/>Una buena contraseña contiene al menos 8 carácteres, con al menos una mayúscula y un dígito.\",\n \"PSEUDO\": \"El seudónimo se utiliza solamente en caso de inscripción como <span class=\\\"text-italic\\\">miembro</span>. Siempre está asociado a un monedero (vía su <span class=\\\"text-italic\\\">llave pública</span>).<br/>Este se publica en la red para que los demás usuarios puedan identificar, certificar o enviar dinero a la cuenta.<br/>Un seudónimo debe ser único para cada miembro (actuales y antiguos).\"\n },\n \"LOGIN\": {\n \"SECTION\": \"Autenticación\",\n \"PUBKEY\": \"Llave pública\",\n \"PUBKEY_DEF\": \"La llave pública del archivo de llaves es generada de las credenciales introducidas (cualquiera que sean), sin estar obligatoriamente vinculadas o contrastadas con ninguna cuenta ya usada. <br/><b>Asegúrese por lo tanto de que la llave pública es la misma con la que se creó originalmente su cuenta</b>. De lo contrario, se autogenerará una cuenta vacía que probablemente nunca ha sido usada, ya que el riesgo de coincidir con las credenciales de otra cuenta ajena es muy pequeño.<br/><a href=\\\"https://es.wikipedia.org/wiki/Criptograf%C3%ADa_de_curva_el%C3%ADptica\\\" target=\\\"_ system\\\">Conozca más sobre criptografía</a> con llaves públicas.\",\n \"METHOD\": \"Métodos de autenticación\",\n \"METHOD_DEF\": \"Diversas opciones están disponibles para conectar a las cuentas: <br/> - La conexión <b>con aleatoriedad (estándar o avanzada)</b> mezcla su contraseña con su identificador secreto, para limitar los intentos de ataque<br/> - La conexión <b>usando llave pública</b> le permite entrar sin credenciales, las cuales solo se le pedirán cuando alguna operación lo necesite.<br/> - La conexión <b>usando archivo de llaves</b> leerá las llave pública y privada de la cuenta desde un archivo sin necesitar sus credenciales. Varios formatos son posibles.\"\n },\n \"GLOSSARY\": {\n \"SECTION\": \"Glosario\",\n \"PUBKEY_DEF\": \"Una llave pública identifica un monedero, que puede estar asociado a un miembro o ser un monedero anónimo. En Cesium se calcula a partir del identificador secreto y la contraseña.\",\n \"MEMBER\": \"Miembro\",\n \"MEMBER_DEF\": \"Cada miembro es una persona humana física y viva, deseosa de participar libremente en la comunidad monetaria. Percibe un dividendo universal, de acuerdo a un periodo e importe definido en las <span class=\\\"text-italic\\\">reglas de la moneda</span>\",\n \"CURRENCY_RULES\": \"Reglas de la moneda\",\n \"CURRENCY_RULES_DEF\": \"Las reglas de la moneda se han definido una vez y para siempre. Establecen el funcionamiento de la moneda: el cálculo del dividendo universal, la cantidad de certificaciones necesarias para ser miembro, la cantidad máxima de certificaciones que cada miembro puede emitir, etc. <a href=\\\"#/app/currency\\\">Ver las reglas actuales</a>.<br/> Sus parámetros no pueden alterarse gracias a una <span class=\\\"text-italic\\\">Cadena de Bloques</span> que soporta, implementa y verifica la buena aplicación de estas reglas.\",\n \"BLOCKCHAIN\": \"Cadena de bloques (<span class=\\\"text-italic\\\">Blockchain</span>)\",\n \"BLOCKCHAIN_DEF\": \"La cadena de bloques es un sistema descentralizado, que en el caso de Duniter, sirve para mantener e implementar las <span class=\\\"text-italic\\\">reglas de la moneda</span>.<br/><a href=\\\"http://duniter.org\\\" target=\\\"_system\\\">Más información</a> acerca de Duniter y el funcionamiento de su cadena de bloques.\",\n \"UNIVERSAL_DIVIDEND_DEF\": \"El Dividendo Universal (DU) es la cantidad de moneda co-creada por cada miembro, dependiendo del periodo y del cálculo definidos en las <span class=\\\"text-italic\\\">reglas de la moneda</span>.<br/>En cada periodo, los miembros reciben en sus cuentas la misma cantidad de moneda.<br/><br/>El DU crece regularmente, para ser justo entre cada miembro (actualmente y en el futuro), y calculado en función de la esperanza de vida media, como se demuestra en la <span class=\\\"text-italic\\\">Teoría Relativa de la Moneda</span> (TRM, de Stéphane Laborde).<br/><a href=\\\"http://trm.creationmonetaire.info\\\">Más información</a> sobre la TRM y las monedas libres.\",\n \"WOT\": \"Red de Confianza (RdC)\",\n \"WOT_DEF\": \"La Red de Confianza se compone del conjunto de miembros de la moneda, y de los enlaces de certificaciones que los conectan.\",\n \"DISTANCE_RULE\": \"Regla de distancia\",\n \"DISTANCE_RULE_DEF\": \"La regle de distancia de la Red de Confianza define <b>una distancia máxima a respetar</b> entre una candidatura y número mínimo miembros referentes (aquellos más conectados). Esta distancia es calculada utilizando los enlaces de certificación.\"\n },\n \"TIP\": {\n \"MENU_BTN_CURRENCY\": \"El menú <b>{{'MENU.CURRENCY'|translate}}</b> permite consultar las <b>reglas de la moneda</b> y su estado.\",\n \"CURRENCY_WOT\": \"El <b>número de miembros</b> muestra el peso de la comunidad y permite <b>seguir su evolución</b>.\",\n \"CURRENCY_MASS\": \"Siga aquí la <b>cantidad total de moneda</b> existente y su <b>distribución media</b> por miembro.<br/><br/>Esto permite juzgar la <b>relevancia de un importe</b>, en relación con lo que <b>poseen los demás</b> en sus cuentas (de media).\",\n \"CURRENCY_UNIT_RELATIVE\": \"La unidad utilizada (&ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;) significa que los importes en {{currency|capitalize}} han sido divididos entre el valor del <b>Dividendo Universal</b> (DU).<br/><br/><small> Esta unidad relativa es <b>pertinente</b>, porque permanece estable, independiente de la cantidad de moneda que aumenta constantemente.</small>\",\n \"CURRENCY_CHANGE_UNIT\": \"Este botón permite <b>cambiar la unidad</b>, para visualizar los importes <b>directamente en {{currency|capitalize}}</b> (en lugar de &ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;).\",\n \"CURRENCY_CHANGE_UNIT_TO_RELATIVE\": \"Este botón permite <b>cambiar la unidad</b>, para visualizar los importes en &ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;, es decir, relativo al Dividendo Universal (el monto co-producido por cada miembro).\",\n \"CURRENCY_RULES\": \"Las <b>reglas</b> de la moneda fijan su funcionamiento <b>exacto y previsible</b>.<br/><br/>Es el propio ADN de la moneda, que hace que su código monetario sea <b>legible y transparente</b>.\",\n \"MENU_BTN_NETWORK\": \"El menú <b>{{'MENU.NETWORK'|translate}}</b> permite consultar el estado de la red.\",\n \"NETWORK_BLOCKCHAIN\": \"Todas las transacciones de la moneda están registradas dentro de un gran libro de contabilidad <b>público e infalsificable</b>, conocido como la <b>cadena de bloques</b> (<em>BlockChain</em> en inglés).\",\n \"NETWORK_PEERS\": \"Los <b>nodos</b> visibles aquí corresponden a los <b>dispositivos de miembros que actualizan y validan</b> la cadena de bloques.<br/><br/>Cuanto más nodos haya conectados, la moneda tendrá una gestión más <b>descentralizada</b> y digna de confianza.\",\n \"NETWORK_PEERS_BLOCK_NUMBER\": \"Este <b>número</b> (en verde) indica el <b>último bloque validado</b> por este nodo (última página escrita en la cadena de bloques).<br/><br/>El color verde indica que este bloque ha sido también validado por <b>la mayoría del resto de nodos</b>.\",\n \"NETWORK_PEERS_PARTICIPATE\": \"<b>Cada miembro</b>, equipado de un dispositivo conectado a Internet, <b>puede contribuir añadiendo un nodo</b>. Necesita <b>instalar el programa Duniter</b> (libre y gratuito). <a href=\\\"{{installDocUrl}}\\\" target=\\\"_system\\\">Ver manual de uso &gt;&gt;</a>.\",\n \"MENU_BTN_ACCOUNT\": \"<b>{{'ACCOUNT.TITLE'|translate}}</b> permite acceder a la gestión y al historial de su cuenta.\",\n \"MENU_BTN_ACCOUNT_MEMBER\": \"Consulte aquí el estado de su cuenta y la información sobre sus certificaciones.\",\n \"WALLET_CERTIFICATIONS\": \"Haga clic aquí para consultar el detalle de sus certificaciones (recibidas y emitidas).\",\n \"WALLET_RECEIVED_CERTIFICATIONS\": \"Haga clic aquí para consultar el detalle de sus <b>certificaciones recibidas</b>.\",\n \"WALLET_GIVEN_CERTIFICATIONS\": \"Haga clic aquí para consultar el detalle de sus <b>certificaciones emitidas</b>.\",\n \"WALLET_BALANCE\": \"El <b>saldo</b> de su cuenta se visualiza aquí.\",\n \"WALLET_BALANCE_RELATIVE\":\n \"{{'HELP.TIP.WALLET_BALANCE'|translate}}<br/><br/>La unidad utilizada (&ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;) significa que el importe en {{currency|capitalize}} fue dividido entre el <b>Dividendo Universal</b> (DU) co-producido por cada miembro.<br/><br/>Actualmente un DU vale {{currentUD|formatInteger}} {{currency|capitalize}}s.\",\n \"WALLET_BALANCE_CHANGE_UNIT\": \"Podrá <b>cambiar la unidad</b> de visualización de los importes en los <b><i class=\\\"icon ion-android-settings\\\"></i>&nbsp;{{'MENU.SETTINGS'|translate}}</b>.<br/><br/>Por ejemplo, para visualizar los importes <b>directamente en {{currency|capitalize}}</b>, en lugar de unidad relativa.\",\n \"WALLET_PUBKEY\": \"Esta es la llave pública de su cuenta. Puede comunicarla a un tercero para que pueda identificar su cuenta de forma simple.\",\n \"WALLET_SEND\": \"Realizar un pago en algunos clics\",\n \"WALLET_SEND_NO_MONEY\": \"Realizar un pago en algunos clics.<br/>(Su saldo ya no lo permite)\",\n \"WALLET_OPTIONS\": \"Este botón permite acceder a las <b>acciones de adhesión</b> y de seguridad.<br/><br/>¡No olvide echar un vistazo!\",\n \"WALLET_RECEIVED_CERTS\": \"Se exhibirá aquí la lista de las personas que le han certificado.\",\n \"WALLET_CERTIFY\": \"El botón <b>{{'WOT.BTN_SELECT_AND_CERTIFY'|translate}}</b> permite seleccionar una identidad y certificarla.<br/><br/>Solo quienes son <b>miembros</b> pueden certificar a otras personas.\",\n \"WALLET_CERT_STOCK\": \"Su stock de certificaciones (emitidas) es limitado a <b>{{sigStock}} certificaciones</b>.<br/><br/>Este stock se renueva con el tiempo, a medida que las certificaciones caducan.\",\n \"MENU_BTN_TX\": \"El menú <b>{{'MENU.TRANSACTIONS'|translate}}</b> permite consultar su saldo, el historial de transacciones y realizar nuevos pagos.\",\n \"MENU_BTN_WALLETS\": \"El menú <b>{{'MENU.WALLETS'|translate}}</b> permite añadir monederos complementarios que usted maneja.\",\n \"MENU_BTN_WOT\": \"El menú <b>{{'MENU.WOT'|translate}}</b> permite buscar <b>usuarios</b> de la moneda (miembro o no).\",\n \"WOT_SEARCH_TEXT_XS\": \"Para buscar en el directorio, escriba las <b>primeras letras de un seudónimo</b> (o de una llave pública).<br/><br/>La búsqueda se iniciará automáticamente.\",\n \"WOT_SEARCH_TEXT\": \"Para buscar en el directorio, escriba las <b>primeras letras de un seudónimo</b> (o de una llave pública). <br/><br/>Luego, pulse en la tecla <b>Intro</b> para iniciar la búsqueda.\",\n \"WOT_SEARCH_RESULT\": \"Visualice la ficha detallada <b>haciendo clic</b> sobre una fila.\",\n \"WOT_VIEW_CERTIFICATIONS\": \"La opción <b>{{'ACCOUNT.CERTIFICATION_COUNT'|translate}}</b> muestra qué miembros han validado esta identidad.<br/><br/>Estas certificaciones atestiguan que la cuenta pertenece a <b>una persona humana viva</b> y que no posee <b>ninguna otra cuenta miembro</b>.\",\n \"WOT_VIEW_CERTIFICATIONS_COUNT\": \"Necesita al menos <b>{{sigQty}} certificaciones</b> para ser miembro y recibir el <b>Dividendo Universal</b>.\",\n \"WOT_VIEW_CERTIFICATIONS_CLICK\": \"Un clic aquí permite abrir <b>la lista de todas las certificaciones</b> de la identidad (recibidas y emitidas).\",\n \"WOT_VIEW_CERTIFY\": \"El botón <b>{{'WOT.BTN_CERTIFY'|translate}}</b> permite añadir su certificación a esta identidad.\",\n \"CERTIFY_RULES\": \"<b>Atención:</b> Certifique solamente <b>personas físicas vivas</b>, que no posean ya ninguna otra cuenta miembro.<br/><br/>¡La seguridad de la red de la moneda depende del cuidado de cada persona!\",\n \"MENU_BTN_SETTINGS\": \"En <b>{{'MENU.SETTINGS'|translate}}</b> podrá configurar la aplicación.\",\n \"HEADER_BAR_BTN_PROFILE\": \"Haga clic aquí para acceder a su <b>perfil</b>\",\n \"SETTINGS_CHANGE_UNIT\": \"Podrá <b>cambiar la unidad de visualización</b> de los importes haciendo clic aquí.<br/><br/>- Desactive la opción para mostrar los importes en {{currency|capitalize}}.<br/>- Actívela para importes relativos al {{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub> (las cantidades de los importes se mostrarán <b>divididos</b> entre el Dividendo Universal actual).\",\n \"END_LOGIN\": \"La visita guiada ha <b>terminado</b>.<br/><br/>¡Buena suerte en este nuevo mundo de la <b>economía libre</b> !\",\n \"END_NOT_LOGIN\": \"La visita guiada ha <b>terminado</b>.<br/><br/>Si quiere utilizar la moneda {{currency|capitalize}}, tiene que hacer un clic en <b>{{'LOGIN.CREATE_ACCOUNT'|translate}}</b> más abajo.\",\n \"END_READONLY\": \"La visita guiada ha <b>terminado</b>.<br/><br/>{{'MODE.READONLY.INSTALL_HELP'|translate}}.\"\n }\n }\n}\n);\n\n$translateProvider.translations(\"fr-FR\", {\n \"COMMON\": {\n \"APP_NAME\": \"Cesium\",\n \"APP_VERSION\": \"v{{version}}\",\n \"APP_BUILD\": \"date : {{build}}\",\n \"PUBKEY\": \"Clé publique\",\n \"MEMBER\": \"Membre\",\n \"BLOCK\" : \"Bloc\",\n \"BTN_OK\": \"OK\",\n \"BTN_YES\": \"Oui\",\n \"BTN_NO\": \"Non\",\n \"BTN_SEND\": \"Envoyer\",\n \"BTN_SEND_MONEY\": \"Faire un virement\",\n \"BTN_SEND_MONEY_SHORT\": \"Virement\",\n \"BTN_SAVE\": \"Enregistrer\",\n \"BTN_YES_SAVE\": \"Oui, Enregistrer\",\n \"BTN_YES_CONTINUE\": \"Oui, Continuer\",\n \"BTN_SHOW\": \"Voir\",\n \"BTN_SHOW_PUBKEY\": \"Afficher la clé publique\",\n \"BTN_RELATIVE_UNIT\": \"Afficher les montants en DU ?\",\n \"BTN_BACK\": \"Retour\",\n \"BTN_NEXT\": \"Suivant\",\n \"BTN_IMPORT\": \"Importer\",\n \"BTN_CANCEL\": \"Annuler\",\n \"BTN_CLOSE\": \"Fermer\",\n \"BTN_LATER\": \"Plus tard\",\n \"BTN_LOGIN\": \"Se connecter\",\n \"BTN_LOGOUT\": \"Déconnexion\",\n \"BTN_ADD_ACCOUNT\": \"Nouveau compte\",\n \"BTN_SHARE\": \"Partager\",\n \"BTN_EDIT\": \"Modifier\",\n \"BTN_DELETE\": \"Supprimer\",\n \"BTN_ADD\": \"Ajouter\",\n \"BTN_SEARCH\": \"Rechercher\",\n \"BTN_REFRESH\": \"Actualiser\",\n \"BTN_RETRY\": \"Recommencer\",\n \"BTN_START\": \"Commencer\",\n \"BTN_CONTINUE\": \"Continuer\",\n \"BTN_CREATE\": \"Créer\",\n \"BTN_UNDERSTOOD\": \"J'ai compris\",\n \"BTN_OPTIONS\": \"Options\",\n \"BTN_HELP_TOUR\": \"Visite guidée\",\n \"BTN_HELP_TOUR_SCREEN\": \"Découvrir cet écran\",\n \"BTN_DOWNLOAD\": \"Télécharger\",\n \"BTN_DOWNLOAD_ACCOUNT_STATEMENT\": \"Télécharger le relevé du compte\",\n \"BTN_MODIFY\": \"Modifier\",\n \"CHOOSE_FILE\": \"Déposez votre fichier <br/>ou cliquez pour le sélectionner\",\n \"DAYS\": \"jours\",\n \"NO_ACCOUNT_QUESTION\": \"Pas encore de compte ? Créez-en un gratuitement !\",\n \"SEARCH_NO_RESULT\": \"Aucun résultat trouvé\",\n \"LOADING\": \"Veuillez patienter...\",\n \"LOADING_WAIT\": \"Veuillez patienter...<br/><small>(Cesium interroge le nœud Duniter)</small>\",\n \"SEARCHING\": \"Recherche en cours...\",\n \"FROM\": \"De\",\n \"TO\": \"À\",\n \"COPY\": \"Copier\",\n \"LANGUAGE\": \"Langue\",\n \"UNIVERSAL_DIVIDEND\": \"Dividende universel\",\n \"UD\": \"DU\",\n \"DATE_PATTERN\": \"DD/MM/YY HH:mm\",\n \"DATE_FILE_PATTERN\": \"YYYY-MM-DD\",\n \"DATE_SHORT_PATTERN\": \"DD/MM/YY\",\n \"DATE_MONTH_YEAR_PATTERN\": \"MM/YYYY\",\n \"EMPTY_PARENTHESIS\": \"(vide)\",\n \"UID\": \"Pseudonyme\",\n \"ENABLE\": \"Activé\",\n \"DISABLE\": \"Désactivé\",\n \"RESULTS_LIST\": \"Résultats\",\n \"RESULTS_COUNT\": \"{{count}} résultats\",\n \"EXECUTION_TIME\": \"exécuté en {{duration|formatDurationMs}}\",\n \"SHOW_VALUES\": \"Afficher les valeurs en clair ?\",\n \"POPOVER_ACTIONS_TITLE\": \"Options\",\n \"POPOVER_FILTER_TITLE\": \"Filtres\",\n \"SHOW_MORE\": \"Afficher plus\",\n \"SHOW_MORE_COUNT\": \"(limite actuelle à {{limit}})\",\n \"POPOVER_SHARE\": {\n \"TITLE\": \"Partager\",\n \"SHARE_ON_TWITTER\": \"Partager sur Twitter\",\n \"SHARE_ON_FACEBOOK\": \"Partager sur Facebook\",\n \"SHARE_ON_DIASPORA\": \"Partager sur Diaspora*\",\n \"SHARE_ON_GOOGLEPLUS\": \"Partager sur Google+\"\n },\n \"FILE\": {\n \"DATE\": \"Date :\",\n \"TYPE\": \"Type :\",\n \"SIZE\": \"Taille :\",\n \"VALIDATING\": \"Validation en cours...\"\n }\n },\n \"SYSTEM\": {\n \"PICTURE_CHOOSE_TYPE\": \"Choisir la source :\",\n \"BTN_PICTURE_GALLERY\": \"Galerie\",\n \"BTN_PICTURE_CAMERA\": \"<b>Caméra</b>\"\n },\n \"MENU\": {\n \"HOME\": \"Accueil\",\n \"WOT\": \"Annuaire\",\n \"CURRENCY\": \"Monnaie\",\n \"ACCOUNT\": \"Mon compte\",\n \"WALLETS\": \"Mes portefeuilles\",\n \"SETTINGS\": \"Paramètres\",\n \"NETWORK\": \"Réseau\",\n \"TRANSACTIONS\": \"Mes opérations\"\n },\n \"ABOUT\": {\n \"TITLE\": \"À propos\",\n \"LICENSE\": \"Application <b>libre</b> (Licence GNU AGPLv3).\",\n \"LATEST_RELEASE\": \"Il existe une <b>version plus récente</b> de {{'COMMON.APP_NAME'|translate}} (<b>v{{version}}</b>)\",\n \"PLEASE_UPDATE\": \"Veuillez mettre à jour {{'COMMON.APP_NAME'|translate}} (dernière version : <b>v{{version}}</b>)\",\n \"CODE\": \"Code source :\",\n \"OFFICIAL_WEB_SITE\": \"Site web officiel :\",\n \"DEVELOPERS\": \"Développé par :\",\n \"FORUM\": \"Forum :\",\n \"PLEASE_REPORT_ISSUE\": \"N'hésitez pas à nous remonter les anomalies rencontrées\",\n \"REPORT_ISSUE\": \"Remonter un problème\",\n \"BTN_OPEN_DEV_WINDOW\": \"Ouvrir la fenêtre de debuggage\"\n },\n \"HOME\": {\n \"TITLE\": \"Cesium\",\n \"WELCOME\": \"Bienvenue dans l'application Cesium !\",\n \"WELCOME_READONLY\": \"Bienvenue dans Cesium <span class='badge badge-balanced'>Monit</span> !\",\n \"MESSAGE\": \"Recevez et envoyez de la monnaie libre {{currency|abbreviate}}\",\n \"MESSAGE_READONLY\": \"Suivez l'état de la monnaie libre {{currency|abbreviate}} en temps réel.\",\n \"BTN_CURRENCY\": \"Explorer la monnaie {{currency|abbreviate}}\",\n \"BTN_ABOUT\": \"à propos\",\n \"BTN_HELP\": \"Aide en ligne\",\n \"BTN_NETWORK\": \"État du réseau\",\n \"FREE_SOFTWARE\": \"Logiciel libre\",\n \"FORK_ME\": \"Cloner moi !\",\n \"SHOW_LICENSE\": \"Voir la license de l'application\",\n \"REPORT_ISSUE\": \"anomalie\",\n \"NOT_YOUR_ACCOUNT_QUESTION\" : \"Vous n'êtes pas propriétaire du compte <b class=\\\"ion-key\\\"> {{pubkey|formatPubkey}}</b>&nbsp;?\",\n \"BTN_CHANGE_ACCOUNT\": \"Déconnecter ce compte\",\n \"CONNECTION_ERROR\": \"Nœud <b>{{server}}</b> injoignable ou adresse invalide.<br/><br/>Vérifiez votre connexion Internet, ou changer de nœud <a class=\\\"positive\\\" ng-click=\\\"doQuickFix('settings')\\\">dans les paramètres</a>.\",\n \"SHOW_ALL_FEED\": \"Voir tout\",\n \"READ_MORE\": \"Lire la suite\",\n \"FEED_SOURCE\": \"Source\"\n },\n \"SETTINGS\": {\n \"TITLE\": \"Paramètres\",\n \"DISPLAY_DIVIDER\": \"Affichage\",\n \"STORAGE_DIVIDER\": \"Stockage\",\n \"NETWORK_SETTINGS\": \"Réseau\",\n \"PEER\": \"Nœud Duniter\",\n \"PEER_SHORT\": \"Nœud Duniter\",\n \"PEER_CHANGED_TEMPORARY\": \"Adresse utilisée temporairement\",\n \"PERSIST_CACHE\": \"Conserver les données de navigation (expérimental)\",\n \"PERSIST_CACHE_HELP\": \"Permet une navigation plus rapide, en conservant localement les données reçues, pour les utiliser d'une session à l'autre.\",\n \"USE_LOCAL_STORAGE\": \"Activer le stockage local\",\n \"USE_LOCAL_STORAGE_HELP\": \"Permet de sauvegarder vos paramètres\",\n \"WALLETS_SETTINGS\": \"Mes portefeuilles\",\n \"USE_WALLETS_ENCRYPTION\": \"Sécuriser la liste ?\",\n \"USE_WALLETS_ENCRYPTION_HELP\": \"Permet de sécuriser la liste de vos portefeuilles (par chiffrement), en exigeant une authentification pour y accéder.\",\n \"ENABLE_HELPTIP\": \"Activer les bulles d'aide contextuelles\",\n \"DISABLE_HELPTIP\": \"Désactiver les bulles d'aide contextuelles\",\n \"ENABLE_UI_EFFECTS\": \"Activer les effets visuels\",\n \"HISTORY_SETTINGS\": \"Mes opérations\",\n \"DISPLAY_UD_HISTORY\": \"Afficher les dividendes produits ?\",\n \"TX_HISTORY_AUTO_REFRESH\": \"Rafraîchir automatiquement\",\n \"TX_HISTORY_AUTO_REFRESH_HELP\": \"Rafraîchit le solde et les opérations automatiquement, à chaque nouveau bloc du réseau.\",\n \"AUTHENTICATION_SETTINGS\": \"Authentification\",\n \"KEEP_AUTH\": \"Désauthentification automatique\",\n \"KEEP_AUTH_SHORT\": \"Désauthentification\",\n \"KEEP_AUTH_HELP\": \"Définit le moment où l'authentification est nettoyée de la mémoire.\",\n \"KEEP_AUTH_OPTION\": {\n \"NEVER\": \"Après chaque opération\",\n \"SECONDS\": \"Après {{value}}s d'inactivité\",\n \"MINUTE\": \"Après {{value}}min d'inactivité\",\n \"MINUTES\": \"Après {{value}}min d'inactivité\",\n \"HOUR\": \"Après {{value}}h d'inactivité\",\n \"ALWAYS\": \"A la fin de la session\"\n },\n \"KEYRING_FILE\": \"Fichier de trousseau\",\n \"KEYRING_FILE_HELP\": \"Permet de vous <b>connecter</b> automatiquement à chaque lancement<br/>et même de vous <b>authentifier</b> (seulement si \\\"Expiration de l'authentification\\\" est configurée \\\"à la fin de la session\\\").\",\n \"REMEMBER_ME\": \"Se souvenir de moi ?\",\n \"REMEMBER_ME_HELP\": \"Permet de rester identifié d'une session à l'autre, en conservant localement la clé publique.\",\n \"PLUGINS_SETTINGS\": \"Extensions\",\n \"BTN_RESET\": \"Restaurer les valeurs par défaut\",\n \"EXPERT_MODE\": \"Activer le mode expert\",\n \"EXPERT_MODE_HELP\": \"Permet un affichage plus détaillé.\",\n \"BLOCK_VALIDITY_WINDOW\": \"Délai d'incertitude des blocs\",\n \"BLOCK_VALIDITY_WINDOW_SHORT\": \"Délai d'incertitude\",\n \"BLOCK_VALIDITY_WINDOW_HELP\": \"Délai avant de considérer qu'une information est validée\",\n \"BLOCK_VALIDITY_OPTION\": {\n \"NONE\": \"Aucun délai\",\n \"N\": \"{{time | formatDuration}} ({{count}} blocs)\"\n },\n \"POPUP_PEER\": {\n \"TITLE\": \"Nœud Duniter\",\n \"HOST\": \"Adresse\",\n \"HOST_HELP\": \"Adresse : serveur:port\",\n \"USE_SSL\": \"Sécurisé ?\",\n \"USE_SSL_HELP\": \"(Chiffrement SSL)\",\n \"BTN_SHOW_LIST\": \"Liste des noeuds\"\n }\n },\n \"BLOCKCHAIN\": {\n \"HASH\": \"Hash : {{hash}}\",\n \"VIEW\": {\n \"HEADER_TITLE\": \"Bloc #{{number}}-{{hash|formatHash}}\",\n \"TITLE_CURRENT\": \"Bloc courant\",\n \"TITLE\": \"Bloc #{{number|formatInteger}}\",\n \"COMPUTED_BY\": \"Calculé par le noeud de\",\n \"SHOW_RAW\": \"Voir le fichier brut\",\n \"TECHNICAL_DIVIDER\": \"Informations techniques\",\n \"VERSION\": \"Version du format\",\n \"HASH\": \"Hash calculé\",\n \"UNIVERSAL_DIVIDEND_HELP\": \"Monnaie co-produite par chacun des {{membersCount}} membres\",\n \"EMPTY\": \"Aucune donnée dans ce bloc\",\n \"POW_MIN\": \"Difficulté minimale\",\n \"POW_MIN_HELP\": \"Difficulté imposée pour le calcul du hash\",\n \"DATA_DIVIDER\": \"Données\",\n \"IDENTITIES_COUNT\": \"Nouvelles identités\",\n \"JOINERS_COUNT\": \"Nouveaux membres\",\n \"ACTIVES_COUNT\": \"Renouvellements\",\n \"ACTIVES_COUNT_HELP\": \"Membres ayant renouvelé leur adhésion\",\n \"LEAVERS_COUNT\": \"Membres sortants\",\n \"LEAVERS_COUNT_HELP\": \"Membres ne souhaitant plus de certification\",\n \"EXCLUDED_COUNT\": \"Membres exclus\",\n \"EXCLUDED_COUNT_HELP\": \"Anciens membres exclus par non renouvellement ou manque de certifications\",\n \"REVOKED_COUNT\": \"Identités révoquées\",\n \"REVOKED_COUNT_HELP\": \"Ces comptes ne pourront plus être membres\",\n \"TX_COUNT\": \"Transactions\",\n \"CERT_COUNT\": \"Certifications\",\n \"TX_TO_HIMSELF\": \"Opération de change\",\n \"TX_OUTPUT_UNLOCK_CONDITIONS\": \"Conditions de déblocage\",\n \"TX_OUTPUT_OPERATOR\": {\n \"AND\": \"et\",\n \"OR\": \"ou\"\n },\n \"TX_OUTPUT_FUNCTION\": {\n \"SIG\": \"<b>Signature</b> de \",\n \"XHX\": \"<b>Mot de passe</b>, dont SHA256 =\",\n \"CSV\": \"Bloqué pendant\",\n \"CLTV\": \"Bloqué jusqu'à\"\n }\n },\n \"LOOKUP\": {\n \"TITLE\": \"Blocs\",\n \"NO_BLOCK\": \"Aucun bloc\",\n \"LAST_BLOCKS\": \"Derniers blocs :\",\n \"BTN_COMPACT\": \"Compacter\"\n }\n },\n \"CURRENCY\": {\n \"VIEW\": {\n \"TITLE\": \"Monnaie\",\n \"TAB_CURRENCY\": \"Monnaie\",\n \"TAB_WOT\": \"Toile de confiance\",\n \"TAB_NETWORK\": \"Réseau\",\n \"TAB_BLOCKS\": \"Blocs\",\n \"CURRENCY_SHORT_DESCRIPTION\": \"{{currency|abbreviate}} est une <b>monnaie libre</b>, démarrée {{firstBlockTime|formatFromNow}}. Elle compte actuellement <b>{{N}} membres</b>, qui produisent et perçoivent un <a ng-click=\\\"showHelpModal('ud')\\\">Dividende Universel</a> (DU), chaque {{dt|formatPeriod}}.\",\n \"NETWORK_RULES_DIVIDER\": \"Règles du réseau\",\n \"CURRENCY_NAME\": \"Nom de la monnaie\",\n \"MEMBERS\": \"Nombre de membres\",\n \"MEMBERS_VARIATION\": \"Variation depuis le dernier DU\",\n \"MONEY_DIVIDER\": \"Monnaie\",\n \"MASS\": \"Masse monétaire\",\n \"SHARE\": \"Masse par membre\",\n \"UD\": \"Dividende universel\",\n \"C_ACTUAL\": \"Croissance actuelle\",\n \"MEDIAN_TIME\": \"Heure de la blockchain\",\n \"POW_MIN\": \"Niveau minimal de difficulté de calcul\",\n \"MONEY_RULES_DIVIDER\": \"Règles de la monnaie\",\n \"C_RULE\": \"Croissance théorique cible\",\n \"UD_RULE\": \"Calcul du dividende universel\",\n \"DT_REEVAL\": \"Période de revalorisation du DU\",\n \"REEVAL_SYMBOL\": \"reval\",\n \"DT_REEVAL_VALUE\": \"Tous les <b>{{dtReeval|formatDuration}}</b> ({{dtReeval/86400}} {{'COMMON.DAYS'|translate}})\",\n \"UD_REEVAL_TIME0\": \"Date de la 1ère revalorisation\",\n \"SIG_QTY_RULE\": \"Nombre de certifications requises pour devenir membre\",\n \"SIG_STOCK\": \"Nombre maximal de certifications émises par membre\",\n \"SIG_PERIOD\": \"Délai minimal d'attente entre 2 certifications successives émises par une même personne\",\n \"SIG_WINDOW\": \"Délai limite de prise en compte d'une certification\",\n \"SIG_VALIDITY\": \"Durée de vie d'une certification qui a été prise en compte\",\n \"MS_WINDOW\": \"Délai limite de prise en compte d'une demande d'adhésion comme membre\",\n \"MS_VALIDITY\": \"Durée de vie d'une adhésion qui a été prise en compte\",\n \"STEP_MAX\": \"Distance maximale, par les certifications, entre un nouvel entrant et les membres référents\",\n \"WOT_RULES_DIVIDER\": \"Règles de la toile de confiance\",\n \"SENTRIES\": \"Nombre de certifications (émises <b>et</b> reçues) pour devenir membre référent\",\n \"SENTRIES_FORMULA\": \"Nombre de certifications (émises <b>et</b> reçues) pour devenir membre référent (formule)\",\n \"XPERCENT\":\"Pourcentage minimum de membres référents à atteindre pour respecter la règle de distance\",\n \"AVG_GEN_TIME\": \"Temps moyen entre deux blocs\",\n \"CURRENT\": \"actuel\",\n \"MATH_CEILING\": \"PLAFOND\",\n \"DISPLAY_ALL_RULES\": \"Afficher toutes les règles ?\",\n \"BTN_SHOW_LICENSE\": \"Voir la licence\",\n \"WOT_DIVIDER\": \"Toile de confiance\"\n },\n \"LICENSE\": {\n \"TITLE\": \"Licence de la monnaie\",\n \"BTN_DOWNLOAD\": \"Télécharger le fichier\",\n \"NO_LICENSE_FILE\": \"Fichier de licence non trouvé.\"\n }\n },\n \"NETWORK\": {\n \"VIEW\": {\n \"MEDIAN_TIME\": \"Heure de la blockchain\",\n \"LOADING_PEERS\": \"Chargement des noeuds...\",\n \"NODE_ADDRESS\": \"Adresse :\",\n \"SOFTWARE\": \"Logiciel\",\n \"WARN_PRE_RELEASE\": \"Pré-version (dernière version stable : <b>{{version}}</b>)\",\n \"WARN_NEW_RELEASE\": \"Version <b>{{version}}</b> disponible\",\n \"WS2PID\": \"Identifiant :\",\n \"PRIVATE_ACCESS\": \"Accès privé\",\n \"POW_PREFIX\": \"Préfixe de preuve de travail :\",\n \"ENDPOINTS\": {\n \"BMAS\": \"Interface sécurisée (SSL)\",\n \"BMATOR\": \"Interface réseau TOR\",\n \"WS2P\": \"Interface WS2P\",\n \"ES_USER_API\": \"Noeud de données Cesium+\"\n }\n },\n \"INFO\": {\n \"ONLY_SSL_PEERS\": \"Les noeuds non SSL ont un affichage dégradé, car Cesium fonctionne en mode HTTPS.\"\n }\n },\n \"PEER\": {\n \"PEERS\": \"Nœuds\",\n \"SIGNED_ON_BLOCK\": \"Signé sur le bloc\",\n \"MIRROR\": \"miroir\",\n \"MIRRORS\": \"Miroirs\",\n \"MIRROR_PEERS\": \"Nœuds miroirs\",\n \"PEER_LIST\" : \"Liste des nœuds\",\n \"MEMBERS\" : \"Membres\",\n \"MEMBER_PEERS\" : \"Nœuds membres\",\n \"ALL_PEERS\" : \"Tous les nœuds\",\n \"DIFFICULTY\" : \"Difficulté\",\n \"API\" : \"API\",\n \"CURRENT_BLOCK\" : \"Bloc #\",\n \"POPOVER_FILTER_TITLE\": \"Filtre\",\n \"OFFLINE\": \"Hors ligne\",\n \"OFFLINE_PEERS\": \"Nœuds hors ligne\",\n \"BTN_SHOW_PEER\": \"Voir le nœud\",\n \"VIEW\": {\n \"TITLE\": \"Nœud\",\n \"OWNER\": \"Appartient à\",\n \"SHOW_RAW_PEERING\": \"Voir la fiche de pair\",\n \"SHOW_RAW_CURRENT_BLOCK\": \"Voir le dernier bloc (format brut)\",\n \"LAST_BLOCKS\": \"Derniers blocs connus\",\n \"KNOWN_PEERS\": \"Nœuds connus :\",\n \"GENERAL_DIVIDER\": \"Informations générales\",\n \"ERROR\": {\n \"LOADING_TOR_NODE_ERROR\": \"Récupération des informations du noeud impossible. Le délai d'attente est dépassé.\",\n \"LOADING_NODE_ERROR\": \"Récupération des informations du noeud impossible\"\n }\n }\n },\n \"WOT\": {\n \"SEARCH_HELP\": \"Recherche (pseudo ou clé publique)\",\n \"SEARCH_INIT_PHASE_WARNING\": \"Durant la phase de pré-inscription, la recherche des inscriptions en attente <b>peut être longue</b>. Merci de patienter...\",\n \"REGISTERED_SINCE\": \"Inscrit le\",\n \"REGISTERED_SINCE_BLOCK\": \"Inscrit au bloc #\",\n \"NO_CERTIFICATION\": \"Aucune certification validée\",\n \"NO_GIVEN_CERTIFICATION\": \"Aucune certification émise\",\n \"NOT_MEMBER_PARENTHESIS\": \"(non membre)\",\n \"IDENTITY_REVOKED_PARENTHESIS\": \"(identité révoquée)\",\n \"MEMBER_PENDING_REVOCATION_PARENTHESIS\": \"(en cours de révocation)\",\n \"EXPIRE_IN\": \"Expiration\",\n \"NOT_WRITTEN_EXPIRE_IN\": \"Date limite<br/>de traitement\",\n \"EXPIRED\": \"Expiré\",\n \"PSEUDO\": \"Pseudonyme\",\n \"SIGNED_ON_BLOCK\": \"Emise au bloc #{{block}}\",\n \"WRITTEN_ON_BLOCK\": \"Ecrite au bloc #{{block}}\",\n \"GENERAL_DIVIDER\": \"Informations générales\",\n \"NOT_MEMBER_ACCOUNT\": \"Compte simple (non membre)\",\n \"NOT_MEMBER_ACCOUNT_HELP\": \"Il s'agit d'un simple portefeuille, sans demande d'adhésion en attente.\",\n \"TECHNICAL_DIVIDER\": \"Informations techniques\",\n \"BTN_CERTIFY\": \"Certifier\",\n \"BTN_YES_CERTIFY\": \"Oui, certifier\",\n \"BTN_SELECT_AND_CERTIFY\": \"Nouvelle certification\",\n \"ACCOUNT_OPERATIONS\": \"Opérations sur le compte\",\n \"VIEW\": {\n \"POPOVER_SHARE_TITLE\": \"Identité {{title}}\"\n },\n \"LOOKUP\": {\n \"TITLE\": \"Toile de confiance\",\n \"NEWCOMERS\": \"Nouveaux membres\",\n \"NEWCOMERS_COUNT\": \"{{count}} membres\",\n \"PENDING\": \"Inscriptions en attente\",\n \"PENDING_COUNT\": \"{{count}} inscriptions en attente\",\n \"REGISTERED\": \"Inscrit {{sigDate | formatFromNow}}\",\n \"MEMBER_FROM\": \"Membre depuis {{memberDate|medianFromNowShort}}\",\n \"BTN_NEWCOMERS\": \"Nouveaux membres\",\n \"BTN_PENDING\": \"Inscriptions en attente\",\n \"SHOW_MORE\": \"Afficher plus\",\n \"SHOW_MORE_COUNT\": \"(limite actuelle à {{limit}})\",\n \"NO_PENDING\": \"Aucune inscription en attente.\",\n \"NO_NEWCOMERS\": \"Aucun membre.\"\n },\n \"CONTACTS\": {\n \"TITLE\": \"Contacts\"\n },\n \"MODAL\": {\n \"TITLE\": \"Recherche\"\n },\n \"CERTIFICATIONS\": {\n \"TITLE\": \"{{uid}} - Certifications\",\n \"SUMMARY\": \"Certifications reçues\",\n \"LIST\": \"Détail des certifications reçues\",\n \"PENDING_LIST\": \"Certifications en attente de traitement\",\n \"RECEIVED\": \"Certifications reçues\",\n \"RECEIVED_BY\": \"Certifications reçues par {{uid}}\",\n \"ERROR\": \"Certifications reçues en erreur\",\n \"SENTRY_MEMBER\": \"Membre référent\"\n },\n \"OPERATIONS\": {\n \"TITLE\": \"{{uid}} - Opérations\"\n },\n \"GIVEN_CERTIFICATIONS\": {\n \"TITLE\": \"{{uid}} - Certifications émises\",\n \"SUMMARY\": \"Certifications émises\",\n \"LIST\": \"Détail des certifications émises\",\n \"PENDING_LIST\": \"Certifications en attente de traitement\",\n \"SENT\": \"Certifications émises\",\n \"SENT_BY\": \"Certifications émises par {{uid}}\",\n \"ERROR\": \"Certifications émises en erreur\"\n }\n },\n \"LOGIN\": {\n \"TITLE\": \"<i class=\\\"icon ion-log-in\\\"></i> Connexion\",\n \"SCRYPT_FORM_HELP\": \"Veuillez saisir vos identifiants.<br>Pensez à vérifier que la clé publique est celle de votre compte.\",\n \"PUBKEY_FORM_HELP\": \"Veuillez saisir une clé publique de compte :\",\n \"FILE_FORM_HELP\": \"Choisissez le fichier de trousseau à utiliser :\",\n \"SCAN_FORM_HELP\": \"Scanner le QR code d'un portefeuille.\",\n \"SALT\": \"Identifiant secret\",\n \"SALT_HELP\": \"Identifiant secret\",\n \"SHOW_SALT\": \"Afficher l'identifiant secret ?\",\n \"PASSWORD\": \"Mot de passe\",\n \"PASSWORD_HELP\": \"Mot de passe\",\n \"PUBKEY_HELP\": \"Clé publique ou pseudonyme\",\n \"NO_ACCOUNT_QUESTION\": \"Vous n'avez pas encore de compte ?\",\n \"HAVE_ACCOUNT_QUESTION\": \"Vous avez déjà un compte ?\",\n \"CREATE_ACCOUNT\": \"Créer un compte...\",\n \"CREATE_FREE_ACCOUNT\": \"Créer un compte gratuitement\",\n \"FORGOTTEN_ID\": \"Mot de passe oublié ?\",\n \"ASSOCIATED_PUBKEY\": \"Clé publique du trousseau :\",\n \"BTN_METHODS\": \"Autres méthodes\",\n \"BTN_METHODS_DOTS\": \"Changer de méthode...\",\n \"METHOD_POPOVER_TITLE\": \"Méthodes\",\n \"MEMORIZE_AUTH_FILE\": \"Mémoriser ce trousseau le temps de la session de navigation\",\n \"SCRYPT_PARAMETERS\": \"Paramètres (Scrypt) :\",\n \"AUTO_LOGOUT\": {\n \"TITLE\": \"Information\",\n \"MESSAGE\": \"<i class=\\\"ion-android-time\\\"></i> Vous avez été <b>déconnecté</b> automatiquement, suite à une inactivité prolongée.\",\n \"BTN_RELOGIN\": \"Me reconnecter\",\n \"IDLE_WARNING\": \"Vous allez être déconnecté... {{countdown}}\"\n },\n \"METHOD\": {\n \"SCRYPT_DEFAULT\": \"Identifiant secret et mot de passe\",\n \"SCRYPT_ADVANCED\": \"Salage avancé\",\n \"FILE\": \"Fichier de trousseau\",\n \"PUBKEY\": \"Clé publique ou pseudonyme\",\n \"SCAN\": \"Scanner un QR code\"\n },\n \"SCRYPT\": {\n \"SIMPLE\": \"Salage léger\",\n \"DEFAULT\": \"Salage standard\",\n \"SECURE\": \"Salage sûr\",\n \"HARDEST\": \"Salage le plus sûr\",\n \"EXTREME\": \"Salage extrême\",\n \"USER\": \"Salage personnalisé\",\n \"N\": \"N (Loop):\",\n \"r\": \"r (RAM):\",\n \"p\": \"p (CPU):\"\n },\n \"FILE\": {\n \"HELP\": \"Format de fichier attendu : <b>.yml</b> ou <b>.dunikey</b> (type PubSec, WIF ou EWIF).\"\n }\n },\n \"AUTH\": {\n \"TITLE\": \"<i class=\\\"icon ion-locked\\\"></i> Authentification\",\n \"BTN_AUTH\": \"S'authentifier\",\n \"GENERAL_HELP\": \"Veuillez vous authentifier :\",\n \"EXPECTED_UID_HELP\": \"Veuillez vous authentifier sur le compte <i class=\\\"ion-person\\\"></i> {{uid}} :\",\n \"EXPECTED_PUBKEY_HELP\": \"Veuillez vous authentifier sur le portefeuille <br class=\\\"visible-xs\\\"/><i class=\\\"ion-key\\\"></i> {{pubkey|formatPubkey}} :\",\n \"SCAN_FORM_HELP\": \"Scanner le QR code de la <b>clef privée</b> du portefeuille.\"\n },\n \"ACCOUNT\": {\n \"TITLE\": \"Mon compte\",\n \"BALANCE\": \"Solde\",\n \"LAST_TX\": \"Dernières transactions validées\",\n \"BALANCE_ACCOUNT\": \"Solde du compte\",\n \"NO_TX\": \"Aucune transaction\",\n \"SHOW_MORE_TX\": \"Afficher plus\",\n \"SHOW_ALL_TX\": \"Afficher tout\",\n \"TX_FROM_DATE\": \"(limite actuelle à {{fromTime|medianFromNowShort}})\",\n \"PENDING_TX\": \"Transactions en attente de traitement\",\n \"VALIDATING_TX\": \"Transactions traitées, non validées\",\n \"ERROR_TX\": \"Transactions non executées\",\n \"ERROR_TX_SENT\": \"Transactions envoyées en échec\",\n \"PENDING_TX_RECEIVED\": \"Transactions en attente de réception\",\n \"EVENTS\": \"Evénements\",\n \"OUT_DISTANCED\": \"Vos certifications actuelles proviennent d'un groupe trop isolé de la <a ng-click=\\\"showHelpModal('wot')\\\">Toile de Confiance</a> (TdC) : la <a ng-click=\\\"showHelpModal('distance_rule')\\\">règle de distance maximale</a> n'est pas respectée.<br/>Vous devez obtenir des certifications provenant d'autres secteurs de la TdC, ou bien attendre que celle-ci se resserre.\",\n \"WAITING_MEMBERSHIP\": \"Demande d'adhésion envoyée. En attente d'acceptation.\",\n \"WAITING_CERTIFICATIONS\": \"Vous devez <b>obtenir {{needCertificationCount}} certification(s)</b> pour devenir membre et produire le <a ng-click=\\\"showHelpModal('ud')\\\">Dividende Universel</a>. Votre compte est cependant déjà opérationnel, pour recevoir et effectuer des paiements.\",\n \"WAITING_CERTIFICATIONS_HELP\": \"Pour obtenir vos certifications, sollicitez uniquement des membres <b>qui vous connaissent suffisamment</b>, comme l'exige <a ng-click=\\\"showLicenseModal()\\\">la licence de la monnaie</a> que vous avez acceptée.<br/>Si vous ne connaissez pas suffisamment de membres, faites-le savoir sur <a ng-click=\\\"openLink($event, $root.settings.userForumUrl)\\\">le forum utilisateur</a>.\",\n \"WILL_MISSING_CERTIFICATIONS\": \"Vous allez bientôt <b>manquer de certifications</b> (au moins {{willNeedCertificationCount}} sont requises)\",\n \"WILL_NEED_RENEW_MEMBERSHIP\": \"Votre adhésion comme membre <b>va expirer {{membershipExpiresIn|formatDurationTo}}</b>. Pensez à <a ng-click=\\\"doQuickFix('renew')\\\">renouveler votre adhésion</a> d'ici là.\",\n \"NEED_RENEW_MEMBERSHIP\": \"Vous n'êtes plus membre de la monnaie, car <b>votre adhésion a expiré</b>. Pensez à <a ng-click=\\\"doQuickFix('renew')\\\">renouveler votre adhésion</a>.\",\n \"NEED_RENEW_MEMBERSHIP_AFTER_CANCELLED\": \"Vous n'êtes plus membre de la monnaie, <b>pour manque de certifications</b>. Pensez à <a ng-click=\\\"doQuickFix('renew')\\\">renouveler votre adhésion</a>.\",\n \"NO_WAITING_MEMBERSHIP\": \"Aucune demande d'adhésion en attente. Si vous souhaitez <b>devenir membre</b>, pensez à <a ng-click=\\\"doQuickFix('membership')\\\">envoyer la demande d'adhésion</a>.\",\n \"CERTIFICATION_COUNT\": \"Certifications reçues\",\n \"CERTIFICATION_COUNT_SHORT\": \"Certifications\",\n \"SIG_STOCK\": \"Certifications envoyées\",\n \"BTN_RECEIVE_MONEY\": \"Encaisser\",\n \"BTN_SELECT_ALTERNATIVES_IDENTITIES\": \"Basculer vers une autre identité...\",\n \"BTN_FIX_MEMBERSHIP\": \"Renvoyer la demande d'adhésion...\",\n \"BTN_MEMBERSHIP_RENEW\": \"Renouveler l'adhésion\",\n \"BTN_MEMBERSHIP_RENEW_DOTS\": \"Renouveler l'adhésion...\",\n \"BTN_MEMBERSHIP_OUT_DOTS\": \"Arrêter l'adhésion...\",\n \"BTN_SECURITY_DOTS\": \"Compte et sécurité...\",\n \"BTN_SHOW_DETAILS\": \"Afficher les infos techniques\",\n \"LOCKED_OUTPUTS_POPOVER\": {\n \"TITLE\": \"Montant verrouillé\",\n \"DESCRIPTION\": \"Voici les conditions de déverrouillage de ce montant :\",\n \"DESCRIPTION_MANY\": \"Cette transaction est composé de plusieurs parties, dont voici les conditions de déverrouillage :\",\n \"LOCKED_AMOUNT\": \"Conditions pour le montant :\"\n },\n \"NEW\": {\n \"TITLE\": \"Création de compte\",\n \"INTRO_WARNING_TIME\": \"La création d'un compte sur {{name|capitalize}} est très simple. Veuillez néanmoins prendre suffisament de temps pour faire correctement cette formalité (pour ne pas oublier les identifiants, mots de passe, etc.).\",\n \"INTRO_WARNING_SECURITY\": \"Vérifiez que le matériel que vous utilisez actuellement (ordinateur, tablette, téléphone) <b>est sécurisé et digne de confiance</b>.\",\n \"INTRO_WARNING_SECURITY_HELP\": \"Anti-virus à jour, pare-feu activé, session protégée par mot de passe ou code pin, etc.\",\n \"INTRO_HELP\": \"Cliquez sur <b>{{'COMMON.BTN_START'|translate}}</b> pour débuter la création de compte. Vous serez guidé étape par étape.\",\n \"REGISTRATION_NODE\": \"Votre inscription sera enregistrée via le noeud Duniter <b>{{server}}</b>, qui le diffusera ensuite au reste du réseau de la monnaie.\",\n \"REGISTRATION_NODE_HELP\": \"Si vous ne faites pas confiance en ce noeud, veuillez en changer <a ng-click=\\\"doQuickFix('settings')\\\">dans les paramètres</a> de Cesium.\",\n \"SELECT_ACCOUNT_TYPE\": \"Choisissez le type de compte à créer :\",\n \"MEMBER_ACCOUNT\": \"Compte membre\",\n \"MEMBER_ACCOUNT_TITLE\": \"Création d'un compte membre\",\n \"MEMBER_ACCOUNT_HELP\": \"Si vous n'êtes pas encore inscrit en tant qu'individu (un seul compte possible par individu). Ce compte permet de co-produire la monnaie, en recevant un <b>dividende universel</b> chaque {{parameters.dt|formatPeriod}}.\",\n \"WALLET_ACCOUNT\": \"Simple portefeuille\",\n \"WALLET_ACCOUNT_TITLE\": \"Création d'un portefeuille\",\n \"WALLET_ACCOUNT_HELP\": \"Pour tous les autres cas, par exemple si vous avez besoin d'un compte supplémentaire.<br/>Aucun dividende universel ne sera créé par ce compte.\",\n \"SALT_WARNING\": \"Choisissez votre identifiant secret.<br/>Il vous sera demandé à chaque connexion sur ce compte.<br/><br/><b>Retenez le bien</b> : en cas de perte, plus personne ne pourra accéder à votre compte !\",\n \"PASSWORD_WARNING\": \"Choisissez un mot de passe.<br/>Il vous sera demandé à chaque connexion sur ce compte.<br/><br/><b>Retenez bien ce mot de passe</b : en cas de perte, plus personne ne pourra accéder à votre compte !\",\n \"PSEUDO_WARNING\": \"Choisissez un pseudonyme.<br/>Il sert aux autres membres, pour vous identifier plus facilement.<div class='hidden-xs'><br/>Il <b>ne pourra pas être modifié</b>, sans refaire un compte.</div><br/><br/>Il ne doit contenir <b>ni espace, ni de caractère accentué</b>.<div class='hidden-xs'><br/>Exemple : <span class='gray'>SophieDupond, MarcelChemin, etc.</span>\",\n \"PSEUDO\": \"Pseudonyme\",\n \"PSEUDO_HELP\": \"Pseudonyme\",\n \"SALT_CONFIRM\": \"Confirmation\",\n \"SALT_CONFIRM_HELP\": \"Confirmation de l'identifiant secret\",\n \"PASSWORD_CONFIRM\": \"Confirmation\",\n \"PASSWORD_CONFIRM_HELP\": \"Confirmation du mot de passe\",\n \"SLIDE_6_TITLE\": \"Confirmation :\",\n \"COMPUTING_PUBKEY\": \"Calcul en cours...\",\n \"LAST_SLIDE_CONGRATULATION\": \"Vous avez saisi toutes les informations nécessaires : Bravo !<br/>Vous pouvez maintenant <b>envoyer la demande de création</b> de compte.</b><br/><br/>Pour information, la clé publique ci-dessous identifiera votre futur compte.<br/>Elle pourra être communiquée à des tiers pour recevoir leurs paiements.<br/><b>Il n'est pas obligatoire</b> de la noter ici, vous pourrez également le faire plus tard.\",\n \"CONFIRMATION_MEMBER_ACCOUNT\": \"<b class=\\\"assertive\\\">Avertissement :</b> l'identifiant secret, le mot de passe et le pseudonyme ne pourront plus être modifiés.<br/><br/><b>Assurez-vous de toujours vous en rappeler !</b><br/><br/><b>Êtes-vous sûr</b> de vouloir envoyer cette demande d'inscription ?\",\n \"CONFIRMATION_WALLET_ACCOUNT\": \"<b class=\\\"assertive\\\">Avertissement :</b> l'identifiant secret et le mot de passe ne pourront plus être modifiés.<br/><br/><b>Assurez-vous de toujours vous en rappeler !</b><br/><br/><b>Êtes-vous sûr</b> de vouloir continuer avec ces identifiants ?\",\n \"CHECKING_PSEUDO\": \"Vérification...\",\n \"PSEUDO_AVAILABLE\": \"Pseudonyme disponible\",\n \"PSEUDO_NOT_AVAILABLE\": \"Pseudonyme non disponible\",\n \"INFO_LICENSE\": \"Avant de créer un compte membre, <b>veuillez lire et accepter la licence</b> d'usage de la monnaie :\",\n \"BTN_ACCEPT\": \"J'accepte\",\n \"BTN_ACCEPT_LICENSE\": \"J'accepte la licence\"\n },\n \"POPUP_REGISTER\": {\n \"TITLE\": \"Choisissez un pseudonyme\",\n \"HELP\": \"Un pseudonyme est obligatoire pour devenir membre.\"\n },\n \"SELECT_IDENTITY_MODAL\": {\n \"TITLE\": \"Sélection de l'identité\",\n \"HELP\": \"Plusieurs <b>identités différentes</b> ont été envoyées, pour la clé publique <span class=\\\"gray\\\"><i class=\\\"ion-key\\\"></i> {{pubkey|formatPubkey}}</span>.<br/>Veuillez sélectionner le dossier à utiliser :\"\n },\n \"SELECT_WALLET_MODAL\": {\n \"TITLE\": \"Sélection du portefeuille\"\n },\n \"WALLET_LIST\": {\n \"TITLE\": \"Mes portefeuilles\",\n \"BTN_NEW\": \"Ajouter un portefeuille\",\n \"BTN_DOWNLOAD\": \"Télécharger la liste\",\n \"BTN_IMPORT_FILE_DOTS\": \"Importer depuis un fichier...\",\n \"NO_WALLET\": \"Aucun portefeuille secondaire\",\n \"BTN_DELETE\": \"Retirer un portefeuille secondaire...\",\n \"BTN_RENAME\": \"Renommer le portefeuille\",\n \"EXPORT_FILENAME\": \"mes_portefeuilles-{{pubkey|formatPubkey}}-{{currency}}.csv\",\n \"TOTAL_DOTS\": \"Total : \",\n \"EDIT_POPOVER\": {\n \"TITLE\": \"Renommer le portefeuille\",\n \"HELP\": \"Renseignez le nouveau nom\",\n \"NAME_HELP\": \"Nom du portefeuille\"\n },\n \"IMPORT_MODAL\": {\n \"TITLE\": \"Importer des portefeuilles\",\n \"HELP\": \"Pour <b>importer des porftefeuilles</b>, veuillez glisser dans la zone ci-dessous le fichier de la liste des portefeuilles, ou bien cliquer dans la zone pour rechercher un fichier.\",\n \"WALLET_COUNT\": \"<b>{{count}}</b> nouveau{{count > 1 ? 'x' : ''}} portefeuille{{count > 1 ? 's' : ''}}\",\n \"NO_NEW_WALLET\": \"Aucun nouveau portefeuille\"\n }\n },\n \"SECURITY\": {\n \"ADD_QUESTION\": \"Ajouter une question personnalisée\",\n \"BTN_CLEAN\": \"Vider\",\n \"BTN_RESET\": \"Réinitialiser\",\n \"DOWNLOAD_REVOKE\": \"Sauvegarder mon fichier de révocation\",\n \"DOWNLOAD_REVOKE_HELP\": \"Disposer d'un fichier de révocation est important, par exemple en cas de perte de vos identifiants. Il vous permet de <b>sortir ce compte de la toile de confiance</b>, en redevenant ainsi un simple portefeuille.\",\n \"GENERATE_KEYFILE\": \"Générer mon fichier de trousseau...\",\n \"GENERATE_KEYFILE_HELP\": \"Génère un fichier permettant de vous authentifier sans saisir vos identifiants.<br/><b>Attention :</b> ce fichier contiendra votre trousseau de compte (clefs publique et secrète) ; il est donc très important de le mettre en lieu sûr !\",\n \"KEYFILE_FILENAME\": \"trousseau-{{pubkey|formatPubkey}}-{{currency}}-{{format}}.dunikey\",\n \"MEMBERSHIP_IN\": \"Transformer en compte membre...\",\n \"MEMBERSHIP_IN_HELP\": \"Permet de <b>transformer</b> un compte simple portefeuille <b>en compte membre</b>, en envoyant une demande d'adhésion. Utile uniquement si vous n'avez pas déjà un autre compte membre.\",\n \"SEND_IDENTITY\": \"Publier son identité...\",\n \"SEND_IDENTITY_HELP\": \"Permet d'associer un pseudonyme à ce compte, mais <b>sans faire de demande d'adhésion</b> pour devenir membre. Cette association n'est généralement pas utile, car la validité de cette association de pseudonyme est limitée dans le temps.\",\n \"HELP_LEVEL\": \"Pour générer un fichier de sauvegarde de vos identifiants, choisissez <strong> au moins {{nb}} questions :</strong>\",\n \"LEVEL\": \"Niveau de sécurité\",\n \"LOW_LEVEL\": \"Faible <span class=\\\"hidden-xs\\\">(2 questions minimum)</span>\",\n \"MEDIUM_LEVEL\": \"Moyen <span class=\\\"hidden-xs\\\">(4 questions minimum)</span>\",\n \"QUESTION_1\": \"Comment s'appelait votre meilleur ami lorsque vous étiez adolescent ?\",\n \"QUESTION_2\": \"Comment s'appelait votre premier animal de compagnie ?\",\n \"QUESTION_3\": \"Quel est le premier plat que vous avez appris à cuisiner ?\",\n \"QUESTION_4\": \"Quel est le premier film que vous avez vu au cinéma ?\",\n \"QUESTION_5\": \"Où êtes-vous allé la première fois que vous avez pris l'avion ?\",\n \"QUESTION_6\": \"Comment s'appelait votre instituteur préféré à l'école primaire ?\",\n \"QUESTION_7\": \"Quel serait selon vous le métier idéal ?\",\n \"QUESTION_8\": \"Quel est le livre pour enfants que vous préférez ?\",\n \"QUESTION_9\": \"Quel était le modèle de votre premier véhicule ?\",\n \"QUESTION_10\": \"Quel était votre surnom lorsque vous étiez enfant ?\",\n \"QUESTION_11\": \"Quel était votre personnage ou acteur de cinéma préféré lorsque vous étiez étudiant ?\",\n \"QUESTION_12\": \"Quel était votre chanteur ou groupe préféré lorsque vous étiez étudiant ?\",\n \"QUESTION_13\": \"Dans quelle ville vos parents se sont-ils rencontrés ?\",\n \"QUESTION_14\": \"Comment s'appelait votre premier patron ?\",\n \"QUESTION_15\": \"Quel est le nom de la rue où vous avez grandi ?\",\n \"QUESTION_16\": \"Quel est le nom de la première plage où vous vous êtes baigné ?\",\n \"QUESTION_17\": \"Quel est le premier album que vous avez acheté ?\",\n \"QUESTION_18\": \"Quel est le nom de votre équipe de sport préférée ?\",\n \"QUESTION_19\": \"Quel était le métier de votre grand-père ?\",\n \"RECOVER_ID\": \"Retrouver mon mot de passe...\",\n \"RECOVER_ID_HELP\": \"Si vous disposez d'un <b>fichier de sauvegarde de vos identifiants</b>, vous pouvez les retrouver en répondant correctement à vos questions personnelles.\",\n \"RECOVER_ID_SELECT_FILE\": \"Choisissez le <b>fichier de sauvegarde de vos identifiants</b> à utiliser :\",\n \"REVOCATION_WITH_FILE\": \"Révoquer mon compte membre...\",\n \"REVOCATION_WITH_FILE_DESCRIPTION\": \"Si vous avez <b>définitivement perdus vos identifiants</b> de compte membre (ou que la sécurité du compte est compromise), vous pouvez utiliser <b>le fichier de révocation</b> du compte pour <b>forcer sa sortie définitive de la toile de confiance</b>.\",\n \"REVOCATION_WITH_FILE_HELP\": \"Pour <b>révoquer définitivement</b> un compte membre, veuillez glisser dans la zone ci-dessous votre fichier de révocation, ou bien cliquer dans la zone pour rechercher un fichier.\",\n \"REVOCATION_WALLET\": \"Révoquer immédiatement ce compte\",\n \"REVOCATION_WALLET_HELP\": \"Demander la révocation de votre identité entraîne la <b>sortie de la toile de confiance</b> (définitive pour le pseudonyme et la clé publique associés). Le compte ne pourra plus produire de Dividende Universel.<br/>Vous pourrez toutefois encore vous y connecter, comme à un simple portefeuille.\",\n \"REVOCATION_FILENAME\": \"revocation-{{uid}}-{{pubkey|formatPubkey}}-{{currency}}.txt\",\n \"SAVE_ID\": \"Sauvegarder mes identifiants...\",\n \"SAVE_ID_HELP\": \"Création d'un fichier de sauvegarde, pour <b>retrouver votre mot de passe</b> (et l'identifiant secret) <b>en cas de d'oubli</b>. Le fichier est <b>sécurisé</b> (chiffré) à l'aide de questions personnelles.\",\n \"STRONG_LEVEL\": \"Fort <span class=\\\"hidden-xs \\\">(6 questions minimum)</span>\",\n \"TITLE\": \"Compte et sécurité\",\n \"KEYFILE\": {\n \"PUBSEC_FORMAT\": \"Format PubSec.\",\n \"PUBSEC_FORMAT_HELP\": \"Ce format stocke votre trousseau de manière très simple. Il est compatible notamment avec Cesium, ğannonce et Duniter.<br/><b>Attention :</b>Le fichier <b>n'est pas chiffré</b> (la clef secrète y apparaît en clair) ; veuillez donc le stocker en lieu sûr !\",\n \"WIF_FORMAT\": \"Format WIF (Wallet Import Format) - v1\",\n \"WIF_FORMAT_HELP\": \"Ce format stocke votre trousseau en y intégrant une somme de contrôle pour vérifier l'intégrité du fichier. Il est compatible notamment avec les portefeuilles papier (Duniter paper wallet).<br/><b>Attention :</b>Le fichier <b>n'est pas chiffré</b> (la clef secrète y apparaît en clair) ; veuillez donc le stocker en lieu sûr !\",\n \"EWIF_FORMAT\": \"Format EWIF (Encrypted Wallet Import Format) - v1\",\n \"EWIF_FORMAT_HELP\": \"Ce format stocke votre trousseau <b>de manière chiffrée</b> à partir d'une phrase secrète de votre choix. Il intègre aussi une somme de contrôle pour vérifier l'intégrité du fichier.<br/><b>Attention :</b> Veillez à toujours vous souvenir de votre phrase secrète !\",\n \"PASSWORD_POPUP\": {\n \"TITLE\": \"Fichier de trousseau chiffré\",\n \"HELP\": \"Veuillez indiquer la phrase secrète :\",\n \"PASSWORD_HELP\": \"Phrase secrète\"\n },\n \"ERROR\": {\n \"BAD_PASSWORD\": \"Phrase secrète incorrecte\",\n \"BAD_CHECKSUM\": \"Somme de contrôle incorrecte\"\n }\n }\n },\n \"FILE_NAME\": \"{{currency}} - Relevé du compte {{pubkey|formatPubkey}} au {{currentTime|formatDateForFile}}.csv\",\n \"HEADERS\": {\n \"TIME\": \"Date\",\n \"AMOUNT\": \"Montant\",\n \"COMMENT\": \"Commentaire\"\n }\n },\n \"TRANSFER\": {\n \"TITLE\": \"Virement\",\n \"SUB_TITLE\": \"Faire un virement\",\n \"SUB_TITLE_ALL\": \"Vider le compte\",\n \"FROM\": \"De\",\n \"TO\": \"À\",\n \"AMOUNT\": \"Montant\",\n \"AMOUNT_HELP\": \"Montant\",\n \"COMMENT\": \"Commentaire\",\n \"COMMENT_HELP\": \"Commentaire\",\n \"BTN_SEND\": \"Envoyer\",\n \"BTN_ADD_COMMENT\": \"Ajouter un commentaire\",\n \"REST\": \"Reste du compte\",\n \"REST_TO\": \"à\",\n \"WARN_COMMENT_IS_PUBLIC\": \"Veuillez noter que <b>les commentaires sont publics</b> (non chiffrés).\",\n \"MODAL\": {\n \"TITLE\": \"Virement\"\n }\n },\n \"ERROR\": {\n \"UNKNOWN_URI_FORMAT\": \"Format d'URI inconnu\",\n \"PUBKEY_INVALID_CHECKSUM\": \"Clé publique invalide (bad checksum).\",\n \"POPUP_TITLE\": \"Erreur\",\n \"UNKNOWN_ERROR\": \"Erreur inconnue\",\n \"CRYPTO_UNKNOWN_ERROR\": \"Votre navigateur ne semble pas compatible avec les fonctionnalités de cryptographie.\",\n \"DOWNLOAD_KEYFILE_FAILED\": \"Échec de la génération du fichier de trousseau.\",\n \"EQUALS_TO_PSEUDO\": \"Doit être différent du pseudonyme\",\n \"EQUALS_TO_SALT\": \"Doit être différent de l'identifiant secret\",\n \"FIELD_REQUIRED\": \"Champ obligatoire\",\n \"FIELD_TOO_SHORT\": \"Valeur trop courte\",\n \"FIELD_TOO_SHORT_WITH_LENGTH\": \"Valeur trop courte ({{minLength}} caractères min)\",\n \"FIELD_TOO_LONG\": \"Valeur trop longue\",\n \"FIELD_TOO_LONG_WITH_LENGTH\": \"Valeur trop longue ({{maxLength}} caractères max)\",\n \"FIELD_MIN\": \"Valeur minimale : {{min}}\",\n \"FIELD_MAX\": \"Valeur maximale : {{max}}\",\n \"FIELD_ACCENT\": \"Caractères accentués et virgules non autorisés\",\n \"FIELD_NOT_NUMBER\": \"Valeur numérique attendue\",\n \"FIELD_NOT_INT\": \"Valeur entière attendue\",\n \"FIELD_NOT_EMAIL\": \"Adresse email non valide\",\n \"PASSWORD_NOT_CONFIRMED\": \"Ne correspond pas au mot de passe\",\n \"SALT_NOT_CONFIRMED\": \"Ne correspond pas à l'identifiant secret\",\n \"SEND_IDENTITY_FAILED\": \"Échec de l'inscription\",\n \"SEND_CERTIFICATION_FAILED\": \"Échec de la certification\",\n \"NEED_MEMBER_ACCOUNT_TO_CERTIFY\": \"Vous ne pouvez pas effectuer de certification, car ce compte n'est <b>pas membre</b>.\",\n \"NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF\": \"Vous ne pouvez pas effectuer de certification, car ce compte n'est pas encore membre.<br/><br/>Il vous manque encore des certifications, ou bien celles-ci n'ont pas encore été validées.\",\n \"IDENTITY_TO_CERTIFY_HAS_NO_SELF\": \"Compte non certifiable. Aucune demande d'adhésion n'a été faite, ou bien elle n'a pas été renouvelée.\",\n \"LOGIN_FAILED\": \"Erreur lors de la connexion.\",\n \"LOAD_IDENTITY_FAILED\": \"Erreur de chargement de l'identité.\",\n \"LOAD_REQUIREMENTS_FAILED\": \"Erreur de chargement des prérequis de l'identité.\",\n \"SEND_MEMBERSHIP_IN_FAILED\": \"Échec de la tentative d'entrée dans la communauté.\",\n \"SEND_MEMBERSHIP_OUT_FAILED\": \"Échec de l'arrêt de l'adhésion.\",\n \"REFRESH_WALLET_DATA\": \"Échec du rafraîchissement du portefeuille.\",\n \"GET_CURRENCY_PARAMETER\": \"Échec de la récupération des règles de la monnaie.\",\n \"GET_CURRENCY_FAILED\": \"Chargement de la monnaie impossible. Veuillez réessayer plus tard.\",\n \"SEND_TX_FAILED\": \"Échec du virement.\",\n \"ALL_SOURCES_USED\": \"Veuillez attendre le calcul du prochain bloc (toutes vos sources de monnaie ont été utilisées).\",\n \"NOT_ENOUGH_SOURCES\": \"Pas assez de change pour envoyer ce montant en une seule transaction.<br/>Montant maximum : {{amount}} {{unit}}<sub>{{subUnit}}</sub>.\",\n \"ACCOUNT_CREATION_FAILED\": \"Échec de la création du compte membre.\",\n \"RESTORE_WALLET_DATA_ERROR\": \"Échec du rechargement des paramètres depuis le stockage local\",\n \"LOAD_WALLET_DATA_ERROR\": \"Échec du chargement des données du portefeuille.\",\n \"COPY_CLIPBOARD_FAILED\": \"Copie de la valeur impossible.\",\n \"TAKE_PICTURE_FAILED\": \"Échec de la récupération de la photo.\",\n \"SCAN_FAILED\": \"Échec du scan de QR-code.\",\n \"SCAN_UNKNOWN_FORMAT\": \"Code non reconnu.\",\n \"WOT_LOOKUP_FAILED\": \"Échec de la recherche.\",\n \"LOAD_PEER_DATA_FAILED\": \"Lecture du nœud Duniter impossible. Veuillez réessayer ultérieurement.\",\n \"NEED_LOGIN_FIRST\": \"Veuillez d'abord vous connecter.\",\n \"AMOUNT_REQUIRED\": \"Le montant est obligatoire.\",\n \"AMOUNT_NEGATIVE\": \"Montant négatif non autorisé.\",\n \"NOT_ENOUGH_CREDIT\": \"Crédit insuffisant.\",\n \"INVALID_NODE_SUMMARY\": \"Nœud injoignable ou adresse invalide.\",\n \"INVALID_USER_ID\": \"Le pseudonyme ne doit contenir ni espace ni caractère spécial ou accentué.\",\n \"INVALID_COMMENT\": \"Le champ 'référence' ne doit pas contenir de caractères accentués.\",\n \"INVALID_PUBKEY\": \"La clé publique n'a pas le format attendu.\",\n \"INVALID_PUBKEY_CHECKSUM\": \"Somme de contrôle invalide.\",\n \"IDENTITY_REVOKED\": \"Cette identité <b>a été révoquée</b>. Elle ne peut plus devenir membre.\",\n \"IDENTITY_REVOKED_WITH_TIME\": \"Cette identité <b>a été révoquée {{revocationTime|medianFromNow}}</b> ({{revocationTime|medianDate}}). Elle ne peut plus devenir membre.\",\n \"IDENTITY_PENDING_REVOCATION\": \"La <b>révocation de cette identité</b> a été demandée et est en attente de traitement. La certification est donc désactivée.\",\n \"IDENTITY_INVALID_BLOCK_HASH\": \"Cette demande d'adhésion n'est plus valide (car elle référence un bloc que les nœuds du réseau ont annulé) : cette personne doit renouveler sa demande d'adhésion <b>avant</b> d'être certifiée.\",\n \"IDENTITY_EXPIRED\": \"La publication de cette identité a expiré : cette personne doit effectuer une nouvelle demande d'adhésion <b>avant</b> d'être certifiée.\",\n \"IDENTITY_SANDBOX_FULL\": \"Le nœud Duniter utilisé par Cesium ne peut plus recevoir de nouvelles identités, car sa file d'attente est pleine.<br/><br/>Veuillez réessayer ultérieurement ou changer de nœud (via le menu <b>Paramètres</b>).\",\n \"IDENTITY_NOT_FOUND\": \"Identité non trouvée.\",\n \"IDENTITY_TX_FAILED\": \"Échec du chargement des opérations.\",\n \"WOT_PENDING_INVALID_BLOCK_HASH\": \"Adhésion non valide.\",\n \"WALLET_INVALID_BLOCK_HASH\": \"Votre demande d'adhésion n'est plus valide (car elle référence un bloc que les nœuds du réseau ont annulé).<br/>Vous devez <a ng-click=\\\"doQuickFix('fixMembership')\\\">envoyer une nouvelle demande</a> pour résoudre ce problème.\",\n \"WALLET_IDENTITY_EXPIRED\": \"La publication de <b>votre identité a expirée</b>.<br/>Vous devez <a ng-click=\\\"doQuickFix('fixIdentity')\\\">publier à nouveau votre identité</a> pour résoudre ce problème.\",\n \"WALLET_REVOKED\": \"Votre identité a été <b>révoquée</b> : ni votre pseudonyme ni votre clef publique ne pourra être utilisé à l'avenir pour un compte membre.\",\n \"WALLET_HAS_NO_SELF\": \"Votre identité doit d'abord avoir été publiée, et ne pas être expirée.\",\n \"AUTH_REQUIRED\": \"Authentification requise.\",\n \"AUTH_INVALID_PUBKEY\": \"La clef attendue est <i class=\\\"ion-key\\\"></i> {{pubkey|formatPubkey}}...\",\n \"AUTH_INVALID_SCRYPT\": \"Identifiant ou mot de passe invalide.\",\n \"AUTH_INVALID_FILE\": \"Fichier de trousseau invalide.\",\n \"AUTH_FILE_ERROR\": \"Échec de l'ouverture du fichier de trousseau.\",\n \"IDENTITY_ALREADY_CERTIFY\": \"Vous avez <b>déjà certifié</b> cette identité.<br/><br/>Cette certification est encore valide (expiration {{expiresIn|formatDurationTo}}).\",\n \"IDENTITY_ALREADY_CERTIFY_PENDING\": \"Vous avez <b>déjà certifié</b> cette identité.<br/><br/>Cette certification est en attente de traitement (date limite de traitement {{expiresIn|formatDurationTo}}).\",\n \"UNABLE_TO_CERTIFY_TITLE\": \"Certification impossible\",\n \"LOAD_NEWCOMERS_FAILED\": \"Échec du chargement des nouveaux membres.\",\n \"LOAD_PENDING_FAILED\": \"Échec du chargement des inscriptions en attente.\",\n \"ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION\": \"Vous devez <b>être membre</b> pour pouvoir effectuer cette action.\",\n \"ONLY_MEMBER_OR_WAS_MEMBER_CAN_EXECUTE_THIS_ACTION\": \"Vous devez <b>être membre (ou ancien membre)</b> pour pouvoir effectuer cette action.\",\n \"ONLY_SELF_CAN_EXECUTE_THIS_ACTION\": \"Vous devez avoir <b>publié votre identité</b> pour pouvoir effectuer cette action.\",\n \"GET_BLOCK_FAILED\": \"Échec de la récupération du bloc.\",\n \"INVALID_BLOCK_HASH\": \"Bloc non trouvé (hash différent).\",\n \"DOWNLOAD_REVOCATION_FAILED\": \"Échec du téléchargement du fichier de révocation.\",\n \"REVOCATION_FAILED\": \"Échec de la révocation.\",\n \"SALT_OR_PASSWORD_NOT_CONFIRMED\": \"Identifiant secret ou mot de passe incorrect.\",\n \"RECOVER_ID_FAILED\": \"Échec de la récupération des identifiants\",\n \"LOAD_FILE_FAILED\" : \"Échec du chargement du fichier\",\n \"NOT_VALID_REVOCATION_FILE\": \"Fichier de révocation non valide (mauvais format de fichier)\",\n \"NOT_VALID_SAVE_ID_FILE\": \"Fichier de récupération non valide (mauvais format de fichier)\",\n \"NOT_VALID_KEY_FILE\": \"Fichier de trousseau non valide (format non reconnu)\",\n \"EXISTING_ACCOUNT\": \"Vos identifiants correspondent à un compte déjà existant, dont la <a ng-click=\\\"showHelpModal('pubkey')\\\">clef publique</a> est :\",\n \"EXISTING_ACCOUNT_REQUEST\": \"Veuillez modifier vos identifiants afin qu'ils correspondent à un compte non utilisé.\",\n \"GET_LICENSE_FILE_FAILED\": \"Récupération du fichier de licence impossible.\",\n \"CHECK_NETWORK_CONNECTION\": \"Aucun nœud ne semble accessible.<br/><br/>Veuillez <b>vérifier votre connexion Internet</b>.\",\n \"ISSUE_524_TX_FAILED\": \"Échec du virement.<br/><br/>Un message a été envoyé aux développeurs pour faciliter la résolution du problème. <b>Merci de votre aide</b>.\",\n \"ADD_SECONDARY_WALLET_FAILED\": \"Échec de l'ajout du portefeuille secondaire.\",\n \"REMOVE_SECONDARY_WALLET_FAILED\": \"Échec de la suppression du portefeuille secondaire.\",\n \"UPDATE_WALLET_LIST_FAILED\": \"Échec du rafraîchissement des portefeuilles secondaires.\",\n \"LOAD_WALLET_LIST_FAILED\": \"Échec du chargement des portefeuilles secondaires.\",\n \"SAVE_WALLET_LIST_FAILED\": \"Échec de la sauvegarde des portefeuilles secondaires.\",\n \"COULD_NOT_ADD_MAIN_WALLET\": \"Ce portefeuille <b>correspond au compte principal</b> avec lequel vous êtes connecté.<br/>Impossible de l'ajouter comme portefeuille secondaire.\",\n \"COULD_NOT_ADD_EXISTING_WALLET\": \"Portefeuille déjà existant dans la liste.\",\n \"UNKNOWN_WALLET_ID\": \"Portefeuille secondaire inconnu.\",\n \"RESTORE_WALLET_LIST_FAILED\": \"Échec de la restauration des portefeuilles secondaires.\",\n \"INVALID_FILE_FORMAT\": \"Format de fichier invalide.\",\n \"SAME_TX_RECIPIENT\": \"Le destinataire doit être différent de l'émetteur.\"\n },\n \"INFO\": {\n \"POPUP_TITLE\": \"Information\",\n \"CERTIFICATION_DONE\": \"Certification envoyée\",\n \"NOT_ENOUGH_CREDIT\": \"Crédit insuffisant\",\n \"TRANSFER_SENT\": \"Virement envoyé\",\n \"COPY_TO_CLIPBOARD_DONE\": \"Copié dans le presse-papier\",\n \"MEMBERSHIP_OUT_SENT\": \"Résiliation envoyée\",\n \"NOT_NEED_MEMBERSHIP\": \"Vous êtes déjà membre.\",\n \"IDENTITY_WILL_MISSING_CERTIFICATIONS\": \"Cette identité va bientôt manquer de certifications (au moins {{willNeedCertificationCount}}).\",\n \"IDENTITY_NEED_MEMBERSHIP\": \"Cette identité n'a pas envoyée de demande d'adhésion. Elle le devra si elle souhaite devenir membre.\",\n \"HAS_ALTERNATIVE_IDENTITIES\": \"Il existe <b>plusieurs identités</b> rattachées à cette clé publique. <b>Avant toute certification</b>, pensez à <a ng-click=\\\"doQuickFix('showSelectIdentities')\\\">consulter les autres identités</a> pour choisir la bonne, ou bien contacter le propriétaire du compte.\",\n \"REVOCATION_SENT\": \"Révocation envoyée\",\n \"REVOCATION_SENT_WAITING_PROCESS\": \"La <b>révocation de cette identité</b> a été demandée et est en attente de traitement.\",\n \"FEATURES_NOT_IMPLEMENTED\": \"Cette fonctionnalité est encore en cours de développement.<br/>Pourquoi ne pas <b>contribuer à Cesium</b>, pour l'obtenir plus rapidement ? ;)\",\n \"EMPTY_TX_HISTORY\": \"Aucune opération à exporter\"\n },\n \"CONFIRM\": {\n \"POPUP_TITLE\": \"<b>Confirmation</b>\",\n \"POPUP_WARNING_TITLE\": \"<b>Avertissement</b>\",\n \"POPUP_SECURITY_WARNING_TITLE\": \"<i class=\\\"icon ion-alert-circled\\\"></i> <b>Avertissement de sécurité</b>\",\n \"CERTIFY_RULES_TITLE_UID\": \"Certifier {{uid}}\",\n \"CERTIFY_RULES\": \"<b class=\\\"assertive\\\">Ne PAS certifier</b> un compte si vous pensez que :<br/><br/><ul><li>1.) il ne correspond pas à une personne <b>physique et vivante</b>.<li>2.) son propriétaire <b>possède un autre compte</b> déjà certifié.<li>3.) son propriétaire viole (volontairement ou non) la règle 1 ou 2 (par exemple en certifiant des comptes factices ou en double).</ul><br/><b>Êtes-vous sûr</b> de vouloir néanmoins certifier cette identité ?\",\n \"FULLSCREEN\": \"Afficher l'application en plein écran ?\",\n \"EXIT_APP\": \"Fermer l'application ?\",\n \"TRANSFER\": \"<b>Récapitulatif du virement</b> :<br/><br/><ul><li> - De : {{from}}</li><li> - A : <b>{{to}}</b></li><li> - Montant : <b>{{amount}} {{unit}}</b></li><li> - Commentaire : <i>{{comment}}</i></li></ul><br/><b>Êtes-vous sûr de vouloir effectuer ce virement ?</b>\",\n \"TRANSFER_ALL\": \"<b>Récapitulatif du virement</b> :<br/><br/><ul><li> - De : {{from}}</li><li> - A : <b>{{to}}</b></li><li> - Montant : <b>{{amount}} {{unit}}</b></li><li> - Commentaire : <i>{{comment}}</i></li><br/><li> - Reste : <b>{{restAmount}} {{unit}}</b> à <b>{{restTo}}</b></li></ul><br/><b>Êtes-vous sûr de vouloir effectuer ce virement ?</b>\",\n \"MEMBERSHIP_OUT\": \"Cette opération est <b>irréversible</b>.<br/></br/>Êtes-vous sûr de vouloir <b>résilier votre compte membre</b> ?\",\n \"MEMBERSHIP_OUT_2\": \"Cette opération est <b>irreversible</b> !<br/><br/>Êtes-vous vraiment sûr de vouloir <b>résilier votre adhésion</b> comme membre ?\",\n \"LOGIN_UNUSED_WALLET_TITLE\": \"Erreur de saisie ?\",\n \"LOGIN_UNUSED_WALLET\": \"Le compte connecté semble <b>inactif</b>.<br/><br/>Il s'agit probablement d'une <b>erreur de saisie</b> dans vos identifiants de connexion. Veuillez recommencer, en vérifiant que <b>la clé publique est celle de votre compte</b>.\",\n \"FIX_IDENTITY\": \"Le pseudonyme <b>{{uid}}</b> va être publiée à nouveau, en remplacement de l'ancienne publication qui a expirée.<br/></br/><b>Êtes-vous sûr</b> de vouloir continuer ?\",\n \"FIX_MEMBERSHIP\": \"Votre demande d'adhésion comme membre va être renvoyée.<br/></br/><b>Êtes-vous sûr</b> de vouloir continuer ?\",\n \"MEMBERSHIP\": \"Votre demande d'adhésion comme membre va être envoyée.<br/></br/><b>Êtes-vous sûr</b> de vouloir continuer ?\",\n \"RENEW_MEMBERSHIP\": \"Votre adhésion comme membre va être renouvelée.<br/></br/><b>Êtes-vous sûr</b> de vouloir continuer ?\",\n \"REVOKE_IDENTITY\": \"Vous allez <b>revoquer définitivement cette identité</b>.<br/><br/>La clé publique et le pseudonyme associés <b>ne pourront plus jamais être utilisés</b> (pour un compte membre). <br/></br/><b>Êtes-vous sûr</b> de vouloir révoquer définitivement ce compte ?\",\n \"REVOKE_IDENTITY_2\": \"Cette opération est <b>irreversible</b> !<br/><br/>Êtes-vous vraiment sûr de vouloir <b>révoquer définitivement</b> ce compte ?\",\n \"NOT_NEED_RENEW_MEMBERSHIP\": \"Votre adhésion n'a pas besoin d'être renouvelée (elle n'expirera que dans {{membershipExpiresIn|formatDuration}}).<br/></br/><b>Êtes-vous sûr</b> de vouloir renouveler votre adhésion ?\",\n \"SAVE_BEFORE_LEAVE\": \"Voulez-vous <b>sauvegarder vos modifications</b> avant de quitter la page ?\",\n \"SAVE_BEFORE_LEAVE_TITLE\": \"Modifications non enregistrées\",\n \"LOGOUT\": \"Êtes-vous sûr de vouloir vous déconnecter ?\",\n \"USE_FALLBACK_NODE\": \"Nœud <b>{{old}}</b> injoignable ou adresse invalide.<br/><br/>Voulez-vous temporairement utiliser le nœud <b>{{new}}</b> ?\",\n \"ISSUE_524_SEND_LOG\": \"La transaction a été rejetée, à cause d'une anomalie connue (ticket #524) mais <b>non reproduite</b>.<br/><br/>Pour aider les développeurs à corriger cette erreur, <b>acceptez-vous la transmission de vos logs</b> par message ?<br/><small>(aucune donnée confidentielle n'est envoyée)</small>.\"\n },\n \"MODE\": {\n \"DEMO\": {\n \"BADGE\": \"Démo\",\n \"MODE\": \"Mode démonstration\",\n \"FEATURE_NOT_AVAILABLE\": \"Fonctionnalité <b>non disponible</b> sur ce site de démonstration.\",\n \"MODE_HELP\": \"Cesium fonctionne en <b>mode démonstration</b> : la consultation de compte est possible, mais aucune opération ne pourra être réalisée.\",\n \"INSTALL_HELP\": \"Pour des <b>raisons de sécurité</b> nous vous recommandons <b>d'installer</b> votre copie de l'application Cesium. Visitez le site <a href='https://cesium.app'>www.cesium.app</a> pour obtenir de l'aide.\"\n },\n \"READONLY\": {\n \"BADGE\": \"Monit\",\n \"MODE\": \"Mode monitoring\",\n \"MODE_HELP\": \"Cesium fonctionne en <b>mode monitoring</b> : sono disponibili solo le funzionalità di monitoraggio della valuta.\",\n \"INSTALL_HELP\": \"Si vous souhaitez <b>créer un compte portefeuille</b> pour envoyer ou recevoir de la monnaie, nous vous recommandons <b>d'installer votre copie</b> de l'application Cesium. Visitez le site <a href='https://cesium.app'>www.cesium.app</a> pour obtenir de l'aide.\"\n }\n },\n \"DOWNLOAD\": {\n \"POPUP_TITLE\": \"<b>Fichier de révocation</b>\",\n \"POPUP_REVOKE_MESSAGE\": \"Pour sécuriser votre compte, veuillez télécharger le <b>document de révocation de compte</b>. Il vous permettra le cas échéant d'annuler votre compte (en cas d'un vol de compte, d'un changement d'identifiant, d'un compte créé à tort, etc.).<br/><br/><b>Veuillez le stocker en lieu sûr.</b>\"\n },\n \"HELP\": {\n \"TITLE\": \"Aide en ligne\",\n \"JOIN\": {\n \"SECTION\": \"Inscription\",\n \"SALT\": \"L'identifiant secret est très important. Il sert à mélanger le mot de passe, avant qu'il ne serve à calculer la <span class=\\\"text-italic\\\">clé publique</span> de votre compte (son numéro) et la clé secrète pour y accéder.<br/><b>Veillez à bien la mémoriser</b>, car aucun moyen n'est actuellement prévu pour la retrouver en cas de perte.<br/>Par ailleurs, il ne peut pas être modifié sans devoir créer un nouveau compte.<br/><br/>Un bon identifiant secret doit être suffisamment long (au moins 8 caractères) et le plus original possible.\",\n \"PASSWORD\": \"Le mot de passe est très important. Avec l'identifiant secret, il sert à calculer le numéro (la clé publique) de votre compte, et la clé secrète pour y accéder.<br/><b>Veillez à bien le mémoriser</b>, car aucun moyen n'est prévu de le retrouver en cas de perte (sauf à générer un fichier de sauvegarde).<br/>Par ailleurs, il ne peut pas être modifié sans devoir créer un nouveau compte.<br/><br/>Un bon mot de passe contient (idéalement) au moins 8 caractères, dont au moins une majuscule et un chiffre.\",\n \"PSEUDO\": \"Le pseudonyme est utilisé uniquement dans le cas d'inscription comme <span class=\\\"text-italic\\\">membre</span>. Il est toujours associé à un portefeuille (via sa <span class=\\\"text-italic\\\">clé publique</span>).<br/>Il est publié sur le réseau, afin que les autres utilisateurs puisse l'identifier, le certifier ou envoyer de la monnaie sur le compte.<br/>Un pseudonyme doit être unique au sein des membres (<u>actuels</u> et anciens).\"\n },\n \"LOGIN\": {\n \"SECTION\": \"Connexion\",\n \"PUBKEY\": \"Clé publique du trousseau\",\n \"PUBKEY_DEF\": \"La clef publique du trousseau est générée à partir des identifiants saisis (n'importe lesquels), sans pour autant qu'ils correspondent à un compte déjà utilisé.<br/><b>Vérifiez attentivement que la clé publique est celle de votre compte</b>. Dans le cas contraire, vous serez connecté à un compte probablement jamais utilisé, le risque de collision avec un compte existant étant infime.<br/><a href=\\\"https://fr.wikipedia.org/wiki/Cryptographie_asym%C3%A9trique\\\" target=\\\"_system\\\">En savoir plus sur la cryptographie</a> par clé publique.\",\n \"METHOD\": \"Méthodes de connexion\",\n \"METHOD_DEF\": \"Plusieurs options sont disponibles pour vous connecter à un portefeuille :<br/> - La connexion <b>par salage (simple ou avancé)</b> mélange votre mot de passe grâce à l'identifiant secret, pour limiter les tentatives de <a href=\\\"https://fr.wikipedia.org/wiki/Attaque_par_force_brute\\\" target=\\\"_system\\\">piratage par force brute</a> (par exemple à partir de mots connus).<br/> - La connexion <b>par clé publique</b> évite de saisir vos identifiants, qui vous seront demandé seulement le moment venu lors d'une opération sur le compte.<br/> - La connexion <b>par fichier de trousseau</b> va lire les clés (publique et privée) du compte, depuis un fichier, sans besoin de saisir d'identifiants. Plusieurs formats de fichier sont possibles.\"\n },\n \"GLOSSARY\": {\n \"SECTION\": \"Glossaire\",\n \"PUBKEY_DEF\": \"Une clé publique identifie un portefeuille de monnaie, qui peut identifier un membre ou correspondre à un portefeuille anonyme. Dans Cesium la clé publique est calculée (par défaut) grâce à l'identifiant secret et au mot de passe.<br/><a href=\\\"https://fr.wikipedia.org/wiki/Cryptographie_asym%C3%A9trique\\\" target=\\\"_system\\\">En savoir plus sur la cryptographie</a> par clé publique.\",\n \"MEMBER\": \"Membre\",\n \"MEMBER_DEF\": \"Un membre est une personne humaine physique et vivante, désireuse de participer librement à la communauté monétaire. Elle co-produit un dividende universel, suivant une période et un montant tels que définis dans les <span class=\\\"text-italic\\\">règles de la monnaie</span>\",\n \"CURRENCY_RULES\": \"Règles de la monnaie\",\n \"CURRENCY_RULES_DEF\": \"Les règles de la monnaie sont définies une fois pour toutes. Elle fixe le fonctionnement de la monnaie : le calcul du dividende universel, le nombre de certifications nécessaire pour être membre, le nombre de certification maximum qu'un membre peut donner, etc. <a href=\\\"#/app/currency\\\">Voir les règles actuelles</a>.<br/>La non modification des règles dans le temps est possible par l'utilisation d'une <span class=\\\"text-italic\\\">BlockChain</span> qui porte et exécute ces règles, et en vérifie constamment la bonne application.\",\n \"BLOCKCHAIN\": \"Chaîne de blocs (<span class=\\\"text-italic\\\">Blockchain</span>)\",\n \"BLOCKCHAIN_DEF\": \"La BlockChain est un système décentralisé, qui, dans le cas de Duniter, sert à porter et exécuter les <span class=\\\"text-italic\\\">règles de la monnaie</span>.<br/><a href=\\\"https://duniter.org/fr/comprendre/\\\" target=\\\"_system\\\">En savoir plus sur Duniter</a> et le fonctionnement de sa blockchain.\",\n \"UNIVERSAL_DIVIDEND_DEF\": \"Le Dividende Universel (DU) est la quantité de monnaie co-créée par chaque membre, suivant la période et le calcul définis dans les <span class=\\\"text-italic\\\">règles de la monnaie</span>.<br/>A chaque échéance, les membres recoivent sur leur compte la meme quantité de nouvelle monnaie.<br/><br/>Le DU subit une croissance régulière, pour rester juste entre les membres (actuels et à venir), calculée en fonction de l'espérance de vie moyenne, telle que démontré dans la Thérorie Relative de la Monnaie (TRM).<br/><a href=\\\"http://trm.creationmonetaire.info\\\" target=\\\"_system\\\">En savoir plus sur la TRM</a> et les monnaies libres.\",\n \"WOT\": \"Toile de Confiance (TdC)\",\n \"WOT_DEF\": \"La Toile de Confiance est constituée de l'ensemble des membres de la monnaie, et des liens de certification qui les relient.\",\n \"DISTANCE_RULE\": \"Règle de distance\",\n \"DISTANCE_RULE_DEF\": \"La règle de distance de la Toile de Confiance définie <b>une distance maximale à respecter</b> entre un postulant et un nombre minimum de membres référents (ou membres centraux). Cette distance est calculée en utilisant les liens de certification.\"\n },\n \"TIP\": {\n \"MENU_BTN_CURRENCY\": \"Le menu <b>{{'MENU.CURRENCY'|translate}}</b> permet la consultation des <b>règles de la monnaie</b> et de son état.\",\n \"CURRENCY_WOT\": \"Le <b>nombre de membres</b> montre l'importance de la communauté et permet de <b>suivre son évolution</b>.\",\n \"CURRENCY_MASS\": \"Suivez ici la <b>quantité totale de monnaie</b> existante et sa <b>répartition moyenne</b> par membre.<br/><br/>Ceci permet de juger de l'<b>importance d'un montant</b>, vis à vis de ce que <b>possède les autres</b> sur leur compte (en moyenne).\",\n \"CURRENCY_UNIT_RELATIVE\": \"L'unité utilisée (&ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;) signifie que les montants en {{currency|capitalize}} ont été divisés par le <b>Dividende Universel</b> (DU).<br/><br/><small>Cette unité relative est <b>pertinente</b>, car stable malgré la quantitié de monnaie qui augmente en permanence.</small>\",\n \"CURRENCY_CHANGE_UNIT\": \"L'option <b>{{'COMMON.BTN_RELATIVE_UNIT'|translate}}</b> permet de <b>changer d'unité</b>, pour visualiser les montants <b>directement en {{currency|capitalize}}</b> (plutôt qu'en &ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;).\",\n \"CURRENCY_CHANGE_UNIT_TO_RELATIVE\": \"L'option <b>{{'COMMON.BTN_RELATIVE_UNIT'|translate}}</b> permet de <b>changer d'unité</b>, pour visualiser les montants en &ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;, c'est-à-dire relativement au Dividende Universel (le montant co-produit par chaque membre).\",\n \"CURRENCY_RULES\": \"Les <b>règles</b> de la monnaie fixent son fonctionnement <b>exact et prévisible</b>.<br/><br/>Véritable ADN de la monnaie, elles rendent son code monétaire <b>lisible et transparent</b>.\",\n \"MENU_BTN_NETWORK\": \"Le menu <b>{{'MENU.NETWORK'|translate}}</b> permet la consultation de l'état du réseau.\",\n \"NETWORK_BLOCKCHAIN\": \"Toutes les opérations de la monnaie sont enregistrées dans un grand livre de compte <b>public et infalsifiable</b>, appelé aussi <b>chaine de blocs</b> (<em>BlockChain</em> en anglais).\",\n \"NETWORK_PEERS\": \"Les <b>nœuds</b> visibles ici correspondent aux <b>ordinateurs qui actualisent et contrôlent</b> la chaine de blocs.<br/><br/>Plus il y a de nœuds, plus la monnaie a une gestion <b>décentralisée</b> et digne de confiance.\",\n \"NETWORK_PEERS_BLOCK_NUMBER\": \"Ce <b>numéro</b> (en vert) indique le <b>dernier bloc validé</b> pour ce nœud (dernière page écrite dans le grand livre de comptes).<br/><br/>La couleur verte indique que ce bloc est également validé par <b>la plupart des autres nœuds</b>.\",\n \"NETWORK_PEERS_PARTICIPATE\": \"<b>Chaque membre</b>, équipé d'un ordinateur avec Internet, <b>peut participer en ajoutant un nœud</b>. Il suffit d'<b>installer le logiciel Duniter</b> (libre et gratuit). <a href=\\\"{{installDocUrl}}\\\" target=\\\"_system\\\">Voir le manuel d'installation &gt;&gt;</a>.\",\n \"MENU_BTN_ACCOUNT\": \"Le menu <b>{{'MENU.ACCOUNT'|translate}}</b> permet d'accéder à la gestion de votre compte.\",\n \"MENU_BTN_ACCOUNT_MEMBER\": \"Consultez ici l'état de votre compte et les informations sur vos certifications.\",\n \"WALLET_CERTIFICATIONS\": \"Cliquez ici pour consulter le détail de vos certifications (reçues et émises).\",\n \"WALLET_RECEIVED_CERTIFICATIONS\": \"Cliquez ici pour consulter le détail de vos <b>certifications reçues</b>.\",\n \"WALLET_GIVEN_CERTIFICATIONS\": \"Cliquez ici pour consulter le détail de vos <b>certifications émises</b>.\",\n \"WALLET_BALANCE\": \"Le <b>solde</b> de votre compte s'affiche ici.\",\n \"WALLET_BALANCE_RELATIVE\": \"{{'HELP.TIP.WALLET_BALANCE'|translate}}<br/><br/>L'unité utilisée (&ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;) signifie que le montant en {{currency|capitalize}} a été divisé par le <b>Dividende Universel</b> (DU) co-créé par chaque membre.<br/><br/>Actuellement 1 DU vaut {{currentUD|formatInteger}} {{currency|capitalize}}s.\",\n \"WALLET_BALANCE_CHANGE_UNIT\": \"Vous pourrez <b>changer l'unité</b> d'affichage des montants dans les <b><i class=\\\"icon ion-android-settings\\\"></i>&nbsp;{{'MENU.SETTINGS'|translate}}</b>.<br/><br/>Par exemple pour visualiser les montants <b>directement en {{currency|capitalize}}</b>, plutôt qu'en unité relative.\",\n \"WALLET_PUBKEY\": \"Voici la clé publique de votre compte. Vous pouvez la communiquer à un tiers afin qu'il identifie plus simplement votre compte.\",\n \"WALLET_SEND\": \"Effectuer un paiement en quelques clics.\",\n \"WALLET_SEND_NO_MONEY\": \"Effectuer un paiement en quelques clics.<br/>(Votre solde ne le permet pas encore)\",\n \"WALLET_OPTIONS\": \"Ce bouton permet l'accès aux <b>actions d'adhésion</b> et de sécurité.<br/><br/>N'oubliez pas d'y jeter un oeil !\",\n \"WALLET_RECEIVED_CERTS\": \"S'affichera ici la liste des personnes qui vous ont certifié.\",\n \"WALLET_CERTIFY\": \"Le bouton <b>{{'WOT.BTN_SELECT_AND_CERTIFY'|translate}}</b> permet de sélectionner une identité et de la certifier.<br/><br/>Seuls des utilisateurs <b>déjà membres</b> peuvent en certifier d'autres.\",\n \"WALLET_CERT_STOCK\": \"Votre stock de certifications (émises) est limité à <b>{{sigStock}} certifications</b>.<br/><br/>Ce stock se renouvelle avec le temps, au fur et à mesure que les certifications s'invalident.\",\n \"MENU_BTN_WALLETS\": \"Le menu <b>{{'MENU.WALLETS'|translate}}</b> permet d'ajouter des portefeuilles supplémentaires que vous gérer.\",\n \"MENU_BTN_TX\": \"Le menu <b>{{'MENU.TRANSACTIONS'|translate}}</b> permet de consulter votre solde, l'historique vos transactions et d'envoyer un paiement.\",\n \"MENU_BTN_WOT\": \"Le menu <b>{{'MENU.WOT'|translate}}</b> permet de rechercher parmi les <b>utilisateurs</b> de la monnaie (membres ou non).\",\n \"WOT_SEARCH_TEXT_XS\": \"Pour rechercher dans l'annuaire, tapez les <b>premières lettres d'un pseudonyme</b> (ou d'une clé publique).<br/><br/>La recherche se lancera automatiquement.\",\n \"WOT_SEARCH_TEXT\": \"Pour rechercher dans l'annuaire, tapez les <b>premières lettres d'un pseudonyme</b> (ou d'une clé publique). <br/><br/>Appuyer ensuite sur <b>Entrée</b> pour lancer la recherche.\",\n \"WOT_SEARCH_RESULT\": \"Visualisez la fiche détaillée simplement en <b>cliquant</b> sur une ligne.\",\n \"WOT_VIEW_CERTIFICATIONS\": \"La ligne <b>{{'ACCOUNT.CERTIFICATION_COUNT'|translate}}</b> montre combien de membres ont validé cette identité.<br/><br/>Ces certifications attestent que le compte appartient à <b>une personne humaine vivante</b> n'ayant <b>aucun autre compte membre</b>.\",\n \"WOT_VIEW_CERTIFICATIONS_COUNT\": \"Il faut au moins <b>{{sigQty}} certifications</b> pour devenir membre et recevoir le <b>Dividende Universel</b>.\",\n \"WOT_VIEW_CERTIFICATIONS_CLICK\": \"Un clic ici permet d'ouvrir <b>la liste de toutes les certifications</b> de l'identité (reçues et émises).\",\n \"WOT_VIEW_CERTIFY\": \"Le bouton <b>{{'WOT.BTN_CERTIFY'|translate}}</b> permet d'ajouter votre certification à cette identité.\",\n \"CERTIFY_RULES\": \"<b>Attention :</b> Ne certifiez que des <b>personnes physiques vivantes</b>, ne possédant aucun autre compte membre.<br/><br/>La sécurité de la monnaie dépend de la vigilance de chacun !\",\n \"MENU_BTN_SETTINGS\": \"Les <b>{{'MENU.SETTINGS'|translate}}</b> vous permettront de configurer l'application.\",\n \"HEADER_BAR_BTN_PROFILE\": \"Cliquez ici pour accéder à votre <b>profil utilisateur.</b>\",\n \"SETTINGS_CHANGE_UNIT\": \"Vous pourrez <b>changer d'unité d'affichage</b> des montants en cliquant ci-dessus.<br/><br/>- Désactivez l'option pour un affichage des montants en {{currency|capitalize}}.<br/>- Activez l'option pour un affichage relatif en {{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub> (tous les montants seront <b>divisés</b> par le Dividende Universel courant).\",\n \"END_LOGIN\": \"Cette visite guidée est <b>terminée</b> !<br/><br/>Bonne continuation à vous, dans le nouveau monde de l'<b>économie libre</b> !\",\n \"END_NOT_LOGIN\": \"Cette visite guidée est <b>terminée</b> !<br/><br/>Si vous souhaitez rejoindre la monnaie {{currency|capitalize}}, il vous suffira de cliquer sur <b>{{'LOGIN.CREATE_FREE_ACCOUNT'|translate}}</b> ci-dessous.\",\n \"END_READONLY\": \"Cette visite guidée est <b>terminée</b>.<br/><br/>{{'MODE.READONLY.INSTALL_HELP'|translate}}.\"\n }\n },\n \"API\" :{\n \"COMMON\": {\n \"LINK_DOC\": \"Documentation API\",\n \"LINK_DOC_HELP\": \"Documentation pour les développeurs\",\n \"LINK_STANDARD_APP\": \"Version classique\",\n \"LINK_STANDARD_APP_HELP\": \"Ouvrir la version classique de {{'COMMON.APP_NAME'|translate}}\",\n \"CONNECTION_ERROR\": \"Nœud <b>{{server}}</b> injoignable ou adresse invalide.<br/><br/>Vérifiez votre connexion Internet, ou contactez l'administrateur du site.\"\n },\n \"HOME\": {\n \"TITLE\": \"Documentation API {{'COMMON.APP_NAME'|translate}}\",\n \"MESSAGE\": \"Bienvenue dans la <b>documentation de l'API</b> {{'COMMON.APP_NAME'|translate}}.<br/>Connectez vos sites web à <a href=\\\"http://duniter.org\\\" target=\\\"_system\\\">Duniter</a> très simplement !\",\n \"MESSAGE_SHORT\": \"Connectez vos sites à <a href=\\\"http://duniter.org\\\" target=\\\"_system\\\">Duniter</a> très simplement !\",\n \"DOC_HEADER\": \"Services disponibles :\"\n },\n \"TRANSFER\": {\n \"TITLE\": \"{{'COMMON.APP_NAME'|translate}} - Paiement en ligne\",\n \"TITLE_SHORT\": \"Paiement en ligne\",\n \"SUMMARY\": \"Récapitulatif du paiement :\",\n \"AMOUNT\": \"Montant :\",\n \"AMOUNTS_HELP\": \"Veuillez choisir le montant :\",\n \"NAME\": \"Nom :\",\n \"PUBKEY\": \"Clé publique du destinataire :\",\n \"COMMENT\": \"Référence de l'opération :\",\n \"NODE\": \"Adresse du nœud :\",\n \"DEMO\": {\n \"SALT\": \"demo\",\n \"PASSWORD\": \"demo\",\n \"PUBKEY\": \"3G28bL6deXQBYpPBpLFuECo46d3kfYMJwst7uhdVBnD1\",\n \"HELP\": \"<b>Mode démonstration</b> : Aucun paiement ne sera réellement envoyé pendant cette simulation.<br/>Veuillez utiliser les identifiants : <b>{{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}</b>\",\n \"BAD_CREDENTIALS\": \"Vérifiez votre saisie.<br/>En mode démonstration, les identifiants sont : {{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}\"\n },\n \"INFO\": {\n \"SUCCESS_REDIRECTING_WITH_NAME\": \"Paiement envoyé.<br/>Redirection vers <b>{{name}}</b>...\",\n \"SUCCESS_REDIRECTING\": \"Paiement envoyé.<br/>Redirection vers le site du vendeur...\",\n \"CANCEL_REDIRECTING_WITH_NAME\": \"Paiement annulé.<br/>Redirection vers <b>{{name}}</b>...\",\n \"CANCEL_REDIRECTING\": \"Paiement annulé.<br/>Redirection vers le site du vendeur...\"\n },\n \"ERROR\": {\n \"TRANSFER_FAILED\": \"Échec du paiement\"\n }\n },\n \"DOC\": {\n \"DESCRIPTION_DIVIDER\": \"Description\",\n \"URL_DIVIDER\": \"Adresse d'appel\",\n \"PARAMETERS_DIVIDER\": \"Paramètres\",\n \"AVAILABLE_PARAMETERS\": \"Voici la liste des paramètres possibles :\",\n \"DEMO_DIVIDER\": \"Tester\",\n \"DEMO_HELP\": \"Pour tester ce service, cliquez sur le bouton ci-contre. Le résultat s'affichera en dessous.\",\n \"DEMO_RESULT\": \"Résultat retourné par l'appel :\",\n \"DEMO_RESULT_PEER\": \"Adresse du nœud utilisé :\",\n \"DEMO_SUCCEED\": \"<i class=\\\"icon ion-checkmark\\\"></i> Succès !\",\n \"DEMO_CANCELLED\": \"<i class=\\\"icon ion-close\\\"></i> Annulé par l'utilisateur\",\n \"INTEGRATE_DIVIDER\": \"Intégrer\",\n \"INTEGRATE_CODE\": \"Code :\",\n \"INTEGRATE_RESULT\": \"Prévisualisation du résultat :\",\n \"INTEGRATE_PARAMETERS\": \"Paramètres\",\n \"TRANSFER\": {\n \"TITLE\": \"Paiements\",\n \"DESCRIPTION\": \"Depuis un site (ex: vente en ligne) vous pouvez déléguer le paiement en monnaie libre à Cesium API. Pour cela, il vous suffit de déclencher l'ouverture d'une page sur l'adresse suivante :\",\n \"PARAM_PUBKEY\": \"Clé publique du destinataire\",\n \"PARAM_PUBKEY_HELP\": \"Clé publique du destinataire (obligatoire)\",\n \"PARAM_AMOUNT\": \"Montant\",\n \"PARAM_AMOUNT_HELP\": \"Montant de la transaction (obligatoire). Valeurs multiples autorisées, en utilisant un séparateur (point-virgule, barre verticale ou espace).\",\n \"PARAM_COMMENT\": \"Référence (ou commentaire)\",\n \"PARAM_COMMENT_HELP\": \"Référence ou commentaire. Vous permettra par exemple d'identifier le paiement dans la BlockChain.\",\n \"PARAM_NAME\": \"Nom (du destinataire ou du site web)\",\n \"PARAM_NAME_HELP\": \"Le nom du destinataire, ou du site web appelant. Cela peut être un nom lisible (\\\"Mon site en ligne\\\"), ou encore une pseudo-adresse web (\\\"MonSite.com\\\").\",\n \"PARAM_REDIRECT_URL\": \"Adresse web de redirection\",\n \"PARAM_REDIRECT_URL_HELP\": \"Adresse web (URL) de redirection, appelé quand le paiement a été envoyé. Peut contenir les chaînes suivantes, qui seront remplacées par les valeurs de la transaction : \\\"{tx}\\\", \\\"{hash}\\\", \\\"{comment}\\\", \\\"{amount}\\\", \\\"{pubkey}\\\" et \\\"{node}\\\".\",\n \"PARAM_CANCEL_URL\": \"Adresse web d'annulation\",\n \"PARAM_CANCEL_URL_HELP\": \"Adresse web (URL) en cas d'annulation du paiement, par l'utilisateur. Peut contenir les chaînes suivantes, qui seront remplacées dynamiquement : \\\"{comment}\\\", \\\"{amount}\\\" et \\\"{pubkey}\\\".\",\n \"PARAM_PREFERRED_NODE\": \"Adresse du nœud préféré\",\n \"PARAM_PREFERRED_NODE_HELP\": \"Adresse (URL) du nœud Duniter à utiliser de préférence (\\\"g1.domaine.com:443\\\" ou \\\"https://g1.domaine.com\\\").\",\n \"EXAMPLES_HELP\": \"Voici des exemples d'intégration :\",\n \"EXAMPLE_BUTTON\": \"Bouton HTML\",\n \"EXAMPLE_BUTTON_DEFAULT_TEXT\": \"Payer en {{currency|currencySymbol}}\",\n \"EXAMPLE_BUTTON_DEFAULT_STYLE\": \"Style personnalisé\",\n \"EXAMPLE_BUTTON_TEXT_HELP\": \"Texte du bouton\",\n \"EXAMPLE_BUTTON_BG_COLOR\": \"Couleur du fond\",\n \"EXAMPLE_BUTTON_BG_COLOR_HELP\": \"Exemple : #fbc14c, black, lightgrey, rgb(180,180,180)\",\n \"EXAMPLE_BUTTON_FONT_COLOR\": \"Couleur du texte\",\n \"EXAMPLE_BUTTON_FONT_COLOR_HELP\": \"Exemple : black, orange, rgb(180,180,180)\",\n \"EXAMPLE_BUTTON_TEXT_ICON\": \"Icône\",\n \"EXAMPLE_BUTTON_TEXT_WIDTH\": \"Largeur\",\n \"EXAMPLE_BUTTON_TEXT_WIDTH_HELP\": \"Exemple : 200px, 50%\",\n \"EXAMPLE_BUTTON_ICON_NONE\": \"Aucune\",\n \"EXAMPLE_BUTTON_ICON_DUNITER\": \"Logo Duniter\",\n \"EXAMPLE_BUTTON_ICON_CESIUM\": \"Logo Cesium\",\n \"EXAMPLE_BUTTON_ICON_G1_COLOR\": \"Logo Ğ1\",\n \"EXAMPLE_BUTTON_ICON_G1_BLACK\": \"Logo Ğ1 (noir)\"\n }\n }\n }\n}\n);\n\n$translateProvider.translations(\"it-IT\", {\n \"COMMON\": {\n \"APP_NAME\": \"Cesium\",\n \"APP_VERSION\": \"v{{version}}\",\n \"APP_BUILD\": \"build {{build}}\",\n \"PUBKEY\": \"Chiave privata\",\n \"MEMBER\": \"Membro\",\n \"BLOCK\" : \"Blocco\",\n \"BTN_OK\": \"OK\",\n \"BTN_YES\": \"Si\",\n \"BTN_NO\": \"No\",\n \"BTN_SEND\": \"Inviare\",\n \"BTN_SEND_MONEY\": \"Trasferire soldi\",\n \"BTN_SEND_MONEY_SHORT\": \"Trasferire\",\n \"BTN_SAVE\": \"Salvare\",\n \"BTN_YES_SAVE\": \"Si, salvare\",\n \"BTN_YES_CONTINUE\": \"Si, continuare\",\n \"BTN_SHOW\": \"Mostrare\",\n \"BTN_SHOW_PUBKEY\": \"Mostrare chiave pubblica\",\n \"BTN_RELATIVE_UNIT\": \"Mostra importi in DU?\",\n \"BTN_BACK\": \"Indietro\",\n \"BTN_NEXT\": \"Avanti\",\n \"BTN_IMPORT\": \"Importazione\",\n \"BTN_CANCEL\": \"Cancellare\",\n \"BTN_CLOSE\": \"Chiudere\",\n \"BTN_LATER\": \"Più tardi\",\n \"BTN_LOGIN\": \"Accedi\",\n \"BTN_LOGOUT\": \"Log out\",\n \"BTN_ADD_ACCOUNT\": \"Nuovo conto\",\n \"BTN_SHARE\": \"Condividere\",\n \"BTN_EDIT\": \"Modificare\",\n \"BTN_DELETE\": \"Eliminare\",\n \"BTN_ADD\": \"Aggiungere\",\n \"BTN_SEARCH\": \"Cercare\",\n \"BTN_REFRESH\": \"Aggiornare\",\n \"BTN_RETRY\": \"Riprovare\",\n \"BTN_START\": \"Iniziare\",\n \"BTN_CONTINUE\": \"Continuare\",\n \"BTN_CREATE\": \"Creare\",\n \"BTN_UNDERSTOOD\": \"Ho capito\",\n \"BTN_OPTIONS\": \"Opzioni\",\n \"BTN_HELP_TOUR\": \"Mostrami le funzionalità\",\n \"BTN_HELP_TOUR_SCREEN\": \"Scoprire questo schermo\",\n \"BTN_DOWNLOAD\": \"Scaricare\",\n \"BTN_DOWNLOAD_ACCOUNT_STATEMENT\": \"Scaricare estratto conto\",\n \"BTN_MODIFY\": \"Modificare\",\n \"CHOOSE_FILE\": \"Trascini un file <br/>o cliccare per selezionare\",\n \"DAYS\": \"giorni\",\n \"NO_ACCOUNT_QUESTION\": \"Non sei ancora membro? Registrati subito!\",\n \"SEARCH_NO_RESULT\": \"Nessun risultato trovato\",\n \"LOADING\": \"Caricando...\",\n \"LOADING_WAIT\": \"Caricando...<br/><small>(Cesium interroga dal nodo peer Duniter)</small>\",\n \"SEARCHING\": \"Cercando...\",\n \"FROM\": \"Da\",\n \"TO\": \"A\",\n \"COPY\": \"Copiare\",\n \"LANGUAGE\": \"Lingua\",\n \"UNIVERSAL_DIVIDEND\": \"Dividendo universale\",\n \"UD\": \"UD\",\n \"DATE_PATTERN\": \"DD/MM/YYYY HH:mm\",\n \"DATE_FILE_PATTERN\": \"YYYY-MM-DD\",\n \"DATE_SHORT_PATTERN\": \"DD/MM/YY\",\n \"DATE_MONTH_YEAR_PATTERN\": \"MM/YYYY\",\n \"EMPTY_PARENTHESIS\": \"(empty)\",\n \"UID\": \"Pseudonimo\",\n \"ENABLE\": \"Attivato\",\n \"DISABLE\": \"Disattivato\",\n \"RESULTS_LIST\": \"Risultati:\",\n \"RESULTS_COUNT\": \"{{count}} risultati\",\n \"EXECUTION_TIME\": \"eeseguit in {{duration|formatDurationMs}}\",\n \"SHOW_VALUES\": \"Mostrare valori in modo trasparente?\",\n \"POPOVER_ACTIONS_TITLE\": \"Opzioni\",\n \"POPOVER_FILTER_TITLE\": \"Filtri\",\n \"SHOW_MORE\": \"Mostrare di più\",\n \"SHOW_MORE_COUNT\": \"(limite attuale di {{limit}})\",\n \"POPOVER_SHARE\": {\n \"TITLE\": \"Condividere\",\n \"SHARE_ON_TWITTER\": \"Condividere su Twitter\",\n \"SHARE_ON_FACEBOOK\": \"Condividere su Facebook\",\n \"SHARE_ON_DIASPORA\": \"Condividere su Diaspora*\",\n \"SHARE_ON_GOOGLEPLUS\":\"Condividere su Google+\"\n },\n \"FILE\": {\n \"DATE\" : \"Data:\",\n \"TYPE\" : \"Tipo:\",\n \"SIZE\": \"Dimensioni del file:\",\n \"VALIDATING\": \"Validazione in corso...\"\n }\n },\n \"SYSTEM\": {\n \"PICTURE_CHOOSE_TYPE\": \"Scegliere un file:\",\n \"BTN_PICTURE_GALLERY\": \"Galleria\",\n \"BTN_PICTURE_CAMERA\": \"<b>Camera</b>\"\n },\n \"MENU\": {\n \"HOME\": \"Home\",\n \"WOT\": \"Annuario\",\n \"CURRENCY\": \"Moneta\",\n \"ACCOUNT\": \"Mio conto\",\n \"WALLETS\": \"I miei portafogli\",\n \"SETTINGS\": \"Impostazioni\",\n \"NETWORK\": \"Rete\",\n \"TRANSACTIONS\": \"Miei pagamenti\"\n },\n \"ABOUT\": {\n \"TITLE\": \"A proposito\",\n \"LICENSE\": \"<b>Free/libre software</b> (License GNU AGPLv3).\",\n \"CODE\": \"Codice sorgente:\",\n \"OFFICIAL_WEB_SITE\": \"Sito ufficiale:\",\n \"DEVELOPERS\": \"Sviluppatori:\",\n \"FORUM\": \"Forum:\",\n \"PLEASE_REPORT_ISSUE\": \"Non esitate a parlarci delle anomalie riscontrate\",\n \"REPORT_ISSUE\": \"Segnalare un bug\"\n },\n \"HOME\": {\n \"TITLE\": \"Cesium\",\n \"WELCOME\": \"Benvenuti nell'Cesium App!\",\n \"WELCOME_READONLY\": \"Benvenuti nell'Cesium <span class='badge badge-balanced'>Monit</span>!\",\n \"MESSAGE\": \"Scambiate in moneta libera {{currency|abbreviate}}\",\n \"MESSAGE_READONLY\": \"Monitoraggio in tempo reale di moneta libera {{currency|abbreviate}}\",\n \"BTN_CURRENCY\": \"Esplorare la moneta {{currency|abbreviate}}\",\n \"BTN_ABOUT\": \"a proposito\",\n \"BTN_HELP\": \"Aiuto\",\n \"BTN_NETWORK\": \"Stato della rete\",\n \"FREE_SOFTWARE\": \"Free software\",\n \"FORK_ME\": \"Fork me!\",\n \"SHOW_LICENSE\": \"Mostra licenza\",\n \"REPORT_ISSUE\": \"Segnalare un bug\",\n \"NOT_YOUR_ACCOUNT_QUESTION\" : \"Non sei proprietario del conto <b><i class=\\\"ion-key\\\"></i> {{pubkey|formatPubkey}}</b>?\",\n \"BTN_CHANGE_ACCOUNT\": \"Disconettere questo conto\",\n \"CONNECTION_ERROR\": \"Peer <b>{{server}}</b> irraggiungibile o indirizzo invalido. <br/><br/> Verifica tua connessione or cambia nodo. <a class=\\\"positive\\\" ng-click=\\\"doQuickFix('settings')\\\">nell impostazioni. </a>.\",\n \"SHOW_ALL_FEED\": \"Mostra tutto\",\n \"READ_MORE\": \"Leggi di più\",\n \"FEED_SOURCE\": \"Fonte\"\n },\n \"SETTINGS\": {\n \"TITLE\": \"Impostazioni\",\n \"DISPLAY_DIVIDER\": \"Schermo\",\n \"STORAGE_DIVIDER\": \"Conservazione\",\n \"NETWORK_SETTINGS\": \"Rete\",\n \"PEER\": \"Indirizzo peer Duniter\",\n \"PEER_SHORT\": \"Indirizzo peer\",\n \"PEER_CHANGED_TEMPORARY\": \"Indirizzo usato per un tempo determinato\",\n \"PERSIST_CACHE\": \"Conserva i dati di navigazione (sperimentale)\",\n \"USE_LOCAL_STORAGE\": \"Abilitare local storage\",\n \"USE_LOCAL_STORAGE_HELP\": \"Permette di salvare tue impostazioni\",\n \"ENABLE_HELPTIP\": \"Abilitare consigli dinamici\",\n \"ENABLE_UI_EFFECTS\": \"Abilitare effetti visivi\",\n \"HISTORY_SETTINGS\": \"Mio conto\",\n \"DISPLAY_UD_HISTORY\": \"Mostrare dividendi prodotti?\",\n \"AUTHENTICATION_SETTINGS\": \"Autenticazione\",\n \"KEEP_AUTH\": \"Scadenza dell'autenticazione\",\n \"KEEP_AUTH_SHORT\": \"Scadenza\",\n \"KEEP_AUTH_HELP\": \"Definire quando l'autenticazione verrà eliminata dalla memoria.\",\n \"KEEP_AUTH_OPTION\": {\n \"NEVER\": \"Dopo ogni operazione\",\n \"SECONDS\": \"Dopo {{value}}s d'inattività\",\n \"MINUTE\": \"Dopo{{value}}min d'inattività\",\n \"MINUTES\": \"Dopo {{value}}min d'inattività\",\n \"HOUR\": \"Dopo {{value}}h d'inattività\",\n \"ALWAYS\": \"Alla fine della sessione\"\n },\n \"REMEMBER_ME\": \"Ricordarsi di me?\",\n \"REMEMBER_ME_HELP\": \"Rimanere identificato/a da una sessione all'altra, conservando la chiave localmente.\",\n \"PLUGINS_SETTINGS\": \"Estensioni\",\n \"BTN_RESET\": \"Ripristini valori predefiniti\",\n \"EXPERT_MODE\": \"Abilitare modlità eseperto\",\n \"EXPERT_MODE_HELP\": \"Permette di vedere più dettagli\",\n \"POPUP_PEER\": {\n \"TITLE\" : \"Peer Duniter\",\n \"HOST\" : \"Indirizzo\",\n \"HOST_HELP\": \"Indirizzo: server:port\",\n \"USE_SSL\" : \"Securizzato?\",\n \"USE_SSL_HELP\" : \"(SSL Encryption)\",\n \"BTN_SHOW_LIST\" : \"Lista dei peers\"\n }\n },\n \"BLOCKCHAIN\": {\n \"HASH\": \"Hash: {{hash}}\",\n \"VIEW\": {\n \"HEADER_TITLE\": \"Blocco #{{number}}-{{hash|formatHash}}\",\n \"TITLE_CURRENT\": \"Blocco attuale\",\n \"TITLE\": \"Blocco #{{number|formatInteger}}\",\n \"COMPUTED_BY\": \"Calcolato da\",\n \"SHOW_RAW\": \"Mostrare dati grezzi\",\n \"TECHNICAL_DIVIDER\": \"Informazioni tecniche\",\n \"VERSION\": \"Versione di formatto\",\n \"HASH\": \"Hash calcolato\",\n \"UNIVERSAL_DIVIDEND_HELP\": \"Moneta co-prodotta da ciasciun dei {{membersCount}} membri\",\n \"EMPTY\": \"Nessun dati in questo blocco\",\n \"POW_MIN\": \"Difficoltà minimale\",\n \"POW_MIN_HELP\": \"Difficoltà imposta nel calcolo del hash\",\n \"DATA_DIVIDER\": \"Dati\",\n \"IDENTITIES_COUNT\": \"Nuove identità\",\n \"JOINERS_COUNT\": \"Nuovi membri\",\n \"ACTIVES_COUNT\": \"Rinnovi\",\n \"ACTIVES_COUNT_HELP\": \"Membri che hanno rinnovato la loro presenza nella rete\",\n \"LEAVERS_COUNT\": \"\",\n \"LEAVERS_COUNT_HELP\": \"Membri che si sono fatti escludere dalla rete\",\n \"EXCLUDED_COUNT\": \"Membri esclusi\",\n \"EXCLUDED_COUNT_HELP\": \"Vecchi membri, esclusi per certificazione non rinnovata o soglia di certificazioni non raggiunta.\",\n \"REVOKED_COUNT\": \"Identità revocate\",\n \"REVOKED_COUNT_HELP\": \"Può essere che questi conti non siano più attivi\",\n \"TX_COUNT\": \"Transazioni\",\n \"CERT_COUNT\": \"Certificazioni\",\n \"TX_TO_HIMSELF\": \"Cambio\",\n \"TX_OUTPUT_UNLOCK_CONDITIONS\": \"Sbloccare condizioni\",\n \"TX_OUTPUT_OPERATOR\": {\n \"AND\": \"e\",\n \"OR\": \"o\"\n },\n \"TX_OUTPUT_FUNCTION\": {\n \"SIG\": \"<b>Firma</b> della chive pubblica\",\n \"XHX\": \"<b>Password</b>, incluso SHA256 =\",\n \"CSV\": \"Bloccato per\",\n \"CLTV\": \"Bloccato fino a\"\n }\n },\n \"LOOKUP\": {\n \"TITLE\": \"Blocchi\",\n \"NO_BLOCK\": \"Nessun blocco\",\n \"LAST_BLOCKS\": \"Ultimi blocchi:\",\n \"BTN_COMPACT\": \"Compact\"\n }\n },\n \"CURRENCY\": {\n \"VIEW\": {\n \"TITLE\": \"Moneta\",\n \"TAB_CURRENCY\": \"Moneta\",\n \"TAB_WOT\": \"Web of trust\",\n \"TAB_NETWORK\": \"Rete\",\n \"TAB_BLOCKS\": \"Blocchi\",\n \"CURRENCY_SHORT_DESCRIPTION\": \"{{currency|capitalize}} è <b>una moneta libera</b>, {{firstBlockTime | formatFromNow}}. La rete comprende <b>{{N}} membri </b>, che produccono e ricevono un <a ng-click=\\\"showHelpModal('ud')\\\">Dividendo Universale</a> (DU), ogni {{dt | formatPeriod}}.\",\n \"NETWORK_RULES_DIVIDER\": \"Regole della rete\",\n \"CURRENCY_NAME\": \"Nome della moneta\",\n \"MEMBERS\": \"Numero di membri\",\n \"MEMBERS_VARIATION\": \"Variazione da {{duration|formatDuration}} (dall' ultimo UD)\",\n \"MONEY_DIVIDER\": \"Moneta\",\n \"MASS\": \"Massa monetaria\",\n \"SHARE\": \"Quantità a testa\",\n \"UD\": \"Dividendo universale\",\n \"C_ACTUAL\": \"Crescita attuale\",\n \"MEDIAN_TIME\": \"Current blockchain time\",\n \"POW_MIN\": \"Difficoltà commune\",\n \"MONEY_RULES_DIVIDER\": \"Regole della moneta\",\n \"C_RULE\": \"Obbietivo teorico di crescità\",\n \"UD_RULE\": \"Dividendo universale (formula)\",\n \"DT_REEVAL\": \"Periodo tra due re-evaluazioni del UD\",\n \"REEVAL_SYMBOL\": \"reeval\",\n \"DT_REEVAL_VALUE\": \"Ogni <b>{{dtReeval|formatDuration}}</b> ({{dtReeval/86400}} {{'COMMON.DAYS'|translate}})\",\n \"UD_REEVAL_TIME0\": \"Data della prima re-evaluzione del UD\",\n \"SIG_QTY_RULE\": \"Numero di certificazioni requisiti per diventare membro\",\n \"SIG_STOCK\": \"Numero massimo di certificazioni inviate da un membro\",\n \"SIG_PERIOD\": \"Tempo minimo tra 2 certificazioni inviate da un unico membro.\",\n \"SIG_WINDOW\": \"Periodo massimo prima che una certificazione venga studiata\",\n \"SIG_VALIDITY\": \"Durata di vita di una certificazione che è state presa in conto\",\n \"MS_WINDOW\": \"Periodo massimo prima che una certificazione pendente sia validata\",\n \"MS_VALIDITY\": \"Durata di vita di un'adesione che è state presa in conto\",\n \"STEP_MAX\": \"Distanza massima tra un nuovo membro e ogni membro referente.\",\n \"WOT_RULES_DIVIDER\": \"Regole della Web of Trust\",\n \"SENTRIES\": \"Numero di certificazioni (date <b>e</b> ricevute) per diventare membro referente \",\n \"SENTRIES_FORMULA\": \"Numero di certificazioni necessarie per diventare membro (formula)\",\n \"XPERCENT\":\"Percentaggio minimino di membri referenti per rispettare la regola di distanza tra i membri\",\n \"AVG_GEN_TIME\": \"Tempo medio tra due blocchi\",\n \"CURRENT\": \"attuale\",\n \"MATH_CEILING\": \"CEILING\",\n \"DISPLAY_ALL_RULES\": \"Mostrare tutte le regole?\",\n \"BTN_SHOW_LICENSE\": \"Mostrare licenza\",\n \"WOT_DIVIDER\": \"Web of trust\"\n },\n \"LICENSE\": {\n \"TITLE\": \"Licensa attuale\",\n \"BTN_DOWNLOAD\": \"Scaricare il file\",\n \"NO_LICENSE_FILE\": \"File di licenza non trovato .\"\n }\n },\n \"NETWORK\": {\n \"VIEW\": {\n \"MEDIAN_TIME\": \"Blockchain time\",\n \"LOADING_PEERS\": \"Caricando peers...\",\n \"NODE_ADDRESS\": \"Indirizzo del peer\",\n \"SOFTWARE\": \"Software\",\n \"WARN_PRE_RELEASE\": \"Pre-versione (ultima versione stabile: <b>{{version}}</b>)\",\n \"WARN_NEW_RELEASE\": \"Versione <b>{{version}}</b> disponibile\",\n \"WS2PID\": \"Identificativo :\",\n \"PRIVATE_ACCESS\": \"Accesso privato\",\n \"POW_PREFIX\": \"Prefisso Prova di Lavoro :\",\n \"ENDPOINTS\": {\n \"BMAS\": \"Endpoint sicuro (SSL)\",\n \"BMATOR\": \"Interfaccia rete TOR\",\n \"WS2P\": \"Interfaccia WS2P\",\n \"ES_USER_API\": \"Cesium+ data node\"\n }\n },\n \"INFO\": {\n \"ONLY_SSL_PEERS\": \"I nodi non-SSL hanno un display semplificato perche Cesium funziona in modalità HTTPS.\"\n }\n },\n \"PEER\": {\n \"PEERS\": \"Peers-Nodi\",\n \"SIGNED_ON_BLOCK\": \"Firmato nel blocco\",\n \"MIRROR\": \"Specchio\",\n \"MIRRORS\": \"Specchio\",\n \"MIRROR_PEERS\": \"Peers specchio\",\n \"PEER_LIST\" : \"Lista dei peers\",\n \"MEMBERS\" : \"Membri\",\n \"MEMBER_PEERS\" : \"Peers membri\",\n \"ALL_PEERS\" : \"Tutti i peers\",\n \"DIFFICULTY\" : \"Difficoltà\",\n \"API\" : \"API\",\n \"CURRENT_BLOCK\" : \"Blocco #\",\n \"POPOVER_FILTER_TITLE\": \"Filtro\",\n \"OFFLINE\": \"Sconessi\",\n \"OFFLINE_PEERS\": \"Peers sconessi\",\n \"BTN_SHOW_PEER\": \"Mostrare peer\",\n \"VIEW\": {\n \"TITLE\": \"Peer\",\n \"OWNER\": \"Proprietà di \",\n \"SHOW_RAW_PEERING\": \"Vedere il documento di peering\",\n \"SHOW_RAW_CURRENT_BLOCK\": \"Vedere l'utimo blocco (formatto grezzo)\",\n \"LAST_BLOCKS\": \"Ultimi blocchi\",\n \"KNOWN_PEERS\": \"Peers conosciuti :\",\n \"GENERAL_DIVIDER\": \"Informazioni generali\",\n \"ERROR\": {\n \"LOADING_TOR_NODE_ERROR\": \"Impossibile ottenere i dati del peer, periodo di attesa scaduto.\",\n \"LOADING_NODE_ERROR\": \"Impossibile ottenere i dati del peer\"\n }\n }\n },\n \"WOT\": {\n \"SEARCH_HELP\": \"Cercare (membro o chiave pubblica)\",\n \"SEARCH_INIT_PHASE_WARNING\": \"La ricerca per le certificazioni pendenti <b>può essere lunga</b> durante la fase di pre-certificazione. La preghiamo di attendere...\",\n \"REGISTERED_SINCE\": \"Certificato/a dal\",\n \"REGISTERED_SINCE_BLOCK\": \"Certificato/a dal blocco #\",\n \"NO_CERTIFICATION\": \"Nessuna certificazione valida\",\n \"NO_GIVEN_CERTIFICATION\": \"Nessuna certificazione data\",\n \"NOT_MEMBER_PARENTHESIS\": \"(non-membro)\",\n \"IDENTITY_REVOKED_PARENTHESIS\": \"(identità revocata)\",\n \"MEMBER_PENDING_REVOCATION_PARENTHESIS\": \"(Cancellazione dell'identità pendente)\",\n \"EXPIRE_IN\": \"Scade\",\n \"NOT_WRITTEN_EXPIRE_IN\": \"Scadenza <br/> \",\n \"EXPIRED\": \"Scaduto\",\n \"PSEUDO\": \"Pseudonimo\",\n \"SIGNED_ON_BLOCK\": \"Emessa nel blocco #{{block}}\",\n \"WRITTEN_ON_BLOCK\": \"Scritta nel blocco #{{block}}\",\n \"GENERAL_DIVIDER\": \"Informazioni generali\",\n \"NOT_MEMBER_ACCOUNT\": \"Conto non-membro\",\n \"NOT_MEMBER_ACCOUNT_HELP\": \"Questo è un semplice portafoglio osservatore, senza richiesta di certificazione emessa.\",\n \"TECHNICAL_DIVIDER\": \"Dati tecnici\",\n \"BTN_CERTIFY\": \"Certificare\",\n \"BTN_YES_CERTIFY\": \"Si, certificare\",\n \"BTN_SELECT_AND_CERTIFY\": \"Nuova certificazione\",\n \"ACCOUNT_OPERATIONS\": \"Operazioni sul conto\",\n \"VIEW\": {\n \"POPOVER_SHARE_TITLE\": \"Identità {{title}}\"\n },\n \"LOOKUP\": {\n \"TITLE\": \"Annuario\",\n \"NEWCOMERS\": \"Nuovi membri:\",\n \"NEWCOMERS_COUNT\": \"{{count}} membri\",\n \"PENDING\": \"Registrazioni pendenti\",\n \"PENDING_COUNT\": \"{{count}} inscrizioni pendenti\",\n \"REGISTERED\": \"Registrato {{sigDate | formatFromNow}}\",\n \"MEMBER_FROM\": \"Membro dal {{memberDate|medianFromNowShort}}\",\n \"BTN_NEWCOMERS\": \"Ultimi membri\",\n \"BTN_PENDING\": \"Registrazioni pendenti\",\n \"SHOW_MORE\": \"Vedere di più\",\n \"SHOW_MORE_COUNT\": \"(limite attuale di {{limit}})\",\n \"NO_PENDING\": \"Nessuna certificazione pendente.\",\n \"NO_NEWCOMERS\": \"Nessun membro.\"\n },\n \"CONTACTS\": {\n \"TITLE\": \"Contatti\"\n },\n \"MODAL\": {\n \"TITLE\": \"Ricerca\"\n },\n \"CERTIFICATIONS\": {\n \"TITLE\": \"{{uid}} - Certificazioni\",\n \"SUMMARY\": \"Certificazioni ricevute\",\n \"LIST\": \"Dettagli delle certificazioni ricevute\",\n \"PENDING_LIST\": \"Certificazioni pendenti\",\n \"RECEIVED\": \"Certificazioni ricevute\",\n \"RECEIVED_BY\": \"Certifications ricevute da {{uid}}\",\n \"ERROR\": \"Certificazioni ricevute per errore\",\n \"SENTRY_MEMBER\": \"Membro referente\"\n },\n \"OPERATIONS\": {\n \"TITLE\": \"{{uid}} - Operazioni\"\n },\n \"GIVEN_CERTIFICATIONS\": {\n \"TITLE\": \"{{uid}} - Certificazioni inviate\",\n \"SUMMARY\": \"Certificazioni inviate\",\n \"LIST\": \"Dettagli delle certificazioni inviate\",\n \"PENDING_LIST\": \"Certificazioni \",\n \"SENT\": \"Certificazioni inviate\",\n \"SENT_BY\": \"Certificazioni inviate da {{uid}}\",\n \"ERROR\": \"Certificazioni inviate per errore\"\n }\n },\n \"LOGIN\": {\n \"TITLE\": \"<i class=\\\"icon ion-log-in\\\"></i> Accedi\",\n \"SCRYPT_FORM_HELP\": \"Accedi con tuoi dati <br> Ricordati di verificare che stai utilizzando la chiave del tuo conto.\",\n \"PUBKEY_FORM_HELP\": \"Scrivi qui la tua chiave privata:\",\n \"FILE_FORM_HELP\": \"Scegliere un portachiavi da utilizzare:\",\n \"SCAN_FORM_HELP\": \"Scansiona il codice QR di un portafoglio.\",\n \"SALT\": \"Identificativo segreto\",\n \"SALT_HELP\": \"Identificativo segreto\",\n \"SHOW_SALT\": \"Mostrare identificativo segreto?\",\n \"PASSWORD\": \"Passsord\",\n \"PASSWORD_HELP\": \"Password\",\n \"PUBKEY_HELP\": \"Chiave pubblica, pseudonimo\",\n \"NO_ACCOUNT_QUESTION\": \"Ancora non hai un conto?\",\n \"HAVE_ACCOUNT_QUESTION\": \"Hai già un account?\",\n \"CREATE_ACCOUNT\": \"Creare un conto\",\n \"CREATE_FREE_ACCOUNT\": \"Crea un conto gratuito\",\n \"FORGOTTEN_ID\": \"Non ricordi la password?\",\n \"ASSOCIATED_PUBKEY\": \"Chiave pubblica:\",\n \"BTN_METHODS\": \"Altri metodi\",\n \"BTN_METHODS_DOTS\": \"Cambiare metodo...\",\n \"METHOD_POPOVER_TITLE\": \"Metodi\",\n \"MEMORIZE_AUTH_FILE\": \"Memorizzare questo portachiavi per la durata di questa sessione\",\n \"SCRYPT_PARAMETERS\": \"Parametri (Scrypt) :\",\n \"AUTO_LOGOUT\": {\n \"TITLE\": \"Informazioni\",\n \"MESSAGE\": \"<i class=\\\"ion-android-time\\\"></i> Sei stato <b>sconesso/ b> automaticamente, per un periodo di inattività prolongata\",\n \"BTN_RELOGIN\": \"Accedi\",\n \"IDLE_WARNING\": \"Sarai disconesso in... {{countdown}}\"\n },\n \"METHOD\": {\n \"SCRYPT_DEFAULT\": \"Salatura standard (imp. predefinita)\",\n \"SCRYPT_ADVANCED\": \"Salatura avanzata\",\n \"FILE\": \"File del portachiavi\",\n \"PUBKEY\": \"Chiave pubblica soltanto\",\n \"SCAN\": \"Scansiona un codice QR\"\n },\n \"SCRYPT\": {\n \"SIMPLE\": \"Salatura leggera\",\n \"DEFAULT\": \"Salatura standard\",\n \"SECURE\": \"Salatura sicura\",\n \"HARDEST\": \"Salatura più sicura\",\n \"EXTREME\": \"Salatura estrema\",\n \"USER\": \"Salatura personalizzata\",\n \"N\": \"N (Loop):\",\n \"r\": \"r (RAM):\",\n \"p\": \"p (CPU):\"\n },\n \"FILE\": {\n \"HELP\": \"Format del file atteso: <b>.dunikey</b> (type PubSec). Altri formati in sviluppo (EWIF, WIF).\"\n }\n },\n \"AUTH\": {\n \"TITLE\": \"<i class=\\\"icon ion-locked\\\"></i> Autenticazione\",\n \"BTN_AUTH\": \"Autenticarsi\",\n \"GENERAL_HELP\": \"Autenticati :\",\n \"EXPECTED_UID_HELP\": \"Effettua il login nell'account <i class=\\\"ion-person\\\"></i> {{uid}}:\",\n \"EXPECTED_PUBKEY_HELP\": \"Si prega di autenticarsi sul portafoglio <i class=\\\"ion-key\\\"></i> {{pubkey|formatPubkey}}:\",\n \"SCAN_FORM_HELP\": \"Scansiona il codice QR della <b>chiave privata</b> del portafoglio.\"\n },\n \"ACCOUNT\": {\n \"TITLE\": \"Mio conto\",\n \"BALANCE\": \"Saldo\",\n \"LAST_TX\": \"Ultime transazioni\",\n \"BALANCE_ACCOUNT\": \"Saldo del conto\",\n \"NO_TX\": \"Nessuna transazione\",\n \"SHOW_MORE_TX\": \"Mostrare di più\",\n \"SHOW_ALL_TX\": \"Mostrare tutte\",\n \"TX_FROM_DATE\": \"(limite attuale del {{fromTime|medianFromNowShort}})\",\n \"PENDING_TX\": \"Transazioni pendenti\",\n \"VALIDATING_TX\": \"Transazioni in corso di convalida\",\n \"ERROR_TX\": \"Transaction non eseguite\",\n \"ERROR_TX_SENT\": \"Transazioni inviate\",\n \"PENDING_TX_RECEIVED\": \"Transazioni in attesa di recezione\",\n \"EVENTS\": \"Eventi\",\n \"WAITING_MEMBERSHIP\": \"Richiesta di certificazione inviata. In attesa di validazione.\",\n \"WAITING_CERTIFICATIONS\": \"Hai bisogno di {{needCertificationCount}} certificazione(i) per diventare membro.\",\n \"WILL_MISSING_CERTIFICATIONS\": \"Mancherai a breve <b>di certificazioni</b> (occorrono almeno {{willNeedCertificationCount}} altre certificazioni)\",\n \"WILL_NEED_RENEW_MEMBERSHIP\": \"Tua certificazione <b>scaderà{{membershipExpiresIn|formatDurationTo}}</b>. Ricordati di <a ng-click=\\\"doQuickFix('renew')\\\">rinnovarla</a> prima.\",\n \"NEED_RENEW_MEMBERSHIP\": \"You are no longer a member because your membership <b>has expired</b>. Remember to <a ng-click=\\\"doQuickFix('renew')\\\">renew your membership</a>.\",\n \"NO_WAITING_MEMBERSHIP\": \"Nessuna domanda di adesione pendente. Se desideri <b>diventare membro</b>, ricordati di <a ng-click=\\\"doQuickFix('membership')\\\">inviare tua domanda di adesione</a>.\",\n \"CERTIFICATION_COUNT\": \"Certificazioni ricevute\",\n \"CERTIFICATION_COUNT_SHORT\": \"Certificazioni\",\n \"SIG_STOCK\": \"Stock di certificazioni da inviare\",\n \"BTN_RECEIVE_MONEY\": \"Ricevere\",\n \"BTN_SELECT_ALTERNATIVES_IDENTITIES\": \"Usare un'altra identità..\",\n \"BTN_FIX_MEMBERSHIP\": \"Invia nuovamente di adesione...\",\n \"BTN_MEMBERSHIP_RENEW\": \"Rinnovare adesione\",\n \"BTN_MEMBERSHIP_RENEW_DOTS\": \"Rinnovare adesione ...\",\n \"BTN_MEMBERSHIP_OUT_DOTS\": \"Revocare adesione...\",\n \"BTN_SECURITY_DOTS\": \"Login e securità...\",\n \"BTN_SHOW_DETAILS\": \"Visualizzare dati tecnici\",\n \"LOCKED_OUTPUTS_POPOVER\": {\n \"TITLE\": \"Importo bloccata\",\n \"DESCRIPTION\": \"Ecco le condizioni per sbloccare questo importo:\",\n \"DESCRIPTION_MANY\": \"Questa transazione è fatta da diverse parti, di cui queste sono le condizioni di sblocco:\",\n \"LOCKED_AMOUNT\": \"Condizioni per l'importo:\"\n },\n \"NEW\": {\n \"TITLE\": \"Registrazione\",\n \"INTRO_WARNING_TIME\": \"Crearsi un conto su {{name|capitalize}} è molto semplice. E consigliato prendere il giusto tempo per farlo correttamente (per evitare di dimenticare passwords, pseudonimi etc.).\",\n \"INTRO_WARNING_SECURITY\": \"Occorre verificare che il hardware che stai utilizzando (computer, tablet, cellulare) <b>è sicuro e affidabile</b>.\",\n \"INTRO_WARNING_SECURITY_HELP\": \"Anti-virus aggiornato, firewall abilitato, session protteta da un password o codice PIN...\",\n \"INTRO_HELP\": \"Cliccare <b> {{'COMMON.BTN_START'|translate}}</b> per avviare la creazione del conto. Ti accompagniamo passo alla volta.\",\n \"REGISTRATION_NODE\": \"Tua iscrizione verrà salvata dal nodo peer Duniter <b>{{server}}</b>, è verrà poi condivisa nella rete della moneta.\",\n \"REGISTRATION_NODE_HELP\": \"Se non ti fidi di questo peer, per favore cambialo <a ng-click=\\\"doQuickFix('settings')\\\">nelle impostazioni/a> di Cesium.\",\n \"SELECT_ACCOUNT_TYPE\": \"Scegliere un tipo di conto:\",\n \"MEMBER_ACCOUNT\": \"Conto membro\",\n \"MEMBER_ACCOUNT_TITLE\": \"Creare un conto membro\",\n \"MEMBER_ACCOUNT_HELP\": \"Se non sei ancora registrato come individuo (un conto a persona soltanto).\",\n \"WALLET_ACCOUNT\": \"Semplice portafoglio\",\n \"WALLET_ACCOUNT_TITLE\": \"Creare un portafoglio\",\n \"WALLET_ACCOUNT_HELP\": \"Se rappresenti un'azienda, associazione, altra ente o hai necessita di un altro portafoglio. Nessun Dividendo Universale sarà prodotto da questo conto.\",\n \"SALT_WARNING\": \"Scegliere un identificativo segreto.<br/>E necessario per ogni connessione a questo conto.<br/><br/><b>Accertati di ricordarlo!</b>.<br/>Se lo dimentichi non ti potrà aiutare nessuno!\",\n \"PASSWORD_WARNING\": \"Scegliere una password.<br/>E necessario per ogni connessione a questo conto.<br/><br/><b>Accertati di ricordarla!</b>.<br/>Se la dimentichi non ti potrà aiutare nessuno!\",\n \"PSEUDO_WARNING\": \"Segliere uno pseudonimo.<br/>Puo essere utile per chi ti cerca nella rete.<br/><br/>.L'utilizzo delle<b>virgole, spazi e accenti</b> è vietato.<br/><div class='hidden-xs'><br/>Esempio: <span class='gray'>JohnDalton, JackieChan, etc.</span>\",\n \"PSEUDO\": \"Pseudonimo\",\n \"PSEUDO_HELP\": \"joe123\",\n \"SALT_CONFIRM\": \"Confermare\",\n \"SALT_CONFIRM_HELP\": \"Confermare l'identificativo segreto\",\n \"PASSWORD_CONFIRM\": \"Confermare\",\n \"PASSWORD_CONFIRM_HELP\": \"Confermare la password\",\n \"SLIDE_6_TITLE\": \"Conferma:\",\n \"COMPUTING_PUBKEY\": \"Calcolando...\",\n \"LAST_SLIDE_CONGRATULATION\": \"Hai riempito tutti i campi richiesti.<br/><b>Puoi inviare la richiesta di creazione del conto</b>.<br/><br/>Per tua informazione, la chiave pubblica qui sotto identifica il tuo futuro conto.<br/>Puo essere communicata a chi ti deve pagare per esempio.<br/>Quando tuo conto verrà approvato potrai trovare la chiave qui <b>{{'ACCOUNT.TITLE'|translate}}</b>.\",\n \"CONFIRMATION_MEMBER_ACCOUNT\": \"<b class=\\\"assertive\\\">Warning:</b> tuo identificare segreto, tua password e tuo pseudonimo non si possono cambiare.<br/><b>Ricordali per sempre!</b><br/><b>Sei sicuro/a</b>di voler inviare questa richiesta di creazione di conto?\",\n \"CONFIRMATION_WALLET_ACCOUNT\": \"<b class=\\\"assertive\\\">Warning:</b> tuo identificare segreto, tua password e tuo pseudonimo non si possono cambiare..<br/><b>Ricordali per sempre!</b><br/><b>Sei sicuro/a</b> di voler continuare?\",\n \"CHECKING_PSEUDO\": \"Verificazione in corso...\",\n \"PSEUDO_AVAILABLE\": \"Pseudonimo disponibile\",\n \"PSEUDO_NOT_AVAILABLE\": \"Pseudonimo indisponibile\",\n \"INFO_LICENSE\": \"TPer aderire alla moneta, ti chiediamo di leggere e accetare le condizioni della licenza.\",\n \"BTN_ACCEPT\": \"Accetto\",\n \"BTN_ACCEPT_LICENSE\": \"Accetto la licenza\"\n },\n \"POPUP_REGISTER\": {\n \"TITLE\": \"Pseudonimo\",\n \"HELP\": \"Un pseudonimo è necessario per che gli altri ti possino trovare.\"\n },\n \"SELECT_IDENTITY_MODAL\": {\n \"TITLE\": \"Selezionare una identità\",\n \"HELP\": \"Più <b>identità diverse</b> sono state inviate per la chiave pubblica <span class=\\\"gray\\\"><i class=\\\"ion-key\\\"></i> {{pubkey|formatPubkey}}</span>.<br/>Seleziona un dossier da usare :\"\n },\n \"SELECT_WALLET_MODAL\": {\n \"TITLE\": \"Selezione del portafoglio\"\n },\n \"WALLET_LIST\": {\n \"TITLE\": \"Portafoglio secondario\",\n \"BTN_NEW\": \"Aggiungi un portfolio\",\n \"NO_WALLET\": \"Nessun portafoglio secondario\",\n \"BTN_DELETE\": \"Rimuovi un portafoglio secondario ...\",\n \"BTN_RENAME\": \"Rinominare il portafoglio\",\n \"EDIT_POPOVER\": {\n \"TITLE\": \"Rinominare il portafoglio\",\n \"HELP\": \"Compila il nuovo nome\",\n \"NAME_HELP\": \"Nome del portafoglio\"\n }\n },\n \"SECURITY\":{\n \"ADD_QUESTION\" : \"Aggiungere domanda personalizzata\",\n \"BTN_CLEAN\" : \"Svuotare\",\n \"BTN_RESET\" : \"Reset\",\n \"DOWNLOAD_REVOKE\": \"Salvare un file di revoca\",\n \"DOWNLOAD_REVOKE_HELP\" : \"Avere une file di revoca è necessario in caso di smarrimento dei tuoi credenziali. Ti permette <b> di rimuovere tuo conto dalla Web Of Trust</b>, per farlo tornare ad essere un semplice portafoglio.\",\n \"HELP_LEVEL\": \"Scegliere <strong> almeno{{nb}} domande </strong> :\",\n \"LEVEL\": \"Livello di sicurezza\",\n \"LOW_LEVEL\": \"Basso <span class=\\\"hidden-xs\\\">(minimo di 2 domande)</span>\",\n \"MEDIUM_LEVEL\": \"Medio <span class=\\\"hidden-xs\\\">(minimo di 4 domande)</span>\",\n \"QUESTION_1\": \"Qual'era il nome del tuo miglior amico quando eri adolescente ?\",\n \"QUESTION_2\": \"Qual'era il nome del tuo primo animale domestico?\",\n \"QUESTION_3\": \"Qual'è il primo piatto che imparasti a cucinare?\",\n \"QUESTION_4\": \"Qual'è il primo film che hai visto al cinema?\",\n \"QUESTION_5\": \"Qual'era la destinazione del tuo primo volo?\",\n \"QUESTION_6\": \"Qual'era il nome del tuo professore preferito in scuola ?\",\n \"QUESTION_7\": \"Quale sarebbe il tuo lavoro preferito?\",\n \"QUESTION_8\": \"Qual'è il tuo libro per bimbi preferito?\",\n \"QUESTION_9\": \"Qual'era il marchio della tua prima macchina?\",\n \"QUESTION_10\": \"Qual'era il tuo nomignolo da ragazzino/a ?\",\n \"QUESTION_11\": \"Qual'era il tuo personaggio di film o attore preferito quand eri studente?\",\n \"QUESTION_12\": \"Qual'era il tuo musicista/cantante/grupo preferito quand eri studente ?\",\n \"QUESTION_13\": \"In che città si sono conosciuti tuoi genitori ?\",\n \"QUESTION_14\": \"Qual'era il nome del tuo primo capo ?\",\n \"QUESTION_15\": \"Qual'è il nome della strada dove sei cresciuto/a ?\",\n \"QUESTION_16\": \"Qual'è il nome della tua spiaggia preferita ?\",\n \"QUESTION_17\": \"Qual'è il primo album che ti sei comprato ?\",\n \"QUESTION_18\": \"Qual'è il nome della squadra di sport preferita ?\",\n \"QUESTION_19\": \"Cosa faceva tuo nonno ?\",\n \"RECOVER_ID\": \"Ricuperare mia password...\",\n \"RECOVER_ID_HELP\": \"Se hai un<b<file di backup dei tuoi credenziali</b>, li puoi trovare rispondendo correttamente alle tue domande personalizzate.\",\n \"REVOCATION_WITH_FILE\" : \"Revocare il mio conto membro...\",\n \"REVOCATION_WITH_FILE_DESCRIPTION\": \"Se pensi di aver perso <b>definitivamente tuoi credenziali</b> di conto membro (o che la sicurezza del tuo conto è compromessa), puoi usare <b>il file di revoca</b> del conto <b>per forzare la sua uscita permanente dalla Tela di Fiducia</b>.\",\n \"REVOCATION_WITH_FILE_HELP\": \"Se hai <b>definitivamente perso tuoi credenziali (o se la sicurezza del tuo conto è compromessa), puoi usare <b>il file di revoca</b> del conto <b>per uscire dalla Web Of Trust</b>.\",\n \"REVOCATION_WALLET\": \"Revocare questo conto subito\",\n \"REVOCATION_WALLET_HELP\": \"Richiedere la cancellazione dell'identità <b>revocherà la tua adesione alla tua rete</ b> (con certezza per il pseudonimo e la chiave pubblica associata). Il conto non potrà più produrre il Dividendo Universale.<br/>Nonostante ciò, puoi ancora usare il conto come semplice portafoglio.\",\n \"REVOCATION_FILENAME\": \"revocation-{{uid}}-{{pubkey|formatPubkey}}-{{currency}}.txt\",\n \"SAVE_ID\": \"Salvare miei credenziali...\",\n \"SAVE_ID_HELP\": \"Creare un file di backup, per <b>ricuperare vostra password</b> (e l'identificativo segreto) <b> in caso di smarrimento</b>. Il file è <b>sicuro</ b> (cryptato) utilizzando le domande personalizzate.\",\n \"STRONG_LEVEL\": \"Alto <span class=\\\"hidden-xs \\\">(minimo di 6 domande)</span>\",\n \"TITLE\": \"Conto e sicurezza\"\n },\n \"FILE_NAME\": \"{{currency}} - Account statement {{pubkey|formatPubkey}} to {{currentTime|formatDateForFile}}.csv\",\n \"HEADERS\": {\n \"TIME\": \"Date\",\n \"AMOUNT\": \"Amount\",\n \"COMMENT\": \"Comment\"\n }\n },\n \"TRANSFER\": {\n \"TITLE\": \"Bonifico\",\n \"SUB_TITLE\": \"Fare un bonifico\",\n \"FROM\": \"Da\",\n \"TO\": \"A\",\n \"AMOUNT\": \"Importo\",\n \"AMOUNT_HELP\": \"Importo\",\n \"COMMENT\": \"Commenti\",\n \"COMMENT_HELP\": \"Commenti\",\n \"BTN_SEND\": \"Inviare\",\n \"BTN_ADD_COMMENT\": \"Scrivere un comento ?\",\n \"WARN_COMMENT_IS_PUBLIC\": \"Ti avvertiamo <b>che i commenti sono pubblici</b> (non cifrati).\",\n \"MODAL\": {\n \"TITLE\": \"Bonifico\"\n }\n },\n \"ERROR\": {\n \"UNKNOWN_URI_FORMAT\": \"Formato URI sconosciuto\",\n \"POPUP_TITLE\": \"Errore\",\n \"UNKNOWN_ERROR\": \"Errore\",\n \"CRYPTO_UNKNOWN_ERROR\": \"Suo navigatore non sembra compatibile con le funzionalità di cryptografia.\",\n \"EQUALS_TO_PSEUDO\": \"Deve essere diverso dal pseudonimo\",\n \"EQUALS_TO_SALT\": \"Deve essere diverso dal identificativo segreto\",\n \"FIELD_REQUIRED\": \"Campo obbligatorio.\",\n \"FIELD_TOO_SHORT\": \"Valore troppo corto.\",\n \"FIELD_TOO_SHORT_WITH_LENGTH\": \"Valore troppo corto ({{minLength}} caratteri min)\",\n \"FIELD_TOO_LONG\": \"Valore troppo lungo\",\n \"FIELD_TOO_LONG_WITH_LENGTH\": \"Valore troppo lungo ({{maxLength}} caractteri max)\",\n \"FIELD_MIN\": \"Valore minimo : {{min}}\",\n \"FIELD_MAX\": \"Valore massimo : {{max}}\",\n \"FIELD_ACCENT\": \"Virgole e caratteri accentati vietati\",\n \"FIELD_NOT_NUMBER\": \"Valore numerico atteso\",\n \"FIELD_NOT_INT\": \"Valore intero atteso\",\n \"FIELD_NOT_EMAIL\": \"Indirizzo mail non valido\",\n \"PASSWORD_NOT_CONFIRMED\": \"Non corrisponde alla password.\",\n \"SALT_NOT_CONFIRMED\": \"Non corrisponde al identificativo segreto.\",\n \"SEND_IDENTITY_FAILED\": \"Iscrizione fallita.\",\n \"SEND_CERTIFICATION_FAILED\": \"Certificazione fallita.\",\n \"NEED_MEMBER_ACCOUNT_TO_CERTIFY\": \"Non puoi inviare certificazioni perche tuo conto <b>non è ancora un conto membro</b>.\",\n \"NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF\": \"Non puoi inviare certificazioni adesso perche <b>non sei ancora membro</b>.<br/><br/>Devi ancora entrare nella WOT.\",\n \"IDENTITY_TO_CERTIFY_HAS_NO_SELF\": \"Impossibile certificare questo conto. Nessuna richiesta di certificazione trovata o bisogna rinnovarla.\",\n \"LOGIN_FAILED\": \"Errore di login.\",\n \"LOAD_IDENTITY_FAILED\": \"Impossibile caricare la tua identità.\",\n \"LOAD_REQUIREMENTS_FAILED\": \"Impossibile caricare i prerequisiti dell'identità.\",\n \"SEND_MEMBERSHIP_IN_FAILED\": \"Ingresso nella WOT fallito.\",\n \"SEND_MEMBERSHIP_OUT_FAILED\": \"Errore nel invio della revocazione.\",\n \"REFRESH_WALLET_DATA\": \"Impossibile aggiornare il portafoglio.\",\n \"GET_CURRENCY_PARAMETER\": \"Impossibile ricuperare i parametri della moneta.\",\n \"GET_CURRENCY_FAILED\": \"Impossibile caricare la moneta. Riprovare più tardi.\",\n \"SEND_TX_FAILED\": \"Impossibile eseguire la transazione.\",\n \"ALL_SOURCES_USED\": \"Per favore aspetta il calcolo del prossimo blocco (Tutte le tue fonti di moneta sono state utilizzate).\",\n \"NOT_ENOUGH_SOURCES\": \"Non hai abbastanza cambio per inviare questo importo in una sola transazione.<br/>Importo massimo: {{amount}} {{unit}}<sub>{{subUnit}}</sub>.\",\n \"ACCOUNT_CREATION_FAILED\": \"Errore nella creazione del tuo conto membro.\",\n \"RESTORE_WALLET_DATA_ERROR\": \"Errore nel aggiornamento delle impostazioni definite in local storage.\",\n \"LOAD_WALLET_DATA_ERROR\": \"Errore nel caricamento dei dati del portafoglio.\",\n \"COPY_CLIPBOARD_FAILED\": \"Impossibile copiare al clipboard\",\n \"TAKE_PICTURE_FAILED\": \"Impossibile ricuperare foto.\",\n \"SCAN_FAILED\": \"Impossibile scansionare il codice QR.\",\n \"SCAN_UNKNOWN_FORMAT\": \"Codice non riconosciuto.\",\n \"WOT_LOOKUP_FAILED\": \"Ricerca fallita.\",\n \"LOAD_PEER_DATA_FAILED\": \"Peer Duniter non accessibile. Riprovare più tardi.\",\n \"NEED_LOGIN_FIRST\": \"Accedi al tuo conto prima.\",\n \"AMOUNT_REQUIRED\": \"Importo necessario.\",\n \"AMOUNT_NEGATIVE\": \"Importo negativo non consentito.\",\n \"NOT_ENOUGH_CREDIT\": \"Saldo insufficiente\",\n \"INVALID_NODE_SUMMARY\": \"Impossibile comunicare col peer o indirizzo non valido\",\n \"INVALID_USER_ID\": \"Il campo del 'pseudonimo' non deve avere spazi vuoti o caratteri speciali.\",\n \"INVALID_COMMENT\": \"Il formato del campo 'reference' è errato.\",\n \"INVALID_PUBKEY\": \"If formato della chiave pubblica è errato.\",\n \"INVALID_PUBKEY_CHECKSUM\": \"Checkum non valido.\",\n \"IDENTITY_REVOKED\": \"Questa identità <b>è stata revocata</b>. Non puo più diventare membro.\",\n \"IDENTITY_REVOKED_WITH_TIME\": \"Questa identità <b>è stata revocata {{revocationTime|medianFromNow}}</b> ({{revocationTime|medianDate}}). Non puo più diventare membro.\",\n \"IDENTITY_PENDING_REVOCATION\": \"L'<b>annulamento di questa identità</b> è stata richiesta ed è in corso di evaluazione. Capacità ad inviare certificazioni disabilitata\",\n \"IDENTITY_INVALID_BLOCK_HASH\": \"Questa richiesta di certificazione non è più valida (perche si riferisce ad un blocco che è stato eliminato dai peers): la persona deve rinnovare la sua domanda di certificazione <b>prima</b> di essere certificata.\",\n \"IDENTITY_EXPIRED\": \"Questa identità è scaduta: la persona deve fare una nuova domanda di certificazione <b>prima di</b> essere certificata.\",\n \"IDENTITY_SANDBOX_FULL\": \"Il nodo Duniter utilizzato da Cesium non puo ricevere altre domande di certificazione per ora, la lista d'attesa è piena.<br/><br/>Riprova più tardi o scegli un'altro peer Duniter (nelle <b>Impostazioni</b>).\",\n \"IDENTITY_NOT_FOUND\": \"Identità non trovata\",\n \"IDENTITY_TX_FAILED\": \"Impossibile caricare le operazioni\",\n \"WOT_PENDING_INVALID_BLOCK_HASH\": \"Adesione non valida.\",\n \"WALLET_INVALID_BLOCK_HASH\": \"Tua domanda di certificazione non è più valida (perche si riferisce ad un blocco che è stato eliminato dai peers).<br/>Devi <a ng-click=\\\"doQuickFix('renew')\\\">rinnvoare la tua richiesta di adesione alla WOT</a> per risolvere il problema.\",\n \"WALLET_IDENTITY_EXPIRED\": \"La pubblicazione della tua identità <b>è scaduta</b>.<br/>Devi <a ng-click=\\\"doQuickFix('fixIdentity')\\\">ripubblicare la tua identità</a> per risolvere il problema.\",\n \"WALLET_REVOKED\": \"La tua identità è stata <b>revocata</b>: ne tuo pseudonimo ne tua chiave pubblica sarano utilizzati in futuro.\",\n \"WALLET_HAS_NO_SELF\": \"La tua identità deve prima essere stata pubblicata e non essere ancora scaduta.\",\n \"AUTH_REQUIRED\": \"Autenticazione necessaria.\",\n \"AUTH_INVALID_PUBKEY\": \"La chiave pubblica non corrisponde al conto conesso.\",\n \"AUTH_INVALID_SCRYPT\": \"Password o nome di utente non valido.\",\n \"AUTH_INVALID_FILE\": \"File di portachiavi non valido.\",\n \"AUTH_FILE_ERROR\": \"Impossibile aprire il file di portachiavi\",\n \"IDENTITY_ALREADY_CERTIFY\": \"Hai <b>già certificato</b> questa identità.<br/><br/>Tuo certificato è ancora valido (scade {{expiresIn|formatDuration}}).\",\n \"IDENTITY_ALREADY_CERTIFY_PENDING\": \"Hai <b>già certificato</b> questa identità.<br/><br/>Tua certificazione è ancora pendente (Scadenza del periodo di treatment {{expiresIn|formatDuration}}).\",\n \"UNABLE_TO_CERTIFY_TITLE\": \"Impossibile certificare\",\n \"LOAD_NEWCOMERS_FAILED\": \"Impossibile caricare i nuovi membri.\",\n \"LOAD_PENDING_FAILED\": \"Impossibile caricare le certificazioni pendenti.\",\n \"ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION\": \"Devi <b>essere membro</b> per poter fare questo.\",\n \"ONLY_MEMBER_OR_WAS_MEMBER_CAN_EXECUTE_THIS_ACTION\": \"Devi <b>essere membro</b> (o era un membro) per poter fare questo.\",\n \"ONLY_SELF_CAN_EXECUTE_THIS_ACTION\": \"Devi aver <b>publiccato tua identità</b> per poter fare questo.\",\n \"GET_BLOCK_FAILED\": \"Impossibile caricare il blocco\",\n \"INVALID_BLOCK_HASH\": \"Blocco non trovato (hash errato)\",\n \"DOWNLOAD_REVOCATION_FAILED\": \"Errore avvenuto nel download del file di cancellazione d'identità.\",\n \"REVOCATION_FAILED\": \"Errore avvenuto durante la richiesta di cancellazione dell'identità.\",\n \"SALT_OR_PASSWORD_NOT_CONFIRMED\": \"identificativo segreto o password sbagliati\",\n \"RECOVER_ID_FAILED\": \"Impossibile ricuperare la password\",\n \"LOAD_FILE_FAILED\" : \"Impossibile caricare il file\",\n \"NOT_VALID_REVOCATION_FILE\": \"File di cancellazione dell'identità errato (formato di file incorreto)\",\n \"NOT_VALID_SAVE_ID_FILE\": \"File di backup dei credenziali errato (formato di file incorreto)\",\n \"NOT_VALID_KEY_FILE\": \"File di portachiavi non valido (formato non riconosciuto)\",\n \"EXISTING_ACCOUNT\": \"Tuoi credenziali corrispondono a quelli di un conto già esistente,di cui <a ng-click=\\\"showHelpModal('pubkey')\\\">la chiave pubblica</a> è:\",\n \"EXISTING_ACCOUNT_REQUEST\": \"Per favore cambi tuoi credenziali in modo che corrispondino ad un conto non utilizzato.\",\n \"GET_LICENSE_FILE_FAILED\": \"Impossibile caricare il file della licenza\",\n \"CHECK_NETWORK_CONNECTION\": \"Nessun peer sembra disponibile.<br/><br/>Per favore <b>verifica la tua connessione Internet</b>.\",\n \"ISSUE_524_TX_FAILED\": \"Bonifico .<br/><br/>Un message a été envoyé aux développeurs pour faciliter la résolution du problème. <b>Merci de votre aide</b>.\"\n },\n \"INFO\": {\n \"POPUP_TITLE\": \"Informazioni\",\n \"CERTIFICATION_DONE\": \"Identità firmata con successo\",\n \"NOT_ENOUGH_CREDIT\": \"Saldo insufficiente\",\n \"TRANSFER_SENT\": \"Transazione inviata con successo\",\n \"COPY_TO_CLIPBOARD_DONE\": \"Copiato con successo\",\n \"MEMBERSHIP_OUT_SENT\": \"Revoca dell'identità inviata\",\n \"NOT_NEED_MEMBERSHIP\": \"Già un membro.\",\n \"IDENTITY_WILL_MISSING_CERTIFICATIONS\": \"Questa identità mancherà a breve di certificazioni (almeno {{willNeedCertificationCount}}).\",\n \"REVOCATION_SENT\": \"Revoca dell'identità inviata\",\n \"REVOCATION_SENT_WAITING_PROCESS\": \"Cancellazione dell'identità <b>inviata con successo</b>. In attesa di validazione.\",\n \"FEATURES_NOT_IMPLEMENTED\": \"Questa funzionalità non è ancora disponibile.<br/><br/>Vuoi contribuire per velocizzarne la disponibilità? ;)\",\n \"EMPTY_TX_HISTORY\": \"Nessuna operazione da esportare\"\n },\n \"CONFIRM\": {\n \"POPUP_TITLE\": \"<b>Conferma</b>\",\n \"POPUP_WARNING_TITLE\": \"<b>Avviso</b>\",\n \"POPUP_SECURITY_WARNING_TITLE\": \"<i class=\\\"icon ion-alert-circled\\\"></i> <b>Avvertimento di sicurezza</b>\",\n \"CERTIFY_RULES_TITLE_UID\": \"Certificare {{uid}}\",\n \"CERTIFY_RULES\": \"<b class=\\\"assertive\\\">Non certificare un conto</b> se credi che: <ul><li>1.) l'identità della persona potrebbe essere finta.<li>2.) la oersona ha già un conto certicato.<li>3.) la persona trasgredisce la regola 1 o 2 o entrambe. (Certifica conti finti o gemelli).</ul></small><br/>Sei sicuro/a di voler certificare questa identità?\",\n \"TRANSFER\": \"<b>Resoconto del bonifico:</b><br/><br/><ul><li> - Inviato da: <b>{{from}}</b></li><li> - A: <b>{{to}}</b></li><li> - Importo: <b>{{amount}} {{unit}}</b></li><li> - Comento: <i>{{comment}}</i></li></ul><br/><b>Sei sicuro di voler procedere con questo bonifico?</b>\",\n \"MEMBERSHIP_OUT\": \"Questa operazione è <b>irreversibile</b>.<br/></br/><b>Sei sicuro/a di voler cancellare la tua presenza nella WOT?</b>\",\n \"MEMBERSHIP_OUT_2\": \"Questa operazione è <b>irreversibile</b>!<br/><br/>Sei sicuro/a <b>di voler revocare la tua identità</b>?\",\n \"LOGIN_UNUSED_WALLET_TITLE\": \"Errore di battitura?\",\n \"LOGIN_UNUSED_WALLET\": \"Il conto sembra <b>inattivo</b>.<br/><br/>Probabilmente è un<b>errore di battitura</b> mientre digitavi i tuoi credenziali. Per favore riprova, verificando che la <b>chiave pubblica sia tua<b/>.\",\n \"FIX_IDENTITY\": \"Lo pseudonimo <b>{{uid}}</b> verrà pubblicato nuovamente. Si sostituirà alla precedente pubblicazione che è scaduta.<br/></br/><b>Sei sicuro/a</b> di voler procedere?\",\n \"FIX_MEMBERSHIP\": \"Tua domanda di certificazione sarà inviata alla rete.<br/></br/><b>Sei sicuro/a?</b>\",\n \"MEMBERSHIP\": \"Tua domanda per diventare membro sta per essere inviata alla rete.<br/></br/><b>Sei sicuro/a/b> di voler continuare ?\",\n \"RENEW_MEMBERSHIP\": \"Tua adesione verrà rinnovata.<br/></br/><b>Sei sicuro/a?</b>\",\n \"REVOKE_IDENTITY\": \"Stai per <b>revocare definitivamente questa identità</b>.<br/><br/>La chiave pubblica e lo pseudonimo associato <b>non saranno mai più utilizzati</b> (per un conto membro).<br/></br/><b>Sei sicuro/a</b> di voler revocare questa identità?\",\n \"REVOKE_IDENTITY_2\": \"Questa operazione è <b>irreversibile</b>!<br/><br/>Sei sicuro/a di volern<b>revocare questa identità</b>?\",\n \"NOT_NEED_RENEW_MEMBERSHIP\": \"Tua presenza nella rete non deve ancora essere rinnovata (scaderà tra {{membershipExpiresIn|formatDuration}}).<br/></br/><b>Sei sicuro/a</b> di voler rinnovare la tua presenza?\",\n \"SAVE_BEFORE_LEAVE\": \"Vuoi <b>salvare tue modifiche</b> prima di uscira dalla pagina?\",\n \"SAVE_BEFORE_LEAVE_TITLE\": \"Modifiche non salvate\",\n \"LOGOUT\": \"Sei sicuro/a di voler chiudere la sessione?\",\n \"USE_FALLBACK_NODE\": \"Peer <b>{{old}}</b> indisponibile o indirizzo errato.<br/><br/>Vuoi utilizzare temporanemante il <b>{{new}}</b> nodo?\",\n \"INVALID_FILE_FORMAT\": \"Formato file non valido.\",\n \"SAME_TX_RECIPIENT\": \"Il destinatario deve essere diverso dall'emittente.\"\n },\n \"MODE\": {\n \"DEMO\": {\n \"BADGE\": \"Demo\",\n \"MODE\": \"Modalità dimostrativa\",\n \"FEATURE_NOT_AVAILABLE\": \"Funzionalità <b>non disponibile</b> su questo sito dimostrativo.\",\n \"MODE_HELP\": \"Il cesio funziona in <b>modalità dimostrativa</b>: è disponibile la consultazione per conto, ma non è possibile eseguire alcuna operazione per conto.\",\n \"INSTALL_HELP\": \"Per <b>motivi di sicurezza</b> ti consigliamo di <b>installare</b> la tua copia del software.<br/>Visita il sito <a href='https://cesium.app'>www.cesium.app</a> per assistenza.\"\n },\n \"READONLY\": {\n \"BADGE\": \"Monit\",\n \"MODE\": \"Modalità di monitoraggio\",\n \"MODE_HELP\": \"Il cesio funziona in <b>modalità monitoraggio</b>: sono disponibili solo le funzionalità di monitoraggio della valuta.\",\n \"INSTALL_HELP\": \"Se desidera <b>creare un account di portafoglio</b> per inviare o ricevere valuta, ti consigliamo di <b>installare</b> la tua copia del software.<br/>Visita il sito <a href='https://cesium.app'>www.cesium.app</a> per assistenza.\"\n }\n },\n \"DOWNLOAD\": {\n \"POPUP_TITLE\": \"<b>File di cancellazione dell'identità/b>\",\n \"POPUP_REVOKE_MESSAGE\": \"Per migliorare la sicurezza del tuo conto, scarica <b>il documento di revoca del conto</b>. Ti consentirà di revocare tuo conto (nel caso di violazione del conto, della tua identità, conto creato con errori, etc.).<br/><br/><b>Tiene questo document al sicuro.</b>\"\n },\n \"HELP\": {\n \"TITLE\": \"Aiuto online\",\n \"JOIN\": {\n \"SECTION\": \"Entrare nella rete\",\n \"SALT\": \"Il tuo identificativo segreto è molto importante. E utilizzato per cryptare tua password che permette poi di calcolare tua <span class=\\\"text-italic\\\">chiave pubblica</span> (suo numero) è la chiave privata che ne consenta l'accesso.<br/><b>Ricordati bene di questo identificativo</b>, perche non ti potrà aiutare nessuno se lo perdi.<br/>Tra l'altro, non puo essere cambiato senza dover creare un conto nuovo.<br/><br/>Raccomandiamo che sia abbastanza lungo (8 caratteri almeno) è il più originale possibile. (buona entropia)\",\n \"PASSWORD\": \"La password è molto importante, è utilizzata per calcolare tuo numero di conto (tua chiave pubblica) e la chiave privata che ne consento l'accesso.<br/><b>Ricordatila bene</b>, perche non ti potrà aiutare nessuno se lo perdi.<br/>Tra l'altro, non puo essere cambiata senza dover creare un conto nuovo.<br/><br/>Una buona password (preferibilmente) è composta da almeno 8 caratteri, con almeno una maiuscola e un numero.\",\n \"PSEUDO\": \"Un pseudonimo è utilizzato quando ti iscrivi come <span class=\\\"text-italic\\\">membro</span>. E sempre associato ad un portafoglio (con sua <span class=\\\"text-italic\\\">chiave pubblica</span>).<br/>E pubblicato sulla rete perche gli altri membri possino identificarla, certificarla o invarle soldi. <br/> Lo pseudonimo deve essere unico nella rete (tra quelli utilizzati adesso e in passato).\"\n },\n \"LOGIN\": {\n \"SECTION\": \"Accedi\",\n \"PUBKEY\": \"Chiave pubblica del conto\",\n \"PUBKEY_DEF\": \"La chiave pubblica del portachiavi è generata dai credenziali, ma non corrispode ad un conto già utilizzato.<br/><b>Accertati che tua chiave pubblica corrisponda al tuo conto</b>. Nel caso contrario, sarai conesso/a ad un conto probabilmente mai usato, datto che il rischio di collisione con un conto esistente è molto ridotto.<br/><a href=\\\"https://en.wikipedia.org/wiki/Elliptic_curve_cryptography\\\" target=\\\"_ system\\\">Saperne di più sulla cryptografia </a> con chiave pubblica.\",\n \"METHOD\": \"Metodi di connessione\",\n \"METHOD_DEF\": \"Hai diverse opzioni per accedere ad un portafoglio:<br/> - Accedendo con <b>salatura (leggera o sicura)</b> tua password sarà cryptata dal tuo identificativo segreto per scoraggiare tentativi di attachi di 'brute force' (per esempio con passwords conosciute).<br/> - Accedendo con la <b>chiave pubblica</b> ti evita di dover digitare tuoi credenziali che ti saranno chiesti solo quando vorrai fare una operazione col conto.<br/> - Accedendo <b>con un portachiavi</b> che leggerà tue chiave pubbliche e private da un file esterno, senza che tu li debba entrare.\"\n },\n \"GLOSSARY\": {\n \"SECTION\": \"Glossario\",\n \"PUBKEY_DEF\": \"Una chiave pubblica permette di identificare un portafoglio. Puo anche identificare un membro. In Cesium è calcolata con la password e lo pseudonimo.\",\n \"MEMBER\": \"Membro\",\n \"MEMBER_DEF\": \"Un membro è una persona reale e viva, che desidera participare liberamente alla communità monetaria. Questo membro riceverà un Dividendo Universale, a secondo delle regole definite <span class=\\\"text-italic\\\">nei parametri della moneta</span>.\",\n \"CURRENCY_RULES\": \"Regole della moneta\",\n \"CURRENCY_RULES_DEF\": \"I parametri delle moneta sono state definite per sempre e per tutti. I parametri con i quali la moneta si comporta: il calcolo del Dividendo Universale, il numero di certificazioni necessarie per diventare membro, il numero massimo di certificazioni che un membro puo inviare, etc.<br/><br/>I parametri non possono essere modificati perche c'è una<span class=\\\"text-italic\\\">Blockchain</span> che implementa e esegue queste regole e verifica costantemente la loro applicazione. <a href=\\\"#/app/currency\\\">Vedere i parametri </a>.\",\n \"BLOCKCHAIN\": \"Blockchain\",\n \"BLOCKCHAIN_DEF\": \"La Blockchain è un sistema decentralizzato che, nel caso di Duniter, permette di rispettare e implementare <span class=\\\"text-italic\\\">le regole della moneta</span>.<br/><a href=\\\"http://en.duniter.org/presentation/\\\" target=\\\"_blank\\\">Saperne di più su Duniter</a> e il funzionamento della blockchain.\",\n \"UNIVERSAL_DIVIDEND_DEF\": \"Il Dividendo Universale (UD) è la quantità di moneta co-creata da ogni membro, seguendo le formule mathematiche definite nelle <span class=\\\"text-italic\\\">regole della moneta</span>.<br/>Al inizio di ogni periodo, il conto di ogni membro riceve una quantità uguale della nuova moneta creata. <br/><br/>Il DU conosce una crescita costante per rimanere equo nei confronti dei membri (attuali e passati). Viene calcolato tenendo in conto la speranza di vità media, cosi come dimostrato nella Teoria Relativa della Moneta (TRM).<br/><a href=\\\"http://trm.creationmonetaire.info\\\" target=\\\"_system\\\">Saperne di più sulla TRM</a> e la moneta libera.\"\n },\n \"TIP\": {\n \"MENU_BTN_CURRENCY\": \"Menu <b>{{'MENU.CURRENCY'|translate}}</b> permette la scoperta dei <b>parametri della moneta</b> e la sua condizione presente.\",\n \"CURRENCY_WOT\": \"Il <b>numero di membri</b> mostra <b>le dimensioni della WoT e la sua evoluzione </b>.\",\n \"CURRENCY_MASS\": \"In evidenza qui è <b>l'importo totale</b> attualmente in circolazione e la sua <b> ripartizione media </b> a testa.<br/><br/>Questa cifra permette di avere un'idea <b>del valore di qualsiasi importo</b>, in base a quello <b>hanno gli altri</b> sul loro conto (in media).\",\n \"CURRENCY_UNIT_RELATIVE\": \"L'unità usata qui (&ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;) significa che gli importi in {{currency|capitalize}} sono stati divisi dal <b>Dividendo Universale</b> (DU).<br/><br/><small>Questa unità relativa <b>ha senso</b> perche è stabile in contrasto con la massa monetaria che cresce costantemente.</small>\",\n \"CURRENCY_CHANGE_UNIT\": \"Questa opzione <b>{{'COMMON.BTN_RELATIVE_UNIT'|translate}}</b> permette di <b>permutare unità</b> per vedere gli importi in <b>{{currency|capitalize}}</b>, non divisi dal Dividendo Universale (piuttosto che in &ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;).\",\n \"CURRENCY_CHANGE_UNIT_TO_RELATIVE\": \"Questa opzione <b>{{'COMMON.BTN_RELATIVE_UNIT'|translate}}</b> permette <b>di permutare unità</b> per vedere gli importi in &ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;, che è relativo al Dividendo Universale (l'importo co-prodotto da ogni membro).\",\n \"CURRENCY_RULES\": \"Le<b>regole</b> della moneta determinano il suo <b>esatto e previdibile</b> comportamento.<br/><br/> Considerate come il proprio DNA della moneta, queste regole rendono il codice monetario <b>trasparente e comprensibile</b>.\",\n \"MENU_BTN_NETWORK\": \"Menu <b>{{'MENU.NETWORK'|translate}}</b> permette la scopertà dello <b>stato della rete<b>.\",\n \"NETWORK_BLOCKCHAIN\": \"Tutte le transazioni monetarie sono registrate in <b>registro sicuro e a prova di manomissione</b>, spesso chiamato <b>blockchain</b>.\",\n \"NETWORK_PEERS\": \"I<b>peers</b> mostrati qui corrispondono a <b>dei computers che aggiornano e monitorano</b> la blockchain.<br/><br/>Più peers ci sono, più <b>decentralizzata</b> e più affidabile diventa la moneta.\",\n \"NETWORK_PEERS_BLOCK_NUMBER\": \"Questo <b>numero</b> (in verda) indica <b>l'ultimo blocco validato</b> dal peer (ultima pagina scritta nel regitro).<br/><br/>Il verda indica che il blocco è stato validato anche dalla <b>maggioranza degli altri peers</b>.\",\n \"NETWORK_PEERS_PARTICIPATE\": \"<b>Ogni membro</b>, che dispone di un computer connesso a Internet <b>puo partecipare, aggiungendosi come peer installando il software Duniter</b> (free/libre). <a target=\\\"_new\\\" href=\\\"{{installDocUrl}}\\\" target=\\\"_system\\\">Leggi il manuale d'installazione &gt;&gt;</a>.\",\n \"MENU_BTN_ACCOUNT\": \"<b>{{'ACCOUNT.TITLE'|translate}}</b> permette l'accesso al saldo del conto e la cronologia delle transazioni.\",\n \"MENU_BTN_ACCOUNT_MEMBER\": \"Qui puoi consultare lo stato del tuo conto, la cronologia delle transazioni e le tue certificazioni.\",\n \"WALLET_CERTIFICATIONS\": \"Clicca qui per vedere i dettagli delle tue certificazioni (date o ricevute).\",\n \"WALLET_RECEIVED_CERTIFICATIONS\": \"Clicca qui per vedere i dettagli delle <b>certificazioni che hai ricevuto</b>.\",\n \"WALLET_GIVEN_CERTIFICATIONS\": \"Clicca qui per vedere i dettagli delle <b>certificazioni che hai date</b>.\",\n \"WALLET_BALANCE\": \"Il <b>soldo</b> del tuo conto è visibile qui.\",\n \"WALLET_BALANCE_RELATIVE\": \"{{'HELP.TIP.WALLET_BALANCE'|translate}}<br/><br/>L'unità utilizzata (&ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;) significa che questo importo in {{currency|capitalize}} è stato diviso dal <b>Dividendo Universale</b> (DU) co-creato da ogni membro.<br/>Ad oggi, 1 DU equivale a {{currentUD}} {{currency|capitalize}}.\",\n \"WALLET_BALANCE_CHANGE_UNIT\": \"Puoi <b>cambiare l'unità</b> in cui sono mostrati gli importi in <b><i class=\\\"icon ion-android-settings\\\"></i>&nbsp;{{'MENU.SETTINGS'|translate}}</b>.<br/><br/>Per esempio, per mostrare gli importi <b>direttamente in {{currency|capitalize}}</b> piuttosto che in unità relativa.\",\n \"WALLET_PUBKEY\": \"Questa è la chiave pubblica del tuo conto. La puoi dare ad un terzo perche possa identificare tuo conto.\",\n \"WALLET_SEND\": \"Paghi in pochi clics.\",\n \"WALLET_SEND_NO_MONEY\": \"Paghi in pochi clics.<br/>(Tuo saldo ancora non lo permette)\",\n \"WALLET_OPTIONS\": \"Questo bottone permette di fare <b>altre, meno frequenti azioni</b>.<br/><br/> Non dimenticarti di fare il tour guidato di Cesium quando hai un attimo!\",\n \"WALLET_RECEIVED_CERTS\": \"Questo mostra l'elenco delle persone che ti hanno fatto entrare nella WoT.\",\n \"WALLET_CERTIFY\": \"Questo bottone <b>{{'WOT.BTN_SELECT_AND_CERTIFY'|translate}}</b> permette di selezionare e certificare una identità.<br/><br/>Solo gli utenti <b>che sono già membri</b> possono certificare gli altri.\",\n \"WALLET_CERT_STOCK\": \"Tuo stock di certificazioni da dare è limitato a <b>{{sigStock}} certificazioni</b>.<br/><br/>Questo stock si rifornisce col tempo, man mano che le certificazioni inviate scadono.\",\n \"MENU_BTN_TX\": \"<b>{{'MENU.TRANSACTIONS'|translate}}</b> permette l'accesso alla cronologia delle transazioni, e permette di fare nuovi bonifici.\",\n \"MENU_BTN_WOT\": \"Il menu<b>{{'MENU.WOT'|translate}}</b> permette di cercare <b>utenti</b> della moneta (membri o non).\",\n \"WOT_SEARCH_TEXT_XS\": \"Per fare una ricerca nel annuario, digita <b>le prime lettere dello pseudonimo o della chiave pubblica di un utente</b>.<br/><br/>La ricerca inizierà automaticamente.\",\n \"WOT_SEARCH_TEXT\": \"Per cercare nel annuario, digita <b>le prime lettere dello pseudonimo o della chiave pubblica di un utente</b>.<br/><br/>Dopodichè calca <b>Enter</b> per avviare la ricerca.\",\n \"WOT_SEARCH_RESULT\": \"Visualizza la scheda dettagliata di un utente con un semplice click sulla linea.\",\n \"WOT_VIEW_CERTIFICATIONS\": \"La linea <b>{{'ACCOUNT.CERTIFICATION_COUNT'|translate}}</b> mostra quanti membri hanno certificato questa identità.<br/><br/>Queste certificazioni dimostrano che il conto appartiene ad <b>una persona viva</b> e che questa persona non ha <b>nessun altro conto membro</b>.\",\n \"WOT_VIEW_CERTIFICATIONS_COUNT\": \"Ci vogliono almeno <b>{{sigQty}} certificazioni</b> per diventare membro e co-produrre il <b>Dividendo Universale</b>.\",\n \"WOT_VIEW_CERTIFICATIONS_CLICK\": \"Clicca qui per aprire <b>una lista di tutte le certificazioni</b> ricevute e date da questa identità.\",\n \"WOT_VIEW_CERTIFY\": \"Il bottone <b>{{'WOT.BTN_CERTIFY'|translate}}</b> permette di aggiungere tua certificazione a questa identità.\",\n \"CERTIFY_RULES\": \"<b>Attenzione:</b> Certifichi <b> solo persone reali e vive</b> che non hanno nessun altro conto membro.<br/><br/>L'affidabilità della moneta dipende della vigilanza di ciascuno.\",\n \"MENU_BTN_SETTINGS\": \"Les <b>{{'MENU.SETTINGS'|translate}}</b> ti permettono di configurare Cesium.<br/><br/>Per esempio, puoi <b>cambiare l'unità</b> in cui visualizzi la moneta.\",\n \"HEADER_BAR_BTN_PROFILE\": \"Clicca qui per entrare nel <b>tuo profilo utente</b>\",\n \"SETTINGS_CHANGE_UNIT\": \"Puoi cambiare <b>l'unità</b> della moneta cliccando qui.<br/><br/>- Disabilita questa opzione per vedere gli importi in {{currency|capitalize}}.<br/>- Abilita l'opzione per importi relativi in {{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub> (<b>divisi</b> dal attuale Dividendo Universale).\",\n \"END_LOGIN\": \"Il tour guidato <b>è finito</b>.<br/><br/>Benvenuto nel <b>economia libera</b>!\",\n \"END_NOT_LOGIN\": \"Il tour guidato <b>è finito</b>.<br/><br/>Se desideri entrare nella Web of Trust {{currency|capitalize}}, basta cliccare <b>{{'LOGIN.CREATE_ACCOUNT'|translate}}</b> qui sotto.\",\n \"END_READONLY\": \"Il tour guidato <b>è finito</b>.<br/><br/>{{'MODE.READONLY.INSTALL_HELP'|translate}}.\"\n }\n },\n \"API\" :{\n \"COMMON\": {\n \"LINK_DOC\": \"documentazione API\",\n \"LINK_DOC_HELP\": \"Documentazione dello sviluppatore\",\n \"LINK_STANDARD_APP\": \"versione classica\",\n \"LINK_STANDARD_APP_HELP\": \"Apri la versione classica di {{'COMMON.APP_NAME'|translate}}\"\n },\n \"HOME\": {\n \"TITLE\": \"Documentazione API {{'COMMON.APP_NAME'|translate}}\",\n \"MESSAGE\": \"Bienvenue dans la <b>documentation de l'API</b> {{'COMMON.APP_NAME'|translate}}.<br/>Connecter vos sites web à <a href=\\\"http://duniter.org\\\" target=\\\"_system\\\">Duniter</a> très simplement !\",\n \"MESSAGE_SHORT\": \"Connecter vos sites à <a href=\\\"http://duniter.org\\\" target=\\\"_system\\\">Duniter</a> très simplement !\",\n \"DOC_HEADER\": \"Services disponibles :\"\n },\n \"TRANSFER\": {\n \"TITLE\": \"{{'COMMON.APP_NAME'|translate}} - Paiement en ligne\",\n \"TITLE_SHORT\": \"Pagamento online\",\n \"SUMMARY\": \"Récapitulatif de la commande :\",\n \"AMOUNT\": \"Montant :\",\n \"NAME\": \"Nom :\",\n \"PUBKEY\": \"Clé publique du destinaire :\",\n \"COMMENT\": \"Référence de la commande :\",\n \"DEMO\": {\n \"SALT\": \"demo\",\n \"PASSWORD\": \"demo\",\n \"PUBKEY\": \"3G28bL6deXQBYpPBpLFuECo46d3kfYMJwst7uhdVBnD1\",\n \"HELP\": \"<b>Mode démonstration</b> : Aucun paiement ne sera réellement envoyé pendant cette simulation.<br/>Veuillez utiliser les identifiants : <b>{{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}</b>\",\n \"BAD_CREDENTIALS\": \"Vérifiez votre saisie.<br/>En mode démonstration, les identifiants sont : {{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}\"\n },\n \"INFO\": {\n \"SUCCESS_REDIRECTING_WITH_NAME\": \"Paiement envoyé.<br/>Redirection vers <b>{{name}}</b>...\",\n \"SUCCESS_REDIRECTING\": \"Paiement envoyé.<br/>Redirection vers le site du vendeur...\",\n \"CANCEL_REDIRECTING_WITH_NAME\": \"Paiement annulé.<br/>Redirection vers <b>{{name}}</b>...\",\n \"CANCEL_REDIRECTING\": \"Paiement annulé.<br/>Redirection vers le site du vendeur...\"\n },\n \"ERROR\": {\n \"TRANSFER_FAILED\": \"Mancato pagamento\"\n }\n },\n \"DOC\": {\n \"DESCRIPTION_DIVIDER\": \"Descrizione\",\n \"URL_DIVIDER\": \"Indirizzo chiamata\",\n \"PARAMETERS_DIVIDER\": \"Impostazioni\",\n \"AVAILABLE_PARAMETERS\": \"Ecco l'elenco dei parametri disponibili :\",\n \"DEMO_DIVIDER\": \"Provare\",\n \"DEMO_HELP\": \"Per provare questo servizio, clicca sul bottone qui a fianco. Il risultato apparirà qui sotto .\",\n \"DEMO_RESULT\": \"Risultato della chiamata :\",\n \"DEMO_SUCCEED\": \"<i class=\\\"icon ion-checkmark\\\"></i> Successo !\",\n \"DEMO_CANCELLED\": \"<i class=\\\"icon ion-close\\\"></i> Annulato dal utente\",\n \"INTEGRATE_DIVIDER\": \"Integrare\",\n \"INTEGRATE_CODE\": \"Codice :\",\n \"INTEGRATE_RESULT\": \"Previsualizzare il risultato :\",\n \"INTEGRATE_PARAMETERS\": \"Parametri\",\n \"TRANSFER\": {\n \"TITLE\": \"Pagamenti\",\n \"DESCRIPTION\": \"Da un sito (per es. : un sito e-commerce) si può delegare il pagamento in moneta libera a Cesium API. Per invocare l'API, basta innescare l'apertura di una pagina con questo indirizzo:\",\n \"PARAM_PUBKEY\": \"Chiave pubblica del destinatario\",\n \"PARAM_PUBKEY_HELP\": \"Chiave pubblica del destinatario (obliggatoria)\",\n \"PARAM_AMOUNT\": \"Importo\",\n \"PARAM_AMOUNT_HELP\": \"Importo della transazione (obligatorio)\",\n \"PARAM_COMMENT\": \"Riferimento (o commento)\",\n \"PARAM_COMMENT_HELP\": \"Riferimento o commento. Ti può aiutare per esempio a trovare tuo pagamento nella blockchain.\",\n \"PARAM_NAME\": \"Nome (de destinatario o del sito web)\",\n \"PARAM_NAME_HELP\": \"Nom del sito web o del destinatario chiamando l'API. Può essere un nome leggibile (\\\"Mio sito\\\"), oppure l'indirizzo http del sito (\\\"MioSito.com\\\").\",\n \"PARAM_REDIRECT_URL\": \"Indirizzo web di redirezione\",\n \"PARAM_REDIRECT_URL_HELP\": \"Indirizzo web (URL) di redirezione, chiamato dopo aver inviato il pagamento. Può includere le seguenti stringe, che saranno sostituite con i valori della transazione : \\\"{tx}\\\", \\\"{hash}\\\", \\\"{comment}\\\", \\\"{amount}\\\" e {pubkey}.\",\n \"PARAM_CANCEL_URL\": \"Indirizzo web della cancellazione\",\n \"PARAM_CANCEL_URL_HELP\": \"Indirizzo web (URL) in caso dell'annullamento del pagamento dall'utente. Può includere le seguenti stringe, che saranno sostituite dinamicamente : \\\"{comment}\\\", \\\"{amount}\\\" e {pubkey}.\",\n \"EXAMPLES_HELP\": \"Ecco esempi di integrazione :\",\n \"EXAMPLE_BUTTON\": \"Bottone HTML\",\n \"EXAMPLE_BUTTON_DEFAULT_TEXT\": \"Pagare in {{currency|currencySymbol}}\",\n \"EXAMPLE_BUTTON_DEFAULT_STYLE\": \"Stile personnalizzato\",\n \"EXAMPLE_BUTTON_TEXT_HELP\": \"Testo del bottone\",\n \"EXAMPLE_BUTTON_BG_COLOR\": \"Colore del fondo\",\n \"EXAMPLE_BUTTON_BG_COLOR_HELP\": \"Per esempio: #fbc14c, black, lightgrey, rgb(180,180,180)\",\n \"EXAMPLE_BUTTON_FONT_COLOR\": \"Colore del testo\",\n \"EXAMPLE_BUTTON_FONT_COLOR_HELP\": \"Esempio: black, orange, rgb(180,180,180)\",\n \"EXAMPLE_BUTTON_TEXT_ICON\": \"Icona\",\n \"EXAMPLE_BUTTON_TEXT_WIDTH\": \"Larghezza\",\n \"EXAMPLE_BUTTON_TEXT_WIDTH_HELP\": \"Esempio: 200px, 50%\",\n \"EXAMPLE_BUTTON_ICON_NONE\": \"Nessuna\",\n \"EXAMPLE_BUTTON_ICON_DUNITER\": \"Logo Duniter\",\n \"EXAMPLE_BUTTON_ICON_CESIUM\": \"Logo Cesium\",\n \"EXAMPLE_BUTTON_ICON_G1_COLOR\": \"Logo Ğ1\",\n \"EXAMPLE_BUTTON_ICON_G1_BLACK\": \"Logo Ğ1 (nero)\"\n }\n }\n }\n}\n);\n\n$translateProvider.translations(\"nl-NL\", {\n \"COMMON\": {\n \"APP_NAME\": \"Cesium\",\n \"APP_VERSION\": \"v{{version}}\",\n \"APP_BUILD\": \"build {{build}}\",\n \"PUBKEY\": \"Publieke sleutel\",\n \"MEMBER\": \"Lid\",\n \"BLOCK\": \"Blok\",\n \"BTN_OK\": \"OK\",\n \"BTN_YES\": \"Ja\",\n \"BTN_NO\": \"Nee\",\n \"BTN_SEND\": \"Verzenden\",\n \"BTN_SEND_MONEY\": \"Verstuur geld\",\n \"BTN_SEND_MONEY_SHORT\": \"Versturen\",\n \"BTN_SAVE\": \"Opslaan\",\n \"BTN_YES_SAVE\": \"Ja, opslaan\",\n \"BTN_YES_CONTINUE\": \"Ja, doorgaan\",\n \"BTN_SHOW\": \"Tonen\",\n \"BTN_SHOW_PUBKEY\": \"Toon sleutel\",\n \"BTN_RELATIVE_UNIT\": \"Gebruik relatieve eenheid\",\n \"BTN_BACK\": \"Terug\",\n \"BTN_NEXT\": \"Volgende\",\n \"BTN_CANCEL\": \"Annuleer\",\n \"BTN_CLOSE\": \"Sluit\",\n \"BTN_LATER\": \"Later\",\n \"BTN_LOGIN\": \"Aanmelden\",\n \"BTN_LOGOUT\": \"Uitloggen\",\n \"BTN_ADD_ACCOUNT\": \"Nieuwe Rekening\",\n \"BTN_SHARE\": \"Delen\",\n \"BTN_EDIT\": \"Bewerken\",\n \"BTN_DELETE\": \"Wissen\",\n \"BTN_ADD\": \"Toevoegen\",\n \"BTN_SEARCH\": \"Zoeken\",\n \"BTN_REFRESH\": \"Verwezenlijken\",\n \"BTN_START\": \"Beginnen\",\n \"BTN_CONTINUE\": \"Doorgaan\",\n \"BTN_UNDERSTOOD\": \"Ik heb het begrepen\",\n \"BTN_OPTIONS\": \"Opties\",\n \"BTN_HELP_TOUR\": \"Rondleiding\",\n \"BTN_HELP_TOUR_SCREEN\": \"Ontdek dit scherm\",\n \"BTN_DOWNLOAD\": \"Downloaden\",\n \"BTN_DOWNLOAD_ACCOUNT_STATEMENT\": \"Downloaden het rekeningoverzicht\",\n \"BTN_MODIFY\": \"Bewerken\",\n \"DAYS\": \"dagen\",\n \"NO_ACCOUNT_QUESTION\": \"Nog geen lid? Registreer nu!\",\n \"SEARCH_NO_RESULT\": \"Geen resultaten\",\n \"LOADING\": \"Even geduld...\",\n \"SEARCHING\": \"Zoeken...\",\n \"FROM\": \"Van\",\n \"TO\": \"Aan\",\n \"COPY\": \"Kopieren\",\n \"LANGUAGE\": \"Taal\",\n \"UNIVERSAL_DIVIDEND\": \"Universeel dividend\",\n \"UD\": \"UD\",\n \"DATE_PATTERN\": \"DD-MM-YYYY HH:mm\",\n \"DATE_FILE_PATTERN\": \"YYYY-MM-DD\",\n \"DATE_SHORT_PATTERN\": \"DD-MM-YY\",\n \"DATE_MONTH_YEAR_PATTERN\": \"MM-YYYY\",\n \"EMPTY_PARENTHESIS\": \"(leeg)\",\n \"UID\": \"Pseudoniem\",\n \"ENABLE\": \"Geactiveerd\",\n \"DISABLE\": \"Gedeactiveerd\",\n \"RESULTS_LIST\": \"Resultaten:\",\n \"RESULTS_COUNT\": \"{{count}} uitslagen\",\n \"EXECUTION_TIME\": \"uitgevoerd in {{duration|formatDurationMs}}\",\n \"SHOW_VALUES\": \"Toon waarden openlijk?\",\n \"POPOVER_ACTIONS_TITLE\": \"Opties\",\n \"POPOVER_FILTER_TITLE\": \"Filters\",\n \"SHOW_MORE\": \"Toon meer\",\n \"SHOW_MORE_COUNT\": \"(huidig limiet op {{limit}})\",\n \"POPOVER_SHARE\": {\n \"TITLE\": \"Delen\",\n \"SHARE_ON_TWITTER\": \"Deel op Twitter\",\n \"SHARE_ON_FACEBOOK\": \"Deel op Facebook\",\n \"SHARE_ON_DIASPORA\": \"Deel op Diaspora*\",\n \"SHARE_ON_GOOGLEPLUS\": \"Deel op Google+\"\n }\n },\n \"SYSTEM\": {\n \"PICTURE_CHOOSE_TYPE\": \"Selecteer bron:\",\n \"BTN_PICTURE_GALLERY\": \"Gallerij\",\n \"BTN_PICTURE_CAMERA\": \"<b>Camera</b>\"\n },\n \"MENU\": {\n \"HOME\": \"Welkom\",\n \"WOT\": \"Register\",\n \"CURRENCY\": \"Valuta\",\n \"CURRENCIES\": \"Valuta's\",\n \"ACCOUNT\": \"Mijn rekening\",\n \"SETTINGS\": \"Instellingen\",\n \"NETWORK\": \"Netwerk\",\n \"TRANSACTIONS\": \"Mijn transacties\"\n },\n \"ABOUT\": {\n \"TITLE\": \"Over\",\n \"LICENSE\": \"<b>Vrije</b> software (GNU AGPLv3 licentie).\",\n \"CODE\": \"Broncode:\",\n \"DEVELOPERS\": \"Ontwikkelaars:\",\n \"FORUM\": \"Forum:\",\n \"DEV_WARNING\": \"Waarschuwing\",\n \"DEV_WARNING_MESSAGE\": \"Deze applicatie is nog in actieve onwikkeling.<br/>Meld ons elk pobleem!\",\n \"DEV_WARNING_MESSAGE_SHORT\": \"Deze App is nog instabiel (in ontwikkeling).\",\n \"REPORT_ISSUE\": \"Meld een probleem\"\n },\n \"HOME\": {\n \"TITLE\": \"Cesium\",\n \"WELCOME\": \"Welkom bij de Cesium Applicatie!\",\n \"MESSAGE\": \"Bekijk je {{currency|abbreviate}} portefeilles in real time.\",\n \"BTN_REGISTRY\": \"Register\",\n \"BTN_CURRENCY\": \"Verken valuta\",\n \"BTN_ABOUT\": \"over\",\n \"BTN_HELP\": \"Help\",\n \"REPORT_ISSUE\": \"Meld een probleem\",\n \"NOT_YOUR_ACCOUNT_QUESTION\" : \"Is rekening <b><i class=\\\"ion-key\\\"></i> {{pubkey|formatPubkey}}</b> niet van jou?\",\n \"BTN_CHANGE_ACCOUNT\": \"Dze rekening ontkoppelen\",\n \"CONNECTION_ERROR\": \"Node <b>{{server}}</b> onbereikbaar of ongeldig adres.<br/><br/>Controleer de internetverbinding, of schakel knooppunt <a class=\\\"positive\\\" ng-click=\\\"doQuickFix('settings')\\\">in parameters</a>.\"\n },\n \"SETTINGS\": {\n \"TITLE\": \"Instellingen\",\n \"NETWORK_SETTINGS\": \"Netwerk\",\n \"PEER\": \"Duniter knooppunt adres\",\n \"PEER_CHANGED_TEMPORARY\": \"Adres tijdelijk worden gebruikt\",\n \"USE_LOCAL_STORAGE\": \"Lokale opslag inschakelen\",\n \"USE_LOCAL_STORAGE_HELP\": \"Laat je instellingen opslaan\",\n \"ENABLE_HELPTIP\": \"Contextgebonden hulp inschakelen\",\n \"ENABLE_UI_EFFECTS\": \"Schakel visuele effecten\",\n \"HISTORY_SETTINGS\": \"Mijn rekening\",\n \"DISPLAY_UD_HISTORY\": \"Toon geproduceerde dividenden?\",\n \"AUTHENTICATION_SETTINGS\": \"Authentificatie\",\n \"REMEMBER_ME\": \"Onthoud mij\",\n \"REMEMBER_ME_HELP\": \"Hiermee kunt u blijven altijd aangesloten (niet aanbevolen).\",\n \"PLUGINS_SETTINGS\": \"Uitbreidingen\",\n \"BTN_RESET\": \"Herstel standaardinstellingen\",\n \"EXPERT_MODE\": \"Geavanceerde modus inschakelen\",\n \"EXPERT_MODE_HELP\": \"Toon meer details\",\n \"POPUP_PEER\": {\n \"TITLE\" : \"Duniter Knooppunt\",\n \"HOST\" : \"Adres\",\n \"HOST_HELP\": \"Aadres: server:poort\",\n \"USE_SSL\" : \"Secure?\",\n \"USE_SSL_HELP\" : \"(SSL-encryptie)\",\n \"BTN_SHOW_LIST\" : \"Lijst van knooppunten\"\n }\n },\n \"BLOCKCHAIN\": {\n \"HASH\": \"Hachee : {{hash}}\",\n \"VIEW\": {\n \"HEADER_TITLE\": \"Blok #{{number}}-{{hash|formatHash}}\",\n \"TITLE_CURRENT\": \"Huidige blok\",\n \"TITLE\": \"Blok #{{number|formatInteger}}\",\n \"COMPUTED_BY\": \"Berekend door het knooppunt\",\n \"SHOW_RAW\": \"Bekijk RAW-bestand\",\n \"TECHNICAL_DIVIDER\": \"Technische informatie\",\n \"VERSION\": \"Format versie\",\n \"HASH\": \"Hash berekend\",\n \"UNIVERSAL_DIVIDEND_HELP\": \"Munt gecoproduceerd door elk van de {{membersCount}} ledental\",\n \"EMPTY\": \"Er zijn geen gegevens in dit blok\",\n \"POW_MIN\": \"Mminimum moeilijkheid\",\n \"POW_MIN_HELP\": \"Moeilijkheid opgelegd hash te berekenen\",\n \"DATA_DIVIDER\": \"Gegevens\",\n \"IDENTITIES_COUNT\": \"Nieuwe identiteiten\",\n \"JOINERS_COUNT\": \"Nieuwe leden\",\n \"ACTIVES_COUNT\": \"Verlengingen\",\n \"ACTIVES_COUNT_HELP\": \"Leden die hun lidmaatschap te vernieuwen\",\n \"LEAVERS_COUNT\": \"Verlaters\",\n \"LEAVERS_COUNT_HELP\": \"Leden die niet langer wenst certificering\",\n \"EXCLUDED_COUNT\": \"Uitgesloten leden\",\n \"EXCLUDED_COUNT_HELP\": \"Oud-leden uitgesloten door niet-verlenging of gebrek aan certificeringen\",\n \"REVOKED_COUNT\": \"Identiteiten ingetrokken\",\n \"REVOKED_COUNT_HELP\": \"Deze rekeningen zullen niet langer leden\",\n \"TX_COUNT\": \"Transacties\",\n \"CERT_COUNT\": \"Certificeringen\",\n \"TX_TO_HIMSELF\": \"Ruil deal\",\n \"TX_OUTPUT_UNLOCK_CONDITIONS\": \"Omstandigheden van de introductie\",\n \"TX_OUTPUT_OPERATOR\": {\n \"AND\": \"en\",\n \"OR\": \"of\"\n },\n \"TX_OUTPUT_FUNCTION\": {\n \"SIG\": \"<b>handtekening</b> \",\n \"XHX\": \"<b>Wachtwoord</b>, wiens SHA256 =\",\n \"CSV\": \"Geblokkeerd\",\n \"CLTV\": \"Opgesloten\"\n }\n },\n \"LOOKUP\": {\n \"TITLE\": \"Blokken\",\n \"NO_BLOCK\": \"Geen blok\",\n \"LAST_BLOCKS\": \"Recente blokken :\",\n \"BTN_COMPACT\": \"Compact\"\n }\n },\n \"CURRENCY\": {\n \"SELECT\": {\n \"TITLE\": \"Valuta's\",\n \"CURRENCIES\": \"Bekende valuta's\",\n \"MEMBERS_COUNT\": \"{{membersCount}} leden\"\n },\n \"VIEW\": {\n \"TITLE\": \"Valuta\",\n \"TAB_CURRENCY\": \"Valuta\",\n \"TAB_WOT\": \"Gemeenschap\",\n \"TAB_NETWORK\": \"Netwerk\",\n \"CURRENCY_NAME\": \"Valuta naam\",\n \"MEMBERS\": \"Ledental\",\n \"MEMBERS_VARIATION\": \"Variatie since {{duration | formatDuration}}\",\n \"MONEY_DIVIDER\": \"Geld\",\n \"MASS\": \"Monetaire massa\",\n \"SHARE\": \"Aandeel per lid\",\n \"UD\": \"Universeel Dividend\",\n \"C_ACTUAL\": \"Huidige toename\",\n \"MEDIAN_TIME\": \"Blockchain tijd\",\n \"POW_MIN\": \"Algemene moeilijkheidsgraad\",\n \"MONEY_RULES_DIVIDER\": \"Monetaire regels\",\n \"C_RULE\": \"Toename\",\n \"UD_RULE\": \"Universeel dividend (formule)\",\n \"SIG_QTY_RULE\": \"Benodigd aantal certificaties om lid te worden\",\n \"SIG_STOCK\": \"Maximum aantal certificaties te versturen per lid\",\n \"SIG_PERIOD\": \"Minimum vertraging tussen 2 certificaties verzonden door één en dezelfde persoon.\",\n \"SIG_WINDOW\": \"Maximum vertraging voor een certificatie in behandeling wordt genomen\",\n \"STEP_MAX\": \"Maximum afstand tussen elk WoT lid en een nieuw lid.\",\n \"WOT_RULES_DIVIDER\": \"Lidmaatschapseisen\",\n \"XPERCENT\":\"Minimum percentage schildwachten te bereiken om de afstandsregel te respecteren\"\n }\n },\n \"NETWORK\": {\n \"VIEW\": {\n \"MEDIAN_TIME\": \"Blockchain tijd\",\n \"LOADING_PEERS\": \"Even geduld...\",\n \"NODE_ADDRESS\": \"Adres :\",\n \"ENDPOINTS\": {\n \"BMAS\": \"Endpoint (SSL)\",\n \"BMATOR\": \"Endpoint TOR\",\n \"ES_USER_API\": \"Knoop Cesium+\"\n }\n },\n \"INFO\": {\n \"ONLY_SSL_PEERS\": \"Les noeuds non SSL ont un affichage dégradé, car Cesium fonctionne en mode HTTPS.\"\n }\n },\n \"PEER\": {\n \"PEERS\": \"Knopen\",\n \"SIGNED_ON_BLOCK\": \"Getekend op blok\",\n \"MIRROR\": \"spiegel\",\n \"CURRENT_BLOCK\": \"Blok #\",\n \"VIEW\": {\n \"TITLE\": \"Knoop\",\n \"OWNER\": \"Maakt deel uit van\",\n \"SHOW_RAW_PEERING\": \"Zie netwerkdocument\",\n \"KNOWN_PEERS\": \"Bekende knopen :\",\n \"GENERAL_DIVIDER\": \"Algemene informatie\",\n \"ERROR\": {\n \"LOADING_TOR_NODE_ERROR\": \"Kan knooppunt niet worden opgehaald. De wachttijd wordt overschreden.\",\n \"LOADING_NODE_ERROR\": \"Kan knooppunt niet worden opgehaald\"\n }\n }\n },\n \"WOT\": {\n \"SEARCH_HELP\": \"Zoeken (lid of publieke sleutel)\",\n \"SEARCH_INIT_PHASE_WARNING\": \"Tijdens de pre-registratiefase, het zoeken van lopende registraties <b>kan lang</b> zijn. Dank je wel geduld...\",\n \"REGISTERED_SINCE\": \"Registratie\",\n \"REGISTERED_SINCE_BLOCK\": \"Geregistreerd op blok #\",\n \"NO_CERTIFICATION\": \"Geen gevalideerde certificaties\",\n \"NO_GIVEN_CERTIFICATION\": \"Geen uitgegeven certificaties\",\n \"NOT_MEMBER_PARENTHESIS\": \"(niet-lid)\",\n \"IDENTITY_REVOKED_PARENTHESIS\": \"(ingetrokken identiteit)\",\n \"MEMBER_PENDING_REVOCATION_PARENTHESIS\": \"(intrekking in behandeling)\",\n \"EXPIRE_IN\": \"Verloopt\",\n \"NOT_WRITTEN_EXPIRE_IN\": \"Uiterlijke<br/>behandeling\",\n \"EXPIRED\": \"Verlopen\",\n \"PSEUDO\": \"Pseudoniem\",\n \"SIGNED_ON_BLOCK\": \"Uitgegeven op block #{{block}}\",\n \"WRITTEN_ON_BLOCK\": \"Geschreven op block #{{block}}\",\n \"GENERAL_DIVIDER\": \"Algemene informatie\",\n \"NOT_MEMBER_ACCOUNT\": \"Simpele rekening (geen lid)\",\n \"NOT_MEMBER_ACCOUNT_HELP\": \"Dit is een eenvoudige rekening, zonder dat er een aanvraag voor lidmaatschap in de wacht wordt gezet.\",\n \"TECHNICAL_DIVIDER\": \"Technische informatie\",\n \"BTN_CERTIFY\": \"Certificeren\",\n \"BTN_YES_CERTIFY\": \"Ja, Certificeren\",\n \"BTN_SELECT_AND_CERTIFY\": \"Nieuwe certificatie\",\n \"ACCOUNT_OPERATIONS\": \"Operaties op de rekening\",\n \"VIEW\": {\n \"POPOVER_SHARE_TITLE\": \"Identiteit {{title}}\"\n },\n \"LOOKUP\": {\n \"TITLE\": \"Register\",\n \"NEWCOMERS\": \"Nieuwe leden:\",\n \"PENDING\": \"Aspirant leden:\",\n \"REGISTERED\": \"Geregistreerd {{sigDate | formatFromNow}}\",\n \"MEMBER_FROM\": \"Lid sinds {{memberDate|medianFromNowShort}}\",\n \"BTN_NEWCOMERS\": \"Nieuwste leden\",\n \"BTN_PENDING\": \"Registraties in afwachting\",\n \"SHOW_MORE\": \"Toon meer\",\n \"SHOW_MORE_COUNT\": \"(huidige limiet op {{limit}})\",\n \"NO_PENDING\": \"Er zijn geen registraties in afwachting gevonden.\",\n \"NO_NEWCOMERS\": \"Er zijn geen nieuwe leden gevonden.\"\n },\n \"MODAL\": {\n \"TITLE\": \"Zoeken\"\n },\n \"CERTIFICATIONS\": {\n \"TITLE\": \"{{uid}} - Certificaties\",\n \"SUMMARY\": \"Ontvangen certificaties\",\n \"LIST\": \"Details van ontvangen certificaties\",\n \"PENDING_LIST\": \"Certificaties in afwachting\",\n \"RECEIVED\": \"Ontvangen certificaties\",\n \"RECEIVED_BY\": \"Certificaties ontvanged door {{uid}}\",\n \"ERROR\": \"Ontvangen vertificaties met fout\",\n \"SENTRY_MEMBER\": \"Referent lid\"\n },\n \"GIVEN_CERTIFICATIONS\": {\n \"TITLE\": \"{{uid}} - Verzonden certificaties\",\n \"SUMMARY\": \"Verzonden certificaties\",\n \"LIST\": \"Details van verzonden certificaties\",\n \"PENDING_LIST\": \"Certificaties in afwachting\",\n \"SENT\": \"Verzonden certificaties\",\n \"SENT_BY\": \"Certificaties verzonden door {{uid}}\",\n \"ERROR\": \"Verzonden certificaties met fout\"\n }\n },\n \"LOGIN\": {\n \"TITLE\": \"<i class=\\\"icon ion-locked\\\"></i> Inloggen\",\n \"SALT\": \"Beveiligingszin\",\n \"SALT_HELP\": \"Zin ter beveiliging van je rekening\",\n \"SHOW_SALT\": \"Toon de beveiligingszin\",\n \"PASSWORD\": \"Wachtwoord\",\n \"PASSWORD_HELP\": \"Wachtwoord ter beveiliging van je rekening\",\n \"NO_ACCOUNT_QUESTION\": \"Nog geen rekening?\",\n \"CREATE_ACCOUNT\": \"Open een rekening\",\n \"FORGOTTEN_ID\": \"Wachtwoord vergeten?\"\n },\n \"ACCOUNT\": {\n \"TITLE\": \"Mijn rekening\",\n \"BALANCE\": \"Saldo\",\n \"LAST_TX\": \"Recente transacties\",\n \"BALANCE_ACCOUNT\": \"Rekeningsaldo\",\n \"NO_TX\": \"Geen transacties\",\n \"SHOW_MORE_TX\": \"Show more\",\n \"SHOW_ALL_TX\": \"Show all\",\n \"TX_FROM_DATE\": \"(huidige limiet op {{fromTime|medianFromNowShort}})\",\n \"PENDING_TX\": \"Transacties in afwachting\",\n \"ERROR_TX\": \"Niet uitgevoerde transacties\",\n \"ERROR_TX_SENT\": \"Verzonden transacties\",\n \"ERROR_TX_RECEIVED\": \"Ontvangen transacties\",\n \"EVENTS\": \"Gebeurtenissen\",\n \"WAITING_MEMBERSHIP\": \"Lidmaatschapsverzoek verzonden. In afwachting van validatie.\",\n \"WAITING_CERTIFICATIONS\": \"Je hebt {{needCertificationCount}} certificatie(s) nodig om lid te worden\",\n \"WILL_MISSING_CERTIFICATIONS\": \"Je heeft binnenkort <b>onvoldoende certificaties</b> (ten minste {{willNeedCertificationCount}} benodigd)\",\n \"WILL_NEED_RENEW_MEMBERSHIP\": \"Je lidmaatschap <b>gaat verlopen op {{membershipExpiresIn|formatDurationTo}}</b>. Vergeet niet <a ng-click=\\\"doQuickFix('renew')\\\">je lidmaatschap te vernieuwen</a> voor die tijd.\",\n \"CERTIFICATION_COUNT\": \"Aantal certificaties\",\n \"CERTIFICATION_COUNT_SHORT\": \"Certificaties\",\n \"SIG_STOCK\": \"Voorraad uit te geven certificaties\",\n \"BTN_RECEIVE_MONEY\": \"Ontvangen\",\n \"BTN_MEMBERSHIP_IN_DOTS\": \"Lidmaatschap aanvragen...\",\n \"BTN_MEMBERSHIP_RENEW\": \"Lidmaatschap verlengen\",\n \"BTN_MEMBERSHIP_RENEW_DOTS\": \"Lidmaatschap verlengen...\",\n \"BTN_MEMBERSHIP_OUT_DOTS\": \"Lidmaatschap opzeggen...\",\n \"BTN_SEND_IDENTITY_DOTS\": \"Identiteit publiceren...\",\n \"BTN_SECURITY_DOTS\": \"Rekening en veiligheid...\",\n \"BTN_SHOW_DETAILS\": \"Tonen technische informatie\",\n \"BTN_REVOKE\": \"Deze identiteit<span class='hidden-xs hidden-sm'> definitief</span> opzeggen...\",\n \"NEW\": {\n \"TITLE\": \"Registratie\",\n \"SLIDE_1_TITLE\": \"Selecteer een valuta:\",\n \"SLIDE_2_TITLE\": \"Soort rekening:\",\n \"MEMBER_ACCOUNT\": \"Persoonlijke rekening (lidmaatschap)\",\n \"MEMBER_ACCOUNT_HELP\": \"Als je nog niet als individu geregistreerd bent (één rekening per individu mogelijk).\",\n \"WALLET_ACCOUNT\": \"Eenvoudige portefeille\",\n \"WALLET_ACCOUNT_HELP\": \"Als je een onderneming, stichting etc. vertegenwoordigd of eenvoudigweg een additionele portefeille nodig hebt. Geen individueel universeel dividend zal door deze rekening gecréeerd worden.\",\n \"SALT_WARNING\": \"Kies een beveiligingszin.<br/>Deze heb je nodig voor ieder verbinding met je rekening.<br/><br/><b>Zorg dat je deze zin goed onthoud</b>.<br/>Eenmaal verloren, is er geen mogelijkheid om hem te achterhalen!\",\n \"PASSWORD_WARNING\": \"Kies een wachtwoord.<br/>Deze heb je nodig voor ieder verbinding met je rekening.<br/><br/><b>Zorg dat je dit woord goed onthoud</b>.<br/>Eenmaal verloren, is er geen mogelijkheid om hem te achterhalen!\",\n \"PSEUDO_WARNING\": \"Kies een pseudoniem.<br/>Het dient om makkelijker gevonden te worden door anderen.<br/><br/>.Gebruik van spaties, komma's en accenten is niet toegestaan.<br/><div class='hidden-xs'><br/>Voorbeeld: <span class='gray'>JulesDeelder, JohanVermeer, etc.</span>\",\n \"PSEUDO\": \"Pseudoniem\",\n \"PSEUDO_HELP\": \"joe123\",\n \"SALT_CONFIRM\": \"Bevestig\",\n \"SALT_CONFIRM_HELP\": \"Bevestig de beveiligingszin\",\n \"PASSWORD_CONFIRM\": \"Bevestig\",\n \"PASSWORD_CONFIRM_HELP\": \"Bevestig het wachtwoord\",\n \"SLIDE_6_TITLE\": \"Bevestiging:\",\n \"COMPUTING_PUBKEY\": \"Berekening...\",\n \"LAST_SLIDE_CONGRATULATION\": \"Bravo! Je hebt alle verplichte velden ingevuld.<br/>Je kunt je <b>rekeningaanvraag verzenden</b>.<br/><br/>Ter informatie, de publieke sleutel hieronder identificeert je toekomstige rekening.<br/>Je kunt deze aan derde partijen communiceren om geld te ontvangen. Zodra je rekening geopend is, kun je de sleutel terugvinden onder <b>{{'ACCOUNT.TITLE'|translate}}</b>.\",\n \"CONFIRMATION_MEMBER_ACCOUNT\": \"<b class=\\\"assertive\\\">Waarschuwing:</b> je beveiligingszin, wachtwoord en pseudoniem kunnen hierna niet gewijzigd worden.<br/><b>Zorg dat ze goed onthoudt!</b><br/><b>Weet je zeker</b> dat je je persoonlijke rekeningaanvraag wil verzenden?\",\n \"CONFIRMATION_WALLET_ACCOUNT\": \"<b class=\\\"assertive\\\">Waarschuwing:</b> je wachtwoord en pseudoniem kunnen hierna niet gewijzigd worden.<br/><b>Zorg dat ze goed onthoudt!</b><br/><b>Weet je zeker</b> dat je deze portefeilleaanvraag wil verzenden?\",\n \"PSEUDO_AVAILABLE\": \"Deze naam is beschikbaar\",\n \"PSEUDO_NOT_AVAILABLE\": \"Deze gebruikersnaam is niet beschikbaar\",\n \"INFO_LICENSE\": \"Om de valuta te sluiten, vragen wij u om te lezen en deze licentie te accepteren.\",\n \"BTN_ACCEPT\": \"Ik accepteer\",\n \"BTN_ACCEPT_LICENSE\": \"Ik ga akkoord met de licentie\"\n },\n \"POPUP_REGISTER\": {\n \"TITLE\": \"Voer een pseudoniem in\",\n \"HELP\": \"Een pseudoniem is nodig voor anderen om je te kunnen vinden.\"\n },\n \"FILE_NAME\": \"{{currency}} - Rekeningafschrift {{pubkey|formatPubkey}} {{currentTime|formatDateForFile}}.csv\",\n \"HEADERS\": {\n \"TIME\": \"Datum\",\n \"AMOUNT\": \"Bedrag\",\n \"COMMENT\": \"Commentaar\"\n }\n },\n \"TRANSFER\": {\n \"TITLE\": \"Overboeken\",\n \"SUB_TITLE\": \"Geld overboeken\",\n \"FROM\": \"Van\",\n \"TO\": \"Aan\",\n \"AMOUNT\": \"Bedrag\",\n \"AMOUNT_HELP\": \"Bedrag\",\n \"COMMENT\": \"Opmerking\",\n \"COMMENT_HELP\": \"Opmerking (optioneel)\",\n \"BTN_SEND\": \"Verzenden\",\n \"BTN_ADD_COMMENT\": \"Opmerking toevoegen\",\n \"WARN_COMMENT_IS_PUBLIC\": \"Houd er rekening mee dat <b>reacties openbaar zijn </b> (niet-versleuteld).\",\n \"MODAL\": {\n \"TITLE\": \"Overboeking\"\n }\n },\n \"ERROR\": {\n \"POPUP_TITLE\": \"Error\",\n \"UNKNOWN_ERROR\": \"Unknown error\",\n \"CRYPTO_UNKNOWN_ERROR\": \"Your browser is not compatible with cryptographic features.\",\n \"FIELD_REQUIRED\": \"This field is required.\",\n \"FIELD_TOO_SHORT\": \"Value is too short (min {{minLength]] characters).\",\n \"FIELD_TOO_SHORT_WITH_LENGTH\": \"This field value is too short.\",\n \"FIELD_TOO_LONG\": \"Value is exceeding max length.\",\n \"FIELD_TOO_LONG_WITH_LENGTH\": \"Value is too long (max {{maxLength}} characters).\",\n \"FIELD_ACCENT\": \"Commas and accent characters not allowed\",\n \"FIELD_NOT_NUMBER\": \"Value is not a number\",\n \"FIELD_NOT_INT\": \"Value is not an integer\",\n \"PASSWORD_NOT_CONFIRMED\": \"Must match previous password.\",\n \"SALT_NOT_CONFIRMED\": \"Must match previous phrase.\",\n \"SEND_IDENTITY_FAILED\": \"Error while trying to register.\",\n \"SEND_CERTIFICATION_FAILED\": \"Could not certify identity.\",\n \"NEED_MEMBER_ACCOUNT_TO_CERTIFY\": \"You could not send certification, because your account is <b>not a member account</b>.\",\n \"NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF\": \"You could not send certification now, because your are <b>not a member</b> yet.<br/><br/>You still need certification to become a member.\",\n \"IDENTITY_TO_CERTIFY_HAS_NO_SELF\": \"This account could not be certified. No registration found, or need to renew.\",\n \"LOGIN_FAILED\": \"Error while sign in.\",\n \"LOAD_IDENTITY_FAILED\": \"Could not load identity.\",\n \"LOAD_REQUIREMENTS_FAILED\": \"Could not load identity requirements.\",\n \"SEND_MEMBERSHIP_IN_FAILED\": \"Error while sending registration as member.\",\n \"SEND_MEMBERSHIP_OUT_FAILED\": \"Error while sending membership revocation.\",\n \"REFRESH_WALLET_DATA\": \"Could not refresh wallet.\",\n \"GET_CURRENCY_PARAMETER\": \"Could not get currency parameters.\",\n \"GET_CURRENCY_FAILED\": \"Could not load currency.\",\n \"SEND_TX_FAILED\": \"Could not send transaction.\",\n \"ALL_SOURCES_USED\": \"Please wait the next block computation (All transaction sources has been used).\",\n \"NOT_ENOUGH_SOURCES\": \"Not enough changes to send this amount in one time.<br/>Maximum amount: {{amount}} {{unit}}<sub>{{subUnit}}</sub>.\",\n \"ACCOUNT_CREATION_FAILED\": \"Error while creating your member account.\",\n \"RESTORE_WALLET_DATA_ERROR\": \"Error while reloading settings from local storage\",\n \"LOAD_WALLET_DATA_ERROR\": \"Error while loading wallet data.\",\n \"COPY_CLIPBOARD_FAILED\": \"Could not copy to clipboard\",\n \"TAKE_PICTURE_FAILED\": \"Could not get picture.\",\n \"SCAN_FAILED\": \"Could not scan QR code.\",\n \"SCAN_UNKNOWN_FORMAT\": \"Code not recognized.\",\n \"WOT_LOOKUP_FAILED\": \"Search failed.\",\n \"LOAD_PEER_DATA_FAILED\": \"Duniter peer not accessible. Please retry later.\",\n \"NEED_LOGIN_FIRST\": \"Please sign in first.\",\n \"AMOUNT_REQUIRED\": \"Amount is required.\",\n \"AMOUNT_NEGATIVE\": \"Negative amount not allowed.\",\n \"NOT_ENOUGH_CREDIT\": \"Not enough credit.\",\n \"INVALID_NODE_SUMMARY\": \"Unreachable peer or invalid address\",\n \"INVALID_USER_ID\": \"Field 'pseudonym' must not contains spaces or special characters.\",\n \"INVALID_COMMENT\": \"Field 'reference' has a bad format.\",\n \"INVALID_PUBKEY\": \"Public key has a bad format.\",\n \"IDENTITY_INVALID_BLOCK_HASH\": \"This membership application is no longer valid (because it references a block that network peers are cancelled): the person must renew its application for membership <b>before</b> being certified.\",\n \"IDENTITY_EXPIRED\": \"This identity has expired: this person must re-apply <b>before</b> being certified.\",\n \"IDENTITY_SANDBOX_FULL\": \"Could not register, because peer's sandbox is full.<br/><br/>Please retry later or choose another Duniter peer (in <b>Settings</b>).\",\n \"WOT_PENDING_INVALID_BLOCK_HASH\": \"Membership not valid.\",\n \"WALLET_INVALID_BLOCK_HASH\": \"Your membership application is no longer valid (because it references a block that network peers are cancelled).<br/>You must <a ng-click=\\\"doQuickFix('renew')\\\">renew your application for membership</a> to fix this issue.\",\n \"WALLET_IDENTITY_EXPIRED\": \"The publication of your identity <b>has expired</b>.<br/>You must <a ng-click=\\\"doQuickFix('fixIdentity')\\\">re-issue your identity</a> to resolve this issue.\",\n \"WALLET_HAS_NO_SELF\": \"Your identity must first have been published, and not expired.\",\n \"IDENTITY_ALREADY_CERTIFY\": \"You have <b>already certified</b> that identity.<br/><br/>Your certificate is still valid (expires {{expiresIn|formatDuration}}).\",\n \"IDENTITY_ALREADY_CERTIFY_PENDING\": \"You have <b>already certified</b> that identity.<br/><br/>Your certification is still pending (Deadline for treatment {{expiresIn|formatDuration}}).\",\n \"UNABLE_TO_CERTIFY_TITLE\": \"Unable to certify\",\n \"LOAD_NEWCOMERS_FAILED\": \"Unable to load new members.\",\n \"LOAD_PENDING_FAILED\": \"Unable to load pending registrations.\",\n \"ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION\": \"You must <b>be a member</b> in order to perform this action.\",\n \"ONLY_SELF_CAN_EXECUTE_THIS_ACTION\": \"You must have <b>published your identity</b> in order to perform this action.\",\n \"EXISTING_ACCOUNT\": \"Je gegevens komen overeen met een bestaande rekening, met de <a ng-click=\\\"showHelpModal('pubkey')\\\">publieke sleutel</a>:\",\n \"EXISTING_ACCOUNT_REQUEST\": \"Gelieve je gegevens te wijzigen zodat ze met een niet gebruikte rekening overeenkomen.\"\n },\n \"INFO\": {\n \"POPUP_TITLE\": \"Informatie\",\n \"CERTIFICATION_DONE\": \"Identiteit succesvol getekend\",\n \"NOT_ENOUGH_CREDIT\": \"Niet genoeg krediet\",\n \"TRANSFER_SENT\": \"Verzoek tot overboeken succesvol verzonden\",\n \"COPY_TO_CLIPBOARD_DONE\": \"Kopie geslaagd\",\n \"MEMBERSHIP_OUT_SENT\": \"Opzegging lidmaatschap succesvol verzonden\",\n \"NOT_NEED_MEMBERSHIP\": \"Je bent al lid.\",\n \"IDENTITY_WILL_MISSING_CERTIFICATIONS\": \"Deze identiteit heeft binnenkort onvoldoende certificaties (ten minste {{willNeedCertificationCount}} nodig).\",\n \"REVOCATION_SENT\": \"Intrekking succesvol verzonden\",\n \"REVOCATION_SENT_WAITING_PROCESS\": \"Intrekking <b>is succesvol verzonden</b>. Het wacht op verwerking.\",\n \"FEATURE_NOT_AVAILABLE_ON_DEMO\": \"Functionaliteit niet beschikbaar op deze demonstratiesite.<br/>Om <b>veiligheidsredenen</b> raden we u aan uw kopie van de software te <b>installeren</b>.<br/>Bezoek de website <a href='https://cesium.app'>www.cesium.app</a> voor hulp.\",\n \"EMPTY_TX_HISTORY\": \"Aucune operatie à exporteur\"\n },\n \"CONFIRM\": {\n \"POPUP_TITLE\": \"<b>Bevestiging</b>\",\n \"POPUP_WARNING_TITLE\": \"<b>Waarschuwing</b>\",\n \"CERTIFY_RULES_TITLE_UID\": \"Certificeer {{uid}}\",\n \"CERTIFY_RULES\": \"<b>Beveiligingswaarschuwing:</b><br/><br/><b class=\\\"assertive\\\">Certificeer een rekening niet</b> als je gelooft dat: <ul><li>1.) de aanvrager niet echt is.<li>2.) de aanvrager al een andere gecertificeerde rekening heeft.<li>3.) de aanvrager opzettelijk of door onzorgvuldigheid regel 1 of 2 overtreedt bij het verzenden van certificaten.</ul></small><br/>Weet je zeker dat je deze identieit wilt certificeren?\",\n \"TRANSFER\": \"<b>Samenvatting van de overboeking:</b><br/><br/><ul><li> - Van: <b>{{from}}</b></li><li> - Aan: <b>{{to}}</b></li><li> - Bedrag: <b>{{amount}} {{unit}}</b></li><li> - Opmerking: <i>{{comment}}</i></li></ul><br/><b>Weet je zeker dat je deze overboeking wil doen?</b>\",\n \"MEMBERSHIP_OUT\": \"<b>Waarschuwing</b>:<br/>Je staat op het punt je lidmaatschap te beëindigen. Dit kan <b>niet ongedaan</b> worden gemaakt.<br/></br/><b>Weet je zeker dat je door wil gaan?</b>\",\n \"LOGIN_UNUSED_WALLET_TITLE\": \"Typefout?\",\n \"LOGIN_UNUSED_WALLET\": \"Je bent ingelogged op een rekening die <b>inactief</b> lijkt te zijn.<br/><br/>Als deze rekening niet met de jouwe overeenkomt, komt dat waarschijnlijk door een <b>typefout</b> bij het inloggen.<br/><br/><b>Wilt u toch doorgaan met deze rekening?</b>\",\n \"FIX_IDENTITY\": \"De pseudoniem <b>{{uid}}</b> zal opnieuw gepubliceerd worden, waarmee de oude verlopen publicatie wordt vervangen.<br/></br/><bWeet je zeker</b> dat je door wil gaan?\",\n \"FIX_MEMBERSHIP\": \"Je verzoek to lidmaatschap zal verstuurd worden.<br/></br/><b>Weet je het zeker?</b>\",\n \"RENEW_MEMBERSHIP\": \"Je lidmaatschap zal verlengd worden.<br/></br/><b>Weet je het zeker?</b>\",\n \"REVOKE_IDENTITY\": \"<b>Beveiligingswaarschuwing:</b><br/>You will <b>definitely revoke this identity</b>.<br/><br/>The public key and the associated nickname <b>will never be used again</b> (for a member account).<br/></br/><b>Are you sure</b> you want to continue?\",\n \"REVOKE_IDENTITY_2\": \"Deze handeling is <b>niet terug te draaien</b>!<br/><br/><b>Weet je zeker</b> dat je door wil gaan?\",\n \"NOT_NEED_RENEW_MEMBERSHIP\": \"Je lidmaatschap hoeft niet verlengd te worden (het zal pas verlopen na {{membershipExpiresIn|formatDuration}}).<br/></br/><b>Weet je zeker</b> dat je een verlengingsaanvraag wil versturen?\",\n \"SAVE_BEFORE_LEAVE\": \"Wil je <b>je wijzigingen opslaan</b> voor je de pagina verlaat?\",\n \"SAVE_BEFORE_LEAVE_TITLE\": \"Wijzigingen niet opgeslagen\",\n \"LICENCE\": \"Ik heb gelezen en geaccepteerd de voorwaarden van de vergunning G1\"\n },\n \"DOWNLOAD\": {\n \"POPUP_TITLE\": \"<b>Intrekkingsdocument</b>\",\n \"POPUP_REVOKE_MESSAGE\": \"Om je rekening te beveiligen, download het <b>rekening intrekkingsdocument</b>. Dit heb je nodig om je rekening op te heffen (in het geval van diefstal, een verandering van ID, een ten onrechte gemaakte rekening, etc.).<br/><br/><b>Bewaar deze op een veilige plaats.</b>\"\n },\n \"HELP\": {\n \"TITLE\": \"Online help\",\n \"JOIN\": {\n \"SECTION\": \"Join\",\n \"SALT\": \"The protection phrase is very important. It is used to hash you password, which in turn is used to calculate your <span class=\\\"text-italic\\\">public account key</span> (its number) and the private key to access it. <b>Please remeber this phrase well</b>, because there is no way to recover it when lost. What's more, it cannot be changed without having to create a new account.<br/><br/>A good protection phrase must be sufficiently long (8 characters at the very least) and as original as possible.\",\n \"PASSWORD\": \"The password is very important. Together with the protection phrase, it is use to calculate your account number (public key) and the private key to access it. <b>Please remember it well</b>, because there is no way to recover it when lost. What's more, it cannot be changed without having to create a new account.<br/><br/>A good password is made (ideally) of at least 8 characters, with at least one capital and one number.\",\n \"PSEUDO\": \"A pseudonym is used only when joining as <span class=\\\"text-italic\\\">member</span>. It is always associated with a wallet (by its <span class=\\\"text-italic\\\">public key</span>). It is published on the network so that other users may identify it, certify or send money to the account. A pseudonym must be unique among all members (current and past).\"\n },\n \"GLOSSARY\": {\n \"SECTION\": \"Glossary\",\n \"PUBKEY_DEF\": \"Een publieke sleutel identificeert altijd een portemonnee. Het kan een lid identificeren. In Cesium wordt berekend met de geheime ID en wachtwoord.\",\n \"MEMBER\": \"Member\",\n \"MEMBER_DEF\": \"A member is a real and living human, wishing to participate freely to the monitary community. The member will receive universal dividend, according to the period and amount as defined in the <span class=\\\"text-italic\\\">currency parameters</span>.\",\n \"CURRENCY_RULES\": \"Currency rules\",\n \"CURRENCY_RULES_DEF\": \"The currency rules are defined only once, and for all. They set the parameters under which the currency will perform: universal dividend calculation, the amount of certifications needed to become a member, the maximum amount of certifications a member can send, etc.<br/><br/>The parameters cannot be modified because of the use of a <span class=\\\"text-italic\\\">Blockchain</span> which carries and executes these rules, and constantly verifies their correct application. <a href=\\\"#/app/currency\\\">See current parameters</a>.\",\n \"BLOCKCHAIN\": \"Blockchain\",\n \"BLOCKCHAIN_DEF\": \"The Blockchain is a decentralised system which, in case of Duniter, serves to carry and execute the <span class=\\\"text-italic\\\">currency rules</span>.<br/><a href=\\\"http://en.duniter.org/presentation/\\\" target=\\\"_blank\\\">Read more about Duniter</a> and the working of its blockchain.\",\n \"UNIVERSAL_DIVIDEND_DEF\": \"The Universal Dividend (UD) is the quantity of money co-created by each member, according to the period and the calculation defined in the <span class=\\\"text-italic\\\">currency rules</span>.<br/>Every term, the members receive an equal amount of new money on their account.<br/><br/>The UD undergoes a steady growth, to remain fair under its members (current and future), calculated by an average life expectancy, as demonstrated in the Relative Theory of Money (RTM).<br/><a href=\\\"http://trm.creationmonetaire.info\\\" target=\\\"_system\\\">Read more about RTM</a> and open money.\"\n },\n \"TIP\": {\n \"MENU_BTN_CURRENCY\": \"Menu <b>{{'MENU.CURRENCY'|translate}}</b> allows discovery of <b>currency parameters</b> and its state.\",\n \"CURRENCY_WOT\": \"The <b>member count</b> shows the <b>community's weight and evolution</b>.\",\n \"CURRENCY_MASS\": \"Shown here is the <b>total amount</b> currently in circulation and its <b>average distribution</b> per member.<br/><br/>This allows to estimate the <b>worth of any amount</b>, in respect to what <b>others own</b> on their account (on average).\",\n \"CURRENCY_UNIT_RELATIVE\": \"The unit used here (&ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;) signifies that the amounts in {{currency|capitalize}} have been devided by the <b>Universal Dividend</b> (UD).<br/><br/><small>This relative unit is <b>relevant</b> because it is stable in contrast to the permanently growing monitary mass.</small>\",\n \"CURRENCY_CHANGE_UNIT\": \"This button allows to <b>switch the unit</b> to show amounts in <b>{{currency|capitalize}}</b>, undevided by the Universal Dividend (instead of in &ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;).\",\n \"CURRENCY_CHANGE_UNIT_TO_RELATIVE\": \"This button allows to <b>switch the unit</b> to show amounts in &ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;, which is relative to the Universal Dividend (the amount co-produced by each member).\",\n \"CURRENCY_RULES\": \"The <b>rules</b> of the currency determine its <b>exact and predictible</b> performance.<br/><br/>As a true DNA of the currency these rules make the monetary code <b>transparent and understandable</b>.\",\n \"NETWORK_BLOCKCHAIN\": \"All monetary transactions are recoded in a <b>public and tamper proof</b> ledger, generally referred to as the <b>blockchain</b>.\",\n \"NETWORK_PEERS\": \"The <b>peers</b> shown here correspond to <b>computers that update and check</b> the blockchain.<br/><br/>The more active peers there are, the more <b>decentralised</b> and therefore trustworhty the currency becomes.\",\n \"NETWORK_PEERS_BLOCK_NUMBER\": \"This <b>number</b> indicates the peer's <b>latest validated block</b> (last page written in the ledger).<br/><br/>Green indicates that the block was equally validated by the <b>majority of other peers</b>.\",\n \"NETWORK_PEERS_PARTICIPATE\": \"<b>Each member</b>, equiped with a computer with Internet, <b>can participate, adding a peer</b> simply by <b>installing the Duniter software</b> (free/libre and open source). <a href=\\\"{{installDocUrl}}\\\" target=\\\"_system\\\">Read the installation manual &gt;&gt;</a>.\",\n \"MENU_BTN_ACCOUNT\": \"<b>{{'ACCOUNT.TITLE'|translate}}</b> allows access to your account balance and transaction history.\",\n \"MENU_BTN_ACCOUNT_MEMBER\": \"Here you can consult your account status, transaction history and your certifications.\",\n \"WALLET_CERTIFICATIONS\": \"Click here to reveiw the details of your certifications (given and received).\",\n \"WALLET_BALANCE\": \"Your account <b>balance</b> is shown here.\",\n \"WALLET_BALANCE_RELATIVE\": \"{{'HELP.TIP.WALLET_BALANCE'|translate}}<br/><br/>The used unit (&ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;) signifies that the amount in {{currency|capitalize}} has been divided by the <b>Universal Dividend</b> (UD) co-created by each member.<br/>At this moment, 1 UD equals {{currentUD}} {{currency|capitalize}}.\",\n \"WALLET_BALANCE_CHANGE_UNIT\": \"You can <b>change the unit</b> in which amounts are shown in <b><i class=\\\"icon ion-android-settings\\\"></i>&nbsp;{{'MENU.SETTINGS'|translate}}</b>.<br/><br/>For example, to display amounts <b>directly in {{currency|capitalize}}</b> instead of relative amounts.\",\n \"WALLET_SEND\": \"Issue a payment in just a few clicks.\",\n \"WALLET_SEND_NO_MONEY\": \"Issue a payment in just a few clicks.<br/>(Your balance does not allow this yet)\",\n \"WALLET_OPTIONS\": \"Please note that this button allows access to <b>other, less used actions</b>.<br/><br/>Don't forget to take a quick look, when you have a moment!\",\n \"WALLET_RECEIVED_CERTS\": \"This shows the list of persons that certified you.\",\n \"WALLET_CERTIFY\": \"The button <b>{{'WOT.BTN_SELECT_AND_CERTIFY'|translate}}</b> allows selecting an identity and certifying it.<br/><br/>Only users that are <b>already member</b> may certify others.\",\n \"WALLET_CERT_STOCK\": \"Your supply of certifications (to send) is limited to <b>{{sigStock}} certifications</b>.<br/><br/>This supply will replete itself over time, as and when earlier certifications expire.\",\n \"MENU_BTN_WOT\": \"The menu <b>{{'MENU.WOT'|translate}}</b> allows searching <b>users</b> of the currency (member or not).\",\n \"WOT_SEARCH_TEXT_XS\": \"To search in the registry, type the <b>first letters of a users pseudonym or public key</b>.<br/><br/>The search will start automatically.\",\n \"WOT_SEARCH_TEXT\": \"To search in the registry, type the <b>first letters of a users pseudonym or public key</b>.<br/><br/>Then hit <b>Enter</b> to start the search.\",\n \"WOT_SEARCH_RESULT\": \"Simply click a user row to view the details sheet.\",\n \"WOT_VIEW_CERTIFICATIONS\": \"The row <b>{{'ACCOUNT.CERTIFICATION_COUNT'|translate}}</b> shows how many members members validated this identity.<br/><br/>These certifications testify that the account belongs to <b>a living human</b> and this person has <b>no other member account</b>.\",\n \"WOT_VIEW_CERTIFICATIONS_COUNT\": \"There are at least <b>{{sigQty}} certifications</b> needed to become a member and receive the <b>Universal Dividend</b>.\",\n \"WOT_VIEW_CERTIFICATIONS_CLICK\": \"Click here to open <b>a list of all certifications</b> given to and by this identity.\",\n \"WOT_VIEW_CERTIFY\": \"The button <b>{{'WOT.BTN_CERTIFY'|translate}}</b> allows to add your certification to this identity.\",\n \"CERTIFY_RULES\": \"<b>Attention:</b> Only certify <b>real and living persons</b> that do not own any other certified account.<br/><br/>The trust carried by the currency depends on each member's vigilance!\",\n \"MENU_BTN_SETTINGS\": \"The <b>{{'MENU.SETTINGS'|translate}}</b> allow you to configure the Cesium application.<br/><br/>For example, you can <b>change the unit</b> in which the currency will be shown.\",\n \"HEADER_BAR_BTN_PROFILE\": \"Click here to access your <b>user profile</b>\",\n \"SETTINGS_CHANGE_UNIT\": \"You can <b>change the display unit</b> of amounts by clicking here.<br/><br/>- Deactivate the option to show amounts in {{currency|capitalize}}.<br/>- Activate the option for relative amounts in {{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub> (<b>divided</b> by the current Universal Dividend).\",\n \"END_LOGIN\": \"This guided visit has <b>ended</b>.<br/><br/>Welcome to the <b>free economy</b>!\",\n \"END_NOT_LOGIN\": \"This guided visit has <b>ended</b>.<br/><br/>If you wish to join the currency {{currency|capitalize}}, simply click <b>{{'LOGIN.CREATE_ACCOUNT'|translate}}</b> below.\"\n }\n }\n}\n);\n}]);\n","\nangular.module('cesium.plugins', [\n /* -- Generated plugin's modules -- */\n\n 'cesium.plugins.translations',\n 'cesium.plugins.templates',\n\n /* -- Plugins -- */\n\n // Graph plugin:\n // removeIf(ubuntu)\n // Graph should be disable for Ubuntu build - see issue #463\n 'cesium.graph.plugin',\n // endRemoveIf(ubuntu)\n\n // RML9 plugin:\n //'cesium.rml9.plugin',\n\n // ES plugin (Cesium+):\n 'cesium.es.plugin',\n\n // Map plugin (Cesium+):\n 'cesium.map.plugin'\n ])\n;\n","angular.module(\"cesium.plugins.translations\", []).config([\"$translateProvider\", function($translateProvider) {\n$translateProvider.translations(\"en-GB\", {\n \"COMMON\": {\n \"CATEGORY\": \"Category\",\n \"CATEGORIES\": \"Categories\",\n \"CATEGORY_SEARCH_HELP\": \"Search\",\n \"COMMENT_HELP\": \"Comments\",\n \"LAST_MODIFICATION_DATE\": \"Updated on \",\n \"SUBMIT_BY\": \"Submitted by\",\n \"BTN_LIKE\": \"I like\",\n \"BTN_LIKE_REMOVE\": \"I don't like anymore\",\n \"LIKES_TEXT\": \"{{total}} {{total > 1 ? 'people' : 'person'}} liked this page\",\n \"ABUSES_TEXT\": \"{{total}} {{total > 1 ? 'people' : 'person'}} reported a problem on this page\",\n \"BTN_REPORT_ABUSE_DOTS\": \"Report a problem or an abuse...\",\n \"BTN_REMOVE_REPORTED_ABUSE\": \"Cancel my problem report\",\n \"BTN_PUBLISH\": \"Publish\",\n \"BTN_PICTURE_DELETE\": \"Delete\",\n \"BTN_PICTURE_FAVORISE\": \"Default\",\n \"BTN_PICTURE_ROTATE\": \"Rotate\",\n \"BTN_ADD_PICTURE\": \"Add picture\",\n \"NOTIFICATION\": {\n \"TITLE\": \"New notification | {{'COMMON.APP_NAME'|translate}}\",\n \"HAS_UNREAD\": \"You have {{count}} unread notification{{count>0?'s':''}}\"\n },\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Notifications\",\n \"MARK_ALL_AS_READ\": \"Mark all as read\",\n \"NO_RESULT\": \"No notification\",\n \"SHOW_ALL\": \"Show all\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Could not load notifications\"\n },\n \"REPORT_ABUSE\": {\n \"TITLE\": \"Report a problem\",\n \"SUB_TITLE\": \"Please explain briefly the problem:\",\n \"REASON_HELP\": \"I explain the problem...\",\n \"ASK_DELETE\": \"Request removal?\",\n \"CONFIRM\": {\n \"SENT\": \"Request sent. Thnak you!\"\n }\n }\n },\n \"MENU\": {\n \"REGISTRY\": \"Pages\",\n \"USER_PROFILE\": \"My Profile\",\n \"MESSAGES\": \"Messages\",\n \"NOTIFICATIONS\": \"Notifications\",\n \"INVITATIONS\": \"Invitations\"\n },\n \"ACCOUNT\": {\n \"NEW\": {\n \"ORGANIZATION_ACCOUNT\": \"Account for an organization\",\n \"ORGANIZATION_ACCOUNT_HELP\": \"If you represent a company, association, etc.<br/>No universal dividend will be created by this account.\"\n },\n \"EVENT\": {\n \"MEMBER_WITHOUT_PROFILE\": \"You can <a ui-sref=\\\"app.edit_profile\\\">fill your Cesium+ profile</a> (optional) to provide better visibility of your account. This profile will be stored in <b>a directory independent</b> of the currency, but decentralized.\"\n },\n \"ERROR\": {\n \"WS_CONNECTION_FAILED\": \"Cesium can not receive notifications because of a technical error (connection to the Cesium + data node).<br/><br/>If the problem persists, please <b>choose another data node</b> in Cesium+ settings.\"\n }\n },\n \"WOT\": {\n \"BTN_SUGGEST_CERTIFICATIONS_DOTS\": \"Suggest identities to certify...\",\n \"BTN_ASK_CERTIFICATIONS_DOTS\": \"Ask members to certify me...\",\n \"BTN_ASK_CERTIFICATION\": \"Ask a certification\",\n \"SUGGEST_CERTIFICATIONS_MODAL\": {\n \"TITLE\": \"Suggest certifications\",\n \"HELP\": \"Select your suggestions\"\n },\n \"ASK_CERTIFICATIONS_MODAL\": {\n \"TITLE\": \"Ask certifications\",\n \"HELP\": \"Select recipients\"\n },\n \"SEARCH\": {\n \"DIVIDER_PROFILE\": \"Accounts\",\n \"DIVIDER_PAGE\": \"Pages\",\n \"DIVIDER_GROUP\": \"Groups\"\n },\n \"CONFIRM\": {\n \"SUGGEST_CERTIFICATIONS\": \"Are you sure you want <b>to send these certification suggestions</b>?\",\n \"ASK_CERTIFICATION\": \"Are you sure you want to <b>send a certification request</b>?\",\n \"ASK_CERTIFICATIONS\": \"Are you sure you want to <b>send a certification request</b> to these people?\"\n }\n },\n \"INVITATION\": {\n \"TITLE\": \"Invitations\",\n \"NO_RESULT\": \"No invitation received\",\n \"BTN_DELETE_ALL\": \"Delete all invitations\",\n \"BTN_DELETE\": \"Delete invitation\",\n \"BTN_NEW_INVITATION\": \"New invitation\",\n \"ASK_CERTIFICATION\": \"<a href=\\\"#/app/wot/{{pubkey}}/{{::uid}}\\\">{{::name||uid}}</a> asks for your certification\",\n \"SUGGESTION_CERTIFICATION\": \"<a href=\\\"#/app/wot/{{::pubkey}}/{{::uid}}\\\">{{::name||uid}}</a> is suggested for certification\",\n \"SUGGESTED_BY\": \"Suggestion sent by <a class=\\\"positive\\\" href=\\\"#/app/wot/{{::issuer.pubkey}}/{{::issuer.uid}}\\\">{{::issuer.name||issuer.uid}}</a>\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Invitations\"\n },\n \"LIST\": {\n \"TITLE\": \"Invitations\"\n },\n \"NEW\": {\n \"TITLE\": \"New invitation\",\n \"RECIPIENTS\": \"A\",\n \"RECIPIENTS_HELP\": \"Recipients of the invitation\",\n \"RECIPIENTS_MODAL_TITLE\": \"Recipients\",\n \"RECIPIENTS_MODAL_HELP\": \"Please choose recipients:\",\n \"SUGGESTION_IDENTITIES\": \"Suggestions for certification\",\n \"SUGGESTION_IDENTITIES_HELP\": \"Certifications to suggest\",\n \"SUGGESTION_IDENTITIES_MODAL_TITLE\": \"Suggestions\",\n \"SUGGESTION_IDENTITIES_MODAL_HELP\": \"Please choose your suggestions:\"\n },\n \"CONFIRM\": {\n \"DELETE_ALL_CONFIRMATION\": \"Removing invitations is <b>an irreversible operation</b>.<br/><br/><b>Are you sure</b> you want to continue\",\n \"SEND_INVITATIONS_TO_CERTIFY\": \"<b>Are you sure</b> you want <b>to sent this invitation to certify</b> ?\"\n },\n \"INFO\": {\n \"INVITATION_SENT\": \"Invitation sent\"\n },\n \"ERROR\": {\n \"LOAD_INVITATIONS_FAILED\": \"Error while loading invitations\",\n \"REMOVE_INVITATION_FAILED\": \"Error while deleting the invitation\",\n \"REMOVE_ALL_INVITATIONS_FAILED\": \"Error while deleting invitations\",\n \"SEND_INVITATION_FAILED\": \"Error while sending invitation\",\n \"BAD_INVITATION_FORMAT\": \"<span class=\\\"assertive\\\"><i class=\\\"ion-close-circled\\\"></i> Invitation unreadable (format unknown)</span> - sent by <a ui-sref=\\\"app.wot_identity({pubkey: '{{::pubkey}}', uid: '{{::uid}}' })\\\">{{::name||uid}}</a>\"\n }\n },\n \"COMMENTS\": {\n \"DIVIDER\": \"Comments\",\n \"SHOW_MORE_COMMENTS\": \"Show previous comments\",\n \"COMMENT_HELP\": \"Your comment, question...\",\n \"COMMENT_HELP_REPLY_TO\": \"Your answer...\",\n \"BTN_SEND\": \"Send\",\n \"POPOVER_SHARE_TITLE\": \"Message #{{number}}\",\n \"REPLY\": \"Reply\",\n \"REPLY_TO\": \"Respond to:\",\n \"REPLY_TO_LINK\": \"In response to \",\n \"REPLY_TO_DELETED_COMMENT\": \"In response to a deleted comment\",\n \"REPLY_COUNT\": \"{{replyCount}} responses\",\n \"DELETED_COMMENT\": \"Comment deleted\",\n \"MODIFIED_ON\": \"modified on {{time|formatDate}}\",\n \"MODIFIED_PARENTHESIS\": \"(modified then)\",\n \"ERROR\": {\n \"FAILED_SAVE_COMMENT\": \"Saving comment failed\",\n \"FAILED_REMOVE_COMMENT\": \"Deleting comment failed\"\n }\n },\n \"MESSAGE\": {\n \"REPLY_TITLE_PREFIX\": \"Re: \",\n \"FORWARD_TITLE_PREFIX\": \"Fw: \",\n \"BTN_REPLY\": \"Reply\",\n \"BTN_COMPOSE\": \"New message\",\n \"BTN_WRITE\": \"Write\",\n \"NO_MESSAGE_INBOX\": \"No message received\",\n \"NO_MESSAGE_OUTBOX\": \"No message sent\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Messages\",\n \"MESSAGE_RECEIVED\": \"You <b>received a message</b><br/>from\"\n },\n \"LIST\": {\n \"INBOX\": \"Inbox\",\n \"OUTBOX\": \"Outbox\",\n \"LAST_INBOX\": \"New messages\",\n \"LAST_OUTBOX\": \"Sent messages\",\n \"BTN_LAST_MESSAGES\": \"Recent messages\",\n \"TITLE\": \"Private messages\",\n \"SEARCH_HELP\": \"Search in messages\",\n \"POPOVER_ACTIONS\": {\n \"TITLE\": \"Options\",\n \"DELETE_ALL\": \"Delete all messages\"\n }\n },\n \"COMPOSE\": {\n \"TITLE\": \"New message\",\n \"TITLE_REPLY\": \"Reply\",\n \"SUB_TITLE\": \"New message\",\n \"TO\": \"To\",\n \"OBJECT\": \"Object\",\n \"OBJECT_HELP\": \"Object\",\n \"ENCRYPTED_HELP\": \"Please note this message will be encrypted before sending so that only the recipient can read it and be sure you are the author.\",\n \"MESSAGE\": \"Message\",\n \"MESSAGE_HELP\": \"Message content\",\n \"CONTENT_CONFIRMATION\": \"No message content.<br/><br/>Are your sure you want to send this message?\"\n },\n \"VIEW\": {\n \"TITLE\": \"Message\",\n \"SENDER\": \"Sent by\",\n \"RECIPIENT\": \"Sent to\",\n \"NO_CONTENT\": \"Empty message\",\n \"DELETE\": \"Delete the message\"\n },\n \"CONFIRM\": {\n \"REMOVE\": \"Are you sure you want to <b>delete this message</b>?<br/><br/> This operation is irreversible.\",\n \"REMOVE_ALL\": \"Are you sure you want to <b>delete all messages</b>?<br/><br/> This operation is irreversible.\",\n \"MARK_ALL_AS_READ\": \"Are you sure you want to <b>mark all message as read</b>?\",\n \"USER_HAS_NO_PROFILE\": \"This identity has no Cesium + profile. It may not use the Cesium + extension, so it <b>will not read your message</b>.<br/><br/>Are you sure you want <b>to continue</b>?\"\n },\n \"INFO\": {\n \"MESSAGE_REMOVED\": \"Message successfully deleted\",\n \"All_MESSAGE_REMOVED\": \"Messages successfully deleted\",\n \"MESSAGE_SENT\": \"Message sent\"\n },\n \"ERROR\": {\n \"SEND_MSG_FAILED\": \"Error while sending message.\",\n \"LOAD_MESSAGES_FAILED\": \"Error while loading messages.\",\n \"LOAD_MESSAGE_FAILED\": \"Error while loading message.\",\n \"MESSAGE_NOT_READABLE\": \"Unable to read message.\",\n \"USER_NOT_RECIPIENT\": \"You are not the recipient of this message: unable to read it.\",\n \"NOT_AUTHENTICATED_MESSAGE\": \"The authenticity of the message is not certain or its content is corrupted.\",\n \"REMOVE_MESSAGE_FAILED\": \"Error while deleting message\",\n \"MESSAGE_CONTENT_TOO_LONG\": \"Value too long ({{maxLength}} characters max).\",\n \"MARK_AS_READ_FAILED\": \"Unable to mark the message as 'read'.\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Error while loading messages notifications.\",\n \"REMOVE_All_MESSAGES_FAILED\": \"Error while removing all messages.\",\n \"MARK_ALL_AS_READ_FAILED\": \"Error while marking messages as read.\",\n \"RECIPIENT_IS_MANDATORY\": \"Recipient is mandatory.\"\n }\n },\n \"BLOCKCHAIN\": {\n \"LOOKUP\": {\n \"SEARCH_HELP\": \"Block number, hash...\",\n \"POPOVER_FILTER_TITLE\": \"Filter\",\n \"HEADER_MEDIAN_TIME\": \"Date / Time\",\n \"HEADER_BLOCK\": \"Block #\",\n \"HEADER_ISSUER\": \"Peer owner\",\n \"BTN_LAST\": \"Last blocks\",\n \"DISPLAY_QUERY\": \"View query\",\n \"HIDE_QUERY\": \"Hide query\",\n \"TX_SEARCH_FILTER\": {\n \"MEMBER_FLOWS\": \"<b class=\\\"ion-person\\\"></b> Members input/output\",\n \"EXISTING_TRANSACTION\": \"<b class=\\\"ion-card\\\"></b> Having transactions\",\n \"PERIOD\": \"<b class=\\\"ion-clock\\\"></b> Between <b class=\\\"gray\\\">{{params[1]|medianDateShort}}</b> ({{params[1]|medianTime}}) and <b class=\\\"gray\\\">{{params[2]|medianDateShort}}</b> ({{params[2]|medianTime}})\",\n \"ISSUER\": \"<b class=\\\"ion-android-desktop\\\"></b> Computed by {{params[1]|formatPubkey}}\",\n \"TX_PUBKEY\": \"<b class=\\\"ion-card\\\"></b> Transactions concerning <b class=\\\"ion-key\\\"></b> {{params[1]|formatPubkey}}\"\n }\n },\n \"ERROR\": {\n \"SEARCH_BLOCKS_FAILED\": \"Error while searching blocks.\"\n }\n },\n \"REGISTRY\": {\n \"CATEGORY\": \"Main activity\",\n \"GENERAL_DIVIDER\": \"Basic information\",\n \"LOCATION_DIVIDER\": \"Address\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Social networks, web sites\",\n \"TECHNICAL_DIVIDER\": \"Technical data\",\n \"BTN_SHOW_WOT\": \"People\",\n \"BTN_SHOW_WOT_HELP\": \"Search for people\",\n \"BTN_SHOW_PAGES\": \"Pages\",\n \"BTN_SHOW_PAGES_HELP\": \"Search for pages\",\n \"BTN_NEW\": \"New page\",\n \"MY_PAGES\": \"My pages\",\n \"NO_PAGE\": \"No page\",\n \"SEARCH\": {\n \"TITLE\": \"Pages\",\n \"SEARCH_HELP\": \"What, Who: hairdresser, Lili's restaurant, ...\",\n \"BTN_ADD\": \"New\",\n \"BTN_LAST_RECORDS\": \"Recent pages\",\n \"BTN_ADVANCED_SEARCH\": \"Advanced search\",\n \"BTN_OPTIONS\": \"Advanced search\",\n \"TYPE\": \"Kind of organization\",\n \"LOCATION_HELP\": \"Where: City, Country\",\n \"RESULTS\": \"Results\",\n \"RESULT_COUNT_LOCATION\": \"{{count}} result{{count>0?'s':''}}, near {{location}}\",\n \"RESULT_COUNT\": \"{{count}} result{{count>0?'s':''}}\",\n \"LAST_RECORDS\": \"Recent pages\",\n \"LAST_RECORD_COUNT_LOCATION\": \"{{count}} recent page{{count>0?'s':''}}, near {{location}}\",\n \"LAST_RECORD_COUNT\": \"{{count}} recent page{{count>0?'s':''}}\",\n \"POPOVER_FILTERS\": {\n \"BTN_ADVANCED_SEARCH\": \"Advanced options?\"\n }\n },\n \"VIEW\": {\n \"TITLE\": \"Registry\",\n \"CATEGORY\": \"Main activity:\",\n \"LOCATION\": \"Address:\",\n \"MENU_TITLE\": \"Options\",\n \"POPOVER_SHARE_TITLE\": \"{{title}}\",\n \"REMOVE_CONFIRMATION\" : \"Are you sure you want to delete this reference?<br/><br/>This is irreversible.\"\n },\n \"TYPE\": {\n \"TITLE\": \"New page\",\n \"SELECT_TYPE\": \"Kind of organization:\",\n \"ENUM\": {\n \"SHOP\": \"Local shops\",\n \"COMPANY\": \"Company\",\n \"ASSOCIATION\": \"Association\",\n \"INSTITUTION\": \"Institution\"\n }\n },\n \"EDIT\": {\n \"TITLE\": \"Edit\",\n \"TITLE_NEW\": \"New page\",\n \"RECORD_TYPE\":\"Kind of organization\",\n \"RECORD_TITLE\": \"Name\",\n \"RECORD_TITLE_HELP\": \"Name\",\n \"RECORD_DESCRIPTION\": \"Description\",\n \"RECORD_DESCRIPTION_HELP\": \"Describe activity\",\n \"RECORD_ADDRESS\": \"Street\",\n \"RECORD_ADDRESS_HELP\": \"Street, building...\",\n \"RECORD_CITY\": \"City\",\n \"RECORD_CITY_HELP\": \"City, Country\",\n \"RECORD_SOCIAL_NETWORKS\": \"Social networks and web site\",\n \"RECORD_PUBKEY\": \"Public key\",\n \"RECORD_PUBKEY_HELP\": \"Public key to receive payments\"\n },\n \"WALLET\": {\n \"PAGE_DIVIDER\": \"Pages\",\n \"PAGE_DIVIDER_HELP\": \"Pages refer to activities accepting money or promoting it: local shops, companies, associations, institutions. They are stored outside the currency network, in <a ui-sref=\\\"app.es_network\\\">the Cesium+ network</a>.\"\n },\n \"ERROR\": {\n \"LOAD_CATEGORY_FAILED\": \"Loading main activities failed\",\n \"LOAD_RECORD_FAILED\": \"Loading failed\",\n \"LOOKUP_RECORDS_FAILED\": \"Error while loading records.\",\n \"REMOVE_RECORD_FAILED\": \"Deleting failed\",\n \"SAVE_RECORD_FAILED\": \"Saving failed\",\n \"RECORD_NOT_EXISTS\": \"Record not found\",\n \"GEO_LOCATION_NOT_FOUND\": \"City or zip code not found\"\n },\n \"INFO\": {\n \"RECORD_REMOVED\" : \"Page successfully deleted\",\n \"RECORD_SAVED\": \"Page successfully saved\"\n }\n },\n \"PROFILE\": {\n \"PROFILE_DIVIDER\": \"Cesium+ profile\",\n \"PROFILE_DIVIDER_HELP\": \"These are ancillary data, stored outside the currency network, in <a ui-sref=\\\"app.es_network\\\">the Cesium+ network</a>.\",\n \"NO_PROFILE_DEFINED\": \"No Cesium+ profile\",\n \"BTN_ADD\": \"Create my profile\",\n \"BTN_EDIT\": \"Edit my profile\",\n \"BTN_DELETE\": \"Delete my profile\",\n \"BTN_REORDER\": \"Reorder\",\n \"UID\": \"Pseudonym\",\n \"TITLE\": \"Lastname, FirstName\",\n \"TITLE_HELP\": \"Name\",\n \"DESCRIPTION\": \"About me\",\n \"DESCRIPTION_HELP\": \"About me...\",\n \"SOCIAL_HELP\": \"http://...\",\n \"GENERAL_DIVIDER\": \"General data\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Social networks and web site\",\n \"TECHNICAL_DIVIDER\": \"Technical data\",\n \"MODAL_AVATAR\": {\n \"TITLE\": \"Avatar\",\n \"SELECT_FILE_HELP\": \"<b>Choose an image file</b>:\",\n \"BTN_SELECT_FILE\": \"Choose an image\",\n \"RESIZE_HELP\": \"<b>Re-crop the image</b> if necessary. A click on the image allows to move it. Click on the area at the bottom left to zoom in.\",\n \"RESULT_HELP\": \"<b>Here is the result</b> as seen on your profile:\"\n },\n \"CONFIRM\": {\n \"DELETE\": \"Are you sure you want to <b>delete your Cesium+ profile ?</b><br/><br/>This operation is irreversible.\"\n },\n \"ERROR\": {\n \"REMOVE_PROFILE_FAILED\": \"Deleting profile failed\",\n \"LOAD_PROFILE_FAILED\": \"Could not load user profile.\",\n \"SAVE_PROFILE_FAILED\": \"Saving profile failed\",\n \"INVALID_SOCIAL_NETWORK_FORMAT\": \"Invalid format: please fill a valid Internet address.<br/><br/>Examples :<ul><li>- A Facebook page (https://www.facebook.com/user)</li><li>- A web page (http://www.domain.com)</li><li>- An email address (joe@dalton.com)</li></ul>\",\n \"IMAGE_RESIZE_FAILED\": \"Error while resizing picture\"\n },\n \"INFO\": {\n \"PROFILE_REMOVED\": \"Profile deleted\",\n \"PROFILE_SAVED\": \"Profile saved\"\n },\n \"HELP\": {\n \"WARNING_PUBLIC_DATA\": \"Please note that the information published here <b>is public</b>: visible including by <b>not logged in people</b>.<br/>{{'PROFILE.PROFILE_DIVIDER_HELP'|translate}}\"\n }\n },\n \"LOCATION\": {\n \"BTN_GEOLOC_ADDRESS\": \"Find my address on the map\",\n \"USE_GEO_POINT\": \"Appear on {{'COMMON.APP_NAME'|translate}} maps?\",\n \"LOADING_LOCATION\": \"Searching address...\",\n \"LOCATION_DIVIDER\": \"Localisation\",\n \"ADDRESS\": \"Address\",\n \"ADDRESS_HELP\": \"Address (optional)\",\n \"CITY\": \"City\",\n \"CITY_HELP\": \"City, Country\",\n \"DISTANCE\": \"Maximum distance around the city\",\n \"DISTANCE_UNIT\": \"mi\",\n \"DISTANCE_OPTION\": \"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}\",\n \"SEARCH_HELP\": \"City, Country\",\n \"PROFILE_POSITION\": \"Profile position\",\n \"MODAL\": {\n \"TITLE\": \"Search address\",\n \"SEARCH_HELP\": \"City, Country\",\n \"ALTERNATIVE_RESULT_DIVIDER\": \"Alternative results for <b>{{address}}</b>:\",\n \"POSITION\": \"lat/lon : {{lat}} / {{lon}}\"\n },\n \"ERROR\": {\n \"CITY_REQUIRED_IF_STREET\": \"Required if a street has been filled\",\n \"REQUIRED_FOR_LOCATION\": \"Required field to appear on the map\",\n \"INVALID_FOR_LOCATION\": \"Unknown address\",\n \"GEO_LOCATION_FAILED\": \"Unable to retrieve your current position. Please use the search button.\",\n \"ADDRESS_LOCATION_FAILED\": \"Unable to retrieve the address position\"\n }\n },\n \"SUBSCRIPTION\": {\n \"SUBSCRIPTION_DIVIDER\": \"Online services\",\n \"SUBSCRIPTION_DIVIDER_HELP\": \"Online services offer optional additional services, delegated to a third party.\",\n \"BTN_ADD\": \"Add a service\",\n \"BTN_EDIT\": \"Manage my services\",\n \"NO_SUBSCRIPTION\": \"No service defined\",\n \"SUBSCRIPTION_COUNT\": \"Services / Subscription\",\n \"EDIT\": {\n \"TITLE\": \"Online services\",\n \"HELP_TEXT\": \"Manage your subscriptions and other online services here\",\n \"PROVIDER\": \"Provider:\"\n },\n \"TYPE\": {\n \"ENUM\": {\n \"EMAIL\": \"Receive email notifications\"\n }\n },\n \"CONFIRM\": {\n \"DELETE_SUBSCRIPTION\": \"Are you sur you want to <b>delete this subscription</b>?\"\n },\n \"ERROR\": {\n \"LOAD_SUBSCRIPTIONS_FAILED\": \"Error while loading online services\",\n \"ADD_SUBSCRIPTION_FAILED\": \"Error while adding subscription\",\n \"UPDATE_SUBSCRIPTION_FAILED\": \"Error during subscription update\",\n \"DELETE_SUBSCRIPTION_FAILED\": \"Error while deleting subscription\"\n },\n \"MODAL_EMAIL\": {\n \"TITLE\" : \"Notification by email\",\n \"HELP\" : \"Fill out this form to <b>be notified by email</ b> of your account's events. <br/>Your email address will be encrypted only to be visible to the service provider.\",\n \"EMAIL_LABEL\" : \"Your email:\",\n \"EMAIL_HELP\": \"john@domain.com\",\n \"FREQUENCY_LABEL\": \"Frequency of notifications:\",\n \"FREQUENCY_DAILY\": \"Daily\",\n \"FREQUENCY_WEEKLY\": \"Weekly\",\n \"PROVIDER\": \"Service Provider:\"\n }\n },\n \"DOCUMENT\": {\n \"HASH\": \"Hash: \",\n \"LOOKUP\": {\n \"TITLE\": \"Document search\",\n \"BTN_ACTIONS\": \"Actions\",\n \"SEARCH_HELP\": \"issuer:AAA*, time:1508406169\",\n \"LAST_DOCUMENTS_DOTS\": \"Last documents:\",\n \"LAST_DOCUMENTS\": \"Last documents\",\n \"SHOW_QUERY\": \"Show query\",\n \"HIDE_QUERY\": \"Hide query\",\n \"HEADER_TIME\": \"Time/Hour\",\n \"HEADER_ISSUER\": \"Issuer\",\n \"HEADER_RECIPIENT\": \"Recipient\",\n \"READ\": \"Read\",\n \"BTN_REMOVE\": \"Delete this document\",\n \"BTN_COMPACT\": \"Compact\",\n \"HAS_CREATE_OR_UPDATE_PROFILE\": \"create or edit his profile\",\n \"POPOVER_ACTIONS\": {\n \"TITLE\": \"Actions\",\n \"REMOVE_ALL\": \"Delete these documents...\"\n }\n },\n \"INFO\": {\n \"REMOVED\": \"Deleted document\"\n },\n \"CONFIRM\": {\n \"REMOVE\": \"Are you sure you want to <b>delete this document</b>?\",\n \"REMOVE_ALL\": \"Are you sure you want to <b>delete these documents</b>?\"\n },\n \"ERROR\": {\n \"LOAD_DOCUMENTS_FAILED\": \"Error searching documents\",\n \"REMOVE_FAILED\": \"Error deleting the document\",\n \"REMOVE_ALL_FAILED\": \"Error deleting documents\"\n }\n },\n \"ES_SETTINGS\": {\n \"PLUGIN_NAME\": \"Cesium+\",\n \"PLUGIN_NAME_HELP\": \"User profiles, notifications, private messages\",\n \"ENABLE_TOGGLE\": \"Enable extension?\",\n \"ENABLE_REMOTE_STORAGE\": \"Enable remote storage for settings?\",\n \"ENABLE_REMOTE_STORAGE_HELP\": \"Enables (encrypted) storage of your settings on Cesium + nodes\",\n \"ENABLE_MESSAGE_TOGGLE\": \"Enable private messages?\",\n \"PEER\": \"Data peer address\",\n \"POPUP_PEER\": {\n \"TITLE\" : \"Data peer\",\n \"HELP\" : \"Set the address of the peer to use:\",\n \"PEER_HELP\": \"server.domain.com:port\"\n },\n \"NOTIFICATIONS\": {\n \"DIVIDER\": \"Notifications\",\n \"HELP_TEXT\": \"Enable the types of notifications you want to receive:\",\n \"ENABLE_TX_SENT\": \"Notify the validation of <b>sent payments</b>?\",\n \"ENABLE_TX_RECEIVED\": \"Notify the validation of <b>received payments</b>?\",\n \"ENABLE_CERT_SENT\": \"Notify the validation of <b>sent certifications</b>?\",\n \"ENABLE_CERT_RECEIVED\": \"Notify the validation of <b>received certifications</b>?\",\n \"ENABLE_HTML5_NOTIFICATION\": \"Warn with each new notification?\",\n \"ENABLE_HTML5_NOTIFICATION_HELP\": \"Opens a small popup window with each new notification.\"\n },\n \"CONFIRM\": {\n \"ASK_ENABLE_TITLE\": \"Optional features\",\n \"ASK_ENABLE\": \"Cesium+ extension is <b>disabled</b> in your settings, making some features inactive: <ul><li>&nbsp;&nbsp;<b><i class=\\\"icon ion-person\\\"></i> user profiles</b>;<li>&nbsp;&nbsp;<b><i class=\\\"icon ion-android-notifications\\\"></i> Notifications</b>;<li>&nbsp;&nbsp;<b><i class=\\\"icon ion-email\\\"></i> Private messages</b>.</ul><br/><br/><b>Do you want to enable</b> the extension?\"\n }\n },\n \"ES_WALLET\": {\n \"ERROR\": {\n \"RECIPIENT_IS_MANDATORY\": \"A recipient is required for encryption.\"\n },\n \"ES_PEER\": {\n \"NAME\": \"Name\",\n \"DOCUMENTS\": \"Documents\",\n \"SOFTWARE\": \"Software\",\n \"DOCUMENT_COUNT\": \"Number of documents\",\n \"EMAIL_SUBSCRIPTION_COUNT\": \"{{emailSubscription}} subscribers to email notification\"\n }\n },\n \"EVENT\": {\n \"NODE_STARTED\": \"Your node ES API <b>{{params[0]}}</b> is UP\",\n \"NODE_BMA_DOWN\": \"Node <b>{{params[0]}}:{{params[1]}}</b> (used by your ES API) is <b>unreachable</b>.\",\n \"NODE_BMA_UP\": \"Node <b>{{params[0]}}:{{params[1]}}</b> is reachable again.\",\n \"MEMBER_JOIN\": \"You are now a <b>member</b> of currency <b>{{params[0]}}</b>!\",\n \"MEMBER_LEAVE\": \"You are <b>not a member anymore</b> of currency <b>{{params[0]}}</b>!\",\n \"MEMBER_EXCLUDE\": \"You are <b>not more member</b> of the currency <b>{{params[0]}}</b>, for lack of renewal or lack of certifications.\",\n \"MEMBER_REVOKE\": \"Your account has been revoked. It will no longer be a member of the currency <b>{{params[0]}}</b>.\",\n \"MEMBER_ACTIVE\": \"Your membership to <b>{{params[0]}}</b> has been <b>renewed successfully</b>.\",\n \"TX_SENT\": \"Your payment to <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\" ><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> was executed.\",\n \"TX_SENT_MULTI\": \"Your payment to <b>{{params[1]}}</b> was executed.\",\n \"TX_RECEIVED\": \"You received a payment from <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span>.\",\n \"TX_RECEIVED_MULTI\": \"You received a payment from <b>{{params[1]}}</b>.\",\n \"CERT_SENT\": \"Your <b>certification</b> to <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\" ><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> was executed.\",\n \"CERT_RECEIVED\": \"You have <b>received a certification</b> from <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span>.\",\n \"USER\": {\n \"LIKE_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> like your profile\",\n \"FOLLOW_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> follows your activity\",\n \"STAR_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> rated you ({{params[3]}} <i class=\\\"ion-star\\\">)\",\n \"MODERATION_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> asks you for a moderation on the profile: <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"DELETION_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> reported a profile to be deleted: <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"ABUSE_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> has requested moderation on your profile\"\n },\n \"PAGE\": {\n \"NEW_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> has commented on your referencing: <b>{{params[2]}}</b>\",\n \"UPDATE_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> has modified his comment on your referencing: <b>{{params[2]}}</b>\",\n \"NEW_REPLY_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> has replied to your comment on the referencing: <b>{{params[2]}}</b>\",\n \"UPDATE_REPLY_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> has modified his answer to your comment, on the referencing: <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> has commented on the page: <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> has modified his comment on the page: <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> added a page: <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> updated the page: <b>{{params[2]}}</b>\",\n \"MODERATION_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> asks you for a moderation on the page: <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"DELETION_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> reported a page to be deleted: <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"ABUSE_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> has requested moderation on your page: <b>{{params[2]}}</b>\"\n }\n },\n \"LIKE\": {\n \"ERROR\": {\n \"FAILED_TOGGLE_LIKE\": \"Unable to execute this action.\"\n }\n },\n \"CONFIRM\": {\n \"ES_USE_FALLBACK_NODE\": \"Data node <b>{{old}}</b> unreachable or invalid address.<br/><br/>Do you want to temporarily use the data node <b>{{new}}</b>?\"\n },\n \"ERROR\": {\n \"ES_CONNECTION_ERROR\": \"Data node <b>{{server}}</b> unreachable or invalid address.<br/><br/>Cesium will continue to work, <b>without the Cesium+</b> extension (user profiles, private messages, maps and graphics).<br/><br/>Check your Internet connection, or change data node in <a class=\\\"positive\\\" ng-click=\\\"doQuickFix('settings')\\\">extension settings</a>.\",\n \"ES_MAX_UPLOAD_BODY_SIZE\": \"The volume of data to be sent exceeds the limit set by the server.<br/><br/>Please try again after, for example, deleting photos.\"\n }\n}\n);\n\n$translateProvider.translations(\"en\", {\n \"COMMON\": {\n \"CATEGORY\": \"Category\",\n \"CATEGORIES\": \"Categories\",\n \"CATEGORY_SEARCH_HELP\": \"Search\",\n \"COMMENT_HELP\": \"Comments\",\n \"LAST_MODIFICATION_DATE\": \"Updated on \",\n \"SUBMIT_BY\": \"Submitted by\",\n \"BTN_LIKE\": \"I like\",\n \"BTN_LIKE_REMOVE\": \"I don't like anymore\",\n \"LIKES_TEXT\": \"{{total}} {{total > 1 ? 'people' : 'person'}} liked this page\",\n \"ABUSES_TEXT\": \"{{total}} {{total > 1 ? 'people' : 'person'}} reported a problem on this page\",\n \"BTN_REPORT_ABUSE_DOTS\": \"Report a problem or an abuse...\",\n \"BTN_REMOVE_REPORTED_ABUSE\": \"Cancel my problem report\",\n \"BTN_PUBLISH\": \"Publish\",\n \"BTN_PICTURE_DELETE\": \"Delete\",\n \"BTN_PICTURE_FAVORISE\": \"Default\",\n \"BTN_PICTURE_ROTATE\": \"Rotate\",\n \"BTN_ADD_PICTURE\": \"Add picture\",\n \"NOTIFICATION\": {\n \"TITLE\": \"New notification | {{'COMMON.APP_NAME'|translate}}\",\n \"HAS_UNREAD\": \"You have {{count}} unread notification{{count>0?'s':''}}\"\n },\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Notifications\",\n \"MARK_ALL_AS_READ\": \"Mark all as read\",\n \"NO_RESULT\": \"No notification\",\n \"SHOW_ALL\": \"Show all\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Could not load notifications\"\n },\n \"REPORT_ABUSE\": {\n \"TITLE\": \"Report a problem\",\n \"SUB_TITLE\": \"Please explain briefly the problem:\",\n \"REASON_HELP\": \"I explain the problem...\",\n \"ASK_DELETE\": \"Request removal?\",\n \"CONFIRM\": {\n \"SENT\": \"Request sent. Thnak you!\"\n }\n }\n },\n \"MENU\": {\n \"REGISTRY\": \"Pages\",\n \"USER_PROFILE\": \"My Profile\",\n \"MESSAGES\": \"Messages\",\n \"NOTIFICATIONS\": \"Notifications\",\n \"INVITATIONS\": \"Invitations\"\n },\n \"ACCOUNT\": {\n \"NEW\": {\n \"ORGANIZATION_ACCOUNT\": \"Account for an organization\",\n \"ORGANIZATION_ACCOUNT_HELP\": \"If you represent a company, association, etc.<br/>No universal dividend will be created by this account.\"\n },\n \"EVENT\": {\n \"MEMBER_WITHOUT_PROFILE\": \"You can <a ui-sref=\\\"app.edit_profile\\\">fill your Cesium+ profile</a> (optional) to provide better visibility of your account. This profile will be stored in <b>a directory independent</b> of the currency, but decentralized.\"\n },\n \"ERROR\": {\n \"WS_CONNECTION_FAILED\": \"Cesium can not receive notifications because of a technical error (connection to the Cesium + data node).<br/><br/>If the problem persists, please <b>choose another data node</b> in Cesium+ settings.\"\n }\n },\n \"WOT\": {\n \"BTN_SUGGEST_CERTIFICATIONS_DOTS\": \"Suggest identities to certify...\",\n \"BTN_ASK_CERTIFICATIONS_DOTS\": \"Ask members to certify me...\",\n \"BTN_ASK_CERTIFICATION\": \"Ask a certification\",\n \"SUGGEST_CERTIFICATIONS_MODAL\": {\n \"TITLE\": \"Suggest certifications\",\n \"HELP\": \"Select your suggestions\"\n },\n \"ASK_CERTIFICATIONS_MODAL\": {\n \"TITLE\": \"Ask certifications\",\n \"HELP\": \"Select recipients\"\n },\n \"SEARCH\": {\n \"DIVIDER_PROFILE\": \"Accounts\",\n \"DIVIDER_PAGE\": \"Pages\",\n \"DIVIDER_GROUP\": \"Groups\"\n },\n \"CONFIRM\": {\n \"SUGGEST_CERTIFICATIONS\": \"Are you sure you want <b>to send these certification suggestions</b>?\",\n \"ASK_CERTIFICATION\": \"Are you sure you want to <b>send a certification request</b>?\",\n \"ASK_CERTIFICATIONS\": \"Are you sure you want to <b>send a certification request</b> to these people?\"\n }\n },\n \"INVITATION\": {\n \"TITLE\": \"Invitations\",\n \"NO_RESULT\": \"No invitation received\",\n \"BTN_DELETE_ALL\": \"Delete all invitations\",\n \"BTN_DELETE\": \"Delete invitation\",\n \"BTN_NEW_INVITATION\": \"New invitation\",\n \"ASK_CERTIFICATION\": \"<a href=\\\"#/app/wot/{{pubkey}}/{{::uid}}\\\">{{::name||uid}}</a> asks for your certification\",\n \"SUGGESTION_CERTIFICATION\": \"<a href=\\\"#/app/wot/{{::pubkey}}/{{::uid}}\\\">{{::name||uid}}</a> is suggested for certification\",\n \"SUGGESTED_BY\": \"Suggestion sent by <a class=\\\"positive\\\" href=\\\"#/app/wot/{{::issuer.pubkey}}/{{::issuer.uid}}\\\">{{::issuer.name||issuer.uid}}</a>\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Invitations\"\n },\n \"LIST\": {\n \"TITLE\": \"Invitations\"\n },\n \"NEW\": {\n \"TITLE\": \"New invitation\",\n \"RECIPIENTS\": \"A\",\n \"RECIPIENTS_HELP\": \"Recipients of the invitation\",\n \"RECIPIENTS_MODAL_TITLE\": \"Recipients\",\n \"RECIPIENTS_MODAL_HELP\": \"Please choose recipients:\",\n \"SUGGESTION_IDENTITIES\": \"Suggestions for certification\",\n \"SUGGESTION_IDENTITIES_HELP\": \"Certifications to suggest\",\n \"SUGGESTION_IDENTITIES_MODAL_TITLE\": \"Suggestions\",\n \"SUGGESTION_IDENTITIES_MODAL_HELP\": \"Please choose your suggestions:\"\n },\n \"CONFIRM\": {\n \"DELETE_ALL_CONFIRMATION\": \"Removing invitations is <b>an irreversible operation</b>.<br/><br/><b>Are you sure</b> you want to continue\",\n \"SEND_INVITATIONS_TO_CERTIFY\": \"<b>Are you sure</b> you want <b>to sent this invitation to certify</b> ?\"\n },\n \"INFO\": {\n \"INVITATION_SENT\": \"Invitation sent\"\n },\n \"ERROR\": {\n \"LOAD_INVITATIONS_FAILED\": \"Error while loading invitations\",\n \"REMOVE_INVITATION_FAILED\": \"Error while deleting the invitation\",\n \"REMOVE_ALL_INVITATIONS_FAILED\": \"Error while deleting invitations\",\n \"SEND_INVITATION_FAILED\": \"Error while sending invitation\",\n \"BAD_INVITATION_FORMAT\": \"<span class=\\\"assertive\\\"><i class=\\\"ion-close-circled\\\"></i> Invitation unreadable (format unknown)</span> - sent by <a ui-sref=\\\"app.wot_identity({pubkey: '{{::pubkey}}', uid: '{{::uid}}' })\\\">{{::name||uid}}</a>\"\n }\n },\n \"COMMENTS\": {\n \"DIVIDER\": \"Comments\",\n \"SHOW_MORE_COMMENTS\": \"Show previous comments\",\n \"COMMENT_HELP\": \"Your comment, question...\",\n \"COMMENT_HELP_REPLY_TO\": \"Your answer...\",\n \"BTN_SEND\": \"Send\",\n \"POPOVER_SHARE_TITLE\": \"Message #{{number}}\",\n \"REPLY\": \"Reply\",\n \"REPLY_TO\": \"Respond to:\",\n \"REPLY_TO_LINK\": \"In response to \",\n \"REPLY_TO_DELETED_COMMENT\": \"In response to a deleted comment\",\n \"REPLY_COUNT\": \"{{replyCount}} responses\",\n \"DELETED_COMMENT\": \"Comment deleted\",\n \"MODIFIED_ON\": \"modified on {{time|formatDate}}\",\n \"MODIFIED_PARENTHESIS\": \"(modified then)\",\n \"ERROR\": {\n \"FAILED_SAVE_COMMENT\": \"Saving comment failed\",\n \"FAILED_REMOVE_COMMENT\": \"Deleting comment failed\"\n }\n },\n \"MESSAGE\": {\n \"REPLY_TITLE_PREFIX\": \"Re: \",\n \"FORWARD_TITLE_PREFIX\": \"Fw: \",\n \"BTN_REPLY\": \"Reply\",\n \"BTN_COMPOSE\": \"New message\",\n \"BTN_WRITE\": \"Write\",\n \"NO_MESSAGE_INBOX\": \"No message received\",\n \"NO_MESSAGE_OUTBOX\": \"No message sent\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Messages\",\n \"MESSAGE_RECEIVED\": \"You <b>received a message</b><br/>from\"\n },\n \"LIST\": {\n \"INBOX\": \"Inbox\",\n \"OUTBOX\": \"Outbox\",\n \"LAST_INBOX\": \"New messages\",\n \"LAST_OUTBOX\": \"Sent messages\",\n \"BTN_LAST_MESSAGES\": \"Recent messages\",\n \"TITLE\": \"Private messages\",\n \"SEARCH_HELP\": \"Search in messages\",\n \"POPOVER_ACTIONS\": {\n \"TITLE\": \"Options\",\n \"DELETE_ALL\": \"Delete all messages\"\n }\n },\n \"COMPOSE\": {\n \"TITLE\": \"New message\",\n \"TITLE_REPLY\": \"Reply\",\n \"SUB_TITLE\": \"New message\",\n \"TO\": \"To\",\n \"OBJECT\": \"Object\",\n \"OBJECT_HELP\": \"Object\",\n \"ENCRYPTED_HELP\": \"Please note this message will be encrypted before sending so that only the recipient can read it and be sure you are the author.\",\n \"MESSAGE\": \"Message\",\n \"MESSAGE_HELP\": \"Message content\",\n \"CONTENT_CONFIRMATION\": \"No message content.<br/><br/>Are your sure you want to send this message?\"\n },\n \"VIEW\": {\n \"TITLE\": \"Message\",\n \"SENDER\": \"Sent by\",\n \"RECIPIENT\": \"Sent to\",\n \"NO_CONTENT\": \"Empty message\",\n \"DELETE\": \"Delete the message\"\n },\n \"CONFIRM\": {\n \"REMOVE\": \"Are you sure you want to <b>delete this message</b>?<br/><br/> This operation is irreversible.\",\n \"REMOVE_ALL\": \"Are you sure you want to <b>delete all messages</b>?<br/><br/> This operation is irreversible.\",\n \"MARK_ALL_AS_READ\": \"Are you sure you want to <b>mark all message as read</b>?\",\n \"USER_HAS_NO_PROFILE\": \"This identity has no Cesium + profile. It may not use the Cesium + extension, so it <b>will not read your message</b>.<br/><br/>Are you sure you want <b>to continue</b>?\"\n },\n \"INFO\": {\n \"MESSAGE_REMOVED\": \"Message successfully deleted\",\n \"All_MESSAGE_REMOVED\": \"Messages successfully deleted\",\n \"MESSAGE_SENT\": \"Message sent\"\n },\n \"ERROR\": {\n \"SEND_MSG_FAILED\": \"Error while sending message.\",\n \"LOAD_MESSAGES_FAILED\": \"Error while loading messages.\",\n \"LOAD_MESSAGE_FAILED\": \"Error while loading message.\",\n \"MESSAGE_NOT_READABLE\": \"Unable to read message.\",\n \"USER_NOT_RECIPIENT\": \"You are not the recipient of this message: unable to read it.\",\n \"NOT_AUTHENTICATED_MESSAGE\": \"The authenticity of the message is not certain or its content is corrupted.\",\n \"REMOVE_MESSAGE_FAILED\": \"Error while deleting message\",\n \"MESSAGE_CONTENT_TOO_LONG\": \"Value too long ({{maxLength}} characters max).\",\n \"MARK_AS_READ_FAILED\": \"Unable to mark the message as 'read'.\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Error while loading messages notifications.\",\n \"REMOVE_All_MESSAGES_FAILED\": \"Error while removing all messages.\",\n \"MARK_ALL_AS_READ_FAILED\": \"Error while marking messages as read.\",\n \"RECIPIENT_IS_MANDATORY\": \"Recipient is mandatory.\"\n }\n },\n \"BLOCKCHAIN\": {\n \"LOOKUP\": {\n \"SEARCH_HELP\": \"Block number, hash...\",\n \"POPOVER_FILTER_TITLE\": \"Filter\",\n \"HEADER_MEDIAN_TIME\": \"Date / Time\",\n \"HEADER_BLOCK\": \"Block #\",\n \"HEADER_ISSUER\": \"Peer owner\",\n \"BTN_LAST\": \"Last blocks\",\n \"DISPLAY_QUERY\": \"View query\",\n \"HIDE_QUERY\": \"Hide query\",\n \"TX_SEARCH_FILTER\": {\n \"MEMBER_FLOWS\": \"<b class=\\\"ion-person\\\"></b> Members input/output\",\n \"EXISTING_TRANSACTION\": \"<b class=\\\"ion-card\\\"></b> Having transactions\",\n \"PERIOD\": \"<b class=\\\"ion-clock\\\"></b> Between <b class=\\\"gray\\\">{{params[1]|medianDateShort}}</b> ({{params[1]|medianTime}}) and <b class=\\\"gray\\\">{{params[2]|medianDateShort}}</b> ({{params[2]|medianTime}})\",\n \"ISSUER\": \"<b class=\\\"ion-android-desktop\\\"></b> Computed by {{params[1]|formatPubkey}}\",\n \"TX_PUBKEY\": \"<b class=\\\"ion-card\\\"></b> Transactions concerning <b class=\\\"ion-key\\\"></b> {{params[1]|formatPubkey}}\"\n }\n },\n \"ERROR\": {\n \"SEARCH_BLOCKS_FAILED\": \"Error while searching blocks.\"\n }\n },\n \"REGISTRY\": {\n \"CATEGORY\": \"Main activity\",\n \"GENERAL_DIVIDER\": \"Basic information\",\n \"LOCATION_DIVIDER\": \"Address\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Social networks, web sites\",\n \"TECHNICAL_DIVIDER\": \"Technical data\",\n \"BTN_SHOW_WOT\": \"People\",\n \"BTN_SHOW_WOT_HELP\": \"Search for people\",\n \"BTN_SHOW_PAGES\": \"Pages\",\n \"BTN_SHOW_PAGES_HELP\": \"Search for pages\",\n \"BTN_NEW\": \"New page\",\n \"MY_PAGES\": \"My pages\",\n \"NO_PAGE\": \"No page\",\n \"SEARCH\": {\n \"TITLE\": \"Pages\",\n \"SEARCH_HELP\": \"What, Who: hairdresser, Lili's restaurant, ...\",\n \"BTN_ADD\": \"New\",\n \"BTN_LAST_RECORDS\": \"Recent pages\",\n \"BTN_ADVANCED_SEARCH\": \"Advanced search\",\n \"BTN_OPTIONS\": \"Advanced search\",\n \"TYPE\": \"Kind of organization\",\n \"LOCATION_HELP\": \"Where: City, Country\",\n \"RESULTS\": \"Results\",\n \"RESULT_COUNT_LOCATION\": \"{{count}} result{{count>0?'s':''}}, near {{location}}\",\n \"RESULT_COUNT\": \"{{count}} result{{count>0?'s':''}}\",\n \"LAST_RECORDS\": \"Recent pages\",\n \"LAST_RECORD_COUNT_LOCATION\": \"{{count}} recent page{{count>0?'s':''}}, near {{location}}\",\n \"LAST_RECORD_COUNT\": \"{{count}} recent page{{count>0?'s':''}}\",\n \"POPOVER_FILTERS\": {\n \"BTN_ADVANCED_SEARCH\": \"Advanced options?\"\n }\n },\n \"VIEW\": {\n \"TITLE\": \"Registry\",\n \"CATEGORY\": \"Main activity:\",\n \"LOCATION\": \"Address:\",\n \"MENU_TITLE\": \"Options\",\n \"POPOVER_SHARE_TITLE\": \"{{title}}\",\n \"REMOVE_CONFIRMATION\" : \"Are you sure you want to delete this reference?<br/><br/>This is irreversible.\"\n },\n \"TYPE\": {\n \"TITLE\": \"New page\",\n \"SELECT_TYPE\": \"Kind of organization:\",\n \"ENUM\": {\n \"SHOP\": \"Local shops\",\n \"COMPANY\": \"Company\",\n \"ASSOCIATION\": \"Association\",\n \"INSTITUTION\": \"Institution\"\n }\n },\n \"EDIT\": {\n \"TITLE\": \"Edit\",\n \"TITLE_NEW\": \"New page\",\n \"RECORD_TYPE\":\"Kind of organization\",\n \"RECORD_TITLE\": \"Name\",\n \"RECORD_TITLE_HELP\": \"Name\",\n \"RECORD_DESCRIPTION\": \"Description\",\n \"RECORD_DESCRIPTION_HELP\": \"Describe activity\",\n \"RECORD_ADDRESS\": \"Street\",\n \"RECORD_ADDRESS_HELP\": \"Street, building...\",\n \"RECORD_CITY\": \"City\",\n \"RECORD_CITY_HELP\": \"City, Country\",\n \"RECORD_SOCIAL_NETWORKS\": \"Social networks and web site\",\n \"RECORD_PUBKEY\": \"Public key\",\n \"RECORD_PUBKEY_HELP\": \"Public key to receive payments\"\n },\n \"WALLET\": {\n \"PAGE_DIVIDER\": \"Pages\",\n \"PAGE_DIVIDER_HELP\": \"Pages refer to activities accepting money or promoting it: local shops, companies, associations, institutions. They are stored outside the currency network, in <a ui-sref=\\\"app.es_network\\\">the Cesium+ network</a>.\"\n },\n \"ERROR\": {\n \"LOAD_CATEGORY_FAILED\": \"Loading main activities failed\",\n \"LOAD_RECORD_FAILED\": \"Loading failed\",\n \"LOOKUP_RECORDS_FAILED\": \"Error while loading records.\",\n \"REMOVE_RECORD_FAILED\": \"Deleting failed\",\n \"SAVE_RECORD_FAILED\": \"Saving failed\",\n \"RECORD_NOT_EXISTS\": \"Record not found\",\n \"GEO_LOCATION_NOT_FOUND\": \"City or zip code not found\"\n },\n \"INFO\": {\n \"RECORD_REMOVED\" : \"Page successfully deleted\",\n \"RECORD_SAVED\": \"Page successfully saved\"\n }\n },\n \"PROFILE\": {\n \"PROFILE_DIVIDER\": \"Cesium+ profile\",\n \"PROFILE_DIVIDER_HELP\": \"These are ancillary data, stored outside the currency network, in <a ui-sref=\\\"app.es_network\\\">the Cesium+ network</a>.\",\n \"NO_PROFILE_DEFINED\": \"No Cesium+ profile\",\n \"BTN_ADD\": \"Create my profile\",\n \"BTN_EDIT\": \"Edit my profile\",\n \"BTN_DELETE\": \"Delete my profile\",\n \"BTN_REORDER\": \"Reorder\",\n \"UID\": \"Pseudonym\",\n \"TITLE\": \"Lastname, FirstName\",\n \"TITLE_HELP\": \"Name\",\n \"DESCRIPTION\": \"About me\",\n \"DESCRIPTION_HELP\": \"About me...\",\n \"SOCIAL_HELP\": \"http://...\",\n \"GENERAL_DIVIDER\": \"General data\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Social networks and web site\",\n \"TECHNICAL_DIVIDER\": \"Technical data\",\n \"MODAL_AVATAR\": {\n \"TITLE\": \"Avatar\",\n \"SELECT_FILE_HELP\": \"<b>Choose an image file</b>:\",\n \"BTN_SELECT_FILE\": \"Choose an image\",\n \"RESIZE_HELP\": \"<b>Re-crop the image</b> if necessary. A click on the image allows to move it. Click on the area at the bottom left to zoom in.\",\n \"RESULT_HELP\": \"<b>Here is the result</b> as seen on your profile:\"\n },\n \"CONFIRM\": {\n \"DELETE\": \"Are you sure you want to <b>delete your Cesium+ profile ?</b><br/><br/>This operation is irreversible.\"\n },\n \"ERROR\": {\n \"REMOVE_PROFILE_FAILED\": \"Deleting profile failed\",\n \"LOAD_PROFILE_FAILED\": \"Could not load user profile.\",\n \"SAVE_PROFILE_FAILED\": \"Saving profile failed\",\n \"INVALID_SOCIAL_NETWORK_FORMAT\": \"Invalid format: please fill a valid Internet address.<br/><br/>Examples :<ul><li>- A Facebook page (https://www.facebook.com/user)</li><li>- A web page (http://www.domain.com)</li><li>- An email address (joe@dalton.com)</li></ul>\",\n \"IMAGE_RESIZE_FAILED\": \"Error while resizing picture\"\n },\n \"INFO\": {\n \"PROFILE_REMOVED\": \"Profile deleted\",\n \"PROFILE_SAVED\": \"Profile saved\"\n },\n \"HELP\": {\n \"WARNING_PUBLIC_DATA\": \"Please note that the information published here <b>is public</b>: visible including by <b>not logged in people</b>.<br/>{{'PROFILE.PROFILE_DIVIDER_HELP'|translate}}\"\n }\n },\n \"LOCATION\": {\n \"BTN_GEOLOC_ADDRESS\": \"Find my address on the map\",\n \"USE_GEO_POINT\": \"Appear on {{'COMMON.APP_NAME'|translate}} maps?\",\n \"LOADING_LOCATION\": \"Searching address...\",\n \"LOCATION_DIVIDER\": \"Localisation\",\n \"ADDRESS\": \"Address\",\n \"ADDRESS_HELP\": \"Address (optional)\",\n \"CITY\": \"City\",\n \"CITY_HELP\": \"City, Country\",\n \"DISTANCE\": \"Maximum distance around the city\",\n \"DISTANCE_UNIT\": \"mi\",\n \"DISTANCE_OPTION\": \"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}\",\n \"SEARCH_HELP\": \"City, Country\",\n \"PROFILE_POSITION\": \"Profile position\",\n \"MODAL\": {\n \"TITLE\": \"Search address\",\n \"SEARCH_HELP\": \"City, Country\",\n \"ALTERNATIVE_RESULT_DIVIDER\": \"Alternative results for <b>{{address}}</b>:\",\n \"POSITION\": \"lat/lon : {{lat}} / {{lon}}\"\n },\n \"ERROR\": {\n \"CITY_REQUIRED_IF_STREET\": \"Required if a street has been filled\",\n \"REQUIRED_FOR_LOCATION\": \"Required field to appear on the map\",\n \"INVALID_FOR_LOCATION\": \"Unknown address\",\n \"GEO_LOCATION_FAILED\": \"Unable to retrieve your current position. Please use the search button.\",\n \"ADDRESS_LOCATION_FAILED\": \"Unable to retrieve the address position\"\n }\n },\n \"SUBSCRIPTION\": {\n \"SUBSCRIPTION_DIVIDER\": \"Online services\",\n \"SUBSCRIPTION_DIVIDER_HELP\": \"Online services offer optional additional services, delegated to a third party.\",\n \"BTN_ADD\": \"Add a service\",\n \"BTN_EDIT\": \"Manage my services\",\n \"NO_SUBSCRIPTION\": \"No service defined\",\n \"SUBSCRIPTION_COUNT\": \"Services / Subscription\",\n \"EDIT\": {\n \"TITLE\": \"Online services\",\n \"HELP_TEXT\": \"Manage your subscriptions and other online services here\",\n \"PROVIDER\": \"Provider:\"\n },\n \"TYPE\": {\n \"ENUM\": {\n \"EMAIL\": \"Receive email notifications\"\n }\n },\n \"CONFIRM\": {\n \"DELETE_SUBSCRIPTION\": \"Are you sur you want to <b>delete this subscription</b>?\"\n },\n \"ERROR\": {\n \"LOAD_SUBSCRIPTIONS_FAILED\": \"Error while loading online services\",\n \"ADD_SUBSCRIPTION_FAILED\": \"Error while adding subscription\",\n \"UPDATE_SUBSCRIPTION_FAILED\": \"Error during subscription update\",\n \"DELETE_SUBSCRIPTION_FAILED\": \"Error while deleting subscription\"\n },\n \"MODAL_EMAIL\": {\n \"TITLE\" : \"Notification by email\",\n \"HELP\" : \"Fill out this form to <b>be notified by email</ b> of your account's events. <br/>Your email address will be encrypted only to be visible to the service provider.\",\n \"EMAIL_LABEL\" : \"Your email:\",\n \"EMAIL_HELP\": \"john@domain.com\",\n \"FREQUENCY_LABEL\": \"Frequency of notifications:\",\n \"FREQUENCY_DAILY\": \"Daily\",\n \"FREQUENCY_WEEKLY\": \"Weekly\",\n \"PROVIDER\": \"Service Provider:\"\n }\n },\n \"DOCUMENT\": {\n \"HASH\": \"Hash: \",\n \"LOOKUP\": {\n \"TITLE\": \"Document search\",\n \"BTN_ACTIONS\": \"Actions\",\n \"SEARCH_HELP\": \"issuer:AAA*, time:1508406169\",\n \"LAST_DOCUMENTS_DOTS\": \"Last documents:\",\n \"LAST_DOCUMENTS\": \"Last documents\",\n \"SHOW_QUERY\": \"Show query\",\n \"HIDE_QUERY\": \"Hide query\",\n \"HEADER_TIME\": \"Time/Hour\",\n \"HEADER_ISSUER\": \"Issuer\",\n \"HEADER_RECIPIENT\": \"Recipient\",\n \"READ\": \"Read\",\n \"BTN_REMOVE\": \"Delete this document\",\n \"BTN_COMPACT\": \"Compact\",\n \"HAS_CREATE_OR_UPDATE_PROFILE\": \"create or edit his profile\",\n \"POPOVER_ACTIONS\": {\n \"TITLE\": \"Actions\",\n \"REMOVE_ALL\": \"Delete these documents...\"\n }\n },\n \"INFO\": {\n \"REMOVED\": \"Deleted document\"\n },\n \"CONFIRM\": {\n \"REMOVE\": \"Are you sure you want to <b>delete this document</b>?\",\n \"REMOVE_ALL\": \"Are you sure you want to <b>delete these documents</b>?\"\n },\n \"ERROR\": {\n \"LOAD_DOCUMENTS_FAILED\": \"Error searching documents\",\n \"REMOVE_FAILED\": \"Error deleting the document\",\n \"REMOVE_ALL_FAILED\": \"Error deleting documents\"\n }\n },\n \"ES_SETTINGS\": {\n \"PLUGIN_NAME\": \"Cesium+\",\n \"PLUGIN_NAME_HELP\": \"User profiles, notifications, private messages\",\n \"ENABLE_TOGGLE\": \"Enable extension?\",\n \"ENABLE_REMOTE_STORAGE\": \"Enable remote storage for settings?\",\n \"ENABLE_REMOTE_STORAGE_HELP\": \"Enables (encrypted) storage of your settings on Cesium + nodes\",\n \"ENABLE_MESSAGE_TOGGLE\": \"Enable private messages?\",\n \"PEER\": \"Data peer address\",\n \"POPUP_PEER\": {\n \"TITLE\" : \"Data peer\",\n \"HELP\" : \"Set the address of the peer to use:\",\n \"PEER_HELP\": \"server.domain.com:port\"\n },\n \"NOTIFICATIONS\": {\n \"DIVIDER\": \"Notifications\",\n \"HELP_TEXT\": \"Enable the types of notifications you want to receive:\",\n \"ENABLE_TX_SENT\": \"Notify the validation of <b>sent payments</b>?\",\n \"ENABLE_TX_RECEIVED\": \"Notify the validation of <b>received payments</b>?\",\n \"ENABLE_CERT_SENT\": \"Notify the validation of <b>sent certifications</b>?\",\n \"ENABLE_CERT_RECEIVED\": \"Notify the validation of <b>received certifications</b>?\",\n \"ENABLE_HTML5_NOTIFICATION\": \"Warn with each new notification?\",\n \"ENABLE_HTML5_NOTIFICATION_HELP\": \"Opens a small popup window with each new notification.\"\n },\n \"CONFIRM\": {\n \"ASK_ENABLE_TITLE\": \"Optional features\",\n \"ASK_ENABLE\": \"Cesium+ extension is <b>disabled</b> in your settings, making some features inactive: <ul><li>&nbsp;&nbsp;<b><i class=\\\"icon ion-person\\\"></i> user profiles</b>;<li>&nbsp;&nbsp;<b><i class=\\\"icon ion-android-notifications\\\"></i> Notifications</b>;<li>&nbsp;&nbsp;<b><i class=\\\"icon ion-email\\\"></i> Private messages</b>.</ul><br/><br/><b>Do you want to enable</b> the extension?\"\n }\n },\n \"ES_WALLET\": {\n \"ERROR\": {\n \"RECIPIENT_IS_MANDATORY\": \"A recipient is required for encryption.\"\n },\n \"ES_PEER\": {\n \"NAME\": \"Name\",\n \"DOCUMENTS\": \"Documents\",\n \"SOFTWARE\": \"Software\",\n \"DOCUMENT_COUNT\": \"Number of documents\",\n \"EMAIL_SUBSCRIPTION_COUNT\": \"{{emailSubscription}} subscribers to email notification\"\n }\n },\n \"EVENT\": {\n \"NODE_STARTED\": \"Your node ES API <b>{{params[0]}}</b> is UP\",\n \"NODE_BMA_DOWN\": \"Node <b>{{params[0]}}:{{params[1]}}</b> (used by your ES API) is <b>unreachable</b>.\",\n \"NODE_BMA_UP\": \"Node <b>{{params[0]}}:{{params[1]}}</b> is reachable again.\",\n \"MEMBER_JOIN\": \"You are now a <b>member</b> of currency <b>{{params[0]}}</b>!\",\n \"MEMBER_LEAVE\": \"You are <b>not a member anymore</b> of currency <b>{{params[0]}}</b>!\",\n \"MEMBER_EXCLUDE\": \"You are <b>not more member</b> of the currency <b>{{params[0]}}</b>, for lack of renewal or lack of certifications.\",\n \"MEMBER_REVOKE\": \"Your account has been revoked. It will no longer be a member of the currency <b>{{params[0]}}</b>.\",\n \"MEMBER_ACTIVE\": \"Your membership to <b>{{params[0]}}</b> has been <b>renewed successfully</b>.\",\n \"TX_SENT\": \"Your payment to <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\" ><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> was executed.\",\n \"TX_SENT_MULTI\": \"Your payment to <b>{{params[1]}}</b> was executed.\",\n \"TX_RECEIVED\": \"You received a payment from <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span>.\",\n \"TX_RECEIVED_MULTI\": \"You received a payment from <b>{{params[1]}}</b>.\",\n \"CERT_SENT\": \"Your <b>certification</b> to <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\" ><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> was executed.\",\n \"CERT_RECEIVED\": \"You have <b>received a certification</b> from <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span>.\",\n \"USER\": {\n \"LIKE_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> like your profile\",\n \"FOLLOW_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> follows your activity\",\n \"STAR_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> rated you ({{params[3]}} <i class=\\\"ion-star\\\">)\",\n \"MODERATION_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> asks you for a moderation on the profile: <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"DELETION_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> reported a profile to be deleted: <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"ABUSE_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> has requested moderation on your profile\"\n },\n \"PAGE\": {\n \"NEW_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> has commented on your referencing: <b>{{params[2]}}</b>\",\n \"UPDATE_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> has modified his comment on your referencing: <b>{{params[2]}}</b>\",\n \"NEW_REPLY_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> has replied to your comment on the referencing: <b>{{params[2]}}</b>\",\n \"UPDATE_REPLY_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> has modified his answer to your comment, on the referencing: <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> has commented on the page: <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> has modified his comment on the page: <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> added a page: <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> updated the page: <b>{{params[2]}}</b>\",\n \"MODERATION_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> asks you for a moderation on the page: <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"DELETION_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> reported a page to be deleted: <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"ABUSE_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> has requested moderation on your page: <b>{{params[2]}}</b>\"\n }\n },\n \"LIKE\": {\n \"ERROR\": {\n \"FAILED_TOGGLE_LIKE\": \"Unable to execute this action.\"\n }\n },\n \"CONFIRM\": {\n \"ES_USE_FALLBACK_NODE\": \"Data node <b>{{old}}</b> unreachable or invalid address.<br/><br/>Do you want to temporarily use the data node <b>{{new}}</b>?\"\n },\n \"ERROR\": {\n \"ES_CONNECTION_ERROR\": \"Data node <b>{{server}}</b> unreachable or invalid address.<br/><br/>Cesium will continue to work, <b>without the Cesium+</b> extension (user profiles, private messages, maps and graphics).<br/><br/>Check your Internet connection, or change data node in <a class=\\\"positive\\\" ng-click=\\\"doQuickFix('settings')\\\">extension settings</a>.\",\n \"ES_MAX_UPLOAD_BODY_SIZE\": \"The volume of data to be sent exceeds the limit set by the server.<br/><br/>Please try again after, for example, deleting photos.\"\n }\n}\n);\n\n$translateProvider.translations(\"eo-EO\", {\n \"COMMON\": {\n \"CATEGORY\": \"Kategorio\",\n \"CATEGORIES\": \"Kategorioj\",\n \"CATEGORY_SEARCH_HELP\": \"Serĉado\",\n \"COMMENT_HELP\": \"Komento\",\n \"LAST_MODIFICATION_DATE\": \"Ĝisdatigita la\",\n \"SUBMIT_BY\": \"Submetita de\",\n \"BTN_LIKE\": \"Mi ŝatas\",\n \"LIKES_TEXT\": \"{{total}} persono{{total > 1 ? 'j' : ''}} ŝatis tiun ĉi paĝon\",\n \"ABUSES_TEXT\": \"{{total}} persono{{total > 1 ? 'j' : ''}} atentigis pri problemo\",\n \"BTN_REPORT_ABUSE_DOTS\": \"Atentigi pri problemo aŭ misuzo...\",\n \"BTN_REMOVE_REPORTED_ABUSE\": \"Nuligi mian atentigon\",\n \"BTN_PUBLISH\": \"Publikigi\",\n \"BTN_PICTURE_DELETE\": \"Forigi\",\n \"BTN_PICTURE_FAVORISE\": \"Precipa\",\n \"BTN_PICTURE_ROTATE\": \"Turni\",\n \"BTN_ADD_PICTURE\": \"Aldoni foton\",\n \"NOTIFICATION\": {\n \"TITLE\": \"Nova avizo | {{'COMMON.APP_NAME'|translate}}\",\n \"HAS_UNREAD\": \"Vi havas {{count}} avizo{{count>0?'j':''}}n ne legita{{count>0?'j':''}}n\"\n },\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Avizoj\",\n \"MARK_ALL_AS_READ\": \"Ĉion marki legita\",\n \"NO_RESULT\": \"Neniu avizo\",\n \"SHOW_ALL\": \"Vidi ĉion\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Malsukceso por ŝarĝi la avizojn\"\n },\n \"REPORT_ABUSE\": {\n \"TITLE\": \"Atentigi pri problemo\",\n \"SUB_TITLE\": \"Bonvolu klarigi rapide la problemon:\",\n \"REASON_HELP\": \"Mi klarigas la problemon...\",\n \"ASK_DELETE\": \"Peti la forigon?\",\n \"CONFIRM\": {\n \"SENT\": \"Atentigo sendita. Dankon!\"\n }\n }\n },\n \"MENU\": {\n \"REGISTRY\": \"Paĝoj\",\n \"USER_PROFILE\": \"Mia profilo\",\n \"MESSAGES\": \"Mesaĝoj\",\n \"NOTIFICATIONS\": \"Avizoj\",\n \"INVITATIONS\": \"Invitoj\"\n },\n \"ACCOUNT\": {\n \"NEW\": {\n \"ORGANIZATION_ACCOUNT\": \"Konto por organizaĵo\",\n \"ORGANIZATION_ACCOUNT_HELP\": \"Se vi reprezentas entreprenon, asocion, ktp.<br/>Neniu universala dividendo estos kreita per tiu ĉi konto.\"\n },\n \"EVENT\": {\n \"MEMBER_WITHOUT_PROFILE\": \"Vi povas <a ui-sref=\\\"app.edit_profile\\\">tajpi vian profilon Cesium+</a> (kromebleco) por disponi pli bonan videblecon por via konto.\"\n },\n \"ERROR\": {\n \"WS_CONNECTION_FAILED\": \"Cesium ne povas ricevi la avizojn pro teknika eraro (konekto al la daten-nodo Cesium+).<br/><br/>Se la problemo daŭradas, bonvolu <b>elekti alian daten-nodon</b> ĉe la parametroj Cesium+.\"\n }\n },\n \"WOT\": {\n \"BTN_SUGGEST_CERTIFICATIONS_DOTS\": \"Sugesti identecojn atestotajn...\",\n \"BTN_ASK_CERTIFICATIONS_DOTS\": \"Peti membrojn atesti min...\",\n \"BTN_ASK_CERTIFICATION\": \"Peti atestaĵon\",\n \"SUGGEST_CERTIFICATIONS_MODAL\": {\n \"TITLE\": \"Sugesti atestadojn\",\n \"HELP\": \"Elekti viajn sugestojn\"\n },\n \"ASK_CERTIFICATIONS_MODAL\": {\n \"TITLE\": \"Peti atestaĵojn\",\n \"HELP\": \"Elekti la ricevontojn\"\n },\n \"SEARCH\": {\n \"DIVIDER_PROFILE\": \"Kontoj\",\n \"DIVIDER_PAGE\": \"Paĝoj\",\n \"DIVIDER_GROUP\": \"Grupoj\"\n },\n \"CONFIRM\": {\n \"SUGGEST_CERTIFICATIONS\": \"Ĉu vi certas, ke vi volas <b>sendi tiujn sugestojn por atestado</b>?\",\n \"ASK_CERTIFICATION\": \"Ĉu vi certas, ke vi volas <b>sendi atesto-peton</b>?\",\n \"ASK_CERTIFICATIONS\": \"Ĉu vi certas, ke vi volas <b>sendi atesto-peton</b> al tiuj personoj?\"\n }\n },\n \"INVITATION\": {\n \"TITLE\": \"Invitoj\",\n \"NO_RESULT\": \"Neniu invito atendanta\",\n \"BTN_DELETE_ALL\": \"Forigi ĉiujn invitojn\",\n \"BTN_DELETE\": \"Forigi la inviton\",\n \"BTN_NEW_INVITATION\": \"Nova invito\",\n \"ASK_CERTIFICATION\": \"<a href=\\\"#/app/wot/{{pubkey}}/{{::uid}}\\\">{{::name||uid}}</a> petas vian atestadon\",\n \"SUGGESTION_CERTIFICATION\": \"<a href=\\\"#/app/wot/{{::pubkey}}/{{::uid}}\\\">{{::name||uid}}</a> estas sugestita al vi por atestado\",\n \"SUGGESTED_BY\": \"Sugesto sendita de <a class=\\\"positive\\\" href=\\\"#/app/wot/{{::issuer.pubkey}}/{{::issuer.uid}}\\\">{{::issuer.name||issuer.uid}}</a>\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Invitoj\"\n },\n \"LIST\": {\n \"TITLE\": \"Invitoj\"\n },\n \"NEW\": {\n \"TITLE\": \"Nova invito\",\n \"RECIPIENTS\": \"Al\",\n \"RECIPIENTS_HELP\": \"Ricevontoj de la invito\",\n \"RECIPIENTS_MODAL_TITLE\": \"Ricevontoj\",\n \"RECIPIENTS_MODAL_HELP\": \"Bonvolu elekti la ricevontojn:\",\n \"SUGGESTION_IDENTITIES\": \"Sugestoj por atestado\",\n \"SUGGESTION_IDENTITIES_HELP\": \"Atestadoj sugestotaj\",\n \"SUGGESTION_IDENTITIES_MODAL_TITLE\": \"Sugestoj\",\n \"SUGGESTION_IDENTITIES_MODAL_HELP\": \"Bonvolu elekti viajn sugestojn:\"\n },\n \"CONFIRM\": {\n \"DELETE_ALL_CONFIRMATION\": \"La forigo de la invitoj estas <b>neinversigebla ago</b>.<br/><br/><b>Ĉu vi certas</b>, ke vi volas daŭrigi?\",\n \"SEND_INVITATIONS_TO_CERTIFY\": \"Ĉu vi certas, ke vi volas <b>sendi tiun inviton atestotan</b>?\"\n },\n \"INFO\": {\n \"INVITATION_SENT\": \"Invito sendita\"\n },\n \"ERROR\": {\n \"LOAD_INVITATIONS_FAILED\": \"Malsukceso por ŝarĝi la invitojn\",\n \"REMOVE_INVITATION_FAILED\": \"Eraro dum la forigo de la invito\",\n \"REMOVE_ALL_INVITATIONS_FAILED\": \"Eraro dum la forigo de la invitoj\",\n \"SEND_INVITATION_FAILED\": \"Eraro dum la sendo de la invito\",\n \"BAD_INVITATION_FORMAT\": \"<span class=\\\"assertive\\\"><i class=\\\"ion-close-circled\\\"></i> Invito nelegebla (strukturo nekonata)</span> - sendita de <a ui-sref=\\\"app.wot_identity({pubkey: '{{::pubkey}}', uid: '{{::uid}}' })\\\">{{::name||uid}}</a>\"\n }\n },\n \"COMMENTS\": {\n \"DIVIDER\": \"Komentoj\",\n \"SHOW_MORE_COMMENTS\": \"Afiŝi la antaŭajn komentojn\",\n \"COMMENT_HELP\": \"Via komento, demando, ktp.\",\n \"COMMENT_HELP_REPLY_TO\": \"Via respondo...\",\n \"BTN_SEND\": \"Sendi\",\n \"POPOVER_SHARE_TITLE\": \"Mesaĝo #{{number}}\",\n \"REPLY\": \"Respondi\",\n \"REPLY_TO\": \"Respondo al:\",\n \"REPLY_TO_LINK\": \"Responde al \",\n \"REPLY_TO_DELETED_COMMENT\": \"Responde al forigita komento\",\n \"REPLY_COUNT\": \"{{replyCount}} respondoj\",\n \"DELETED_COMMENT\": \"Komento forigita\",\n \"MODIFIED_ON\": \"modifita la {{time|formatDate}}\",\n \"MODIFIED_PARENTHESIS\": \"(modifita poste)\",\n \"ERROR\": {\n \"FAILED_SAVE_COMMENT\": \"Eraro dum la konservo de la komento\",\n \"FAILED_REMOVE_COMMENT\": \"Eraro dum la forigo de la komento\"\n }\n },\n \"MESSAGE\": {\n \"REPLY_TITLE_PREFIX\": \"Resp: \",\n \"FORWARD_TITLE_PREFIX\": \"Tr: \",\n \"BTN_REPLY\": \"Respondi\",\n \"BTN_COMPOSE\": \"Nova mesaĝo\",\n \"BTN_WRITE\": \"Skribi\",\n \"NO_MESSAGE_INBOX\": \"Neniu mesaĝo ricevita\",\n \"NO_MESSAGE_OUTBOX\": \"Neniu mesaĝo sendita\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Mesaĝoj\",\n \"MESSAGE_RECEIVED\": \"Vi <b>ricevis mesaĝon</b><br/>de\"\n },\n \"LIST\": {\n \"INBOX\": \"Ricevujo\",\n \"OUTBOX\": \"Senditaj mesaĝoj\",\n \"LAST_INBOX\": \"Novaj mesaĝoj\",\n \"LAST_OUTBOX\": \"Senditaj mesaĝoj\",\n \"BTN_LAST_MESSAGES\": \"Freŝdataj mesaĝoj\",\n \"TITLE\": \"Mesaĝoj\",\n \"SEARCH_HELP\": \"Serĉado en la mesaĝoj\",\n \"POPOVER_ACTIONS\": {\n \"TITLE\": \"Kromaĵoj\",\n \"DELETE_ALL\": \"Forigi ĉiujn mesaĝojn\"\n }\n },\n \"COMPOSE\": {\n \"TITLE\": \"Nova mesaĝo\",\n \"TITLE_REPLY\": \"Respondi\",\n \"SUB_TITLE\": \"Nova mesaĝo\",\n \"TO\": \"Al\",\n \"OBJECT\": \"Temo\",\n \"OBJECT_HELP\": \"Temo\",\n \"ENCRYPTED_HELP\": \"Bonvolu noti, ke tiu ĉi mesaĝo estos ĉifrita antaŭ sendo, tiel ke nur la adresato povos legi ĝin, kaj ke li estos certa, ke vi ja estas ties aŭtoro.\",\n \"MESSAGE\": \"Mesaĝo\",\n \"MESSAGE_HELP\": \"Enhavo de la mesaĝo\",\n \"CONTENT_CONFIRMATION\": \"La enhavo de la mesaĝo estas malplena.<br/><br/>Ĉu vi volas tamen sendi la mesaĝon?\"\n },\n \"VIEW\": {\n \"TITLE\": \"Mesaĝo\",\n \"SENDER\": \"Sendita de\",\n \"RECIPIENT\": \"Sendita al\",\n \"NO_CONTENT\": \"Mesaĝo malplena\",\n \"DELETE\": \"Forigi la mesaĝon\"\n },\n \"CONFIRM\": {\n \"REMOVE\": \"Ĉu vi certas, ke vi volas <b>forigi tiun ĉi mesaĝon</b>?<br/><br/>Tiu ago estas neinversigebla.\",\n \"REMOVE_ALL\" : \"Ĉu vi certas, ke vi volas <b>forigi ĉiujn mesaĝojn</b>?<br/><br/>Tiu ago estas neinversigebla.\",\n \"MARK_ALL_AS_READ\": \"Ĉu vi certas, ke vi volas <b>marki ĉiujn mesaĝojn legitaj</b>?\",\n \"USER_HAS_NO_PROFILE\": \"Tiu identeco havas neniun profilon Cesium+. Eblas ke ĝi ne uzas la krom-programon Cesium+, kaj <b>do ne legos vian mesaĝon</b>.<br/><br/>Ĉu vi certas, ke vi volas tamen <b>daŭrigi</b>?\"\n },\n \"INFO\": {\n \"MESSAGE_REMOVED\": \"Mesaĝo forigita\",\n \"All_MESSAGE_REMOVED\": \"Ĉiuj mesaĝoj estis forigitaj\",\n \"MESSAGE_SENT\": \"Mesaĝo sendita\"\n },\n \"ERROR\": {\n \"SEND_MSG_FAILED\": \"Eraro dum la sendo de la mesaĝo.\",\n \"LOAD_MESSAGES_FAILED\": \"Eraro dum la ricevo de la mesaĝoj.\",\n \"LOAD_MESSAGE_FAILED\": \"Eraro dum la ricevo de la mesaĝo.\",\n \"MESSAGE_NOT_READABLE\": \"Legado de la mesaĝo neebla.\",\n \"USER_NOT_RECIPIENT\": \"Vi ne estas la adresato de tiu ĉi mesaĝo: malĉifrado neebla.\",\n \"NOT_AUTHENTICATED_MESSAGE\": \"La aŭtenteco de la mesaĝo estas dubinda aŭ ties enhavo estas difektita.\",\n \"REMOVE_MESSAGE_FAILED\": \"Malsukceso por forigi la mesaĝon\",\n \"MESSAGE_CONTENT_TOO_LONG\": \"Signaro tro longa ({{maxLength}} signoj maksimume).\",\n \"MARK_AS_READ_FAILED\": \"Neeblas marki la mesaĝon 'legita'.\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Eraro dum la ricevo de la mesaĝo-avizoj.\",\n \"REMOVE_All_MESSAGES_FAILED\": \"Eraro dum la forigo de ĉiuj mesaĝoj.\",\n \"MARK_ALL_AS_READ_FAILED\": \"Eraro por marki la mesaĝojn legitaj.\",\n \"RECIPIENT_IS_MANDATORY\": \"La adresato estas deviga.\"\n }\n },\n \"BLOCKCHAIN\": {\n \"LOOKUP\": {\n \"SEARCH_HELP\": \"Numero de bloko, haketo, publika ŝlosilo, ktp.\",\n \"POPOVER_FILTER_TITLE\": \"Filtriloj\",\n \"HEADER_MEDIAN_TIME\": \"Dato / Horo\",\n \"HEADER_BLOCK\": \"Bloko #\",\n \"HEADER_ISSUER\": \"Nodo elsendinta\",\n \"BTN_LAST\": \"Lastaj blokoj\",\n \"DISPLAY_QUERY\": \"Afiŝi la informpeton\",\n \"HIDE_QUERY\": \"Kaŝi la informpeton\",\n \"TX_SEARCH_FILTER\": {\n \"MEMBER_FLOWS\": \"<b class=\\\"ion-person\\\"></b> Eniroj/eliroj de membroj\",\n \"EXISTING_TRANSACTION\": \"<b class=\\\"ion-card\\\"></b> Kun spezoj\",\n \"PERIOD\": \"<b class=\\\"ion-clock\\\"></b> Inter <b class=\\\"gray\\\">{{params[1]|medianDateShort}}</b> ({{params[1]|medianTime}}) kaj <b class=\\\"gray\\\">{{params[2]|medianDateShort}}</b> ({{params[2]|medianTime}})\",\n \"ISSUER\": \"<b class=\\\"ion-android-desktop\\\"></b> Kalkulita de <b class=\\\"ion-key\\\"></b> {{params[1]|formatPubkey}}\",\n \"TX_PUBKEY\": \"<b class=\\\"ion-card\\\"></b> Spezoj koncernantaj <b class=\\\"ion-key\\\"></b> {{params[1]|formatPubkey}}\"\n }\n },\n \"ERROR\": {\n \"SEARCH_BLOCKS_FAILED\": \"Eraro dum la serĉado de la blokoj.\"\n }\n },\n \"GROUP\": {\n \"GENERAL_DIVIDER\": \"Ĝeneralaj informoj\",\n \"LOCATION_DIVIDER\": \"Adreso\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Sociaj retoj kaj retejo\",\n \"TECHNICAL_DIVIDER\": \"Teknikaj informoj\",\n \"CREATED_TIME\": \"Kreita {{creationTime|formatFromNow}}\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Invitoj\"\n },\n \"LOOKUP\": {\n \"TITLE\": \"Grupoj\",\n \"SEARCH_HELP\": \"Nomo de grupo, vortoj, loko, ktp.\",\n \"LAST_RESULTS_LIST\": \"Novaj grupoj:\",\n \"OPEN_RESULTS_LIST\": \"Malfermitaj grupoj:\",\n \"MANAGED_RESULTS_LIST\": \"Fermitaj grupoj:\",\n \"BTN_LAST\": \"Novaj grupoj\",\n \"BTN_NEW\": \"Mi aldonas grupon\"\n },\n \"TYPE\": {\n \"TITLE\": \"Nova grupo\",\n \"SELECT_TYPE\": \"Tipo de grupo:\",\n \"OPEN_GROUP\": \"Malfermita grupo\",\n \"OPEN_GROUP_HELP\": \"Malfermita grupo estas alirebla de iu ajn membro de la mono.\",\n \"MANAGED_GROUP\": \"Administrita grupo\",\n \"MANAGED_GROUP_HELP\": \"Administrita grupo estas mastrumata de administrantoj kaj moderigantoj, kiuj povas akcepti, rifuzi aŭ eksigi membron.\",\n \"ENUM\": {\n \"OPEN\": \"Malfermita grupo\",\n \"MANAGED\": \"Administrita grupo\"\n }\n },\n \"VIEW\": {\n \"POPOVER_SHARE_TITLE\": \"{{title}}\",\n \"MENU_TITLE\": \"Kromaĵoj\",\n \"REMOVE_CONFIRMATION\" : \"Ĉu vi certas, ke vi volas forigi tiun ĉi grupon?<br/><br/>Tiu ago estas neinversigebla.\"\n },\n \"EDIT\": {\n \"TITLE\": \"Grupo\",\n \"TITLE_NEW\": \"Nova grupo\",\n \"RECORD_TITLE\": \"Titolo\",\n \"RECORD_TITLE_HELP\": \"Titolo\",\n \"RECORD_DESCRIPTION\": \"Priskribo\",\n \"RECORD_DESCRIPTION_HELP\": \"Priskribo\"\n },\n \"ERROR\": {\n \"SEARCH_GROUPS_FAILED\": \"Malsukceso por traserĉi grupojn\",\n \"REMOVE_RECORD_FAILED\": \"Malsukceso por forigi la grupon\"\n },\n \"INFO\": {\n \"RECORD_REMOVED\" : \"Grupo forigita\"\n }\n },\n \"REGISTRY\": {\n \"CATEGORY\": \"Ĉefa agado\",\n \"GENERAL_DIVIDER\": \"Ĝeneralaj informoj\",\n \"LOCATION_DIVIDER\": \"Adreso\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Sociaj retoj kaj retejo\",\n \"TECHNICAL_DIVIDER\": \"Teknikaj informoj\",\n \"BTN_SHOW_WOT\": \"Personoj\",\n \"BTN_SHOW_WOT_HELP\": \"Traserĉi personojn\",\n \"BTN_SHOW_PAGES\": \"Paĝoj\",\n \"BTN_SHOW_PAGES_HELP\": \"Traserĉi paĝojn\",\n \"BTN_NEW\": \"Krei paĝon\",\n \"MY_PAGES\": \"Miaj paĝoj\",\n \"NO_PAGE\": \"Neniu paĝo\",\n \"SEARCH\": {\n \"TITLE\": \"Paĝoj\",\n \"SEARCH_HELP\": \"Kio, Kiu: restoracio, Ĉe Marcelo, ...\",\n \"BTN_ADD\": \"Nova\",\n \"BTN_LAST_RECORDS\": \"Freŝdataj paĝoj\",\n \"BTN_ADVANCED_SEARCH\": \"Sperta serĉado\",\n \"BTN_OPTIONS\": \"Sperta serĉado\",\n \"TYPE\": \"Tipo de paĝo\",\n \"LOCATION_HELP\": \"Kie: Poŝto-kodo, Urbo\",\n \"RESULTS\": \"Rezultoj\",\n \"RESULT_COUNT_LOCATION\": \"{{count}} rezulto{{count>0?'j':''}}, proksime de {{location}}\",\n \"RESULT_COUNT\": \"{{count}} rezulto{{count>0?'j':''}}\",\n \"LAST_RECORDS\": \"Freŝdataj paĝoj\",\n \"LAST_RECORD_COUNT_LOCATION\": \"{{count}} paĝo{{count>0?'j':''}} freŝdata{{count>0?'j':''}}, proksime de {{location}}\",\n \"LAST_RECORD_COUNT\": \"{{count}} paĝo{{count>0?'j':''}} freŝdata{{count>0?'j':''}}\",\n \"POPOVER_FILTERS\": {\n \"BTN_ADVANCED_SEARCH\": \"Spertaj kromaĵoj?\"\n }\n },\n \"VIEW\": {\n \"TITLE\": \"Adresaro\",\n \"CATEGORY\": \"Ĉefa agado:\",\n \"LOCATION\": \"Adreso:\",\n \"MENU_TITLE\": \"Kromaĵoj\",\n \"POPOVER_SHARE_TITLE\": \"{{title}}\",\n \"REMOVE_CONFIRMATION\" : \"Ĉu vi certas, ke vi volas forigi tiun ĉi paĝon?<br/><br/>Tiu ago estas neinversigebla.\"\n },\n \"TYPE\": {\n \"TITLE\": \"Tipoj\",\n \"SELECT_TYPE\": \"Tipo de paĝo:\",\n \"ENUM\": {\n \"SHOP\": \"Loka komerco\",\n \"COMPANY\": \"Entrepreno\",\n \"ASSOCIATION\": \"Asocio\",\n \"INSTITUTION\": \"Institucio\"\n }\n },\n \"EDIT\": {\n \"TITLE\": \"Redaktado\",\n \"TITLE_NEW\": \"Nova paĝo\",\n \"RECORD_TYPE\":\"Tipo de paĝo\",\n \"RECORD_TITLE\": \"Nomo\",\n \"RECORD_TITLE_HELP\": \"Nomo\",\n \"RECORD_DESCRIPTION\": \"Priskribo\",\n \"RECORD_DESCRIPTION_HELP\": \"Priskribo de la agado\",\n \"RECORD_ADDRESS\": \"Strato\",\n \"RECORD_ADDRESS_HELP\": \"Strato, konstruaĵo...\",\n \"RECORD_CITY\": \"Urbo\",\n \"RECORD_CITY_HELP\": \"Urbo\",\n \"RECORD_SOCIAL_NETWORKS\": \"Sociaj retoj kaj retejo\",\n \"RECORD_PUBKEY\": \"Publika ŝlosilo\",\n \"RECORD_PUBKEY_HELP\": \"Publika ŝlosilo por ricevi la pagojn\"\n },\n \"WALLET\": {\n \"PAGE_DIVIDER\": \"Paĝoj\",\n \"PAGE_DIVIDER_HELP\": \"La paĝoj listigas agadojn, kiuj akceptas la liberan monon aŭ helpas ĝin: komercoj, entreprenoj, asocioj, institucioj.\"\n },\n \"ERROR\": {\n \"LOAD_CATEGORY_FAILED\": \"Malsukceso por ŝarĝi la liston de la agadoj\",\n \"LOAD_RECORD_FAILED\": \"Eraro dum la ŝarĝado de la paĝo\",\n \"LOOKUP_RECORDS_FAILED\": \"Eraro dum la serĉado\",\n \"REMOVE_RECORD_FAILED\": \"Malsukceso por forigi la paĝon\",\n \"SAVE_RECORD_FAILED\": \"Eraro dum la konservado\",\n \"RECORD_NOT_EXISTS\": \"Paĝo neekzistanta\",\n \"GEO_LOCATION_NOT_FOUND\": \"Urbo aŭ poŝto-kodo ne trovita\"\n },\n \"INFO\": {\n \"RECORD_REMOVED\" : \"Paĝo forigita\",\n \"RECORD_SAVED\": \"Paĝo konservita\"\n }\n },\n \"PROFILE\": {\n \"PROFILE_DIVIDER\": \"Profilo Cesium+\",\n \"PROFILE_DIVIDER_HELP\": \"Temas pri kromaj datenoj, stokitaj ekster la mon-reto.\",\n \"NO_PROFILE_DEFINED\": \"Neniu profilo tajpita\",\n \"BTN_ADD\": \"Tajpi mian profilon\",\n \"BTN_EDIT\": \"Redakti mian profilon\",\n \"BTN_DELETE\": \"Forigi mian profilon\",\n \"BTN_REORDER\": \"Reordigi\",\n \"UID\": \"Pseŭdonimo\",\n \"TITLE\": \"Familia nomo, Persona nomo\",\n \"TITLE_HELP\": \"Familia nomo, Persona nomo\",\n \"DESCRIPTION\": \"Pri mi\",\n \"DESCRIPTION_HELP\": \"Pri mi...\",\n \"SOCIAL_HELP\": \"http://...\",\n \"GENERAL_DIVIDER\": \"Ĝeneralaj informoj\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Sociaj retoj, retejoj\",\n \"TECHNICAL_DIVIDER\": \"Teknikaj informoj\",\n \"MODAL_AVATAR\": {\n \"TITLE\": \"Profil-foto\",\n \"SELECT_FILE_HELP\": \"Bonvolu <b>elekti bildo-dosieron</b>:\",\n \"BTN_SELECT_FILE\": \"Elekti foton\",\n \"RESIZE_HELP\": \"<b>Rekadri la bildon</b>, laŭbezone. Pluigi klakon sur la bildo ebligas movi ĝin. Alklaku la zonon malsupre maldekstre por zomi.\",\n \"RESULT_HELP\": \"<b>Jen la rezulto</b> tiel videbla ĉe via profilo:\"\n },\n \"CONFIRM\": {\n \"DELETE\": \"Ĉu vi certas, ke vi volas <b>forigi vian profilon Cesium+ ?</b><br/><br/>Tiu ago estas neinversigebla.\"\n },\n \"ERROR\": {\n \"REMOVE_PROFILE_FAILED\": \"Malsukceso por forigi la profilon\",\n \"LOAD_PROFILE_FAILED\": \"Malsukceso por ŝarĝi la profilon de la uzanto.\",\n \"SAVE_PROFILE_FAILED\": \"Eraro dum la konservado\",\n \"INVALID_SOCIAL_NETWORK_FORMAT\": \"Strukturo ne rekonata: bonvolu tajpi validan adreson.<br/><br/>Ezemploj:<ul><li>- Facebook-paĝo (https://www.facebook.com/uzanto)</li><li>- Retpaĝo (http://www.miaretejo.net)</li><li>- Retadreso (joe@dalton.com)</li></ul>\",\n \"IMAGE_RESIZE_FAILED\": \"Eraro dum la reformatigo de la bildo\"\n },\n \"INFO\": {\n \"PROFILE_REMOVED\": \"Profilo forigita\",\n \"PROFILE_SAVED\": \"Profilo konservita\"\n },\n \"HELP\": {\n \"WARNING_PUBLIC_DATA\": \"La informoj afiŝitaj en via profilo <b>estas publikaj</b>: videblaj inkluzive de la personoj <b>ne konektitaj</b>.<br/>{{'PROFILE.PROFILE_DIVIDER_HELP'|translate}}\"\n }\n },\n \"LOCATION\": {\n \"BTN_GEOLOC_ADDRESS\": \"Trovi mian adreson surmape\",\n \"USE_GEO_POINT\": \"Aperi sur la mapoj {{'COMMON.APP_NAME'|translate}}?\",\n \"LOADING_LOCATION\": \"Serĉado de la adreso...\",\n \"LOCATION_DIVIDER\": \"Adreso\",\n \"ADDRESS\": \"Strato\",\n \"ADDRESS_HELP\": \"Strato, adres-aldonaĵo...\",\n \"CITY\": \"Urbo\",\n \"CITY_HELP\": \"Poŝto-kodo, Urbo, Lando\",\n \"DISTANCE\": \"Maksimuma distanco ĉirkaŭ la urbo\",\n \"DISTANCE_UNIT\": \"km\",\n \"DISTANCE_OPTION\": \"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}\",\n \"SEARCH_HELP\": \"Poŝto-kodo, Urbo\",\n \"PROFILE_POSITION\": \"Loko de la profilo\",\n \"MODAL\": {\n \"TITLE\": \"Serĉado de la adreso\",\n \"SEARCH_HELP\": \"Urbo, Poŝto-kodo, Lando\",\n \"ALTERNATIVE_RESULT_DIVIDER\": \"Alternativaj rezultoj por <b>{{address}}</b>:\",\n \"POSITION\": \"Lat/Lon: {{lat}}/{{lon}}\"\n },\n \"ERROR\": {\n \"CITY_REQUIRED_IF_STREET\": \"Deviga kampo (ĉar strato estas tajpita)\",\n \"REQUIRED_FOR_LOCATION\": \"Deviga kampo por aperi sur la mapo\",\n \"INVALID_FOR_LOCATION\": \"Adreso nekonata\",\n \"GEO_LOCATION_FAILED\": \"Neeblas ricevi vian lokiĝon. Bonvolu uzi la serĉo-butonon.\",\n \"ADDRESS_LOCATION_FAILED\": \"Neeblas ricevi la lokon per la adreso\"\n }\n },\n \"SUBSCRIPTION\": {\n \"SUBSCRIPTION_DIVIDER\": \"Retaj servoj\",\n \"SUBSCRIPTION_DIVIDER_HELP\": \"La retaj servoj proponas pliajn nedevigajn servojn, delegitajn al aliulo.\",\n \"BTN_ADD\": \"Aldoni servon\",\n \"BTN_EDIT\": \"Mastrumi miajn servojn\",\n \"NO_SUBSCRIPTION\": \"Neniu servo uzata\",\n \"SUBSCRIPTION_COUNT\": \"Servoj / Abonoj\",\n \"EDIT\": {\n \"TITLE\": \"Retaj servoj\",\n \"HELP_TEXT\": \"Mastrumu ĉi tie viajn abonojn kaj aliajn retajn servojn\",\n \"PROVIDER\": \"Provizanto:\"\n },\n \"TYPE\": {\n \"ENUM\": {\n \"EMAIL\": \"Ricevi la avizojn per retmesaĝo\"\n }\n },\n \"CONFIRM\": {\n \"DELETE_SUBSCRIPTION\": \"Ĉu vi certas, ke vi volas <b>forigi tiun abonon</b>?\"\n },\n \"ERROR\": {\n \"LOAD_SUBSCRIPTIONS_FAILED\": \"Eraro dum la ŝarĝo de la retaj servoj\",\n \"ADD_SUBSCRIPTION_FAILED\": \"Malsukceso por sendi la abonon\",\n \"UPDATE_SUBSCRIPTION_FAILED\": \"Malsukceso por ĝisdatigi la abonon\",\n \"DELETE_SUBSCRIPTION_FAILED\": \"Eraro dum la forigo de la abono\"\n },\n \"MODAL_EMAIL\": {\n \"TITLE\" : \"Avizo per retmesaĝo\",\n \"HELP\" : \"Plenigu tiun ĉi formularon por <b>esti avizita per retmesaĝo</b> pri la okazaĵoj ĉe via konto.<br/>Via retadreso estos ĉifrita por esti videbla nur de la servo-provizanto.\",\n \"EMAIL_LABEL\" : \"Via retadreso:\",\n \"EMAIL_HELP\": \"johano.stelaro@esperanto.org\",\n \"FREQUENCY_LABEL\": \"Periodo de la avizoj:\",\n \"FREQUENCY_DAILY\": \"Ĉiutaga\",\n \"FREQUENCY_WEEKLY\": \"Ĉiusemajna\",\n \"PROVIDER\": \"Servo-provizanto:\"\n }\n },\n \"DOCUMENT\": {\n \"HASH\": \"Haketo: \",\n \"LOOKUP\": {\n \"TITLE\": \"Serĉado de dokumentoj\",\n \"BTN_ACTIONS\": \"Agoj\",\n \"SEARCH_HELP\": \"Sendanto:AAA*, tempo:1508406169\",\n \"LAST_DOCUMENTS_DOTS\": \"Lastaj dokumentoj:\",\n \"LAST_DOCUMENTS\": \"Lastaj dokumentoj\",\n \"SHOW_QUERY\": \"Vidi la informpeton\",\n \"HIDE_QUERY\": \"Kaŝi la informpeton\",\n \"HEADER_TIME\": \"Dato/Horo\",\n \"HEADER_ISSUER\": \"Sendanto\",\n \"HEADER_RECIPIENT\": \"Ricevonto\",\n \"READ\": \"Legita\",\n \"BTN_REMOVE\": \"Forigi tiun ĉi dokumenton\",\n \"BTN_COMPACT\": \"Densigi\",\n \"HAS_CREATE_OR_UPDATE_PROFILE\": \"kreis aŭ modifis sian profilon\",\n \"POPOVER_ACTIONS\": {\n \"TITLE\": \"Agoj\",\n \"REMOVE_ALL\": \"Forigi tiujn ĉi dokumentojn...\"\n }\n },\n \"INFO\": {\n \"REMOVED\": \"Dokumento forigita\"\n },\n \"CONFIRM\": {\n \"REMOVE\": \"Ĉu vi certas, ke vi volas <b>forigi tiun ĉi dokumenton</b>?\",\n \"REMOVE_ALL\": \"Ĉu vi certas, ke vi volas <b>forigi tiujn ĉi dokumentojn</b>?\"\n },\n \"ERROR\": {\n \"LOAD_DOCUMENTS_FAILED\": \"Eraro dum la serĉado de dokumentoj\",\n \"REMOVE_FAILED\": \"Eraro dum la forigo de la dokumento\",\n \"REMOVE_ALL_FAILED\": \"Eraro dum la forigo de la dokumentoj\"\n }\n },\n \"ES_SETTINGS\": {\n \"PLUGIN_NAME\": \"Cesium+\",\n \"PLUGIN_NAME_HELP\": \"Profiloj, avizoj, privataj mesaĝoj\",\n \"ENABLE_TOGGLE\": \"Aktivigi la krom-programon?\",\n \"ENABLE_REMOTE_STORAGE\": \"Aktivigi la foran stokadon?\",\n \"ENABLE_REMOTE_STORAGE_HELP\": \"Ebligas stoki (ĉifrite) viajn parametrojn ĉe la nodoj Cesium+\",\n \"ENABLE_MESSAGE_TOGGLE\": \"Aktivigi la privatajn mesaĝojn?\",\n \"PEER\": \"Adreso de la daten-nodo\",\n \"POPUP_PEER\": {\n \"TITLE\" : \"Daten-nodo\",\n \"HELP\" : \"Tajpu la adreson de la nodo, kiun vi volas uzi:\",\n \"PEER_HELP\": \"servo.domajno.com:port\"\n },\n \"NOTIFICATIONS\": {\n \"DIVIDER\": \"Avizoj\",\n \"HELP_TEXT\": \"Aktivigu la avizo-tipojn, kiujn vi deziras ricevi:\",\n \"ENABLE_TX_SENT\": \"Avizi pri la <b>senditaj pagoj</b>?\",\n \"ENABLE_TX_RECEIVED\": \"Avizi pri la <b>ricevitaj pagoj</b>?\",\n \"ENABLE_CERT_SENT\": \"Avizi pri la <b>senditaj atestaĵoj</b>?\",\n \"ENABLE_CERT_RECEIVED\": \"Avizi pri <b>la ricevitaj atestaĵoj</b>?\",\n \"ENABLE_HTML5_NOTIFICATION\": \"Anonci ĉiun novan avizon?\",\n \"ENABLE_HTML5_NOTIFICATION_HELP\": \"Malfermas fenestreton por ĉiu nova avizo.\"\n },\n \"CONFIRM\": {\n \"ASK_ENABLE_TITLE\": \"Kromaj funkcioj\",\n \"ASK_ENABLE\": \"La krom-programo Cesium+ estas <b>malaktivigita</b> ĉe viaj parametroj, kio senaktivigas la funkciojn: <ul><li>&nbsp;&nbsp;<b><i class=\\\"icon ion-person\\\"></i> Profiloj Cesium+</b>;<li>&nbsp;&nbsp;<b><i class=\\\"icon ion-android-notifications\\\"></i> Avizoj</b>;<li>&nbsp;&nbsp;<b><i class=\\\"icon ion-email\\\"></i> Privataj mesaĝoj</b>.<li>&nbsp;&nbsp;<b><i class=\\\"icon ion-location\\\"></i> Mapoj, ktp.</b>.</ul><br/><b>Ĉu vi deziras reaktivigi</b> la krom-programon?\"\n }\n },\n \"ES_WALLET\": {\n \"ERROR\": {\n \"RECIPIENT_IS_MANDATORY\": \"Adresito estas deviga por la ĉifrado.\"\n }\n },\n \"ES_PEER\": {\n \"NAME\": \"Nomo\",\n \"DOCUMENTS\": \"Dokumentoj\",\n \"SOFTWARE\": \"Programo\",\n \"DOCUMENT_COUNT\": \"Nombro de dokumentoj\",\n \"EMAIL_SUBSCRIPTION_COUNT\": \"{{emailSubscription}} abonantoj pri avizoj per retmesaĝoj\"\n },\n \"EVENT\": {\n \"NODE_STARTED\": \"Via nodo ES API <b>{{params[0]}}</b> ekis\",\n \"NODE_BMA_DOWN\": \"La nodo <b>{{params[0]}}:{{params[1]}}</b> (uzata de via nodo ES API) estas <b>neatingebla</b>.\",\n \"NODE_BMA_UP\": \"La nodo <b>{{params[0]}}:{{params[1]}}</b> estas denove alirebla.\",\n \"MEMBER_JOIN\": \"Vi estas nun <b>membro</b> de la mono <b>{{params[0]}}</b>!\",\n \"MEMBER_LEAVE\": \"Vi <b>ne plu estas membro</b> de la mono <b>{{params[0]}}</b>!\",\n \"MEMBER_EXCLUDE\": \"Vi <b>ne plu estas membro</b> de la mono <b>{{params[0]}}</b>, pro ne revalidiĝo aŭ pro manko da atestaĵoj.\",\n \"MEMBER_REVOKE\": \"La nuligo de via konto efektiviĝis. Ĝi ne plu povos esti membro-konto de la mono <b>{{params[0]}}</b>.\",\n \"MEMBER_ACTIVE\": \"La revalidiĝo de via aliĝo al la mono <b>{{params[0]}}</b> estis <b>ricevita</b>.\",\n \"TX_SENT\": \"Via <b>pago</b> al <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\" ><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> efektiviĝis.\",\n \"TX_SENT_MULTI\": \"Via <b>pago</b> al <b>{{params[1]}}</b> efektiviĝis.\",\n \"TX_RECEIVED\": \"Vi <b>ricevis pagon</b> de <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span>.\",\n \"TX_RECEIVED_MULTI\": \"Vi <b>ricevis pagon</b> de <b>{{params[1]}}</b>.\",\n \"CERT_SENT\": \"Via <b>atestado</b> al <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\" ><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> efektiviĝis.\",\n \"CERT_RECEIVED\": \"Vi <b>ricevis atestaĵon</b> de <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span>.\",\n \"USER\": {\n \"LIKE_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> ŝatas vian profilon\",\n \"FOLLOW_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> sekvas viajn agojn\",\n \"STAR_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> notis vin ({{params[3]}} <b class=\\\"ion-star\\\">)\",\n \"MODERATION_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> petas de vi moderigon pri la profilo: <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"DELETION_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> atentigis pri profilo foriginda: <b>{{params[2]}}</b>\",\n \"ABUSE_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> atentigis pri via profilo\"\n },\n \"PAGE\": {\n \"NEW_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> komentis vian anoncon: <b>{{params[2]}}</b>\",\n \"UPDATE_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> modifis sian komenton pri via anonco: <b>{{params[2]}}</b>\",\n \"NEW_REPLY_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> respondis al via komento pri la anonco: <b>{{params[2]}}</b>\",\n \"UPDATE_REPLY_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> modifis sian respondon al via komento pri la anonco: <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> komentis la paĝon: <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> modifis sian komenton ĉe la paĝo: <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> aldonis la paĝon: <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> modifis la paĝon: <b>{{params[2]}}</b>\",\n \"MODERATION_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> petas de vis moderigon pri la paĝo: <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"DELETION_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> atentigis pri paĝo foriginda: <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"ABUSE_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> atentigis pri via paĝo: <b>{{params[2]}}</b>\"\n }\n },\n \"CONFIRM\": {\n \"ES_USE_FALLBACK_NODE\": \"Daten-nodo <b>{{old}}</b> neatingebla aŭ adreso nevalida.<br/><br/>Ĉu vi volas provizore uzi la daten-nodon <b>{{new}}</b> ?\"\n },\n \"ERROR\": {\n \"ES_CONNECTION_ERROR\": \"Daten-nodo <b>{{server}}</b> neatingebla aŭ adreso nevalida.<br/><br/>Cesium daŭrigos funkcii, <b>sen la krom-programo Cesium+</b> (uzanto-profiloj, privataj mesaĝoj, mapoj kaj grafikoj)<br/><br/>Kontrolu vian ret-konekton, aŭ ŝanĝu daten-nodon ĉe la <a class=\\\"positive\\\" ng-click=\\\"doQuickFix('settings')\\\">parametroj de la krom-programo</a>.\",\n \"ES_MAX_UPLOAD_BODY_SIZE\": \"La kvanto de datenoj sendotaj superas la limon fiksitan de la servilo.<br/>Bonvolu reprovi post, ekzemple, forigo de fotoj.\"\n }\n}\n);\n\n$translateProvider.translations(\"es-ES\", {\n \"COMMON\": {\n \"ABUSES_TEXT\": \"{{total}} personne{{total > 1 ? 's' : ''}} {{total > 1 ? 'ont' : 'a'}} signalé un problème\",\n \"BTN_LIKE\": \"Me gusta\",\n \"BTN_LIKE_REMOVE\": \"Dejar de gustarme\",\n \"BTN_REMOVE_REPORTED_ABUSE\": \"Cancelar mi reporte\",\n \"BTN_REPORT_ABUSE_DOTS\": \"Reportar un problema o un abuso...\",\n \"COMMENT_HELP\": \"Comentario\",\n \"LIKES_TEXT\": \"A {{total}} persona{{total > 1 ? 's' : ''}} {{total > 1 ? 'les' : 'le'}} gusta esta página\",\n \"NOTIFICATION\": {\n \"HAS_UNREAD\": \"Tiene {{count}} notificaci{{count>0?'ones':'ón'}} no leída{{count>0?'s':''}}\",\n \"TITLE\": \"Nueva notificación | {{'COMMON.APP_NAME'|translate}}\"\n },\n \"REPORT_ABUSE\": {\n \"ASK_DELETE\": \"¿ Solicitar la eliminación ?\",\n \"CONFIRM\": {\n \"SENT\": \"Reporte enviado. ¡ Gracias !\"\n },\n \"REASON_HELP\": \"Yo explico el problema...\",\n \"SUB_TITLE\": \"Por favor explique brevemente el problema :\",\n \"TITLE\": \"Señalar un problema\"\n },\n\n \"CATEGORY\": \"Categoría\",\n \"CATEGORIES\": \"Categorías\",\n \"CATEGORY_SEARCH_HELP\": \"Búsqueda\",\n \"LAST_MODIFICATION_DATE\": \"Actualización el\",\n \"SUBMIT_BY\": \"Enviado por\",\n \"BTN_PUBLISH\": \"Publicar\",\n \"BTN_PICTURE_DELETE\": \"Suprimir\",\n \"BTN_PICTURE_FAVORISE\": \"Principal\",\n \"BTN_PICTURE_ROTATE\": \"Girar\",\n \"BTN_ADD_PICTURE\": \"Añadir una foto\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Notificaciones\",\n \"MARK_ALL_AS_READ\": \"Marcar todo como leído\",\n \"NO_RESULT\": \"Ningúna notificación\",\n \"SHOW_ALL\": \"Ver todo\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Fallo en la carga de las notificaciones\"\n }\n },\n \"DOCUMENT\": {\n \"HASH\": \"Hash: \",\n \"LOOKUP\": {\n \"BTN_COMPACT\": \"Compactar\",\n \"HAS_CREATE_OR_UPDATE_PROFILE\": \"ha creado o modificado su perfil\",\n \"LAST_DOCUMENTS_DOTS\": \"Últimos documentos :\",\n \"TITLE\": \"Búsqueda de documentos\",\n \"BTN_ACTIONS\": \"Acciones\",\n \"SEARCH_HELP\": \"issuer:AAA*, time:1508406169\",\n \"LAST_DOCUMENTS\": \"Últimos documentos\",\n \"SHOW_QUERY\": \"Ver la búsqueda\",\n \"HIDE_QUERY\": \"Esconder la búsqueda\",\n \"HEADER_TIME\": \"Fecha/Hora\",\n \"HEADER_ISSUER\": \"Emisor\",\n \"HEADER_RECIPIENT\": \"Destinatario\",\n \"READ\": \"Leído\",\n \"BTN_REMOVE\": \"Sumprimer este documento\",\n \"POPOVER_ACTIONS\": {\n \"TITLE\": \"Acciones\",\n \"REMOVE_ALL\": \"Suprimir estos documentos...\"\n }\n },\n \"INFO\": {\n \"REMOVED\": \"Documento suprimido\"\n },\n \"CONFIRM\": {\n \"REMOVE\": \"¿ Desea <b>suprimir este documento</b> ?\",\n \"REMOVE_ALL\": \"¿ Desea <b>suprimer estos documentos</b> ?\"\n },\n \"ERROR\": {\n \"LOAD_DOCUMENTS_FAILED\": \"Error al buscar los documentos\",\n \"REMOVE_FAILED\": \"Error al suprimir el documento\",\n \"REMOVE_ALL_FAILED\": \"Error al suprimir los documentos\"\n }\n },\n \"MENU\": {\n \"REGISTRY\": \"Páginas\",\n \"USER_PROFILE\": \"Mi perfil\",\n \"MESSAGES\": \"Mensajes\",\n \"NOTIFICATIONS\": \"Notificaciones\",\n \"INVITATIONS\": \"Invitaciones\"\n },\n \"ACCOUNT\": {\n \"NEW\": {\n \"ORGANIZATION_ACCOUNT\": \"Cuenta para una organización\",\n \"ORGANIZATION_ACCOUNT_HELP\": \"Si representa una empresa, una asociación, etc.<br/>Ningún dividendo universal será creído por esta cuenta.\"\n },\n \"EVENT\": {\n \"MEMBER_WITHOUT_PROFILE\": \"Para obtener sus certificaciones más rapidamente, complete <a ui-sref=\\\"app.edit_profile\\\">su perfil usuario</a>. Los miembros concederán más fácilmente su confianza a una identidad verificable.\"\n },\n \"ERROR\": {\n \"WS_CONNECTION_FAILED\": \"Cesium no puede recibir las notificaciones, a causa de un error técnico (conexión al nodo de datos Cesium+).<br/><br/>Si el problema persiste, por favor <b>elige un otro nodo de datos</b> en los ajustes de Cesium+.\"\n }\n },\n \"WOT\": {\n \"BTN_SUGGEST_CERTIFICATIONS_DOTS\": \"Sugerir identidades a certificar…\",\n \"BTN_ASK_CERTIFICATIONS_DOTS\": \"Pedir a miembros que le certifiquen…\",\n \"BTN_ASK_CERTIFICATION\": \"Pedir una certificación\",\n \"SUGGEST_CERTIFICATIONS_MODAL\": {\n \"TITLE\": \"Sugerir certificaciones\",\n \"HELP\": \"Selectionar sus sugerencias\"\n },\n \"ASK_CERTIFICATIONS_MODAL\": {\n \"TITLE\": \"Solicitar certificaciones\",\n \"HELP\": \"Selectionar los destinatarios\"\n },\n \"SEARCH\": {\n \"DIVIDER_PROFILE\": \"Cuentas\",\n \"DIVIDER_PAGE\": \"Páginas\",\n \"DIVIDER_GROUP\": \"Grupos\"\n },\n \"CONFIRM\": {\n \"SUGGEST_CERTIFICATIONS\": \"¿Desea <b>enviar estas sugerencias de certificatión</b> ?\",\n \"ASK_CERTIFICATION\": \"¿Desea <b>enviar una solicitud de certificación</b> ?\",\n \"ASK_CERTIFICATIONS\": \"¿Desea <b>enviar una solicitud de certificación</b> a estas personas ?\"\n }\n },\n \"INVITATION\": {\n \"TITLE\": \"Invitaciones\",\n \"NO_RESULT\": \"Ningúna invitación en espera\",\n \"BTN_DELETE_ALL\": \"Suprimir todas las invitaciones\",\n \"BTN_DELETE\": \"Suprimir la invitación\",\n \"BTN_NEW_INVITATION\": \"Nueva invitación\",\n \"ASK_CERTIFICATION\": \"<a href=\\\"#/app/wot/{{pubkey}}/{{::uid}}\\\">{{::name||uid}}</a> solicita su certificación\",\n \"SUGGESTION_CERTIFICATION\": \"<a href=\\\"#/app/wot/{{::pubkey}}/{{::uid}}\\\">{{::name||uid}}</a> ha sido sugerido/a para certificación\",\n \"SUGGESTED_BY\": \"Sugerencia mandada por <a class=\\\"positive\\\" href=\\\"#/app/wot/{{::issuer.pubkey}}/{{::issuer.uid}}\\\">{{::issuer.name||issuer.uid}}</a>\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Invitaciones\"\n },\n \"LIST\": {\n \"TITLE\": \"Invitaciones\"\n },\n \"NEW\": {\n \"TITLE\": \"Nueva invitación\",\n \"RECIPIENTS\": \"A\",\n \"RECIPIENTS_HELP\": \"Destinatarios de la invitación\",\n \"RECIPIENTS_MODAL_TITLE\": \"Destinatarios\",\n \"RECIPIENTS_MODAL_HELP\": \"Por favor, elige los destinatarios :\",\n \"SUGGESTION_IDENTITIES\": \"Sugerencia de certificación\",\n \"SUGGESTION_IDENTITIES_HELP\": \"Certificaciones a sugerir\",\n \"SUGGESTION_IDENTITIES_MODAL_TITLE\": \"Sugerencias\",\n \"SUGGESTION_IDENTITIES_MODAL_HELP\": \"Por favor, elige sus sugerencias :\"\n },\n \"CONFIRM\": {\n \"DELETE_ALL_CONFIRMATION\": \"La supresión de las invitaciones es una <b>operación ireversible</b>.<br/><br/>¿ Desea continuar ?\",\n \"SEND_INVITATIONS_TO_CERTIFY\": \"¿ Desea <b>mandar esta invitación a certificar</b> ?\"\n },\n \"INFO\": {\n \"INVITATION_SENT\": \"Invitación mandada\"\n },\n \"ERROR\": {\n \"LOAD_INVITATIONS_FAILED\": \"Fallo en la carga de las invitaciones\",\n \"REMOVE_INVITATION_FAILED\": \"Fallo durante la supresión de la invitación\",\n \"REMOVE_ALL_INVITATIONS_FAILED\": \"Fallo durante la supresión de las invitaciones\",\n \"SEND_INVITATION_FAILED\": \"Fallo durante el envío de la invitación\",\n \"BAD_INVITATION_FORMAT\": \"<span class=\\\"assertive\\\"><i class=\\\"ion-close-circled\\\"></i> Invitación ilegible (formato desconocido)</span> - mandada por <a ui-sref=\\\"app.wot_identity({pubkey: '{{::pubkey}}', uid: '{{::uid}}' })\\\">{{::name||uid}}</a>\"\n }\n },\n \"COMMENTS\": {\n \"DIVIDER\": \"Comentarios\",\n \"SHOW_MORE_COMMENTS\": \"Visualizar los comentarios anteriores\",\n \"COMMENT_HELP\": \"Su comentario, preguntas, etc.\",\n \"COMMENT_HELP_REPLY_TO\": \"Su repuesta…\",\n \"BTN_SEND\": \"Mandar\",\n \"POPOVER_SHARE_TITLE\": \"Mensaje #{{number}}\",\n \"MODIFIED_ON\": \"modificado el {{time|formatDate}}\",\n \"MODIFIED_PARENTHESIS\": \"(modificado entonces)\",\n \"REPLY\": \"Responder\",\n \"REPLY_TO\": \"Repuesta a :\",\n \"REPLY_TO_LINK\": \"En repuesta a \",\n \"REPLY_TO_DELETED_COMMENT\": \"En repuesta a un comentario suprimido\",\n \"REPLY_COUNT\": \"{{replyCount}} repuestas\",\n \"DELETED_COMMENT\": \"Comentario suprimido\",\n \"ERROR\": {\n \"FAILED_SAVE_COMMENT\": \"Fallo durante el respaldo del comentario\",\n \"FAILED_REMOVE_COMMENT\": \"Fallo durante la supresión del comentario\"\n }\n },\n \"MESSAGE\": {\n \"REPLY_TITLE_PREFIX\": \"Rep: \",\n \"FORWARD_TITLE_PREFIX\": \"Tr: \",\n \"BTN_REPLY\": \"Responder\",\n \"BTN_COMPOSE\": \"Nuevo mensaje\",\n \"BTN_WRITE\": \"Escribir\",\n \"NO_MESSAGE_INBOX\": \"Ningun mensaje recibido\",\n \"NO_MESSAGE_OUTBOX\": \"Ningun mensaje mandado\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Mensajes\",\n \"MESSAGE_RECEIVED\": \"Ha <b>recibido un mensaje</b><br/>de\"\n },\n \"LIST\": {\n \"INBOX\": \"Bandeja de entrada\",\n \"OUTBOX\": \"Mensajes enviados\",\n \"LAST_INBOX\": \"Nuevos mensajes\",\n \"LAST_OUTBOX\": \"Mensajes enviados\",\n \"BTN_LAST_MESSAGES\": \"Mensajes recientes\",\n \"TITLE\": \"Mensajes\",\n \"SEARCH_HELP\": \"Buscar en mensajes\",\n \"POPOVER_ACTIONS\": {\n \"TITLE\": \"Opciones\",\n \"DELETE_ALL\": \"Suprimir todos los mensajes\"\n }\n },\n \"COMPOSE\": {\n \"TITLE\": \"Nuevo mensaje\",\n \"TITLE_REPLY\": \"Responder\",\n \"SUB_TITLE\": \"Nuevo mensaje\",\n \"TO\": \"A\",\n \"OBJECT\": \"Objeto\",\n \"OBJECT_HELP\": \"Objeto\",\n \"ENCRYPTED_HELP\": \"Tenga en cuenta que este mensaje será cifrado antes del envío, con el fin de que solo el destinatario pueda leerlo, y que se tenga la seguridad de que la autoría es suya.\",\n \"MESSAGE\": \"Mensaje\",\n \"MESSAGE_HELP\": \"Contenido del mensaje\",\n \"CONTENT_CONFIRMATION\": \"El contenido del mensaje está vacío.<br/><br/>¿ Sin embargo, quiere mandar el mensaje ?\"\n },\n \"VIEW\": {\n \"TITLE\": \"Mensaje\",\n \"SENDER\": \"Enviado por\",\n \"RECIPIENT\": \"Enviado a\",\n \"NO_CONTENT\": \"Mensaje vacío\",\n \"DELETE\": \"Eliminar el mensaje\"\n },\n \"CONFIRM\": {\n \"REMOVE\": \"¿ Desea <b>suprimir este mensaje</b> ?<br/><br/>Esta operación es ireversible.\",\n \"REMOVE_ALL\" : \"¿ Desea <b>suprimir todos los mensajes</b> ?<br/><br/>Esta operación es ireversible.\",\n \"MARK_ALL_AS_READ\": \"¿ Desea <b>marcar todos los mensajes como leído</b> ?\",\n \"USER_HAS_NO_PROFILE\": \"Esta identidad no tiene ningún perfil Cesium+. Puede que no tenga habilitada la extensión Cesium+, y <b>no podrá ver su mensaje</b>.<br/><br/>¿ Desea <b>continuar</b> a pesar de todo ?\"\n },\n \"INFO\": {\n \"MESSAGE_REMOVED\": \"Mensaje suprimido\",\n \"All_MESSAGE_REMOVED\": \"Todos los mensajes fueron suprimido\",\n \"MESSAGE_SENT\": \"Mensaje mandado\"\n },\n \"ERROR\": {\n \"SEND_MSG_FAILED\": \"Fallo durante el envío del mensaje.\",\n \"LOAD_MESSAGES_FAILED\": \"Fallo durante la recuperación de los mensajes.\",\n \"LOAD_MESSAGE_FAILED\": \"Fallo durante la recuperación del mensaje.\",\n \"MESSAGE_NOT_READABLE\": \"Lectura del mensaje imposible.\",\n \"USER_NOT_RECIPIENT\": \"No está el destinatario de este mensaje : deciframiento imposible.\",\n \"NOT_AUTHENTICATED_MESSAGE\": \"La autenticidad del mensaje es dudosa o su contenido está corrupto.\",\n \"REMOVE_MESSAGE_FAILED\": \"Fallo en la supresión del mensaje\",\n \"MESSAGE_CONTENT_TOO_LONG\": \"Valor demasiado largo ({{maxLength}} carácteres max).\",\n \"MARK_AS_READ_FAILED\": \"Imposible marcar el mensaje como 'leído'.\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Fallo durante la recuperación de las notificaciones de mensajes.\",\n \"REMOVE_All_MESSAGES_FAILED\": \"Fallo durante la supresión de todos los mensajes.\",\n \"MARK_ALL_AS_READ_FAILED\": \"Fallo durante el marcaje de los mensajes como leído.\",\n \"RECIPIENT_IS_MANDATORY\": \"El destinatario es obligatorio.\"\n }\n },\n \"BLOCKCHAIN\": {\n \"LOOKUP\": {\n \"SEARCH_HELP\": \"Número de bloque, hash, llave pública, etc.\",\n \"POPOVER_FILTER_TITLE\": \"Filtros\",\n \"HEADER_MEDIAN_TIME\": \"Fecha / Hora\",\n \"HEADER_BLOCK\": \"Bloque #\",\n \"HEADER_ISSUER\": \"Nodo emisor\",\n \"BTN_LAST\": \"Últimos bloques\",\n \"DISPLAY_QUERY\": \"Mostrar la consulta\",\n \"HIDE_QUERY\": \"Ocultar la consulta\",\n \"TX_SEARCH_FILTER\": {\n \"MEMBER_FLOWS\": \"Entradas/salidas de miembros\",\n \"EXISTING_TRANSACTION\": \"Con transacciones\",\n \"PERIOD\": \"<b class=\\\"ion-clock\\\"></b> Entre el <b class=\\\"gray\\\">{{params[1]|medianDateShort}}</b> ({{params[1]|medianTime}}) y el <b class=\\\"gray\\\">{{params[2]|medianDateShort}}</b> ({{params[2]|medianTime}})\",\n \"ISSUER\": \"<b class=\\\"ion-android-desktop\\\"></b> Calculado por <b class=\\\"ion-key\\\"></b> {{params[1]|formatPubkey}}\",\n \"TX_PUBKEY\": \"<b class=\\\"ion-card\\\"></b> Transacciones que implican <b class=\\\"ion-key\\\"></b> {{params[1]|formatPubkey}}\"\n }\n },\n \"ERROR\": {\n \"SEARCH_BLOCKS_FAILED\": \"Fallo en la búsqueda de los bloques.\"\n }\n },\n \"GROUP\": {\n \"GENERAL_DIVIDER\": \"Informaciones generales\",\n \"LOCATION_DIVIDER\": \"Dirección\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Redes sociales y página web\",\n \"TECHNICAL_DIVIDER\": \"Informaciones técnicas\",\n \"CREATED_TIME\": \"Creada {{creationTime|formatFromNow}}\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Invitaciones\"\n },\n \"LOOKUP\": {\n \"TITLE\": \"Grupos\",\n \"SEARCH_HELP\": \"Nombre de grupo, palabras , lugar, etc.\",\n \"LAST_RESULTS_LIST\": \"Nuevos grupos :\",\n \"OPEN_RESULTS_LIST\": \"Grupos abiertos :\",\n \"MANAGED_RESULTS_LIST\": \"Grupos cerrados :\",\n \"BTN_LAST\": \"Nuevos grupos\",\n \"BTN_NEW\": \"Añado un grupo\"\n },\n \"TYPE\": {\n \"TITLE\": \"Nuevo grupo\",\n \"SELECT_TYPE\": \"Tipo de grupo :\",\n \"OPEN_GROUP\": \"Grupo abierto\",\n \"OPEN_GROUP_HELP\": \"Un grupo abierto es accesible por cualquier miembro de la moneda.\",\n \"MANAGED_GROUP\": \"Grupo administrado\",\n \"MANAGED_GROUP_HELP\": \"Un grupo administrado es gestionado por administradores y moderadores, que pueden aceptar, rechazar o excluir un miembro en su seno.\",\n \"ENUM\": {\n \"OPEN\": \"Grupo abierto\",\n \"MANAGED\": \"Grupo administrado\"\n }\n },\n \"VIEW\": {\n \"POPOVER_SHARE_TITLE\": \"{{title}}\",\n \"MENU_TITLE\": \"Opciones\",\n \"REMOVE_CONFIRMATION\" : \"¿Desea eliminar este grupo?<br/><br/>Esta operación es irreversible.\"\n },\n \"EDIT\": {\n \"TITLE\": \"Grupo\",\n \"TITLE_NEW\": \"Nuevo grupo\",\n \"RECORD_TITLE\": \"Título\",\n \"RECORD_TITLE_HELP\": \"Título\",\n \"RECORD_DESCRIPTION\": \"Descripción\",\n \"RECORD_DESCRIPTION_HELP\": \"Descripción\"\n },\n \"ERROR\": {\n \"SEARCH_GROUPS_FAILED\": \"Fallo en la búsqueda de grupos\",\n \"REMOVE_RECORD_FAILED\": \"Error al eliminar el grupo\"\n },\n \"INFO\": {\n \"RECORD_REMOVED\" : \"Grupo eliminado\"\n }\n },\n \"REGISTRY\": {\n \"CATEGORY\": \"Actividad principal\",\n \"GENERAL_DIVIDER\": \"Informaciones generales\",\n \"LOCATION_DIVIDER\": \"Dirección\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Redes sociales y sitio web\",\n \"TECHNICAL_DIVIDER\": \"Informaciones técnicas\",\n \"BTN_SHOW_WOT\": \"Personas\",\n \"BTN_SHOW_WOT_HELP\": \"Buscar personas\",\n \"BTN_SHOW_PAGES\": \"Páginas\",\n \"BTN_SHOW_PAGES_HELP\": \"Búsqueda de páginas\",\n \"BTN_NEW\": \"Crear una página\",\n \"MY_PAGES\": \"Mis páginas\",\n \"NO_PAGE\": \"Sin páginas\",\n \"SEARCH\": {\n \"TITLE\": \"Páginas\",\n \"SEARCH_HELP\": \"Qué, Quién, ej: peluquería, restaurante Sol.\",\n \"BTN_ADD\": \"Nuevo\",\n \"BTN_LAST_RECORDS\": \"Páginas recientes\",\n \"BTN_ADVANCED_SEARCH\": \"búsqueda avanzada\",\n \"BTN_OPTIONS\": \"Búsqueda avanzada\",\n \"TYPE\": \"Tipo de página\",\n \"LOCATION_HELP\": \"Ciudad\",\n \"RESULTS\": \"Resultados\",\n \"RESULT_COUNT_LOCATION\": \"{{count}} Resultado{{count>0?'s':''}}, cerca de {{location}}\",\n \"RESULT_COUNT\": \"{{count}} resultado{{count>0?'s':''}}\",\n \"LAST_RECORDS\": \"Páginas recientes\",\n \"LAST_RECORD_COUNT_LOCATION\": \"{{count}} página{{count>0?'s':''}} reciente{{count>0?'s':''}}, cerca de {{location}}\",\n \"LAST_RECORD_COUNT\": \"{{count}} página{{count>0?'s':''}} reciente{{count>0?'s':''}}\",\n \"POPOVER_FILTERS\": {\n \"BTN_ADVANCED_SEARCH\": \"Opciones avanzadas\"\n }\n },\n \"VIEW\": {\n \"TITLE\": \"Anuario\",\n \"CATEGORY\": \"Actividad principal :\",\n \"LOCATION\": \"Dirección :\",\n \"MENU_TITLE\": \"Opciones\",\n \"POPOVER_SHARE_TITLE\": \"{{title}}\",\n \"REMOVE_CONFIRMATION\" : \"¿ Desea suprimir esta página ?<br/><br/>Esta operación es ireversible.\"\n },\n \"TYPE\": {\n \"TITLE\": \"Nueva página\",\n \"SELECT_TYPE\": \"Tipo de página :\",\n \"ENUM\": {\n \"SHOP\": \"Comercio local\",\n \"COMPANY\": \"Empresa\",\n \"ASSOCIATION\": \"Asociación\",\n \"INSTITUTION\": \"Institución\"\n }\n },\n \"EDIT\": {\n \"TITLE\": \"Edición\",\n \"TITLE_NEW\": \"Nueva página\",\n \"RECORD_TYPE\":\"Tipo de página\",\n \"RECORD_TITLE\": \"Nombre\",\n \"RECORD_TITLE_HELP\": \"Nombre\",\n \"RECORD_DESCRIPTION\": \"Descripción\",\n \"RECORD_DESCRIPTION_HELP\": \"Descripción de la actividad\",\n \"RECORD_ADDRESS\": \"Calle\",\n \"RECORD_ADDRESS_HELP\": \"Calle, edificio…\",\n \"RECORD_CITY\": \"Ciudad\",\n \"RECORD_CITY_HELP\": \"Ciudad\",\n \"RECORD_SOCIAL_NETWORKS\": \"Redes sociales y sitio web\",\n \"RECORD_PUBKEY\": \"Llave pública\",\n \"RECORD_PUBKEY_HELP\": \"Llave pública para recibir pagos\"\n },\n \"WALLET\": {\n \"PAGE_DIVIDER\": \"Páginas\",\n \"PAGE_DIVIDER_HELP\": \"Las páginas se refieren a colectivos que aceptan moneda o la promocionan: tiendas, empresas, negocios, asociaciones, instituciones. Se almacenan fuera de la red de la moneda, en <a ui-sref=\\\"app.es_network\\\">la red Cesium+</a>.\"\n },\n \"ERROR\": {\n \"LOAD_CATEGORY_FAILED\": \"Fallo en la carga de la lista de actividades\",\n \"LOAD_RECORD_FAILED\": \"Fallo durante la carga de la página\",\n \"LOOKUP_RECORDS_FAILED\": \"Fallo durante la ejecución de la búsqueda.\",\n \"REMOVE_RECORD_FAILED\": \"Fallo en la supresión de la página\",\n \"SAVE_RECORD_FAILED\": \"Fallo durante el respaldo\",\n \"RECORD_NOT_EXISTS\": \"Página inexistente\",\n \"GEO_LOCATION_NOT_FOUND\": \"Ciudad o código postal no encontrado\"\n },\n \"INFO\": {\n \"RECORD_REMOVED\" : \"Página suprimida\",\n \"RECORD_SAVED\": \"Página guardada\"\n }\n },\n \"PROFILE\": {\n \"PROFILE_DIVIDER\": \"Perfil Cesium+\",\n \"PROFILE_DIVIDER_HELP\": \"Estos son datos auxiliares, almacenados fuera de la red monetaria\",\n \"NO_PROFILE_DEFINED\": \"Ningún perfil Cesium+\",\n \"BTN_ADD\": \"Ingresar mi perfil\",\n \"BTN_EDIT\": \"Editar mi perfil\",\n \"BTN_DELETE\": \"Eliminar mi perfil\",\n \"BTN_REORDER\": \"Reordenar\",\n \"UID\": \"Seudónimo\",\n \"TITLE\": \"Nombre, Apellidos\",\n \"TITLE_HELP\": \"Nombre, Apellidos\",\n \"DESCRIPTION\": \"Sobre mí\",\n \"DESCRIPTION_HELP\": \"Sobre mí…\",\n \"SOCIAL_HELP\": \"http://...\",\n \"GENERAL_DIVIDER\": \"Informaciones generales\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Redes sociales, sitios web\",\n \"TECHNICAL_DIVIDER\": \"Informaciones técnicas\",\n \"MODAL_AVATAR\": {\n \"TITLE\": \"Foto de perfil\",\n \"SELECT_FILE_HELP\": \"Por favor, <b>elija una imagen</b>:\",\n \"BTN_SELECT_FILE\": \"Eligir una imagen\",\n \"RESIZE_HELP\": \"<b>Encuadre la imagen</b>, si es necesario. Un clic presionado sobre la imagen permite desplazarla. Haga clic en la zona inferior izquierda para hacer zoom.\",\n \"RESULT_HELP\": \"<b>Aquí está el resultado</b> tal como se verá sobre su perfil :\"\n },\n \"CONFIRM\": {\n \"DELETE\": \"¿Desea <b>eliminar su perfil Cesium+?</b><br/><br/>Esta operación es irreversible.\",\n \"DELETE_BY_MODERATOR\": \"¿Desea <b>eliminar este perfil Cesium+?</b><br/><br/>Esta operación es irreversible.\"\n },\n \"ERROR\": {\n \"DELETE_PROFILE_FAILED\": \"Error durante la eliminación del perfil\",\n \"REMOVE_PROFILE_FAILED\": \"Error de eliminación del perfil\",\n \"LOAD_PROFILE_FAILED\": \"Fallo en la carga del perfil usuario.\",\n \"SAVE_PROFILE_FAILED\": \"Fallo durante el respaldo\",\n \"INVALID_SOCIAL_NETWORK_FORMAT\": \"Formato inválido: por favor, indique una dirección válida.<br/><br/>Ejemplos :<ul><li>- Una página Facebook (https://www.facebook.com/user)</li><li>- Una página web (http://www.misitio.es)</li><li>- Una dirección de correo (joe@dalton.com)</li></ul>\",\n \"IMAGE_RESIZE_FAILED\": \"Falló el redimensionado de la imagen\"\n },\n \"INFO\": {\n \"PROFILE_REMOVED\": \"Perfil eliminado\",\n \"PROFILE_SAVED\": \"Perfil guardado\"\n },\n \"HELP\": {\n \"WARNING_PUBLIC_DATA\": \"La información de su perfil <b>es pública</b>: visible también por personas <b>sin cuenta</b>.<br/>{{'PROFILE.PROFILE_DIVIDER_HELP'|translate}}\"\n }\n },\n \"LIKE\": {\n \"ERROR\": {\n \"FAILED_TOGGLE_LIKE\": \"Imposible ejecutar esta acción.\"\n }\n },\n \"LOCATION\": {\n \"BTN_GEOLOC_ADDRESS\": \"Actualizar desde la dirección\",\n \"USE_GEO_POINT\": \"Aparecer en el mapa {{'COMMON.APP_NAME'|translate}}\",\n \"LOADING_LOCATION\": \"Encontrar la dirección…\",\n \"LOCATION_DIVIDER\": \"Dirección\",\n \"ADDRESS\": \"Calle\",\n \"ADDRESS_HELP\": \"Calle, número, etc…\",\n \"CITY\": \"Ciudad\",\n \"CITY_HELP\": \"Ciudad, País\",\n \"DISTANCE\": \"Distancia máxima alrededor de la ciudad\",\n \"DISTANCE_UNIT\": \"km\",\n \"DISTANCE_OPTION\": \"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}\",\n \"SEARCH_HELP\": \"Ciudad, País\",\n \"PROFILE_POSITION\": \"Posición del perfil\",\n \"MODAL\": {\n \"TITLE\": \"Búsqueda de dirección\",\n \"SEARCH_HELP\": \"Ciudad, País\",\n \"ALTERNATIVE_RESULT_DIVIDER\": \"Resultados alternativos para <b>{{address}}</b> :\",\n \"POSITION\": \"Latitud/Longitud : {{lat}} / {{lon}}\"\n },\n \"ERROR\": {\n \"CITY_REQUIRED_IF_STREET\": \"Requerido si una calle ha sido llenada\",\n \"REQUIRED_FOR_LOCATION\": \"Campo obligatorio para aparecer en el mapa\",\n \"INVALID_FOR_LOCATION\": \"Dirección desconocida\",\n \"GEO_LOCATION_FAILED\": \"No se puede recuperar su ubicación Por favor usa el botón de búsqueda.\",\n \"ADDRESS_LOCATION_FAILED\": \"No se puede recuperar la posición de la dirección.\"\n }\n },\n \"SUBSCRIPTION\": {\n \"SUBSCRIPTION_DIVIDER\": \"Servicios en línea\",\n \"SUBSCRIPTION_DIVIDER_HELP\": \"Los servicios en línea ofrecen servicios adicionales, proporcionados por un tercero.\",\n \"BTN_ADD\": \"Agregar un servicio\",\n \"BTN_EDIT\": \"Administrar mis servicios\",\n \"NO_SUBSCRIPTION\": \"Ningún servicio definido\",\n \"SUBSCRIPTION_COUNT\": \"Servicios / Suscripción\",\n \"EDIT\": {\n \"TITLE\": \"Servicios en línea\",\n \"HELP_TEXT\": \"Gestione sus suscripciones y otros servicios en línea aquí\",\n \"PROVIDER\": \"Proveedor:\"\n },\n \"TYPE\": {\n \"ENUM\": {\n \"EMAIL\": \"Recibir notificaciones por correo electrónico\"\n }\n },\n \"CONFIRM\": {\n \"DELETE_SUBSCRIPTION\": \"¿ Deseas <b>eliminar</b> esta suscripción ?\"\n },\n \"ERROR\": {\n \"LOAD_SUBSCRIPTIONS_FAILED\": \"Error al cargar servicios en línea\",\n \"ADD_SUBSCRIPTION_FAILED\": \"Error al agregar suscripción\",\n \"UPDATE_SUBSCRIPTION_FAILED\": \"Error durante la actualización de la suscripción\",\n \"DELETE_SUBSCRIPTION_FAILED\": \"Error al eliminar la suscripción\"\n },\n \"MODAL_EMAIL\": {\n \"TITLE\" : \"Notificación por correo electrónico\",\n \"HELP\" : \"Rellene este formulario para <b>ser notificado por correo electrónico</b> de los eventos de su cuenta. <br/> Su dirección de correo electrónico se cifrará y únicamente será visible para el proveedor de servicios.\",\n \"EMAIL_LABEL\" : \"Su correo electrónico :\",\n \"EMAIL_HELP\": \"maria@dominio.com\",\n \"FREQUENCY_LABEL\": \"Frecuencia de las notificaciones :\",\n \"FREQUENCY_DAILY\": \"Diaria\",\n \"FREQUENCY_WEEKLY\": \"Semanal\",\n \"PROVIDER\": \"Proveedor de servicio :\"\n }\n },\n \"ES_PEER\": {\n \"DOCUMENT_COUNT\": \"Número de documentos\",\n \"DOCUMENTS\": \"Documentos\",\n \"EMAIL_SUBSCRIPTION_COUNT\": \"{{emailSubscription}} suscrito/a{{emailSubscription ? 's' : ''}} a notificaciones por correo\",\n \"NAME\": \"Nombre\",\n \"SOFTWARE\": \"Software\"\n },\n \"ES_SETTINGS\": {\n \"PLUGIN_NAME\": \"Cesium+\",\n \"PLUGIN_NAME_HELP\": \"Perfiles, notificaciones, mensajes privados\",\n \"ENABLE_TOGGLE\": \"Activar la extensión\",\n \"ENABLE_MESSAGE_TOGGLE\": \"Activar los mensajes privados\",\n \"ENABLE_REMOTE_STORAGE\": \"Activar el almacenamiento remoto\",\n \"ENABLE_REMOTE_STORAGE_HELP\": \"Permite almacenar (con cifrado) sus ajustes en los nodos Cesium+\",\n \"PEER\": \"Dirección del nodo de datos\",\n \"POPUP_PEER\": {\n \"TITLE\" : \"Nodo de datos\",\n \"HELP\" : \"Ingrese la dirección del nodo que quiere utilizar:\",\n \"PEER_HELP\": \"servidor.dominio.com:puerto\"\n },\n \"NOTIFICATIONS\": {\n \"DIVIDER\": \"Notificaciones\",\n \"HELP_TEXT\": \"Active los tipos de notificaciones que desea recibir:\",\n \"ENABLE_TX_SENT\": \"Notificar la validación de los <b>pagos emitidos</b>\",\n \"ENABLE_TX_RECEIVED\": \"Notificar la validación de los <b>pagos recibidos</b>\",\n \"ENABLE_CERT_SENT\": \"Notificar la validación de las <b>certificaciones emitidas</b>\",\n \"ENABLE_CERT_RECEIVED\": \"Notificar la validación de las <b>certificaciones recibidas</b>\",\n \"ENABLE_HTML5_NOTIFICATION\": \"Avisar con cada nueva notificación\",\n \"ENABLE_HTML5_NOTIFICATION_HELP\": \"Abre una pequeña ventana emergente con cada nueva notificación.\"\n },\n \"CONFIRM\": {\n \"ASK_ENABLE_TITLE\": \"Otras funcionalidades\",\n \"ASK_ENABLE\": \"La extensión de Cesium+ está deshabilitada en sus ajutes, desactivando ciertas funcionalidades: <ul><li>&nbsp;&nbsp;<b><i class=\\\"icon ion-person\\\"></i> Perfiles de usuario/a</b>;<li>&nbsp;&nbsp;<b><i class=\\\"icon ion-android-notifications\\\"></i> Notificaciones</b>;<li>&nbsp;&nbsp;<b><i class=\\\"icon ion-email\\\"></i> Mensajes privados</b>.</ul><br/><br/>¿<b>Desea re-activar</b> la extensión?\"\n }\n },\n \"ES_WALLET\": {\n \"ERROR\": {\n \"RECIPIENT_IS_MANDATORY\": \"Un destinatario es obligatorio para el cifrado.\"\n }\n },\n \"EVENT\": {\n \"NODE_STARTED\": \"Su nodo ES API <b>{{params[0]}}</b> es comenzado\",\n \"NODE_BMA_DOWN\": \"El nodo <b>{{params[0]}}:{{params[1]}}</b> (utilizado por su nodo ES API) <b>no es localizable</b>.\",\n \"NODE_BMA_UP\": \"El nodo <b>{{params[0]}}:{{params[1]}}</b> es de nuevo accesible.\",\n \"MEMBER_JOIN\": \"Ahora es <b>miembro</b> de la moneda <b>{{params[0]}}</b> !\",\n \"MEMBER_LEAVE\": \"No es <b>miembro</b> de la moneda <b>{{params[0]}}</b>!\",\n \"MEMBER_EXCLUDE\": \"Usted ya no es miembro de la moneda <b>{{params[0]}}</b>, por falta de renovación o certificaciones.\",\n \"MEMBER_REVOKE\": \"Su membresía ha sido revocada. Ya no es miembro de la moneda <b>{{params[0]}}</b>.\",\n \"MEMBER_ACTIVE\": \"Su membresía a <b>{{params[0]}}</b> ha sido <b>renovada con éxito</b>.\",\n \"TX_SENT\": \"Su <b>pago</b> a <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\" ><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> fue efectuado.\",\n \"TX_SENT_MULTI\": \"Su <b>pago</b> a <b>{{params[1]}}</b> fue efectuado.\",\n \"TX_RECEIVED\": \"Ha <b>recibido un pago</b> de <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span>.\",\n \"TX_RECEIVED_MULTI\": \"Ha <b>recibido un pago</b> de <b>{{params[1]}}</b>.\",\n \"CERT_SENT\": \"Su <b>certificación</b> a <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\" ><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> fue efectuada.\",\n \"CERT_RECEIVED\": \"Ha <b>recibido una certificación</b> de <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span>.\",\n \"USER\": {\n \"ABUSE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> ha reportardo su perfil\",\n \"DELETION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> ha reportado un perfil para suprimir : <b>{{params[2]}}</b>\",\n \"FOLLOW_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> sigue la actividad de su perfil\",\n \"LIKE_RECEIVED\": \"A <span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> le ha gustado su perfil</b>\",\n \"MODERATION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> os pide moderación sobre el perfil : <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"STAR_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> os ha puntuado con ({{params[3]}} <b class=\\\"ion-star\\\">)\"\n },\n \"PAGE\": {\n \"ABUSE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> ha reportardo su página : <b>{{params[2]}}</b>\",\n \"DELETION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> ha reportado una página para suprimir : <b>{{params[2]}}</b>\",\n \"FOLLOW_CLOSE\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> ha cerrado la página : <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> ha añadido la página : <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> ha comentado la página : <b>{{params[2]}}</b>\",\n \"FOLLOW_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> sigue su página : <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> ha modificado la página : <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> ha modificado su comentario en la página : <b>{{params[2]}}</b>\",\n \"MODERATION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> os pide moderación sobre la página : <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n\n \"NEW_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> ha comentado su referencia : <b>{{params[2]}}</b>\",\n \"UPDATE_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> ha modificado su comentario sobre su referencia : <b>{{params[2]}}</b>\",\n \"NEW_REPLY_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> ha contestado a su comentario sobre la referencia : <b>{{params[2]}}</b>\",\n \"UPDATE_REPLY_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> ha modificado la repuesta a su comentario sobre la referencia : <b>{{params[2]}}</b>\"\n }\n },\n \"CONFIRM\": {\n \"ES_USE_FALLBACK_NODE\": \"Nodo de datos <b>{{old}}</b> inalcanzable o dirección no válida.<br/><br/>¿Desea utilizar temporalmente el nodo de datos <b>{{new}}</b>?\"\n },\n \"ERROR\": {\n \"ES_CONNECTION_ERROR\": \"Nodo de datos <b>{{server}}</b> inalcanzable o dirección no válida.<br/><br/>Cesium continuará funcionando, <b>sin la extensión Cesium+</b> (perfiles de usuario, mensajes privados), mapas y gráficos).<br/><br/>Verifique su conexión a Internet, o cambie el nodo de datos en <a class=\\\"positive\\\" ng-click=\\\"doQuickFix('settings')\\\"> los ajustes de la extensión </a>.\",\n \"ES_MAX_UPLOAD_BODY_SIZE\": \"El volumen de datos a enviar excede el límite establecido por el servidor.<br/><br/>Por favor, inténtelo de nuevo después, por ejemplo, borrando fotos.\"\n }\n}\n);\n\n$translateProvider.translations(\"fr-FR\", {\n \"COMMON\": {\n \"CATEGORY\": \"Catégorie\",\n \"CATEGORIES\": \"Catégories\",\n \"CATEGORY_SEARCH_HELP\": \"Recherche\",\n \"COMMENT_HELP\": \"Commentaire\",\n \"LAST_MODIFICATION_DATE\": \"Mise à jour le\",\n \"SUBMIT_BY\": \"Soumis par\",\n \"BTN_LIKE\": \"J'aime\",\n \"BTN_LIKE_REMOVE\": \"Je n'aime plus\",\n \"LIKES_TEXT\": \"{{total}} personne{{total > 1 ? 's' : ''}} {{total > 1 ? 'ont' : 'a'}} aimé cette page\",\n \"ABUSES_TEXT\": \"{{total}} personne{{total > 1 ? 's' : ''}} {{total > 1 ? 'ont' : 'a'}} signalé un problème\",\n \"BTN_REPORT_ABUSE_DOTS\": \"Signaler un problème ou un abus...\",\n \"BTN_REMOVE_REPORTED_ABUSE\": \"Annuler mon signalement\",\n \"BTN_PUBLISH\": \"Publier\",\n \"BTN_PICTURE_DELETE\": \"Supprimer\",\n \"BTN_PICTURE_FAVORISE\": \"Principale\",\n \"BTN_PICTURE_ROTATE\": \"Tourner\",\n \"BTN_ADD_PICTURE\": \"Ajouter une photo\",\n \"NOTIFICATION\": {\n \"TITLE\": \"Nouvelle notification | {{'COMMON.APP_NAME'|translate}}\",\n \"HAS_UNREAD\": \"Vous avez {{count}} notification{{count>0?'s':''}} non lue{{count>0?'s':''}}\"\n },\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Notifications\",\n \"MARK_ALL_AS_READ\": \"Tout marquer comme lu\",\n \"NO_RESULT\": \"Aucune notification\",\n \"SHOW_ALL\": \"Voir tout\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Erreur de chargement des notifications\"\n },\n \"REPORT_ABUSE\": {\n \"TITLE\": \"Signaler un problème\",\n \"SUB_TITLE\": \"Merci d'expliquer succintement le problème :\",\n \"REASON_HELP\": \"J'explique le problème...\",\n \"ASK_DELETE\": \"Demander la suppression ?\",\n \"CONFIRM\": {\n \"SENT\": \"Signalement envoyé. Merci !\"\n }\n }\n },\n \"MENU\": {\n \"REGISTRY\": \"Pages\",\n \"USER_PROFILE\": \"Mon profil\",\n \"MESSAGES\": \"Messages\",\n \"NOTIFICATIONS\": \"Notifications\",\n \"INVITATIONS\": \"Invitations\"\n },\n \"ACCOUNT\": {\n \"NEW\": {\n \"ORGANIZATION_ACCOUNT\": \"Compte pour une organisation\",\n \"ORGANIZATION_ACCOUNT_HELP\": \"Si vous représentez une entreprise, une association, etc.<br/>Aucun dividende universel ne sera créé par ce compte.\"\n },\n \"EVENT\": {\n \"MEMBER_WITHOUT_PROFILE\": \"Vous pouvez <a ui-sref=\\\"app.edit_profile\\\">saisir votre profil Cesium+</a> (optionnel) pour offrir une meilleure visibilité de votre compte. Ce profil sera stocké dans <b>un annuaire indépendant</b> de la monnaie, mais décentralisé.\"\n },\n \"ERROR\": {\n \"WS_CONNECTION_FAILED\": \"Cesium ne peut pas recevoir les notifications, à cause d'une erreur technique (connexion au noeud de données Cesium+).<br/><br/>Si le problème persiste, veuillez <b>choisir un autre noeud de données</b> dans les paramètres Cesium+.\"\n }\n },\n \"WOT\": {\n \"BTN_SUGGEST_CERTIFICATIONS_DOTS\": \"Suggérer des identités à certifier...\",\n \"BTN_ASK_CERTIFICATIONS_DOTS\": \"Demander à des membres de me certifier...\",\n \"BTN_ASK_CERTIFICATION\": \"Demander une certification\",\n \"SUGGEST_CERTIFICATIONS_MODAL\": {\n \"TITLE\": \"Suggérer des certifications\",\n \"HELP\": \"Sélectionner vos suggestions\"\n },\n \"ASK_CERTIFICATIONS_MODAL\": {\n \"TITLE\": \"Demander des certifications\",\n \"HELP\": \"Sélectionner les destinataires\"\n },\n \"SEARCH\": {\n \"DIVIDER_PROFILE\": \"Comptes\",\n \"DIVIDER_PAGE\": \"Pages\",\n \"DIVIDER_GROUP\": \"Groupes\"\n },\n \"CONFIRM\": {\n \"SUGGEST_CERTIFICATIONS\": \"Êtes-vous sûr de vouloir <b>envoyer ces suggestions de certification</b> ?\",\n \"ASK_CERTIFICATION\": \"Êtes-vous sûr de vouloir <b>envoyer une demande de certification</b> ?\",\n \"ASK_CERTIFICATIONS\": \"Êtes-vous sûr de vouloir <b>envoyer une demande de certification</b> à ces personnes ?\"\n }\n },\n \"INVITATION\": {\n \"TITLE\": \"Invitations\",\n \"NO_RESULT\": \"Aucune invitation en attente\",\n \"BTN_DELETE_ALL\": \"Supprimer toutes les invitations\",\n \"BTN_DELETE\": \"Supprimer l'invitation\",\n \"BTN_NEW_INVITATION\": \"Nouvelle invitation\",\n \"ASK_CERTIFICATION\": \"<a href=\\\"#/app/wot/{{pubkey}}/{{::uid}}\\\">{{::name||uid}}</a> demande votre certification\",\n \"SUGGESTION_CERTIFICATION\": \"<a href=\\\"#/app/wot/{{::pubkey}}/{{::uid}}\\\">{{::name||uid}}</a> vous est suggéré pour certification\",\n \"SUGGESTED_BY\": \"Suggestion envoyée par <a class=\\\"positive\\\" href=\\\"#/app/wot/{{::issuer.pubkey}}/{{::issuer.uid}}\\\">{{::issuer.name||issuer.uid}}</a>\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Invitations\"\n },\n \"LIST\": {\n \"TITLE\": \"Invitations\"\n },\n \"NEW\": {\n \"TITLE\": \"Nouvelle invitation\",\n \"RECIPIENTS\": \"A\",\n \"RECIPIENTS_HELP\": \"Destinataires de l'invitation\",\n \"RECIPIENTS_MODAL_TITLE\": \"Destinataires\",\n \"RECIPIENTS_MODAL_HELP\": \"Veuillez choisir les destinataires :\",\n \"SUGGESTION_IDENTITIES\": \"Suggestions de certification\",\n \"SUGGESTION_IDENTITIES_HELP\": \"Certifications à suggérer\",\n \"SUGGESTION_IDENTITIES_MODAL_TITLE\": \"Suggestions\",\n \"SUGGESTION_IDENTITIES_MODAL_HELP\": \"Veuillez choisir vos suggestions :\"\n },\n \"CONFIRM\": {\n \"DELETE_ALL_CONFIRMATION\": \"La suppression des invitations est une <b>opération irréversible</b>.<br/><br/><b>Êtes-vous sûr</b> de vouloir continuer ?\",\n \"SEND_INVITATIONS_TO_CERTIFY\": \"Êtes-vous sûr de vouloir <b>envoyer cette invitation à certifier</b> ?\"\n },\n \"INFO\": {\n \"INVITATION_SENT\": \"Invitation envoyée\"\n },\n \"ERROR\": {\n \"LOAD_INVITATIONS_FAILED\": \"Échec du chargement des invitations\",\n \"REMOVE_INVITATION_FAILED\": \"Erreur lors de la suppression de l'invitation\",\n \"REMOVE_ALL_INVITATIONS_FAILED\": \"Erreur lors de la suppression des invitations\",\n \"SEND_INVITATION_FAILED\": \"Erreur lors de l'envoi de l'invitation\",\n \"BAD_INVITATION_FORMAT\": \"<span class=\\\"assertive\\\"><i class=\\\"ion-close-circled\\\"></i> Invitation illisible (format inconnu)</span> - envoyée par <a ui-sref=\\\"app.wot_identity({pubkey: '{{::pubkey}}', uid: '{{::uid}}' })\\\">{{::name||uid}}</a>\"\n }\n },\n \"COMMENTS\": {\n \"DIVIDER\": \"Commentaires\",\n \"SHOW_MORE_COMMENTS\": \"Afficher les commentaires précédents\",\n \"COMMENT_HELP\": \"Votre commentaire, question, etc.\",\n \"COMMENT_HELP_REPLY_TO\": \"Votre réponse...\",\n \"BTN_SEND\": \"Envoyer\",\n \"POPOVER_SHARE_TITLE\": \"Message #{{number}}\",\n \"REPLY\": \"Répondre\",\n \"REPLY_TO\": \"Réponse à :\",\n \"REPLY_TO_LINK\": \"En réponse à \",\n \"REPLY_TO_DELETED_COMMENT\": \"En réponse à un commentaire supprimé\",\n \"REPLY_COUNT\": \"{{replyCount}} réponses\",\n \"DELETED_COMMENT\": \"Commentaire supprimé\",\n \"MODIFIED_ON\": \"modifié le {{time|formatDate}}\",\n \"MODIFIED_PARENTHESIS\": \"(modifié ensuite)\",\n \"ERROR\": {\n \"FAILED_SAVE_COMMENT\": \"Erreur lors de la sauvegarde du commentaire\",\n \"FAILED_REMOVE_COMMENT\": \"Erreur lors de la suppression du commentaire\"\n }\n },\n \"MESSAGE\": {\n \"REPLY_TITLE_PREFIX\": \"Rep: \",\n \"FORWARD_TITLE_PREFIX\": \"Tr: \",\n \"BTN_REPLY\": \"Répondre\",\n \"BTN_COMPOSE\": \"Nouveau message\",\n \"BTN_WRITE\": \"Ecrire\",\n \"NO_MESSAGE_INBOX\": \"Aucun message reçu\",\n \"NO_MESSAGE_OUTBOX\": \"Aucun message envoyé\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Messages\",\n \"MESSAGE_RECEIVED\": \"Vous avez <b>reçu un message</b><br/>de\"\n },\n \"LIST\": {\n \"INBOX\": \"Boîte de réception\",\n \"OUTBOX\": \"Messages envoyés\",\n \"LAST_INBOX\": \"Nouveaux messages\",\n \"LAST_OUTBOX\": \"Messages envoyés\",\n \"BTN_LAST_MESSAGES\": \"Messages récents\",\n \"TITLE\": \"Messages\",\n \"SEARCH_HELP\": \"Recherche dans les messages\",\n \"POPOVER_ACTIONS\": {\n \"TITLE\": \"Options\",\n \"DELETE_ALL\": \"Supprimer tous les messages\"\n }\n },\n \"COMPOSE\": {\n \"TITLE\": \"Nouveau message\",\n \"TITLE_REPLY\": \"Répondre\",\n \"SUB_TITLE\": \"Nouveau message\",\n \"TO\": \"A\",\n \"OBJECT\": \"Objet\",\n \"OBJECT_HELP\": \"Objet\",\n \"ENCRYPTED_HELP\": \"Veuillez noter que ce message sera chiffré avant envoi, afin que seul le destinataire puisse le lire, et qu'il soit assuré que vous soyez bien son auteur.\",\n \"MESSAGE\": \"Message\",\n \"MESSAGE_HELP\": \"Contenu du message\",\n \"CONTENT_CONFIRMATION\": \"Le contenu du message est vide.<br/><br/>Voulez-vous néanmoins envoyer le message ?\"\n },\n \"VIEW\": {\n \"TITLE\": \"Message\",\n \"SENDER\": \"Envoyé par\",\n \"RECIPIENT\": \"Envoyé à\",\n \"NO_CONTENT\": \"Message vide\",\n \"DELETE\": \"Supprimer le message\"\n },\n \"CONFIRM\": {\n \"REMOVE\": \"Êtes-vous sûr de vouloir <b>supprimer ce message</b> ?<br/><br/>Cette opération est irréversible.\",\n \"REMOVE_ALL\" : \"Êtes-vous sûr de vouloir <b>supprimer tous les messages</b> ?<br/><br/>Cette opération est irréversible.\",\n \"MARK_ALL_AS_READ\": \"Êtes-vous sûr de vouloir <b>marquer tous les messages comme lus</b> ?\",\n \"USER_HAS_NO_PROFILE\": \"Cette identité n'a aucun profil Cesium+. Il se peut qu'elle n'utilise pas l'extension Cesium+, et <b>ne consultera donc pas votre message</b>.<br/><br/>Êtes-vous sûr de vouloir <b>continuer</b> malgré tout ?\"\n },\n \"INFO\": {\n \"MESSAGE_REMOVED\": \"Message supprimé\",\n \"All_MESSAGE_REMOVED\": \"Tous les messages ont été supprimés\",\n \"MESSAGE_SENT\": \"Message envoyé\"\n },\n \"ERROR\": {\n \"SEND_MSG_FAILED\": \"Erreur lors de l'envoi du message.\",\n \"LOAD_MESSAGES_FAILED\": \"Erreur lors de la récupération des messages.\",\n \"LOAD_MESSAGE_FAILED\": \"Erreur lors de la récupération du message.\",\n \"MESSAGE_NOT_READABLE\": \"Lecture du message impossible.\",\n \"USER_NOT_RECIPIENT\": \"Vous n'êtes pas le destinataire de ce message : déchiffrement impossible.\",\n \"NOT_AUTHENTICATED_MESSAGE\": \"L'authenticité du message est douteuse ou son contenu est corrompu.\",\n \"REMOVE_MESSAGE_FAILED\": \"Erreur de suppression du message\",\n \"MESSAGE_CONTENT_TOO_LONG\": \"Valeur trop longue ({{maxLength}} caractères max).\",\n \"MARK_AS_READ_FAILED\": \"Impossible de marquer le message comme 'lu'.\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Erreur lors de la récupération des notifications de messages.\",\n \"REMOVE_All_MESSAGES_FAILED\": \"Erreur lors de la suppression de tous les messages.\",\n \"MARK_ALL_AS_READ_FAILED\": \"Erreur lors du marquage des messages comme lus.\",\n \"RECIPIENT_IS_MANDATORY\": \"Le destinataire est obligatoire.\"\n }\n },\n \"BLOCKCHAIN\": {\n \"LOOKUP\": {\n \"SEARCH_HELP\": \"Numéro de bloc, hash, clé publique, etc.\",\n \"POPOVER_FILTER_TITLE\": \"Filtres\",\n \"HEADER_MEDIAN_TIME\": \"Date / Heure\",\n \"HEADER_BLOCK\": \"Bloc #\",\n \"HEADER_ISSUER\": \"Noeud émetteur\",\n \"BTN_LAST\": \"Derniers blocs\",\n \"DISPLAY_QUERY\": \"Afficher la requête\",\n \"HIDE_QUERY\": \"Masquer la requête\",\n \"TX_SEARCH_FILTER\": {\n \"MEMBER_FLOWS\": \"<b class=\\\"ion-person\\\"></b> Entrées/sorties de membres\",\n \"EXISTING_TRANSACTION\": \"<b class=\\\"ion-card\\\"></b> Avec transactions\",\n \"PERIOD\": \"<b class=\\\"ion-clock\\\"></b> Entre <b class=\\\"gray\\\">{{params[1]|medianDateShort}}</b> ({{params[1]|medianTime}}) et <b class=\\\"gray\\\">{{params[2]|medianDateShort}}</b> ({{params[2]|medianTime}})\",\n \"ISSUER\": \"<b class=\\\"ion-android-desktop\\\"></b> Calculé par <b class=\\\"ion-key\\\"></b> {{params[1]|formatPubkey}}\",\n \"TX_PUBKEY\": \"<b class=\\\"ion-card\\\"></b> Transactions concernant <b class=\\\"ion-key\\\"></b> {{params[1]|formatPubkey}}\"\n }\n },\n \"ERROR\": {\n \"SEARCH_BLOCKS_FAILED\": \"Erreur de la recherche des blocs.\"\n }\n },\n \"GROUP\": {\n \"GENERAL_DIVIDER\": \"Informations générales\",\n \"LOCATION_DIVIDER\": \"Adresse\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Réseaux sociaux et site web\",\n \"TECHNICAL_DIVIDER\": \"Informations techniques\",\n \"CREATED_TIME\": \"Créé {{creationTime|formatFromNow}}\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Invitations\"\n },\n \"LOOKUP\": {\n \"TITLE\": \"Groupes\",\n \"SEARCH_HELP\": \"Nom de groupe, mots, lieu, etc.\",\n \"LAST_RESULTS_LIST\": \"Nouveaux groupes :\",\n \"OPEN_RESULTS_LIST\": \"Groupes ouverts :\",\n \"MANAGED_RESULTS_LIST\": \"Groupes fermés :\",\n \"BTN_LAST\": \"Nouveaux groupes\",\n \"BTN_NEW\": \"J'ajoute un groupe\"\n },\n \"TYPE\": {\n \"TITLE\": \"Nouveau groupe\",\n \"SELECT_TYPE\": \"Type de groupe :\",\n \"OPEN_GROUP\": \"Groupe ouvert\",\n \"OPEN_GROUP_HELP\": \"Un groupe ouvert est accessible par n'importe quel membre de la monnaie.\",\n \"MANAGED_GROUP\": \"Groupe administré\",\n \"MANAGED_GROUP_HELP\": \"un groupe administré est géré par des administrateurs et des modérateurs, qui peuvent accepter, refuser ou exclure un membre en son sein.\",\n \"ENUM\": {\n \"OPEN\": \"Groupe ouvert\",\n \"MANAGED\": \"Groupe administré\"\n }\n },\n \"VIEW\": {\n \"POPOVER_SHARE_TITLE\": \"{{title}}\",\n \"MENU_TITLE\": \"Options\",\n \"REMOVE_CONFIRMATION\" : \"Êtes-vous sûr de vouloir supprimer ce groupe ?<br/><br/>Cette opération est irréversible.\"\n },\n \"EDIT\": {\n \"TITLE\": \"Groupe\",\n \"TITLE_NEW\": \"Nouveau groupe\",\n \"RECORD_TITLE\": \"Titre\",\n \"RECORD_TITLE_HELP\": \"Titre\",\n \"RECORD_DESCRIPTION\": \"Description\",\n \"RECORD_DESCRIPTION_HELP\": \"Description\"\n },\n \"ERROR\": {\n \"SEARCH_GROUPS_FAILED\": \"Échec de la recherche de groupes\",\n \"REMOVE_RECORD_FAILED\": \"Erreur de la suppression du groupe\"\n },\n \"INFO\": {\n \"RECORD_REMOVED\" : \"Groupe supprimé\"\n }\n },\n \"REGISTRY\": {\n \"CATEGORY\": \"Activité principale\",\n \"GENERAL_DIVIDER\": \"Informations générales\",\n \"LOCATION_DIVIDER\": \"Adresse\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Réseaux sociaux et site web\",\n \"TECHNICAL_DIVIDER\": \"Informations techniques\",\n \"BTN_SHOW_WOT\": \"Personnes\",\n \"BTN_SHOW_WOT_HELP\": \"Rechercher des personnes\",\n \"BTN_SHOW_PAGES\": \"Pages\",\n \"BTN_SHOW_PAGES_HELP\": \"Rechercher des pages\",\n \"BTN_NEW\": \"Créer une page\",\n \"MY_PAGES\": \"Mes pages\",\n \"NO_PAGE\": \"Aucune page\",\n \"SEARCH\": {\n \"TITLE\": \"Pages\",\n \"SEARCH_HELP\": \"Quoi, Qui : restaurant, Chez Marcel, ...\",\n \"BTN_ADD\": \"Nouveau\",\n \"BTN_LAST_RECORDS\": \"Pages récentes\",\n \"BTN_ADVANCED_SEARCH\": \"Recherche avancée\",\n \"BTN_OPTIONS\": \"Recherche avancée\",\n \"TYPE\": \"Type de page\",\n \"LOCATION_HELP\": \"Où : Code postal, Ville\",\n \"RESULTS\": \"Résultats\",\n \"RESULT_COUNT_LOCATION\": \"{{count}} résultat{{count>0?'s':''}}, près de {{location}}\",\n \"RESULT_COUNT\": \"{{count}} résultat{{count>0?'s':''}}\",\n \"LAST_RECORDS\": \"Pages récentes\",\n \"LAST_RECORD_COUNT_LOCATION\": \"{{count}} page{{count>0?'s':''}} récente{{count>0?'s':''}}, près de {{location}}\",\n \"LAST_RECORD_COUNT\": \"{{count}} page{{count>0?'s':''}} récente{{count>0?'s':''}}\",\n \"POPOVER_FILTERS\": {\n \"BTN_ADVANCED_SEARCH\": \"Options avancées ?\"\n }\n },\n \"VIEW\": {\n \"TITLE\": \"Annuaire\",\n \"CATEGORY\": \"Activité principale :\",\n \"LOCATION\": \"Adresse :\",\n \"MENU_TITLE\": \"Options\",\n \"POPOVER_SHARE_TITLE\": \"{{title}}\",\n \"REMOVE_CONFIRMATION\" : \"Êtes-vous sûr de vouloir supprimer cette page ?<br/><br/>Cette opération est irréversible.\"\n },\n \"TYPE\": {\n \"TITLE\": \"Types\",\n \"SELECT_TYPE\": \"Type de page :\",\n \"ENUM\": {\n \"SHOP\": \"Commerce local\",\n \"COMPANY\": \"Entreprise\",\n \"ASSOCIATION\": \"Association\",\n \"INSTITUTION\": \"Institution\"\n }\n },\n \"EDIT\": {\n \"TITLE\": \"Edition\",\n \"TITLE_NEW\": \"Nouvelle page\",\n \"RECORD_TYPE\":\"Type de page\",\n \"RECORD_TITLE\": \"Nom\",\n \"RECORD_TITLE_HELP\": \"Nom\",\n \"RECORD_DESCRIPTION\": \"Description\",\n \"RECORD_DESCRIPTION_HELP\": \"Description de l'activité\",\n \"RECORD_ADDRESS\": \"Rue\",\n \"RECORD_ADDRESS_HELP\": \"Rue, bâtiment...\",\n \"RECORD_CITY\": \"Ville\",\n \"RECORD_CITY_HELP\": \"Ville\",\n \"RECORD_SOCIAL_NETWORKS\": \"Réseaux sociaux et site web\",\n \"RECORD_PUBKEY\": \"Clé publique\",\n \"RECORD_PUBKEY_HELP\": \"Clé publique de réception des paiements\"\n },\n \"WALLET\": {\n \"PAGE_DIVIDER\": \"Pages\",\n \"PAGE_DIVIDER_HELP\": \"Les pages référencent des activités acceptant la monnaie ou la favorisant : commerces, entreprises, associations, institutions. Elles sont stockées en dehors du réseau de la monnaie, dans <a ui-sref=\\\"app.es_network\\\">le réseau des nœuds Cesium+</a>.\"\n },\n \"ERROR\": {\n \"LOAD_CATEGORY_FAILED\": \"Erreur de chargement de la liste des activités\",\n \"LOAD_RECORD_FAILED\": \"Erreur lors du chargement de la page\",\n \"LOOKUP_RECORDS_FAILED\": \"Erreur lors de l'exécution de la recherche\",\n \"REMOVE_RECORD_FAILED\": \"Erreur lors de la suppression de la page\",\n \"SAVE_RECORD_FAILED\": \"Erreur lors de la sauvegarde\",\n \"RECORD_NOT_EXISTS\": \"Page inexistante\",\n \"GEO_LOCATION_NOT_FOUND\": \"Ville ou code postal non trouvé\"\n },\n \"INFO\": {\n \"RECORD_REMOVED\" : \"Page supprimée\",\n \"RECORD_SAVED\": \"Page sauvegardée\"\n }\n },\n \"PROFILE\": {\n \"PROFILE_DIVIDER\": \"Profil Cesium+\",\n \"PROFILE_DIVIDER_HELP\": \"Il s'agit de données annexes, optionnelles. Elles sont stockées en dehors du réseau de la monnaie, dans <a ui-sref=\\\"app.es_network\\\">le réseau Cesium+</a>.\",\n \"NO_PROFILE_DEFINED\": \"Aucun profil saisi\",\n \"BTN_ADD\": \"Saisir mon profil\",\n \"BTN_EDIT\": \"Editer mon profil\",\n \"BTN_DELETE\": \"Supprimer mon profil\",\n \"BTN_REORDER\": \"Réordonner\",\n \"UID\": \"Pseudonyme\",\n \"TITLE\": \"Nom, Prénom\",\n \"TITLE_HELP\": \"Nom, Prénom\",\n \"DESCRIPTION\": \"A propos de moi\",\n \"DESCRIPTION_HELP\": \"A propos de moi...\",\n \"SOCIAL_HELP\": \"http://...\",\n \"GENERAL_DIVIDER\": \"Informations générales\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Réseaux sociaux, sites web\",\n \"TECHNICAL_DIVIDER\": \"Informations techniques\",\n \"MODAL_AVATAR\": {\n \"TITLE\": \"Photo de profil\",\n \"SELECT_FILE_HELP\": \"Veuillez <b>choisir le fichier image</b> :\",\n \"BTN_SELECT_FILE\": \"Choisir une photo\",\n \"RESIZE_HELP\": \"<b>Recadrez l'image</b>, si besoin. Un clic maintenu sur l'image permet de la déplacer. Cliquez sur la zone en bas à gauche pour zoomer.\",\n \"RESULT_HELP\": \"<b>Voici le résultat</b> tel que visible sur votre profil :\"\n },\n \"CONFIRM\": {\n \"DELETE\": \"Êtes-vous sûr de vouloir <b>supprimer votre profil Cesium+ ?</b><br/><br/>Cette opération est irréversible.\",\n \"DELETE_BY_MODERATOR\": \"Êtes-vous sûr de vouloir <b>supprimer ce profil Cesium+ ?</b><br/><br/>Cette opération est irréversible.\"\n },\n \"ERROR\": {\n \"REMOVE_PROFILE_FAILED\": \"Erreur de suppression du profil\",\n \"LOAD_PROFILE_FAILED\": \"Erreur de chargement du profil\",\n \"SAVE_PROFILE_FAILED\": \"Erreur lors de la sauvegarde\",\n \"DELETE_PROFILE_FAILED\": \"Erreur lors de la suppression du profil\",\n \"INVALID_SOCIAL_NETWORK_FORMAT\": \"Format non pris en compte : veuillez indiquer une adresse valide.<br/><br/>Exemples :<ul><li>- Une page Facebook (https://www.facebook.com/user)</li><li>- Une page web (http://www.monsite.fr)</li><li>- Une adresse email (joe@dalton.com)</li></ul>\",\n \"IMAGE_RESIZE_FAILED\": \"Erreur lors du redimensionnement de l'image\"\n },\n \"INFO\": {\n \"PROFILE_REMOVED\": \"Profil supprimé\",\n \"PROFILE_SAVED\": \"Profil sauvegardé\"\n },\n \"HELP\": {\n \"WARNING_PUBLIC_DATA\": \"Les informations renseignées dans votre profil <b>sont publiques</b> : visibles y compris par des personnes <b>non connectées</b>.<br/>{{'PROFILE.PROFILE_DIVIDER_HELP'|translate}}\"\n }\n },\n \"LOCATION\": {\n \"BTN_GEOLOC_ADDRESS\": \"Trouver mon adresse sur la carte\",\n \"USE_GEO_POINT\": \"Apparaître sur les cartes {{'COMMON.APP_NAME'|translate}} ?\",\n \"LOADING_LOCATION\": \"Recherche de l'adresse...\",\n \"LOCATION_DIVIDER\": \"Adresse\",\n \"ADDRESS\": \"Rue\",\n \"ADDRESS_HELP\": \"Rue, complément d'adresse...\",\n \"CITY\": \"Ville\",\n \"CITY_HELP\": \"Code postal, Ville, Pays\",\n \"DISTANCE\": \"Distance maximale autour de la ville\",\n \"DISTANCE_UNIT\": \"km\",\n \"DISTANCE_OPTION\": \"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}\",\n \"SEARCH_HELP\": \"Code postal, Ville\",\n \"PROFILE_POSITION\": \"Position du profil\",\n \"MODAL\": {\n \"TITLE\": \"Recherche de l'adresse\",\n \"SEARCH_HELP\": \"Ville, Code postal, Pays\",\n \"ALTERNATIVE_RESULT_DIVIDER\": \"Résultats alternatifs pour <b>{{address}}</b> :\",\n \"POSITION\": \"Lat/Lon : {{lat}}/{{lon}}\"\n },\n \"ERROR\": {\n \"CITY_REQUIRED_IF_STREET\": \"Champ obligatoire (car une rue est saisie)\",\n \"REQUIRED_FOR_LOCATION\": \"Champ obligatoire pour apparaître sur la carte\",\n \"INVALID_FOR_LOCATION\": \"Adresse inconnue\",\n \"GEO_LOCATION_FAILED\": \"Impossible de récupérer votre position. Veuillez utiliser le bouton de recherche.\",\n \"ADDRESS_LOCATION_FAILED\": \"Impossible de récupérer la position à partir de l'adresse\"\n }\n },\n \"SUBSCRIPTION\": {\n \"SUBSCRIPTION_DIVIDER\": \"Services en ligne\",\n \"SUBSCRIPTION_DIVIDER_HELP\": \"Les services en ligne offrent des services supplémentaires et optionnels, délégués à un perstataire de votre choix. Par exemple, pour recevoir les notifications de paiement par email.\",\n \"BTN_ADD\": \"Ajouter un service\",\n \"BTN_EDIT\": \"Gérer mes services\",\n \"NO_SUBSCRIPTION\": \"Aucun service utilisé\",\n \"SUBSCRIPTION_COUNT\": \"Services / Abonnements\",\n \"EDIT\": {\n \"TITLE\": \"Services en ligne\",\n \"HELP_TEXT\": \"Gérez ici vos abonnements et autres services en ligne\",\n \"PROVIDER\": \"Prestataire :\"\n },\n \"TYPE\": {\n \"ENUM\": {\n \"EMAIL\": \"Recevoir les notifications par email\"\n }\n },\n \"CONFIRM\": {\n \"DELETE_SUBSCRIPTION\": \"Êtes-vous sûr de vouloir <b>supprimer cet abonnement</b> ?\"\n },\n \"ERROR\": {\n \"LOAD_SUBSCRIPTIONS_FAILED\": \"Erreur lors du chargement des services en ligne\",\n \"ADD_SUBSCRIPTION_FAILED\": \"Erreur de l'envoi de l'abonnement\",\n \"UPDATE_SUBSCRIPTION_FAILED\": \"Erreur de la mise à jour de l'abonnement\",\n \"DELETE_SUBSCRIPTION_FAILED\": \"Erreur lors de la suppression de l'abonnement\"\n },\n \"MODAL_EMAIL\": {\n \"TITLE\": \"Notification par email\",\n \"HELP\": \"Remplissez ce formulaire pour <b>être notifié par email</b> des événements de votre compte.<br/>Votre adresse email sera chiffrée pour n'être visible que par le prestataire de service.\",\n \"EMAIL_LABEL\": \"Votre email :\",\n \"EMAIL_HELP\": \"jean.dupond@domaine.com\",\n \"FREQUENCY_LABEL\": \"Fréquence des notifications :\",\n \"FREQUENCY_DAILY\": \"Journalier\",\n \"FREQUENCY_WEEKLY\": \"Hebdomadaire\",\n \"PROVIDER\": \"Prestataire du service :\"\n }\n },\n \"DOCUMENT\": {\n \"HASH\": \"Hash : \",\n \"LOOKUP\": {\n \"TITLE\": \"Recherche de documents\",\n \"BTN_ACTIONS\": \"Actions\",\n \"SEARCH_HELP\": \"issuer:AAA*, time:1508406169\",\n \"LAST_DOCUMENTS_DOTS\": \"Derniers documents :\",\n \"LAST_DOCUMENTS\": \"Derniers documents\",\n \"SHOW_QUERY\": \"Voir la requête\",\n \"HIDE_QUERY\": \"Masquer la requête\",\n \"HEADER_TIME\": \"Date/Heure\",\n \"HEADER_ISSUER\": \"Emetteur\",\n \"HEADER_RECIPIENT\": \"Destinataire\",\n \"READ\": \"Lu\",\n \"BTN_REMOVE\": \"Supprimer ce document\",\n \"BTN_COMPACT\": \"Compacter\",\n \"HAS_CREATE_OR_UPDATE_PROFILE\": \"a créé ou modifié son profil\",\n \"POPOVER_ACTIONS\": {\n \"TITLE\": \"Actions\",\n \"REMOVE_ALL\": \"Supprimer ces documents...\"\n }\n },\n \"INFO\": {\n \"REMOVED\": \"Document supprimé\"\n },\n \"CONFIRM\": {\n \"REMOVE\": \"Êtes-vous sûr de vouloir <b>supprimer ce document</b> ?\",\n \"REMOVE_ALL\": \"Êtes-vous sûr de vouloir <b>supprimer ces documents</b> ?\"\n },\n \"ERROR\": {\n \"LOAD_DOCUMENTS_FAILED\": \"Erreur lors de la recherche de documents\",\n \"REMOVE_FAILED\": \"Erreur lors de la suppression du document\",\n \"REMOVE_ALL_FAILED\": \"Erreur lors de la suppression des documents\"\n }\n },\n \"ES_SETTINGS\": {\n \"PLUGIN_NAME\": \"Cesium+\",\n \"PLUGIN_NAME_HELP\": \"Profils, notifications, messages privés\",\n \"ENABLE_TOGGLE\": \"Activer l'extension ?\",\n \"ENABLE_REMOTE_STORAGE\": \"Activer le stockage distant ?\",\n \"ENABLE_REMOTE_STORAGE_HELP\": \"Permet de stockage (chiffré) de vos paramètres sur les noeuds Cesium+\",\n \"ENABLE_MESSAGE_TOGGLE\": \"Activer les messages privés ?\",\n \"PEER\": \"Nœud de données Cesium+\",\n \"POPUP_PEER\": {\n \"TITLE\" : \"Nœud de données\",\n \"HELP\" : \"Saisissez l'adresse du nœud que vous voulez utiliser :\",\n \"PEER_HELP\": \"serveur.domaine.com:port\"\n },\n \"NOTIFICATIONS\": {\n \"DIVIDER\": \"Notifications\",\n \"HELP_TEXT\": \"Activez les types de notifications que vous souhaitez recevoir :\",\n \"ENABLE_TX_SENT\": \"Notifier les <b>paiements émis</b> ?\",\n \"ENABLE_TX_RECEIVED\": \"Notifier les <b>paiements reçus</b> ?\",\n \"ENABLE_CERT_SENT\": \"Notifier les <b>certifications émises</b> ?\",\n \"ENABLE_CERT_RECEIVED\": \"Notifier les <b>certifications reçues</b> ?\",\n \"ENABLE_HTML5_NOTIFICATION\": \"Avertir à chaque nouvelle notification ?\",\n \"ENABLE_HTML5_NOTIFICATION_HELP\": \"Ouvre une petite fenêtre à chaque nouvelle notification.\"\n },\n \"CONFIRM\": {\n \"ASK_ENABLE_TITLE\": \"Fonctionnalités optionnelles\",\n \"ASK_ENABLE\": \"L'extension Cesium+ est <b>désactivée</b> dans vos paramètres, rendant inactives les fonctionnalités : <ul><li>&nbsp;&nbsp;<b><i class=\\\"icon ion-person\\\"></i> Profils Cesium+</b>;<li>&nbsp;&nbsp;<b><i class=\\\"icon ion-android-notifications\\\"></i> Notifications</b>;<li>&nbsp;&nbsp;<b><i class=\\\"icon ion-email\\\"></i> Messages privés</b>.<li>&nbsp;&nbsp;<b><i class=\\\"icon ion-location\\\"></i> Cartes, etc.</b>.</ul><br/><b>Souhaitez-vous ré-activer</b> l'extension ?\"\n }\n },\n \"ES_WALLET\": {\n \"ERROR\": {\n \"RECIPIENT_IS_MANDATORY\": \"Un destinataire est obligatoire pour le chiffrement.\"\n }\n },\n \"ES_PEER\": {\n \"NAME\": \"Nom\",\n \"DOCUMENTS\": \"Documents\",\n \"SOFTWARE\": \"Logiciel\",\n \"DOCUMENT_COUNT\": \"Nombre de documents\",\n \"EMAIL_SUBSCRIPTION_COUNT\": \"{{emailSubscription}} abonné{{emailSubscription ? 's' : ''}} aux notifications par email\"\n },\n \"EVENT\": {\n \"NODE_STARTED\": \"Votre noeud ES API <b>{{params[0]}}</b> est démarré\",\n \"NODE_BMA_DOWN\": \"Le noeud <b>{{params[0]}}:{{params[1]}}</b> (utilisé par votre noeud ES API) est <b>injoignable</b>.\",\n \"NODE_BMA_UP\": \"Le noeud <b>{{params[0]}}:{{params[1]}}</b> est à nouveau accessible.\",\n \"MEMBER_JOIN\": \"Vous êtes maintenant <b>membre</b> de la monnaie <b>{{params[0]}}</b> !\",\n \"MEMBER_LEAVE\": \"Vous n'êtes <b>plus membre</b> de la monnaie <b>{{params[0]}}</b> !\",\n \"MEMBER_EXCLUDE\": \"Vous n'êtes <b>plus membre</b> de la monnaie <b>{{params[0]}}</b>, faute de non renouvellement ou par manque de certifications.\",\n \"MEMBER_REVOKE\": \"La révocation de votre compte a été effectuée. Il ne pourra plus être un compte membre de la monnaie <b>{{params[0]}}</b>.\",\n \"MEMBER_ACTIVE\": \"Votre renouvellement d'adhésion à la monnaie <b>{{params[0]}}</b> a été <b>pris en compte</b>.\",\n \"TX_SENT\": \"Votre <b>paiement</b> à <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\" ><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> a été effectué.\",\n \"TX_SENT_MULTI\": \"Votre <b>paiement</b> à <b>{{params[1]}}</b> a été effectué.\",\n \"TX_RECEIVED\": \"Vous avez <b>reçu un paiement</b> de <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span>.\",\n \"TX_RECEIVED_MULTI\": \"Vous avez <b>reçu un paiement</b> de <b>{{params[1]}}</b>.\",\n \"CERT_SENT\": \"Votre <b>certification</b> à <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\" ><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> a été effectuée.\",\n \"CERT_RECEIVED\": \"Vous avez <b>reçu une certification</b> de <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span>.\",\n \"USER\": {\n \"LIKE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> aime votre profil\",\n \"FOLLOW_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> suit votre activité\",\n \"STAR_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> vous a noté ({{params[3]}} <b class=\\\"ion-star\\\">)\",\n \"MODERATION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> vous demande une modération sur le profil : <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"DELETION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> demande la suppression d'un profil : <b>{{params[2]}}</b>\",\n \"ABUSE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> a signalé votre profil\"\n },\n \"PAGE\": {\n \"NEW_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> a commenté votre page : <b>{{params[2]}}</b>\",\n \"UPDATE_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> a modifié son commentaire sur votre page : <b>{{params[2]}}</b>\",\n \"NEW_REPLY_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> a répondu à votre commentaire sur la page : <b>{{params[2]}}</b>\",\n \"UPDATE_REPLY_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> a modifié sa réponse à votre commentaire sur la page : <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> a commenté la page : <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> a modifié son commentaire sur la page : <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> a ajouté la page : <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> a modifié la page : <b>{{params[2]}}</b>\",\n \"MODERATION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> vous demande une modération sur la page : <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"DELETION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> a signalé une page à supprimer : <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"ABUSE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> a signalé votre page : <b>{{params[2]}}</b>\"\n }\n },\n \"LIKE\": {\n \"ERROR\": {\n \"FAILED_TOGGLE_LIKE\": \"Impossible d'exécuter cette action.\"\n }\n },\n \"CONFIRM\": {\n \"ES_USE_FALLBACK_NODE\": \"Nœud de données <b>{{old}}</b> injoignable ou adresse invalide.<br/><br/>Voulez-vous temporairement utiliser le nœud de données <b>{{new}}</b> ?\"\n },\n \"ERROR\": {\n \"ES_CONNECTION_ERROR\": \"Nœud de données <b>{{server}}</b> injoignable ou adresse invalide.<br/><br/>Cesium va continuer à fonctionner, <b>sans l'extension Cesium+</b> (profils utilisateur, messages privés, cartes et graphiques)<br/><br/>Vérifiez votre connexion Internet, ou changez de nœud de données dans les <a class=\\\"positive\\\" ng-click=\\\"doQuickFix('settings')\\\">paramètres de l'extension</a>.\",\n \"ES_MAX_UPLOAD_BODY_SIZE\": \"Le volume des données à envoyer dépasse la limite fixée par le serveur.<br/>Veuillez ré-essayer après avoir, par exemple, supprimer des photos.\"\n }\n}\n);\n\n$translateProvider.translations(\"it-IT\", {\n \"COMMON\": {\n \"CATEGORY\": \"Categoria\",\n \"CATEGORIES\": \"Categorie\",\n \"CATEGORY_SEARCH_HELP\": \"Ricerca\",\n \"LAST_MODIFICATION_DATE\": \"Aggiornato il \",\n \"SUBMIT_BY\": \"Inviato da\",\n \"BTN_PUBLISH\": \"Pubblicare\",\n \"BTN_PICTURE_DELETE\": \"Eliminare\",\n \"BTN_PICTURE_FAVORISE\": \"Predefinito\",\n \"BTN_PICTURE_ROTATE\": \"Girare\",\n \"BTN_ADD_PICTURE\": \"Aggiungere foto\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Notifiche\",\n \"MARK_ALL_AS_READ\": \"Segna tutte come lette\",\n \"NO_RESULT\": \"Nessuna notifica\",\n \"SHOW_ALL\": \"Mostrare tutte\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Impossibile caricare le notifiche\"\n }\n },\n \"MENU\": {\n \"REGISTRY\": \"Pagine\",\n \"USER_PROFILE\": \"Mio profilo\",\n \"MESSAGES\": \"Messaggi\",\n \"NOTIFICATIONS\": \"Notifiche\",\n \"INVITATIONS\": \"Inviti\"\n },\n \"ACCOUNT\": {\n \"NEW\": {\n \"ORGANIZATION_ACCOUNT\": \"Conto per enti\",\n \"ORGANIZATION_ACCOUNT_HELP\": \"Se rappresenta un'azienda, un'associazione, etc.<br/>Questo conto non potrà creare il Dividendo Universale.\"\n },\n \"EVENT\": {\n \"MEMBER_WITHOUT_PROFILE\": \"Per ottenere sue certificazioni più velocemente, riempire le informazioni<a ui-sref=\\\"app.edit_profile\\\">del suo profilo</a>. I membri della rete si fidano più volontieri di profili verificabili.\"\n },\n \"ERROR\": {\n \"WS_CONNECTION_FAILED\": \"Cesium non può ricevere notifiche a causa di un problema tecnico (di conessione al data node Cesium+).<br/><br/>Se il problema persiste, le chiediamo di <b>scegliere un'altro data node</b> nelle impostazioni di Cesium+.\"\n }\n },\n \"WOT\": {\n \"BTN_SUGGEST_CERTIFICATIONS_DOTS\": \"Suggerire delle identità da certificare..\",\n \"BTN_ASK_CERTIFICATIONS_DOTS\": \"Chiedere una certificazione ai membri...\",\n \"BTN_ASK_CERTIFICATION\": \"Chiedere una certificazione\",\n \"SUGGEST_CERTIFICATIONS_MODAL\": {\n \"TITLE\": \"Suggerire delle certificazioni\",\n \"HELP\": \"Scegliere i suoi suggerimenti, aiuti\"\n },\n \"ASK_CERTIFICATIONS_MODAL\": {\n \"TITLE\": \"Chiedere delle certificazioni\",\n \"HELP\": \"Selezionare un ricevente\"\n },\n \"SEARCH\": {\n \"DIVIDER_PROFILE\": \"Conti\",\n \"DIVIDER_PAGE\": \"Pagine\",\n \"DIVIDER_GROUP\": \"Gruppi\"\n },\n \"CONFIRM\": {\n \"SUGGEST_CERTIFICATIONS\": \"E sicuro(a) di voler <b>suggerire queste certificazioni</b> ?\",\n \"ASK_CERTIFICATION\": \" E sicuro(a) di voler <b>chiedere una certificazione</b> ?\",\n \"ASK_CERTIFICATIONS\": \" E sicuro(a) di voler <b>chiedere una certificazione</b> a questi membri ?\"\n }\n },\n \"INVITATION\": {\n \"TITLE\": \"Invitazioni\",\n \"NO_RESULT\": \"Nessun invito ricevuto\",\n \"BTN_DELETE_ALL\": \"Cancellare tutti gli inviti\",\n \"BTN_DELETE\": \"Cancellare l'invito\",\n \"BTN_NEW_INVITATION\": \"Nuovo invito\",\n \"ASK_CERTIFICATION\": \"<a href=\\\"#/app/wot/{{pubkey}}/{{::uid}}\\\">{{::name||uid}}</a> ti ha chiesto una certificazione\",\n \"SUGGESTION_CERTIFICATION\": \"<a href=\\\"#/app/wot/{{::pubkey}}/{{::uid}}\\\">{{::name||uid}}</a> è proposto per ricevere una certificazione\",\n \"SUGGESTED_BY\": \"Suggerimento inviato da by <a class=\\\"positive\\\" href=\\\"#/app/wot/{{::issuer.pubkey}}/{{::issuer.uid}}\\\">{{::issuer.name||issuer.uid}}</a>\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Inviti\"\n },\n \"LIST\": {\n \"TITLE\": \"Inviti\"\n },\n \"NEW\": {\n \"TITLE\": \"Nuovo invito\",\n \"RECIPIENTS\": \"A\",\n \"RECIPIENTS_HELP\": \"Riceventi dell'invito\",\n \"RECIPIENTS_MODAL_TITLE\": \"Riceventi\",\n \"RECIPIENTS_MODAL_HELP\": \"Scegliere riceventi:\",\n \"SUGGESTION_IDENTITIES\": \"Suggerimenti di identità da certificare\",\n \"SUGGESTION_IDENTITIES_HELP\": \"Suggerimenti di certificazioni\",\n \"SUGGESTION_IDENTITIES_MODAL_TITLE\": \"Suggerimenti\",\n \"SUGGESTION_IDENTITIES_MODAL_HELP\": \"Scegli tuoi sugerimenti:\"\n },\n \"CONFIRM\": {\n \"DELETE_ALL_CONFIRMATION\": \"Cancellare degli inviti è <b>una operazione irreversibile</b>.<br/><br/><b>Sei sicuro/a</b> di voler proseguire\",\n \"SEND_INVITATIONS_TO_CERTIFY\": \"<b>Sei sicuro/a</b> di voler <b>inviare questo suggerimento di certificazione</b> ?\"\n },\n \"INFO\": {\n \"INVITATION_SENT\": \"Invito inviato\"\n },\n \"ERROR\": {\n \"LOAD_INVITATIONS_FAILED\": \"Errore nel caricare gli inviti\",\n \"REMOVE_INVITATION_FAILED\": \"Errore nel cancellare gli inviti\",\n \"REMOVE_ALL_INVITATIONS_FAILED\": \"Errore nel cancellare inviti\",\n \"SEND_INVITATION_FAILED\": \"Errore nel invio degli inviti\",\n \"BAD_INVITATION_FORMAT\": \"<span class=\\\"assertive\\\"><i class=\\\"ion-close-circled\\\"></i> Invito illegibile (formatto sconosciuto)</span> - inviato da <a ui-sref=\\\"app.wot_identity({pubkey: '{{::pubkey}}', uid: '{{::uid}}' })\\\">{{::name||uid}}</a>\"\n }\n },\n \"COMMENTS\": {\n \"DIVIDER\": \"Commenti\",\n \"SHOW_MORE_COMMENTS\": \"Mostrare commenti precedenti\",\n \"COMMENT_HELP\": \"Suo commento o domanda...\",\n \"COMMENT_HELP_REPLY_TO\": \"Sua risposta...\",\n \"BTN_SEND\": \"Inviare\",\n \"POPOVER_SHARE_TITLE\": \"Messaggio #{{number}}\",\n \"REPLY\": \"Rispondere\",\n \"REPLY_TO\": \"Rispondere a:\",\n \"REPLY_TO_LINK\": \"In risposta a\",\n \"REPLY_TO_DELETED_COMMENT\": \"In risposta ad un commento cancellato\",\n \"REPLY_COUNT\": \"{{replyCount}} risposte\",\n \"DELETED_COMMENT\": \"Commento cancellato\",\n \"ERROR\": {\n \"FAILED_SAVE_COMMENT\": \"Salvare il commento cancellato\",\n \"FAILED_REMOVE_COMMENT\": \"Cancellazione del commento fallita\"\n }\n },\n \"MESSAGE\": {\n \"REPLY_TITLE_PREFIX\": \"Re: \",\n \"FORWARD_TITLE_PREFIX\": \"Fw: \",\n \"BTN_REPLY\": \"Rispondere\",\n \"BTN_COMPOSE\": \"Nuovo messaggio\",\n \"BTN_WRITE\": \"Scrivere\",\n \"NO_MESSAGE_INBOX\": \"Nessun messaggio ricevuto\",\n \"NO_MESSAGE_OUTBOX\": \"Nessun messaggio inviato\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Messaggi\",\n \"MESSAGE_RECEIVED\": \"Hai <b>ricevuto un messaggio/b><br/>da\"\n },\n \"LIST\": {\n \"INBOX\": \"In entrata\",\n \"OUTBOX\": \"In uscita\",\n \"TITLE\": \"Messaggi privati\",\n \"POPOVER_ACTIONS\": {\n \"TITLE\": \"Opzioni\",\n \"DELETE_ALL\": \"Eliminare tutti i messaggi\"\n }\n },\n \"COMPOSE\": {\n \"TITLE\": \"Nuovo messaggio\",\n \"TITLE_REPLY\": \"Rispondere\",\n \"SUB_TITLE\": \"Nuovo messaggio\",\n \"TO\": \"A\",\n \"OBJECT\": \"Oggetto\",\n \"OBJECT_HELP\": \"Oggetto\",\n \"ENCRYPTED_HELP\": \"La informiamo che questo messaggio verrà criptato prima della sua spedizione in modo che solo il destinatario lo possa leggere e essere sicuro che ne sia Lei l'autore.\",\n \"MESSAGE\": \"Messaggio\",\n \"MESSAGE_HELP\": \"Contenuto del messaggio\",\n \"CONTENT_CONFIRMATION\": \"Nessun contenuto. <br/><br/>E sicura di voler inviare questo messaggio?\"\n },\n \"VIEW\": {\n \"TITLE\": \"Messaggio\",\n \"SENDER\": \"Inviato da\",\n \"RECIPIENT\": \"Inviato a\",\n \"NO_CONTENT\": \"Messaggio vuoto\",\n \"DELETE\": \"Cancellare il messaggio\"\n },\n \"CONFIRM\": {\n \"REMOVE\": \"E sicuro/a di voler <b>eliminare il messaggio</b>?<br/><br/> Questa operazione è irreversibile.\",\n \"REMOVE_ALL\": \"E sicuro/a di voler <b>eliminare tutti i messaggi</b>?<br/><br/> Questa operazione è irreversibile.\",\n \"MARK_ALL_AS_READ\": \"E sicuro/a di voler <b>segnare tutti i messaggi come letti/b>?\",\n \"USER_HAS_NO_PROFILE\": \"Questa identità non ha un profilo Cesium+. Pertanto non può <b>leggere il suo messaggio</b>.<br/><br/>E sicuro/a di voler <b>continuare</b>?\"\n },\n \"INFO\": {\n \"MESSAGE_REMOVED\": \"Messaggio eliminato correttamente\",\n \"All_MESSAGE_REMOVED\": \"Messaggi eliminati correttamente\",\n \"MESSAGE_SENT\": \"Messaggio inviato\"\n },\n \"ERROR\": {\n \"SEND_MSG_FAILED\": \"Errore nella spedizione del messaggio.\",\n \"LOAD_MESSAGES_FAILED\": \"Errore durante il caricamento dei messaggi.\",\n \"LOAD_MESSAGE_FAILED\": \"Errore durante il caricamento del messaggio.\",\n \"MESSAGE_NOT_READABLE\": \"Impossibile leggere il messaggio.\",\n \"USER_NOT_RECIPIENT\": \"Lei non è il destinatario del messaggio: impossibile leggerlo.\",\n \"NOT_AUTHENTICATED_MESSAGE\": \"Impossibile verificare l'autenticità del messaggio o contenuto corrotto.\",\n \"REMOVE_MESSAGE_FAILED\": \"Errore avvenuto durante l'eliminazione del messaggio\",\n \"MESSAGE_CONTENT_TOO_LONG\": \"Il contenuto supera il limite ({{maxLength}} caratteri ammessi).\",\n \"MARK_AS_READ_FAILED\": \"Impossibile segnare il messaggio come 'letto'.\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Errore nel caricare le notifiche.\",\n \"REMOVE_All_MESSAGES_FAILED\": \"Errore avvenuto durante l'eliminazione dei messaggi.\",\n \"MARK_ALL_AS_READ_FAILED\": \"Errore avvenuto nel segnare i messaggi come 'letti\",\n \"RECIPIENT_IS_MANDATORY\": \"Destinatario obbligatorio\"\n }\n },\n \"BLOCKCHAIN\": {\n \"LOOKUP\": {\n \"SEARCH_HELP\": \"Numero di blocco, hash...\",\n \"POPOVER_FILTER_TITLE\": \"Filtro\",\n \"HEADER_MEDIAN_TIME\": \"Data / Ora\",\n \"HEADER_BLOCK\": \"Blocco #\",\n \"HEADER_ISSUER\": \"Peer proprietario\",\n \"BTN_LAST\": \"Ultimi blocchi\",\n \"DISPLAY_QUERY\": \"Visualizzare query\",\n \"HIDE_QUERY\": \"Nascondere query\",\n \"TX_SEARCH_FILTER\": {\n \"MEMBER_FLOWS\": \"<b class=\\\"ion-person\\\"></b> Input/output Membri\",\n \"EXISTING_TRANSACTION\": \"<b class=\\\"ion-card\\\"></b> hanno transazioni\",\n \"PERIOD\": \"<b class=\\\"ion-clock\\\"></b> Tra <b class=\\\"gray\\\">{{params[1]|medianDateShort}}</b> ({{params[1]|medianTime}}) e <b class=\\\"gray\\\">{{params[2]|medianDateShort}}</b> ({{params[2]|medianTime}})\",\n \"ISSUER\": \"<b class=\\\"ion-android-desktop\\\"></b> Calcolato da {{params[1]|formatPubkey}}\",\n \"TX_PUBKEY\": \"<b class=\\\"ion-card\\\"></b> Transazioni legate a <b class=\\\"ion-key\\\"></b> {{params[1]|formatPubkey}}\"\n }\n },\n \"ERROR\": {\n \"SEARCH_BLOCKS_FAILED\": \"Errore durante la ricerca dei blocchi.\"\n }\n },\n \"GROUP\": {\n \"GENERAL_DIVIDER\": \"Informazioni generali\",\n \"LOCATION_DIVIDER\": \"Indirizzo\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Presenza sui social e/o sito web\",\n \"TECHNICAL_DIVIDER\": \"Dati tecnici\",\n \"CREATED_TIME\": \"Creato {{creationTime|formatFromNow}}\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Inviti\"\n },\n \"LOOKUP\": {\n \"TITLE\": \"Gruppi\",\n \"SEARCH_HELP\": \"Nome del grupo, parole chiavi, luogo, etc.\",\n \"LAST_RESULTS_LIST\": \"Nuovi gruppi :\",\n \"OPEN_RESULTS_LIST\": \"Gruppi aperti :\",\n \"MANAGED_RESULTS_LIST\": \"Gruppi chiusi :\",\n \"BTN_LAST\": \"Nuovi gruppi\",\n \"BTN_NEW\": \"Aggiungo un grupo!\"\n },\n \"TYPE\": {\n \"TITLE\": \"Nuovo gruppo\",\n \"SELECT_TYPE\": \"Tipo di gruppo :\",\n \"OPEN_GROUP\": \"Gruppo aperto\",\n \"OPEN_GROUP_HELP\": \"Un gruppo aperto è accessibile da qualsiasi membro della moneta.\",\n \"MANAGED_GROUP\": \"Gruppo amministrato\",\n \"MANAGED_GROUP_HELP\": \"un gruppo amministrato è gestito da amministratori e moderatori, che possono accetare, rifiutare o escludere membri del gruppo.\",\n \"ENUM\": {\n \"OPEN\": \"Gruppo aperto\",\n \"MANAGED\": \"Gruppo amministrato\"\n }\n },\n \"VIEW\": {\n \"POPOVER_SHARE_TITLE\": \"{{title}}\",\n \"MENU_TITLE\": \"Opzioni\",\n \"REMOVE_CONFIRMATION\" : \"Sei sicuro/a di voler chiudere questo gruppo ?<br/><br/>Questa operazione è irreversibile.\"\n },\n \"EDIT\": {\n \"TITLE\": \"Gruppo\",\n \"TITLE_NEW\": \"Nuovo gruppo\",\n \"RECORD_TITLE\": \"Titolo\",\n \"RECORD_TITLE_HELP\": \"Titolo\",\n \"RECORD_DESCRIPTION\": \"Descrizione\",\n \"RECORD_DESCRIPTION_HELP\": \"Descrizione\"\n },\n \"ERROR\": {\n \"SEARCH_GROUPS_FAILED\": \"Errore nella ricerca di gruppi\",\n \"REMOVE_RECORD_FAILED\": \"Errore nel chiudere il gruppo\"\n },\n \"INFO\": {\n \"RECORD_REMOVED\" : \"Gruppo eliminato\"\n }\n },\n \"REGISTRY\": {\n \"CATEGORY\": \"Attività principale\",\n \"GENERAL_DIVIDER\": \"Informazioni di base\",\n \"LOCATION_DIVIDER\": \"Indirizzo\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Presenza sui social, sito web\",\n \"TECHNICAL_DIVIDER\": \"Dati tecnici\",\n \"BTN_SHOW_WOT\": \"Persone\",\n \"BTN_SHOW_WOT_HELP\": \"Cercare persone\",\n \"BTN_SHOW_PAGES\": \"Pagine\",\n \"BTN_SHOW_PAGES_HELP\": \"Cercare pagine\",\n \"BTN_NEW\": \"Aggiungere\",\n \"MY_PAGES\": \"Mie pagine\",\n \"NO_PAGE\": \"Nessuna pagina\",\n \"SEARCH\": {\n \"TITLE\": \"Pagine\",\n \"SEARCH_HELP\": \"Che, chi: parrucchiere, Pizza Efisio, ...\",\n \"BTN_ADD\": \"Nuovo\",\n \"BTN_LAST_RECORDS\": \"Pagine recenti\",\n \"BTN_ADVANCED_SEARCH\": \"Ricerca avanzata\",\n \"BTN_OPTIONS\": \"Ricerca avanzata\",\n \"TYPE\": \"Tipo di ente\",\n \"LOCATION_HELP\": \"Città\",\n \"RESULTS\": \"Risultati\",\n \"RESULT_COUNT_LOCATION\": \"{{count}} risultato{{count>0?'i':''}}, vicino a {{location}}\",\n \"RESULT_COUNT\": \"{{count}} risultato{{count>0?'i':''}}\",\n \"LAST_RECORDS\": \"Pagine recenti:\",\n \"LAST_RECORD_COUNT_LOCATION\": \"{{count}} pagina{{count>0?'e':''}} recente{{count>0?'i':''}}, vicino a{{location}}\",\n \"LAST_RECORD_COUNT\": \"{{count}} pagina{{count>0?'e':''}} recente{{count>0?'i':''}}\",\n \"POPOVER_FILTERS\": {\n \"BTN_ADVANCED_SEARCH\": \"Opzioni avanzate ?\"\n }\n },\n \"VIEW\": {\n \"TITLE\": \"Annuario\",\n \"CATEGORY\": \"Attività principale:\",\n \"LOCATION\": \"Indirizzo:\",\n \"MENU_TITLE\": \"Impostazioni\",\n \"POPOVER_SHARE_TITLE\": \"{{title}}\",\n \"REMOVE_CONFIRMATION\" : \"E sicuro/a di voler eliminare questo riferimento?<br/><br/>Questa operazione è irreversibile.\"\n },\n \"TYPE\": {\n \"TITLE\": \"Nuovo riferimento\",\n \"SELECT_TYPE\": \"Tipo di ente/organismo:\",\n \"ENUM\": {\n \"SHOP\": \"Negozi locali\",\n \"COMPANY\": \"Azienda\",\n \"ASSOCIATION\": \"Associazione\",\n \"INSTITUTION\": \"Istituto\"\n }\n },\n \"EDIT\": {\n \"TITLE\": \"Modificare\",\n \"TITLE_NEW\": \"Nuovo riferimento\",\n \"RECORD_TYPE\": \"Tipo di ente\",\n \"RECORD_TITLE\": \"Nome\",\n \"RECORD_TITLE_HELP\": \"Nome\",\n \"RECORD_DESCRIPTION\": \"Descrizione\",\n \"RECORD_DESCRIPTION_HELP\": \"Descrivere l'attività\",\n \"RECORD_ADDRESS\": \"Indirizzo\",\n \"RECORD_ADDRESS_HELP\": \"Indirizzo: Strada, numero civico...\",\n \"RECORD_CITY\": \"Città\",\n \"RECORD_CITY_HELP\": \"Città, Paese\",\n \"RECORD_SOCIAL_NETWORKS\": \"Presenza sui social e/o sito web\",\n \"RECORD_PUBKEY\": \"Chiave pubblica\",\n \"RECORD_PUBKEY_HELP\": \"Chiave pubblica per ricevere pagamenti\"\n },\n \"WALLET\": {\n \"PAGE_DIVIDER\": \"Pagine\",\n \"PAGE_DIVIDER_HELP\": \"Le pagine sono un elenco dei profesionisti che accettano o favoriscono: negozi, aziende, associazioni, istituti...\"\n },\n \"ERROR\": {\n \"LOAD_CATEGORY_FAILED\": \"Errore nel caricamento delle attività principali\",\n \"LOAD_RECORD_FAILED\": \"Caricamento fallito\",\n \"LOOKUP_RECORDS_FAILED\": \"Errore nel caricare i dati\",\n \"REMOVE_RECORD_FAILED\": \"Errore nella cancellazione\",\n \"SAVE_RECORD_FAILED\": \"Impossibile salvare\",\n \"RECORD_NOT_EXISTS\": \"Inesistente\",\n \"GEO_LOCATION_NOT_FOUND\": \"Città o CAP inesistente\"\n },\n \"INFO\": {\n \"RECORD_REMOVED\" : \"Pagina eliminata con successo.\",\n \"RECORD_SAVED\": \"Pagina salvata\"\n }\n },\n \"PROFILE\": {\n \"PROFILE_DIVIDER\": \"Profilo Cesium+\",\n \"PROFILE_DIVIDER_HELP\": \"Si tratta qui di data esterni, salvati fuori della rete della moneta.\",\n \"NO_PROFILE_DEFINED\": \"Nessun profilo Cesium+\",\n \"BTN_ADD\": \"Creare mio profilo\",\n \"BTN_EDIT\": \"Modificare mio profilo\",\n \"UID\": \"Pseudonimo\",\n \"TITLE\": \"Cognome, Nome\",\n \"TITLE_HELP\": \"Nome\",\n \"DESCRIPTION\": \"A proposito di me\",\n \"DESCRIPTION_HELP\": \"A proposito di me...\",\n \"SOCIAL_HELP\": \"http://...\",\n \"GENERAL_DIVIDER\": \"Informazioni generali\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Presenza sui social e sito/i web\",\n \"TECHNICAL_DIVIDER\": \"Dati tecnici\",\n \"MODAL_AVATAR\": {\n \"TITLE\": \"Avatar\",\n \"SELECT_FILE_HELP\": \"<b>Scegliere un'immagine</b>:\",\n \"BTN_SELECT_FILE\": \"Scegliere un'immagine\",\n \"RESIZE_HELP\": \"<b>Ritagliare l'immagine</b> se necessario. Cliccare sull'immagine permette di spostarla. Cliccando nella zona a basso sinistra permette di fare uno zoom-in.\",\n \"RESULT_HELP\": \"<b>Questo è il risultato</b> come visibile sul suo profilo:\"\n },\n \"ERROR\": {\n \"LOAD_PROFILE_FAILED\": \"Impossibile caricare il profilo dellutente.\",\n \"SAVE_PROFILE_FAILED\": \"Impossibile salvare il profilo\",\n \"INVALID_SOCIAL_NETWORK_FORMAT\": \"Formatto scorretto: URL sbagliato.<br/><br/>Esempi: :<ul><li>- Una pagina Facebook (https://www.facebook.com/user)</li><li>- Un sito: (http://www.domain.com)</li><li>- Un indirizzo mail: (joe@dalton.com)</li></ul>\",\n \"IMAGE_RESIZE_FAILED\": \"Errore nel ritagliare l'immagine\"\n },\n \"INFO\": {\n \"PROFILE_SAVED\": \"Profilo salvato\"\n },\n \"HELP\": {\n \"WARNING_PUBLIC_DATA\": \"La informiamo che le informazioni qui pubblicate <b>sono pubbliche</b>: sono anche visibili <b>da gente non registrata/b>.\"\n }\n },\n \"LOCATION\": {\n \"BTN_GEOLOC_ADDRESS\": \"Trovare mio indirizzo sulla mappa\",\n \"USE_GEO_POINT\": \"Geo-localizzare (raccomandato)?\",\n \"LOADING_LOCATION\": \"Cercando indirizzo...\",\n \"LOCATION_DIVIDER\": \"Posizione\",\n \"ADDRESS\": \"Indirizzo\",\n \"ADDRESS_HELP\": \"Indirizzo (opzionale)\",\n \"CITY\": \"Città\",\n \"CITY_HELP\": \"Città, Paese\",\n \"DISTANCE\": \"Distanza massimale intorno alla città\",\n \"DISTANCE_UNIT\": \"km\",\n \"DISTANCE_OPTION\": \"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}\",\n \"SEARCH_HELP\": \"Città, CAP\",\n \"MODAL\": {\n \"TITLE\": \"Cercare indirizzo\",\n \"SEARCH_HELP\": \"Città, Paese\",\n \"ALTERNATIVE_RESULT_DIVIDER\": \"Risultati alternativi <b>{{address}}</b>:\",\n \"POSITION\": \"lat/lon : {{lat}} {{lon}}\"\n },\n \"ERROR\": {\n \"REQUIRED_FOR_LOCATION\": \"Campo obbligatorio per apparire sulla mappa\",\n \"INVALID_FOR_LOCATION\": \"Indirizzo sconosciuto\",\n \"GEO_LOCATION_FAILED\": \"Impossibile trovare sua posizione. Utilizzi il bottone di ricerca.\",\n \"ADDRESS_LOCATION_FAILED\": \"Indirizzo non trovato\"\n }\n },\n \"SUBSCRIPTION\": {\n \"SUBSCRIPTION_DIVIDER\": \"Servizi online\",\n \"SUBSCRIPTION_DIVIDER_HELP\": \"I servizi online offrono servizi addizionali opzionali, delegati ad terzi.\",\n \"BTN_ADD\": \"Aggiungere un servizio\",\n \"BTN_EDIT\": \"Gestire miei servizi\",\n \"NO_SUBSCRIPTION\": \"Nessun servizio utilizzato\",\n \"SUBSCRIPTION_COUNT\": \"Servizi/ Abbonamenti\",\n \"EDIT\": {\n \"TITLE\": \"Servizi online\",\n \"HELP_TEXT\": \"Qui si possono gestire gli abbonamenti e/o altri servizi online\",\n \"PROVIDER\": \"Prestatore :\"\n },\n \"TYPE\": {\n \"ENUM\": {\n \"EMAIL\": \"Ricevere notifiche per posta elettronica\"\n }\n },\n \"CONFIRM\": {\n \"DELETE_SUBSCRIPTION\": \"Sei sicuro/a di voler <b>cancellare questo abbonamento</b> ?\"\n },\n \"ERROR\": {\n \"LOAD_SUBSCRIPTIONS_FAILED\": \"Errore nel caricamento dei servizi online\",\n \"ADD_SUBSCRIPTION_FAILED\": \"Errore nel invio dell' abbonamento\",\n \"UPDATE_SUBSCRIPTION_FAILED\": \"Errore nel aggiornamento dell' abbonamento\",\n \"DELETE_SUBSCRIPTION_FAILED\": \"Errore nella cancellazine dell' abbonamento\"\n },\n \"MODAL_EMAIL\": {\n \"TITLE\" : \"Notifiche per posta elettronica\",\n \"HELP\" : \"Riempi questo formulario per <b>essere notificato/a per e-mail</b> degli eventi che avvengono sul tuo conto.<br/>Tuo indizzo mail sarà cifrato e solo il prestatore del servizio lo potrà vedere.\",\n \"EMAIL_LABEL\" : \"Tuo indirizzo mail :\",\n \"EMAIL_HELP\": \"cristiana.leonardi@dominio.com\",\n \"FREQUENCY_LABEL\": \"Frequenza delle notifiche :\",\n \"FREQUENCY_DAILY\": \"Quotidiano\",\n \"FREQUENCY_WEEKLY\": \"Settimanale\",\n \"PROVIDER\": \"Prestatore del servizio :\"\n }\n },\n \"DOCUMENT\": {\n \"HASH\": \"Hash: \",\n \"LOOKUP\": {\n \"TITLE\": \"Ricerca di documenti\",\n \"BTN_ACTIONS\": \"Azioni\",\n \"SEARCH_HELP\": \"issuer:AAA*, time:1508406169\",\n \"LAST_DOCUMENTS\": \"Ultimi documenti\",\n \"SHOW_QUERY\": \"Visualizzare la richiesta\",\n \"HIDE_QUERY\": \"Nacondere la richiesta\",\n \"HEADER_TIME\": \"Data/Ora\",\n \"HEADER_ISSUER\": \"Emittente\",\n \"HEADER_RECIPIENT\": \"Destinatario\",\n \"READ\": \"Letto\",\n \"BTN_REMOVE\": \"Eliminare questo documento\",\n \"POPOVER_ACTIONS\": {\n \"TITLE\": \"Azioni\",\n \"REMOVE_ALL\": \"Eliminare questi documenti...\"\n }\n },\n \"INFO\": {\n \"REMOVED\": \"Documento eliminato\"\n },\n \"CONFIRM\": {\n \"REMOVE\": \"Sei sicuro/a di voler <b>eliminare questo documento</b> ?\",\n \"REMOVE_ALL\": \"Si sicuro/a di voler <b>eliminare questi documenti</b> ?\"\n },\n \"ERROR\": {\n \"LOAD_DOCUMENTS_FAILED\": \"Errore nella ricerca dei documenti\",\n \"REMOVE_FAILED\": \"Errore nell'eliminazione del documento\",\n \"REMOVE_ALL_FAILED\": \"Errore nell'eliminazione dei documenti\"\n }\n },\n \"ES_SETTINGS\": {\n \"PLUGIN_NAME\": \"Cesium+\",\n \"PLUGIN_NAME_HELP\": \"Profili di utenti, notifiche, messaggi privati\",\n \"ENABLE_TOGGLE\": \"Abilitare l'estensione ?\",\n \"ENABLE_MESSAGE_TOGGLE\": \"Abilitare i messaggi? privati\",\n \"ENABLE_SETTINGS_TOGGLE\": \"Abilitare stoccaggio su dispositivi esterni per le impostazioni?\",\n \"PEER\": \"Indirizzo di data peers\",\n \"POPUP_PEER\": {\n \"TITLE\" : \"Data peer\",\n \"HELP\" : \"Definire l'indirizzo da usare per il peer:\",\n \"PEER_HELP\": \"server.domain.com:port\"\n },\n \"NOTIFICATIONS\": {\n \"DIVIDER\": \"Notifiche\",\n \"HELP_TEXT\": \"Scegliere le notifiche che accetta ricevere:\",\n \"ENABLE_TX_SENT\": \"Notificarmi di <b>pagamenti inviati</b> con successo?\",\n \"ENABLE_TX_RECEIVED\": \"Notificarmi di <b>pagamenti in entrata</b>?\",\n \"ENABLE_CERT_SENT\": \"Notificarmi delle <b>certificazioni inviate</b>?\",\n \"ENABLE_CERT_RECEIVED\": \"Notificarmi di <b>certificazioni ricevute</b>?\"\n },\n \"CONFIRM\": {\n \"ASK_ENABLE_TITLE\": \"Nuove funzionalità\",\n \"ASK_ENABLE\": \"Sono disponibili nuove funzionalità: <ul><li>&nbsp;&nbsp;<b><i class=\\\"icon ion-person\\\"></i>Profili di utenti</b>;<li>&nbsp;&nbsp;<b><i class=\\\"icon ion-android-notifications\\\"></i> Notifications</b>;<li>&nbsp;&nbsp;<b><i class=\\\"icon ion-email\\\"></i> Messaggi privati/b>.</ul><br/>Sono state <b>disabilitate</b> nelle sue impostazioni.<br/><br/><b>Desidera abilitare</b> queste funzionalità?\"\n }\n },\n \"ES_WALLET\": {\n \"ERROR\": {\n \"RECIPIENT_IS_MANDATORY\": \"Un destinatario è necessario per il criptaggio.\"\n }\n },\n \"EVENT\": {\n \"NODE_STARTED\": \"Suo nodo ES API <b>{{params[0]}}</b> è UP\",\n \"NODE_BMA_DOWN\": \"Nodo<b>{{params[0]}}:{{params[1]}}</b> (utilizzato dal suo ES API) è <b>indisponibile</b>.\",\n \"NODE_BMA_UP\": \"Nodo <b>{{params[0]}}:{{params[1]}}</b> è di nuovo attivo.\",\n \"MEMBER_JOIN\": \"E diventato <b>membro/a</b> della WoT della moneta <b>{{params[0]}}</b>!\",\n \"MEMBER_LEAVE\": \"Non <b>è più membro/a</b> della WoT della moneta <b>{{params[0]}}</b>!\",\n \"MEMBER_EXCLUDE\": \"Non è <b>più membro/a</b> della WoT della moneta<b>{{params[0]}}</b>, a causa di certificazioni non rinnovate o soglia di certificazioni non raggiunta.\",\n \"MEMBER_REVOKE\": \"Il suo conto è stato revocato. Da ora in poi non farà più parte della WoT. <b>{{params[0]}}</b>.\",\n \"MEMBER_ACTIVE\": \"La sua presenza nella WoT <b>{{params[0]}}</b> è stata <b>rinnovata correttamente</b>.\",\n \"TX_SENT\": \"Il suo pagamento <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\" ><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> è stato eseguito.\",\n \"TX_SENT_MULTI\": \"Il suo pagamento <b>{{params[1]}}</b> è stato eseguito.\",\n \"TX_RECEIVED\": \"Ha ricevuto un pagamento da <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span>.\",\n \"TX_RECEIVED_MULTI\": \"Ha ricevuto un pagamento da <b>{{params[1]}}</b>.\",\n \"CERT_SENT\": \"Sua <b>certificazione</b> a favore di <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\" ><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> è stata eseguita.\",\n \"CERT_RECEIVED\": \"Ha ricevuto <b>una certificazione</b> da parte di <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span>.\",\n \"PAGE\": {\n \"NEW_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> ha scritto un commento sul suo riferimento: <b>{{params[2]}}</b>\",\n \"UPDATE_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> ha modificato il suo commento sul suo riferimento: <b>{{params[2]}}</b>\",\n \"NEW_REPLY_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> ha risposto al suo commento sul riferimento: <b>{{params[2]}}</b>\",\n \"UPDATE_REPLY_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> ha modificato sua risposta sul suo commento a proposito del riferimento: <b>{{params[2]}}</b>\"\n }\n },\n \"CONFIRM\": {\n \"ES_USE_FALLBACK_NODE\": \"Nodo<b>{{old}}</b> irraggiungibile o indirizzo sbagliato.<br/><br/>Vuoi utilizzare temporaneamente il nodo di dati <b>{{new}}</b> ?\"\n },\n \"ERROR\": {\n \"ES_CONNECTION_ERROR\": \"Nodo di dati<b>{{server}}</b> irraggiungibile o indirizzo sbagliato.<br/><br/>Cesium continuerà a funzionare <b>senza l'estensione Cesium+</b> (profili utenti, messaggi privati, mappe e grafici)<br/><br/>Verifica tua connessione o cambia nodo <a class=\\\"positive\\\" ng-click=\\\"doQuickFix('settings')\\\">impostazioni dell'estensione</a>.\",\n \"ES_MAX_UPLOAD_BODY_SIZE\": \"Il volume di data da inviare supera il limite imposto dal server.<br/><br/>Suggeriamo di riprovare dopo aver eliminato delle foto, per esempio.\"\n }\n }\n);\n\n$translateProvider.translations(\"nl-NL\", {\n \"COMMON\": {\n \"CATEGORY\": \"Categorie\",\n \"CATEGORIES\": \"Categorieën\",\n \"CATEGORY_SEARCH_HELP\": \"Zoeken\",\n \"LAST_MODIFICATION_DATE\": \"Vernieuwd op \",\n \"SUBMIT_BY\": \"Ingediend door\",\n \"BTN_PUBLISH\": \"Publiceren\",\n \"BTN_PICTURE_DELETE\": \"Wissen\",\n \"BTN_PICTURE_FAVORISE\": \"Default\",\n \"BTN_ADD_PICTURE\": \"Afbeelding toevoegen\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Notificaties\",\n \"MARK_ALL_AS_READ\": \"Markeer alles als gelezen\",\n \"NO_RESULT\": \"Geen berichten\",\n \"SHOW_ALL\": \"Toon alles\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Kan berichten niet laden\"\n }\n },\n \"MENU\": {\n \"REGISTRY\": \"Pagina's\",\n \"USER_PROFILE\": \"Mijn profiel\",\n \"MESSAGES\": \"Berichten\"\n },\n \"ACCOUNT\": {\n \"NEW\": {\n \"ORGANIZATION_ACCOUNT\": \"Ondernemingsrekening\",\n \"ORGANIZATION_ACCOUNT_HELP\": \"Als je een onderneming, vereniging etc. vertegenwoordigt.<br/>Deze rekening zal geen dividend créeren.\"\n },\n \"EVENT\": {\n \"MEMBER_WITHOUT_PROFILE\": \"Vul <a ui-sref=\\\"app.edit_profile\\\"je gebruikersprofiel</a> in om sneller een certificering te verkrijgen. Leden zullen een verfifieerbare identiteit eerder vertrouwen.\"\n }\n },\n \"COMMENTS\": {\n \"DIVIDER\": \"Commentaren\",\n \"SHOW_MORE_COMMENTS\": \"Toon eerdere commentaren\",\n \"COMMENT_HELP\": \"Jouw commentaar, vraag...\",\n \"COMMENT_HELP_REPLY_TO\": \"Jouw antwoord...\",\n \"BTN_SEND\": \"Verzenden\",\n \"POPOVER_SHARE_TITLE\": \"Bericht #{{number}}\",\n \"REPLY\": \"Antwoord\",\n \"REPLY_TO\": \"Antwoorden op:\",\n \"REPLY_TO_LINK\": \"In antwoord op \",\n \"REPLY_TO_DELETED_COMMENT\": \"In antwoord op een gewist bericht\",\n \"REPLY_COUNT\": \"{{replyCount}} antwoorden\",\n \"DELETED_COMMENT\": \"Bericht gewist\"\n },\n \"MESSAGE\": {\n \"REPLY_TITLE_PREFIX\": \"Re: \",\n \"FORWARD_TITLE_PREFIX\": \"Fw: \",\n \"BTN_REPLY\": \"Antwoord\",\n \"BTN_COMPOSE\": \"Nieuw bericht\",\n \"BTN_WRITE\": \"Schrijven\",\n \"NO_MESSAGE_INBOX\": \"Geen bericht ontvangen\",\n \"NO_MESSAGE_OUTBOX\": \"Geen bericht verzonden\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Berichten\",\n \"MESSAGE_RECEIVED\": \"Je hebt een <b>bericht ontvangen</b><br/>van\"\n },\n \"LIST\": {\n \"INBOX\": \"Inbox\",\n \"OUTBOX\": \"Verzonden\",\n \"TITLE\": \"Privé\",\n \"POPOVER_ACTIONS\": {\n \"TITLE\": \"Opties\",\n \"DELETE_ALL\": \"Alle berichten wissen\"\n }\n },\n \"COMPOSE\": {\n \"TITLE\": \"Nieuw bericht\",\n \"TITLE_REPLY\": \"Antwoord\",\n \"SUB_TITLE\": \"Nieuw bericht\",\n \"TO\": \"Aan\",\n \"OBJECT\": \"Onderwerp\",\n \"OBJECT_HELP\": \"Onderwerp\",\n \"ENCRYPTED_HELP\": \"Please note this message will by encrypt before sending zodat alleen de ontvanger het kan lezen en zeker kan zijn dat jij de auteur bent.\",\n \"MESSAGE\": \"Bericht\",\n \"MESSAGE_HELP\": \"Berichtinhoud\",\n \"CONTENT_CONFIRMATION\": \"Geen berichtinhoud.<br/><br/>Weet je zeker dat je dit bericht wil verzenden?\"\n },\n \"VIEW\": {\n \"TITLE\": \"Bericht\",\n \"SENDER\": \"Verzonden door\",\n \"RECIPIENT\": \"Verzonden aan\",\n \"NO_CONTENT\": \"Leeg bericht\"\n },\n \"CONFIRM\": {\n \"REMOVE\": \"Weet je zeker dat je <b>dit bericht wil wissen</b>?<br/><br/>Dit kan niet ongedaan gemaakt worden.\",\n \"REMOVE_ALL\": \"Weet je zeker dat je <b>alle berichten wil wissen</b>?<br/><br/>Dit kan niet ongedaan gemaakt worden.\",\n \"MARK_ALL_AS_READ\": \"Weet je zeker dat je <b>alle berichten als gelezen wil markeren</b>?\"\n },\n \"INFO\": {\n \"MESSAGE_REMOVED\": \"Bericht succesvol gewist\",\n \"All_MESSAGE_REMOVED\": \"Berichten succesvol gewist\",\n \"MESSAGE_SENT\": \"Bericht verzonden\"\n },\n \"ERROR\": {\n \"SEND_MSG_FAILED\": \"Fout tijdens verzending.\",\n \"LOAD_MESSAGES_FAILED\": \"Kan berichten niet laden.\",\n \"LOAD_MESSAGE_FAILED\": \"Kan bericht niet laden.\",\n \"MESSAGE_NOT_READABLE\": \"Kan bericht niet lezen.\",\n \"USER_NOT_RECIPIENT\": \"Je bent niet de geadresseerde van dit bericht: het kan niet gelezen worden.\",\n \"NOT_AUTHENTICATED_MESSAGE\": \"De authenticiteit van het bericht is onduidelijk of de inhoud is gecorrumpeerd.\",\n \"REMOVE_MESSAGE_FAILED\": \"Kan bericht niet wissen.\",\n \"MESSAGE_CONTENT_TOO_LONG\": \"Waarde te lang (max {{maxLength}} characters).\",\n \"MARK_AS_READ_FAILED\": \"Kan bericht niet als gelezen markeren.\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Kan niet alle berichtnotificaties laden.\",\n \"REMOVE_All_MESSAGES_FAILED\": \"Kan niet alle berichten wissen.\",\n \"MARK_ALL_AS_READ_FAILED\": \"Kan berichten niet als gelezen markeren.\"\n }\n },\n \"REGISTRY\": {\n \"CATEGORY\": \"Hoofdactiviteit\",\n \"GENERAL_DIVIDER\": \"Basisinformatie\",\n \"LOCATION_DIVIDER\": \"Adres\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Sociale media en website\",\n \"TECHNICAL_DIVIDER\": \"Technische informatie\",\n \"BTN_NEW\": \"Toevoegen\",\n \"SEARCH\": {\n \"TITLE\": \"Bedrijfsregister\",\n \"TITLE_SMALL_DEVICE\": \"Bedrijfsregister\",\n \"SEARCH_HELP\": \"Wie, Wat: kapper, Lili's restaurant, ...\",\n \"BTN_ADD\": \"Nieuw\",\n \"BTN_OPTIONS\": \"Geavanceerd zoeken\",\n \"TYPE\": \"Soort organisatie\",\n \"LOCATION\": \"Locatie\",\n \"LOCATION_HELP\": \"Plaats\",\n \"LAST_RECORDS\": \"Nieuwste referenties:\",\n \"RESULTS\": \"Resultaten:\"\n },\n \"VIEW\": {\n \"TITLE\": \"Register\",\n \"CATEGORY\": \"Hoofdactiviteit:\",\n \"LOCATION\": \"Adres:\",\n \"MENU_TITLE\": \"Opties\",\n \"POPOVER_SHARE_TITLE\": \"{{title}}\",\n \"REMOVE_CONFIRMATION\" : \"Weet je zeker dat je deze referentie wil verwijderen?<br/><br/>Dit kan niet ongedaan worden gemaakt.\"\n },\n \"TYPE\": {\n \"TITLE\": \"Nieuwe referentie\",\n \"SELECT_TYPE\": \"Soort organizatie:\",\n \"ENUM\": {\n \"SHOP\": \"Locale winkel\",\n \"COMPANY\": \"Onderneming\",\n \"ASSOCIATION\": \"Stichting\",\n \"INSTITUTION\": \"Instituut\"\n }\n },\n \"EDIT\": {\n \"TITLE\": \"Bewerk\",\n \"TITLE_NEW\": \"Nieuwe referentie\",\n \"RECORD_TYPE\":\"Soort organizatie\",\n \"RECORD_TITLE\": \"Naam\",\n \"RECORD_TITLE_HELP\": \"Naam\",\n \"RECORD_DESCRIPTION\": \"Beschrijving\",\n \"RECORD_DESCRIPTION_HELP\": \"Omschrijf activiteit\",\n \"RECORD_ADDRESS\": \"Straat\",\n \"RECORD_ADDRESS_HELP\": \"Straat, gebouw...\",\n \"RECORD_CITY\": \"Plaats\",\n \"RECORD_CITY_HELP\": \"Plaats\",\n \"RECORD_SOCIAL_NETWORKS\": \"Sociale media en website\",\n \"RECORD_PUBKEY\": \"Publieke sleutel\",\n \"RECORD_PUBKEY_HELP\": \"Publieke sleutel om betalingen te ontvangen\"\n },\n \"ERROR\": {\n \"LOAD_CATEGORY_FAILED\": \"Laden hoofdactiveiten mislukt\",\n \"LOAD_RECORD_FAILED\": \"Laden datasheet mislukt\",\n \"LOOKUP_RECORDS_FAILED\": \"Opzoeken datasheets is mislukt.\",\n \"REMOVE_RECORD_FAILED\": \"Verwijderen datasheet mislukt\",\n \"SAVE_RECORD_FAILED\": \"Opslaan datasheet mislukt\",\n \"RECORD_NOT_EXISTS\": \"Datasheet niet gevonden\"\n },\n \"INFO\": {\n \"RECORD_REMOVED\" : \"Datasheet succesvol verwijderd\"\n }\n },\n \"PROFILE\": {\n \"UID\": \"Pseudoniem\",\n \"TITLE\": \"Naam\",\n \"TITLE_HELP\": \"Naam\",\n \"DESCRIPTION\": \"Over mij\",\n \"DESCRIPTION_HELP\": \"Over mij...\",\n \"ADDRESS\": \"Adres\",\n \"ADDRESS_HELP\": \"Adres (optioneel)\",\n \"CITY\": \"Plaats\",\n \"CITY_HELP\": \"Plaats (optioneel)\",\n \"SOCIAL_HELP\": \"http://...\",\n \"GENERAL_DIVIDER\": \"Algemene informatie\",\n \"LOCATION_DIVIDER\": \"Localisatie\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Sociale media en website\",\n \"TECHNICAL_DIVIDER\": \"Technische informatie\",\n \"ERROR\": {\n \"LOAD_PROFILE_FAILED\": \"Kon gebruikersprofiel niet laden.\",\n \"SAVE_PROFILE_FAILED\": \"Opslaan profiel mislukt\",\n \"INVALID_SOCIAL_NETWORK_FORMAT\": \"Ongeldig formaat: vul een geldig internetadres in.<br/><br/>Voorbeelden:<ul><li>- Een Facebookpagina (https://www.facebook.com/user)</li><li>- Een webpagina (http://www.domain.com)</li><li>- Een emailadres (joe@dalton.com)</li></ul>\",\n \"IMAGE_RESIZE_FAILED\": \"Fout tijdens afbeelding schalen\"\n },\n \"INFO\": {\n \"PROFILE_SAVED\": \"Profiel opgeslagen\"\n },\n \"HELP\": {\n \"WARNING_PUBLIC_DATA\": \"Let op, de informatie die hier is vastgelegd <b>is publiek</b>: zichtbaar ook voor <b>niet ingelogde gebruikers</b>.\"\n }\n },\n \"ES_SETTINGS\": {\n \"PLUGIN_NAME\": \"Cesium+\",\n \"ENABLE_TOGGLE\": \"Uitbreiding inschakelen?\",\n \"ENABLE_MESSAGE_TOGGLE\": \"Berichten inschakelen?\",\n \"ENABLE_SETTINGS_TOGGLE\": \"Globale opslag voor instellingen inschakelen?\",\n \"PEER\": \"Adres dataknooppunt\",\n \"POPUP_PEER\": {\n \"TITLE\" : \"Dataknoop\",\n \"HELP\" : \"Stel het te gebruiken adres in:\",\n \"PEER_HELP\": \"server.domein.com:poort\"\n },\n \"NOTIFICATIONS\": {\n \"DIVIDER\": \"Notificaties\",\n \"HELP_TEXT\": \"Schakel het type notificatie dat je wil ontvangen in:\",\n \"ENABLE_TX_SENT\": \"Bericht bij validatie van <b>verzonden betalingen</b>?\",\n \"ENABLE_TX_RECEIVED\": \"Bericht bij validatie van <b>ontvangen betalingen</b>?\",\n \"ENABLE_CERT_SENT\": \"Bericht bij validatie van <b>verzonden certificaties</b>?\",\n \"ENABLE_CERT_RECEIVED\": \"Bericht bij validatie van <b>ontvangen certificaties</b>?\"\n },\n \"CONFIRM\": {\n \"ASK_ENABLE_TITLE\": \"Optionele functies\",\n \"ASK_ENABLE\": \"Cesium+ is <b>uitgeschakeld</b> waardoor deze functies niet beschikbaar zijn: <ul><li>&nbsp;&nbsp;<b><i class=\\\"icon ion-person\\\"></i> Gebruikersprofielen</b>;<li>&nbsp;&nbsp;<b><i class=\\\"icon ion-android-notifcaitions\\\"></i> Notificaties</b>;<li>&nbsp;&nbsp;<b><i class=\\\"icon ion-email\\\"></i> Privéberichten</b>.</ul><br/><br/>Wil je deze functies <b>inschakelen</b>?\"\n }\n },\n \"EVENT\": {\n \"NODE_STARTED\": \"Je knoop ES API <b>{{params[0]}}</b> is UP\",\n \"NODE_BMA_DOWN\": \"Knooppunt <b>{{params[0]}}:{{params[1]}}</b> (gebruikt door je ES API) is <b>onbereikbaar</b>.\",\n \"NODE_BMA_UP\": \"Knooppunt <b>{{p0}}:{{params[1]}}</b> is weer bereikbaar.\",\n \"MEMBER_JOIN\": \"Je bent nu <b>lid</b> van valuta <b>{{params[0]}}</b>!\",\n \"MEMBER_LEAVE\": \"Je bent <b>geen lid meer</b> van valuta <b>{{params[0]}}</b>!\",\n \"MEMBER_ACTIVE\": \"Je lidmaatschap bij <b>{{params[0]}}</b> is met <b>succes verlengd</b>.\",\n \"TX_SENT\": \"Je <b>betaling</b> aan <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\" ><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> is uitgevoerd.\",\n \"TX_SENT_MULTI\": \"Je <b>betaling</b> aan <b>{{params[1]}}</b> is uitgevoerd.\",\n \"TX_RECEIVED\": \"Je hebt een <b>betaling ontvangen</b> van <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span>.\",\n \"TX_RECEIVED_MULTI\": \"Je hebt een <b>betaling ontvangen</b> van <b>{{params[1]}}</b>.\",\n \"CERT_SENT\": \"Je <b>certificatie</b> van <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\" ><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> is uitgevoerd.\",\n \"CERT_RECEIVED\": \"Je hebt een <b>certificatie ontvangen</b> van <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span>.\",\n \"PAGE\": {\n \"NEW_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> heeft gereageerd op jouw referentie: <b>{{params[2]}}</b>\",\n \"UPDATE_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> heeft zijn/aar reactie op jouw referentie bewerkt: <b>{{params[2]}}</b>\",\n \"NEW_REPLY_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> hheeft gereageerd op jouw commentaar op referentie: <b>{{params[2]}}</b>\",\n \"UPDATE_REPLY_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i>&thinsp;{{name||uid||params[1]}}</span> heeft zijn/haar reactie op jouw commentaar bewerkt, op referentie: <b>{{params[2]}}</b>\"\n }\n },\n \"CONFIRM\": {\n \"ES_USE_FALLBACK_NODE\": \"Knooppunt <b>{{old}}</b> onbereikbaar of ongeldig adres.<br/><br/>Tijdelijk knooppunt <b>{{new}}</b> gebruiken?\"\n },\n \"ERROR\": {\n \"ES_CONNECTION_ERROR\": \"Knooppunt <b>{{server}}</b> onbereikbaar of ongeldig adres.<br/><br/>Cesium zal verder weken, <b>zonder de Cesium+ uitbreiding</b> (gebruikersprofielens, privéberichten, kaarten en grafieken).<br/><br/>Controleer je internetverbinding, of verander je knooppunt in <a class=\\\"positive\\\" ng-click=\\\"doQuickFix('settings')\\\">instellingen</a>.\",\n \"ES_MAX_UPLOAD_BODY_SIZE\": \"De hoveelheid te verzenden gegevens is overschrijdt de serverlimiet.<br/><br/>Probeer het nogmaals na, bijvoorbeeld, het wissen foto's.\"\n }\n}\n);\n\n$translateProvider.translations(\"en-GB\", {\n \"NETWORK\": {\n \"VIEW\": {\n \"BTN_GRAPH\": \"Statistics\"\n }\n },\n \"GRAPH\": {\n \"COMMON\": {\n \"LINEAR_SCALE\" : \"Linear scale\",\n \"LOGARITHMIC_SCALE\" : \"Logarithmic scale\",\n \"BTN_SHOW_STATS\": \"See statistics\",\n \"BTN_SHOW_DETAILED_STATS\": \"Detailed statistics\",\n \"RANGE_DURATION_DIVIDER\": \"Step unit:\",\n \"RANGE_DURATION\": {\n \"HOUR\": \"Group by <b>hour</b>\",\n \"DAY\": \"Group by <b>day</b>\",\n \"MONTH\": \"Group by <b>month</b>\"\n }\n },\n \"ACCOUNT\": {\n \"TITLE\": \"Statistics\",\n \"BTN_SHOW_STATS\": \"View account Statistics\",\n \"BALANCE_DIVIDER\": \"Account status\",\n \"BALANCE_TITLE\": \"Evolution of the account {{pubkey|formatPubkey}}\",\n \"TX_RECEIVED_LABEL\": \"Receipts\",\n \"TX_SENT_LABEL\": \"Spending\",\n \"UD_LABEL\": \"UD\",\n \"BALANCE_LABEL\": \"Balance\",\n \"INPUT_CHART_TITLE\": \"Sum of incoming flows, per transmitter:\",\n \"OUTPUT_CHART_TITLE\": \"Sum of outgoing flows, per recipient:\"\n },\n \"BLOCKCHAIN\": {\n \"TITLE\": \"Statistics\",\n \"BLOCKS_ISSUERS_DIVIDER\": \"Written blocks by members\",\n \"BLOCKS_ISSUERS_HELP\": \"<b>{{issuerCount|formatInteger}} members</b> calculated <b>{{blockCount|formatInteger}} blocks</b>\",\n \"BLOCKS_ISSUERS_TITLE\": \"Number of blocks calculated per member\",\n \"BLOCKS_ISSUERS_LABEL\": \"Number of blocks\",\n \"TX_DIVIDER\": \"Analysis of transactions\",\n \"TX_AMOUNT_TITLE\": \"Transaction volume\",\n \"TX_AMOUNT_PUBKEY_TITLE\": \"Volume of transactions calculated by {{issuer | formatPubkey}}\",\n \"TX_AMOUNT_LABEL\": \"Exchange volume\",\n \"TX_COUNT_TITLE\": \"Number of written transactions\",\n \"TX_COUNT_LABEL\": \"Number of transactions\",\n \"TX_AVG_BY_BLOCK\": \"Average per block\"\n },\n \"CURRENCY\": {\n \"MONETARY_MASS_TITLE\": \"Evolution of the monetary mass\",\n \"MONETARY_MASS_LABEL\": \"Monetary mass\",\n \"MONETARY_MASS_SHARE_LABEL\": \"Average per member\",\n \"UD_TITLE\": \"Evolution of the universal dividend\",\n \"MEMBERS_COUNT_TITLE\": \"Evolution of the number of members\",\n \"MEMBERS_COUNT_LABEL\": \"Number of members\"\n },\n \"PEER\": {\n \"VIEW\": {\n \"BLOCK_COUNT_LABEL\": \"Computed blocks count\",\n \"BLOCK_COUNT\": \"{{count}} blocks\",\n \"NO_BLOCK\": \"No block\"\n }\n },\n \"DOC_STATS\": {\n \"TITLE\": \"Data storage statistics (Cesium+)\",\n \"USER\": {\n \"TITLE\": \"Number of documents linked to an account\",\n \"USER_PROFILE\": \"User profiles\",\n \"USER_SETTINGS\": \"Saved settings\"\n },\n \"USER_DELTA\": {\n \"TITLE\": \"Delta / Number of documents linked to an account\",\n \"USER_PROFILE\": \"User profiles\",\n \"USER_SETTINGS\": \"Saved settings\"\n },\n \"MESSAGE\": {\n \"TITLE\": \"Number of documents related to the communication\",\n \"MESSAGE_INBOX\": \"Messages in inbox\",\n \"MESSAGE_OUTBOX\": \"Messages in outbox\",\n \"INVITATION_CERTIFICATION\": \"Invitations to certify\"\n },\n \"SOCIAL\": {\n \"TITLE\": \"Number of page or group\",\n \"PAGE_COMMENT\": \"Comments\",\n \"PAGE_RECORD\": \"Pages\",\n \"GROUP_RECORD\": \"Groups\"\n },\n \"OTHER\": {\n \"TITLE\": \"Other documents\",\n \"HISTORY_DELETE\": \"Deletion of documents\"\n }\n }\n }\n}\n);\n\n$translateProvider.translations(\"en\", {\n \"NETWORK\": {\n \"VIEW\": {\n \"BTN_GRAPH\": \"Statistics\"\n }\n },\n \"GRAPH\": {\n \"COMMON\": {\n \"LINEAR_SCALE\" : \"Linear scale\",\n \"LOGARITHMIC_SCALE\" : \"Logarithmic scale\",\n \"BTN_SHOW_STATS\": \"See statistics\",\n \"BTN_SHOW_DETAILED_STATS\": \"Detailed statistics\",\n \"RANGE_DURATION_DIVIDER\": \"Step unit:\",\n \"RANGE_DURATION\": {\n \"HOUR\": \"Group by <b>hour</b>\",\n \"DAY\": \"Group by <b>day</b>\",\n \"MONTH\": \"Group by <b>month</b>\"\n }\n },\n \"ACCOUNT\": {\n \"TITLE\": \"Statistics\",\n \"BTN_SHOW_STATS\": \"View account Statistics\",\n \"BALANCE_DIVIDER\": \"Account status\",\n \"BALANCE_TITLE\": \"Evolution of the account {{pubkey|formatPubkey}}\",\n \"TX_RECEIVED_LABEL\": \"Receipts\",\n \"TX_SENT_LABEL\": \"Spending\",\n \"UD_LABEL\": \"UD\",\n \"BALANCE_LABEL\": \"Balance\",\n \"INPUT_CHART_TITLE\": \"Sum of incoming flows, per transmitter:\",\n \"OUTPUT_CHART_TITLE\": \"Sum of outgoing flows, per recipient:\"\n },\n \"BLOCKCHAIN\": {\n \"TITLE\": \"Statistics\",\n \"BLOCKS_ISSUERS_DIVIDER\": \"Written blocks by members\",\n \"BLOCKS_ISSUERS_HELP\": \"<b>{{issuerCount|formatInteger}} members</b> calculated <b>{{blockCount|formatInteger}} blocks</b>\",\n \"BLOCKS_ISSUERS_TITLE\": \"Number of blocks calculated per member\",\n \"BLOCKS_ISSUERS_LABEL\": \"Number of blocks\",\n \"TX_DIVIDER\": \"Analysis of transactions\",\n \"TX_AMOUNT_TITLE\": \"Transaction volume\",\n \"TX_AMOUNT_PUBKEY_TITLE\": \"Volume of transactions calculated by {{issuer | formatPubkey}}\",\n \"TX_AMOUNT_LABEL\": \"Exchange volume\",\n \"TX_COUNT_TITLE\": \"Number of written transactions\",\n \"TX_COUNT_LABEL\": \"Number of transactions\",\n \"TX_AVG_BY_BLOCK\": \"Average per block\"\n },\n \"CURRENCY\": {\n \"MONETARY_MASS_TITLE\": \"Evolution of the monetary mass\",\n \"MONETARY_MASS_LABEL\": \"Monetary mass\",\n \"MONETARY_MASS_SHARE_LABEL\": \"Average per member\",\n \"UD_TITLE\": \"Evolution of the universal dividend\",\n \"MEMBERS_COUNT_TITLE\": \"Evolution of the number of members\",\n \"MEMBERS_COUNT_LABEL\": \"Number of members\"\n },\n \"PEER\": {\n \"VIEW\": {\n \"BLOCK_COUNT_LABEL\": \"Computed blocks count\",\n \"BLOCK_COUNT\": \"{{count}} blocks\",\n \"NO_BLOCK\": \"No block\"\n }\n },\n \"DOC_STATS\": {\n \"TITLE\": \"Data storage statistics (Cesium+)\",\n \"USER\": {\n \"TITLE\": \"Number of documents linked to an account\",\n \"USER_PROFILE\": \"User profiles\",\n \"USER_SETTINGS\": \"Saved settings\"\n },\n \"USER_DELTA\": {\n \"TITLE\": \"Delta / Number of documents linked to an account\",\n \"USER_PROFILE\": \"User profiles\",\n \"USER_SETTINGS\": \"Saved settings\"\n },\n \"MESSAGE\": {\n \"TITLE\": \"Number of documents related to the communication\",\n \"MESSAGE_INBOX\": \"Messages in inbox\",\n \"MESSAGE_OUTBOX\": \"Messages in outbox\",\n \"INVITATION_CERTIFICATION\": \"Invitations to certify\"\n },\n \"SOCIAL\": {\n \"TITLE\": \"Number of page or group\",\n \"PAGE_COMMENT\": \"Comments\",\n \"PAGE_RECORD\": \"Pages\",\n \"GROUP_RECORD\": \"Groups\"\n },\n \"OTHER\": {\n \"TITLE\": \"Other documents\",\n \"HISTORY_DELETE\": \"Deletion of documents\"\n }\n }\n }\n}\n);\n\n$translateProvider.translations(\"eo-EO\", {\n \"NETWORK\": {\n \"VIEW\": {\n \"BTN_GRAPH\": \"Statistikoj\"\n }\n },\n \"GRAPH\": {\n \"COMMON\": {\n \"LINEAR_SCALE\" : \"Lineara skalo\",\n \"LOGARITHMIC_SCALE\" : \"Logaritma skalo\",\n \"BTN_SHOW_STATS\": \"Vidi la statistikojn\",\n \"BTN_SHOW_DETAILED_STATS\": \"Detalaj statistikoj\",\n \"RANGE_DURATION_DIVIDER\": \"Tempo-unuo:\",\n \"RANGE_DURATION\": {\n \"HOUR\": \"Horo\",\n \"DAY\": \"Tago\",\n \"MONTH\": \"Monato\"\n }\n },\n \"ACCOUNT\": {\n \"TITLE\": \"Statistikoj\",\n \"BTN_SHOW_STATS\": \"Vidi la statistikojn de la konto\",\n \"BALANCE_DIVIDER\": \"Stato de la konto\",\n \"BALANCE_TITLE\": \"Evoluo de la konto {{pubkey|formatPubkey}}\",\n \"TX_RECEIVED_LABEL\": \"Enspezoj\",\n \"TX_SENT_LABEL\": \"Elspezoj\",\n \"TX_ACCUMULATION_LABEL\": \"Bilanco de la spezoj\",\n \"UD_LABEL\": \"UD\",\n \"UD_ACCUMULATION_LABEL\": \"Bilanco de la UD\",\n \"BALANCE_LABEL\": \"Saldo\",\n \"WOT_DIVIDER\": \"Reto de fido\",\n \"CERTIFICATION_TITLE\": \"Nombro de atestaĵoj - {{pubkey|formatPubkey}}\",\n \"RECEIVED_CERT_LABEL\": \"Tuto pri la ricevitaj\",\n \"RECEIVED_CERT_DELTA_LABEL\": \"Vario pri la ricevitaj\",\n \"GIVEN_CERT_LABEL\": \"Tuto pri la senditaj\",\n \"GIVEN_CERT_DELTA_LABEL\": \"Vario pri la senditaj\",\n \"INPUT_CHART_TITLE\": \"Sumo de la enirantaj fluoj, por ĉiu sendinto:\",\n \"OUTPUT_CHART_TITLE\": \"Sumo de la elirantaj fluoj, por ĉiu ricevinto:\"\n },\n \"BLOCKCHAIN\": {\n \"TITLE\": \"Statistikoj\",\n \"BLOCKS_ISSUERS_DIVIDER\": \"Analizo de la kalkul-distribuo\",\n \"BLOCKS_ISSUERS_HELP\": \"<b>{{issuerCount|formatInteger}} membroj</b> kalkulis <b>{{blockCount|formatInteger}} blokojn</b>\",\n \"BLOCKS_ISSUERS_TITLE\": \"Nombro de blokoj kalkulitaj por membro\",\n \"BLOCKS_ISSUERS_LABEL\": \"Nombro de blokoj\",\n \"TX_DIVIDER\": \"Analizo de la spezoj\",\n \"TX_AMOUNT_TITLE\": \"Kvanto de la spezoj\",\n \"TX_AMOUNT_PUBKEY_TITLE\": \"Kvanto de spezoj kalkulitaj de {{issuer | formatPubkey}}\",\n \"TX_AMOUNT_LABEL\": \"Kvanto interŝanĝita\",\n \"TX_COUNT_TITLE\": \"Nombro de spezoj skribitaj\",\n \"TX_COUNT_LABEL\": \"Nombro de spezoj\",\n \"TX_AVG_BY_BLOCK\": \"Meza nombro de spezoj / bloko\"\n\n },\n \"CURRENCY\": {\n \"MONETARY_MASS_TITLE\": \"Evoluo de la mona maso\",\n \"MONETARY_MASS_LABEL\": \"Mona maso\",\n \"MONETARY_MASS_SHARE_LABEL\": \"Mezumo por membro\",\n \"UD_TITLE\": \"Evoluo de la universala dividendo\",\n \"MEMBERS_COUNT_TITLE\": \"Evoluo de la nombro de membroj\",\n \"MEMBERS_COUNT_LABEL\": \"Nombro de membroj\"\n },\n \"PEER\": {\n \"VIEW\": {\n \"BLOCK_COUNT_LABEL\": \"Nombro de blokoj kalkulitaj\",\n \"BLOCK_COUNT\": \"{{count}} blokoj\",\n \"NO_BLOCK\": \"Neniu bloko\"\n }\n },\n \"DOC_STATS\": {\n \"TITLE\": \"Statistikoj pri stokado\",\n \"USER\": {\n \"TITLE\": \"Nombro de dokumentoj ligitaj al konto\",\n \"USER_PROFILE\": \"Uzanto-profiloj\",\n \"USER_SETTINGS\": \"Parametroj konservitaj\"\n },\n \"USER_DELTA\": {\n \"TITLE\": \"Variado de la nombro de dokumentoj ligitaj al konto\",\n \"USER_PROFILE\": \"Uzanto-profiloj\",\n \"USER_SETTINGS\": \"Parametroj konservitaj\"\n },\n \"MESSAGE\": {\n \"TITLE\": \"Nombro de dokumentoj ligitaj al komunikado\",\n \"MESSAGE_INBOX\": \"Mesaĝoj en ricevujo\",\n \"MESSAGE_OUTBOX\": \"Senditaj mesaĝoj konservitaj\",\n \"INVITATION_CERTIFICATION\": \"Invitoj atestotaj\"\n },\n \"SOCIAL\": {\n \"TITLE\": \"Nombro de paĝoj aŭ grupoj\",\n \"PAGE_COMMENT\": \"Komentoj\",\n \"PAGE_RECORD\": \"Paĝoj\",\n \"GROUP_RECORD\": \"Grupoj\"\n },\n \"OTHER\": {\n \"TITLE\": \"Aliaj dokumentoj\",\n \"HISTORY_DELETE\": \"Forigoj de dokumentoj\"\n }\n },\n \"SYNCHRO\": {\n \"TITLE\": \"Statistikoj pri sinkronigoj\",\n \"COUNT\": {\n \"TITLE\": \"Kvanto sinkronigita\",\n \"INSERTS\": \"Enmetoj\",\n \"UPDATES\": \"Ĝisdatigoj\",\n \"DELETES\": \"Forigoj\"\n },\n \"PEER\": {\n \"TITLE\": \"Nodoj informpetitaj\",\n \"ES_USER_API\": \"Nodoj pri datenoj de uzantoj\",\n \"ES_SUBSCRIPTION_API\": \"Nodoj pri retaj servoj\"\n },\n \"PERFORMANCE\": {\n \"TITLE\": \"Efikecoj pri efektiviĝo\",\n \"DURATION\": \"Tempo por efektiviĝo (ms)\"\n }\n }\n }\n}\n);\n\n$translateProvider.translations(\"es-ES\", {\n \"NETWORK\": {\n \"VIEW\": {\n \"BTN_GRAPH\": \"Estadística\"\n }\n },\n \"GRAPH\": {\n \"COMMON\": {\n \"LINEAR_SCALE\" : \"Escala lineal\",\n \"LOGARITHMIC_SCALE\" : \"Escala logarítmica\",\n \"BTN_SHOW_STATS\": \"Ver estadísticas\",\n \"BTN_SHOW_DETAILED_STATS\": \"Estadísticas detalladas\",\n \"RANGE_DURATION_DIVIDER\": \"Unidad de tiempo:\",\n \"RANGE_DURATION\": {\n \"HOUR\": \"Agrupar por <b>horas</b>\",\n \"DAY\": \"Agrupar por <b>días</b>\",\n \"MONTH\": \"Agrupar por <b>meses</b>\"\n }\n },\n \"ACCOUNT\": {\n \"TITLE\": \"Estadísticas\",\n \"BTN_SHOW_STATS\": \"Ver estadísticas de la cuenta\",\n \"BALANCE_DIVIDER\": \"Balance de la cuenta\",\n \"BALANCE_TITLE\": \"Evolución de la cuenta {{pubkey|formatPubkey}}\",\n \"TX_RECEIVED_LABEL\": \"Recibido\",\n \"TX_SENT_LABEL\": \"Gastado\",\n \"UD_LABEL\": \"DU\",\n \"BALANCE_LABEL\": \"Saldo\",\n \"INPUT_CHART_TITLE\": \"Resumen de lo recibido, por emisor\",\n \"OUTPUT_CHART_TITLE\": \"Resumen de lo gastado, por destinatario\"\n },\n \"BLOCKCHAIN\": {\n \"TITLE\": \"Estadística\",\n \"BLOCKS_ISSUERS_DIVIDER\": \"Bloques escritos por cada miembro\",\n \"BLOCKS_ISSUERS_HELP\": \"<b>{{issuerCount|formatInteger}} miembros</b> han calculado <b>{{blockCount|formatInteger}} bloques</b>\",\n \"BLOCKS_ISSUERS_TITLE\": \"Número de bloques por miembro\",\n \"BLOCKS_ISSUERS_LABEL\": \"Número de bloques\",\n \"TX_DIVIDER\": \"Análisis de transacciones\",\n \"TX_AMOUNT_TITLE\": \"El volumen de transacciones\",\n \"TX_AMOUNT_PUBKEY_TITLE\": \"El volumen de transacciones calculado por {{issuer | formatPubkey}}\",\n \"TX_AMOUNT_LABEL\": \"Volumen intercambiado\",\n \"TX_COUNT_TITLE\": \"Número de transacciones escritas\",\n \"TX_COUNT_LABEL\": \"Número de transacciones\",\n \"TX_AVG_BY_BLOCK\": \"Promedio por bloque\"\n },\n \"CURRENCY\": {\n \"MONETARY_MASS_TITLE\": \"Evolución de la masa monetaria\",\n \"MONETARY_MASS_LABEL\": \"Masa monetaria\",\n \"MONETARY_MASS_SHARE_LABEL\": \"Promedio miembro\",\n \"UD_TITLE\": \"Evolución del dividendo universales\",\n \"MEMBERS_COUNT_TITLE\": \"Evolución del número de miembros\",\n \"MEMBERS_COUNT_LABEL\": \"Número de miembros\"\n },\n \"PEER\": {\n \"VIEW\": {\n \"BLOCK_COUNT_LABEL\": \"Número de bloques calculados\",\n \"BLOCK_COUNT\": \"{{count}} bloques\",\n \"NO_BLOCK\": \"Ningún bloque\"\n }\n }\n }\n}\n);\n\n$translateProvider.translations(\"fr-FR\", {\n \"NETWORK\": {\n \"VIEW\": {\n \"BTN_GRAPH\": \"Statistiques\"\n }\n },\n \"GRAPH\": {\n \"COMMON\": {\n \"LINEAR_SCALE\" : \"Echelle linéaire\",\n \"LOGARITHMIC_SCALE\" : \"Echelle logarithmique\",\n \"BTN_SHOW_STATS\": \"Voir les statistiques\",\n \"BTN_SHOW_DETAILED_STATS\": \"Statistiques détaillées\",\n \"RANGE_DURATION_DIVIDER\": \"Unité de temps :\",\n \"RANGE_DURATION\": {\n \"HOUR\": \"Heure\",\n \"DAY\": \"Jour\",\n \"MONTH\": \"Mois\"\n }\n },\n \"ACCOUNT\": {\n \"TITLE\": \"Statistiques\",\n \"BTN_SHOW_STATS\": \"Voir les statistiques du compte\",\n \"BALANCE_DIVIDER\": \"Situation du compte\",\n \"BALANCE_TITLE\": \"Evolution du compte {{pubkey|formatPubkey}}\",\n \"TX_RECEIVED_LABEL\": \"Recettes\",\n \"TX_SENT_LABEL\": \"Dépenses\",\n \"TX_ACCUMULATION_LABEL\": \"Bilan des transactions\",\n \"UD_LABEL\": \"DU\",\n \"UD_ACCUMULATION_LABEL\": \"Bilan des DU\",\n \"BALANCE_LABEL\": \"Solde\",\n \"WOT_DIVIDER\": \"Toile de confiance\",\n \"CERTIFICATION_TITLE\": \"Nombre de certifications - {{pubkey|formatPubkey}}\",\n \"RECEIVED_CERT_LABEL\": \"Total reçues\",\n \"RECEIVED_CERT_DELTA_LABEL\": \"Variation reçues\",\n \"GIVEN_CERT_LABEL\": \"Total envoyées\",\n \"GIVEN_CERT_DELTA_LABEL\": \"Variation envoyées\",\n \"INPUT_CHART_TITLE\": \"Somme des flux entrants, par émetteur :\",\n \"OUTPUT_CHART_TITLE\": \"Somme des flux sortants, par destinaire :\"\n },\n \"BLOCKCHAIN\": {\n \"TITLE\": \"Statistiques\",\n \"BLOCKS_ISSUERS_DIVIDER\": \"Analyse de la répartition du calcul\",\n \"BLOCKS_ISSUERS_HELP\": \"<b>{{issuerCount|formatInteger}} membres</b> ont calculé <b>{{blockCount|formatInteger}} blocs</b>\",\n \"BLOCKS_ISSUERS_TITLE\": \"Nombre de blocs calculés par membre\",\n \"BLOCKS_ISSUERS_LABEL\": \"Nombre de blocs\",\n \"TX_DIVIDER\": \"Analyse des transactions\",\n \"TX_AMOUNT_TITLE\": \"Volume des transactions\",\n \"TX_AMOUNT_PUBKEY_TITLE\": \"Volume des transactions calculées par {{issuer | formatPubkey}}\",\n \"TX_AMOUNT_LABEL\": \"Volume échangé\",\n \"TX_COUNT_TITLE\": \"Nombre de transactions écrites\",\n \"TX_COUNT_LABEL\": \"Nombre de transactions\",\n \"TX_AVG_BY_BLOCK\": \"Nombre moyen de transactions / bloc\"\n\n },\n \"CURRENCY\": {\n \"MONETARY_MASS_TITLE\": \"Evolution de la masse monétaire\",\n \"MONETARY_MASS_LABEL\": \"Masse monétaire\",\n \"MONETARY_MASS_SHARE_LABEL\": \"Moyenne par membre\",\n \"UD_TITLE\": \"Evolution du dividende universel\",\n \"MEMBERS_COUNT_TITLE\": \"Evolution du nombre de membres\",\n \"MEMBERS_COUNT_LABEL\": \"Nombre de membres\"\n },\n \"PEER\": {\n \"VIEW\": {\n \"BLOCK_COUNT_LABEL\": \"Nombre de blocs calculés\",\n \"BLOCK_COUNT\": \"{{count}} blocs\",\n \"NO_BLOCK\": \"Aucun bloc\"\n }\n },\n \"DOC_STATS\": {\n \"TITLE\": \"Statistiques de stockage\",\n \"USER\": {\n \"TITLE\": \"Nombre de documents liés à un compte\",\n \"USER_PROFILE\": \"Profils utilisateur\",\n \"USER_SETTINGS\": \"Paramètres sauvegardés\"\n },\n \"USER_DELTA\": {\n \"TITLE\": \"Variation du nombre de documents liés à un compte\",\n \"USER_PROFILE\": \"Profils utilisateur\",\n \"USER_SETTINGS\": \"Paramètres sauvegardés\"\n },\n \"MESSAGE\": {\n \"TITLE\": \"Nombre de documents liés à la communication\",\n \"MESSAGE_INBOX\": \"Messages en boîte de réception\",\n \"MESSAGE_OUTBOX\": \"Messages envoyés sauvegardés\",\n \"INVITATION_CERTIFICATION\": \"Invitations à certifier\"\n },\n \"SOCIAL\": {\n \"TITLE\": \"Nombre de pages ou groupes\",\n \"PAGE_COMMENT\": \"Commentaires\",\n \"PAGE_RECORD\": \"Pages\",\n \"GROUP_RECORD\": \"Groupes\"\n },\n \"OTHER\": {\n \"TITLE\": \"Autres documents\",\n \"HISTORY_DELETE\": \"Suppressions de documents\"\n }\n },\n \"SYNCHRO\": {\n \"TITLE\": \"Statistiques de synchronisations\",\n \"COUNT\": {\n \"TITLE\": \"Volume synchronisé\",\n \"INSERTS\": \"Insertions\",\n \"UPDATES\": \"Mises à jour\",\n \"DELETES\": \"Suppressions\"\n },\n \"PEER\": {\n \"TITLE\": \"Noeuds requêtés\",\n \"ES_USER_API\": \"Noeuds données utilisateurs\",\n \"ES_SUBSCRIPTION_API\": \"Noeuds services en ligne\"\n },\n \"PERFORMANCE\": {\n \"TITLE\": \"Performances d'exécution\",\n \"DURATION\": \"Temps d'exécution (ms)\"\n }\n }\n }\n}\n);\n\n$translateProvider.translations(\"it-IT\", {\n \"NETWORK\": {\n \"VIEW\": {\n \"BTN_GRAPH\": \"Statistiche\"\n }\n },\n \"GRAPH\": {\n \"COMMON\": {\n \"LINEAR_SCALE\" : \"Scala lineare\",\n \"LOGARITHMIC_SCALE\" : \"Scala logaritmica\",\n \"BTN_SHOW_STATS\": \"Vedere le statistiche\",\n \"BTN_SHOW_DETAILED_STATS\": \"Statistiche dettagliate\",\n \"RANGE_DURATION_DIVIDER\": \"Unità di tempo :\",\n \"RANGE_DURATION\": {\n \"HOUR\": \"Ora\",\n \"DAY\": \"Giorno\",\n \"MONTH\": \"Mese\"\n }\n },\n \"ACCOUNT\": {\n \"TITLE\": \"Statistiche\",\n \"BTN_SHOW_STATS\": \"Visualizzare le statistiche del conto\",\n \"BALANCE_DIVIDER\": \"Situazione del conto\",\n \"BALANCE_TITLE\": \"Evoluzione del conto {{pubkey|formatPubkey}}\",\n \"TX_RECEIVED_LABEL\": \"Incassi\",\n \"TX_SENT_LABEL\": \"Spese\",\n \"TX_ACCUMULATION_LABEL\": \"Bilancio delle transazioni\",\n \"UD_LABEL\": \"DU\",\n \"UD_ACCUMULATION_LABEL\": \"Bilancio dei DU\",\n \"BALANCE_LABEL\": \"Saldo\",\n \"WOT_DIVIDER\": \"Tela di fiducia\",\n \"CERTIFICATION_TITLE\": \"Numero di certificazioni - {{pubkey|formatPubkey}}\",\n \"RECEIVED_CERT_LABEL\": \"Totale ricevute\",\n \"RECEIVED_CERT_DELTA_LABEL\": \"Variazione ricevute\",\n \"GIVEN_CERT_LABEL\": \"Totale inviate\",\n \"GIVEN_CERT_DELTA_LABEL\": \"Variazione inviate\",\n \"INPUT_CHART_TITLE\": \"Somma dei flussi in entrata, par emittente :\",\n \"OUTPUT_CHART_TITLE\": \"Somma dei flussi in uscita, per destinatario :\"\n },\n \"BLOCKCHAIN\": {\n \"TITLE\": \"Statistiche\",\n \"BLOCKS_ISSUERS_DIVIDER\": \"Analisi della ripartizione del calcolo\",\n \"BLOCKS_ISSUERS_HELP\": \"<b>{{issuerCount|formatInteger}} membri</b> hanno calcolato <b>{{blockCount|formatInteger}} blocchi</b>\",\n \"BLOCKS_ISSUERS_TITLE\": \"Numero di blocchi calcolati a membro\",\n \"BLOCKS_ISSUERS_LABEL\": \"Numero di blocchi\",\n \"TX_DIVIDER\": \"Analisi delle transazioni\",\n \"TX_AMOUNT_TITLE\": \"Volume delle transazioni\",\n \"TX_AMOUNT_PUBKEY_TITLE\": \"Volume delle transazioni calcolato da {{issuer | formatPubkey}}\",\n \"TX_AMOUNT_LABEL\": \"Volume scambiato\",\n \"TX_COUNT_TITLE\": \"Numero di transazioni scritte\",\n \"TX_COUNT_LABEL\": \"Numero di transazioni\",\n \"TX_AVG_BY_BLOCK\": \"Numero medio di transazioni / blocco\"\n },\n \"CURRENCY\": {\n \"MONETARY_MASS_TITLE\": \"Evoluzione della massa monetaria\",\n \"MONETARY_MASS_LABEL\": \"Massa monetaria\",\n \"MONETARY_MASS_SHARE_LABEL\": \"Media a membro\",\n \"UD_TITLE\": \"Evoluzione del Dividendo Universale\",\n \"MEMBERS_COUNT_TITLE\": \"Evoluzione del numero di membri\",\n \"MEMBERS_COUNT_LABEL\": \"Numero di membri\"\n },\n \"PEER\": {\n \"VIEW\": {\n \"BLOCK_COUNT_LABEL\": \"Numero di blocchi calcolati\",\n \"BLOCK_COUNT\": \"{{count}} blocchi\",\n \"NO_BLOCK\": \"Nessun blocco\"\n }\n },\n \"DOC_STATS\": {\n \"TITLE\": \"Statistiche di stoccaggio\",\n \"USER\": {\n \"TITLE\": \"Numero di documenti legati ad un conto\",\n \"USER_PROFILE\": \"Profili dell'utente\",\n \"USER_SETTINGS\": \"Impostazioni salvate\"\n },\n \"MESSAGE\": {\n \"TITLE\": \"Numero di documenti legati alla conversazione\",\n \"MESSAGE_INBOX\": \"Messaggi in arrivo\",\n \"MESSAGE_OUTBOX\": \"Messaggi inviati salvati\",\n \"INVITATION_CERTIFICATION\": \"Invitazioni da certificare\"\n },\n \"SOCIAL\": {\n \"TITLE\": \"Numero di pagine o gruppi\",\n \"PAGE_COMMENT\": \"Commenti\",\n \"PAGE_RECORD\": \"Pagine\",\n \"GROUP_RECORD\": \"Gruppi\"\n },\n \"OTHER\": {\n \"TITLE\": \"Altri documenti\",\n \"HISTORY_DELETE\": \"Cronologia eliminazione documenti\"\n }\n },\n \"SYNCHRO\": {\n \"TITLE\": \"Statistiche di sincronizzazioni\",\n \"COUNT\": {\n \"TITLE\": \"Volume sincronizzato\",\n \"INSERTS\": \"Inserimenti\",\n \"UPDATES\": \"Aggiornamenti\",\n \"DELETES\": \"Eliminazioni\"\n },\n \"PEER\": {\n \"TITLE\": \"Nodi interrogati\",\n \"ES_USER_API\": \"Nodi dati utenti\",\n \"ES_SUBSCRIPTION_API\": \"Noeuds servizi online\"\n },\n \"PERFORMANCE\": {\n \"TITLE\": \"Prestazioni (performance) di esecuzione\",\n \"DURATION\": \"Tempo di esecuzione (ms)\"\n }\n }\n }\n }\n);\n\n$translateProvider.translations(\"nl-NL\", {\n \"NETWORK\": {\n \"VIEW\": {\n \"BTN_GRAPH\": \"Statistieken\"\n }\n },\n \"GRAPH\": {\n \"COMMON\": {\n \"LINEAR_SCALE\" : \"Lineaire schaal\",\n \"LOGARITHMIC_SCALE\" : \"Logaritmische schaal\",\n \"BTN_SHOW_STATS\": \"Zie statistieken\",\n \"BTN_SHOW_DETAILED_STATS\": \"Gedetailleerde statistieken\",\n \"RANGE_DURATION_DIVIDER\": \"Stap eenheid:\",\n \"RANGE_DURATION\": {\n \"HOUR\": \"Groep per <b>uur</b>\",\n \"DAY\": \"Groep per <b>dag</b>\",\n \"MONTH\": \"Groep per <b>maand</b>\"\n }\n },\n \"ACCOUNT\": {\n \"INPUT_CHART_TITLE\": \"Som van de binnenkomende stroom, door de zender:\",\n \"OUTPUT_CHART_TITLE\": \"Som van de uitstroom per bestemming:\"\n },\n \"BLOCKCHAIN\": {\n \"TITLE\": \"Statistieken\",\n \"BLOCKS_ISSUERS_DIVIDER\": \"Schriftelijke blokken door leden\",\n \"BLOCKS_ISSUERS_HELP\": \"<b>{{issuerCount|formatInteger}} leden</b> berekend <b>{{blockCount|formatInteger}} blokken</b>\",\n \"BLOCKS_ISSUERS_TITLE\": \"Aantal blokken berekend per lid\",\n \"BLOCKS_ISSUERS_LABEL\": \"Aantal blokken\",\n \"TX_DIVIDER\": \"Analyse van transacties\",\n \"TX_AMOUNT_TITLE\": \"Trading volume\",\n \"TX_AMOUNT_PUBKEY_TITLE\": \"Trading volume dat wordt berekend door {{issuer | formatPubkey}}\",\n \"TX_AMOUNT_LABEL\": \"Verhandeld volume\",\n \"TX_COUNT_TITLE\": \"Aantal schriftelijke transacties\",\n \"TX_COUNT_LABEL\": \"Aantal transacties\",\n \"TX_AVG_BY_BLOCK\": \"Gemiddeld aantal transacties / blok\"\n },\n \"CURRENCY\": {\n \"MONETARY_MASS_TITLE\": \"Evolutie van de monetaire massa\",\n \"MONETARY_MASS_LABEL\": \"Monetaire massa\",\n \"MONETARY_MASS_SHARE_LABEL\": \"Gemiddelde leden\",\n \"UD_TITLE\": \"Ontwikkeling van de universele dividend\",\n \"MEMBERS_COUNT_TITLE\": \"Evolutie van het aantal leden\",\n \"MEMBERS_COUNT_LABEL\": \"Aantal leden\"\n }\n }\n}\n);\n\n$translateProvider.translations(\"en-GB\", {\n \"MAP\": {\n \"COMMON\": {\n \"SEARCH_DOTS\": \"Search...\",\n \"BTN_LOCALIZE_ME\": \"Localize me\"\n },\n \"NETWORK\": {\n \"LOOKUP\": {\n \"BTN_MAP\": \"Peers map\",\n \"BTN_MAP_HELP\": \"Open peers map\"\n },\n \"VIEW\": {\n \"TITLE\": \"Peers map\",\n \"LAYER\": {\n \"MEMBER\": \"Member peers\",\n \"MIRROR\": \"Mirror peers\",\n \"OFFLINE\": \"Offline peers\"\n }\n }\n },\n \"WOT\": {\n \"LOOKUP\": {\n \"BTN_MAP\": \"Map\",\n \"BTN_MAP_HELP\": \"Open members map\"\n },\n \"VIEW\": {\n \"TITLE\": \"Members map\",\n \"LAYER\": {\n \"MEMBER\": \"<i class=\\\"icon ion-person positive\\\"></i> Members\",\n \"PENDING\": \"<i class=\\\"icon ion-clock energized\\\"></i> Pending registrations\",\n \"WALLET\": \"<i class=\\\"icon ion-card gray\\\"></i> Simple wallets\"\n }\n },\n \"ERROR\": {\n \"LOAD_POSITION_FAILED\": \"Can not retrieve the positions to display.\"\n }\n },\n \"REGISTRY\": {\n \"LOOKUP\": {\n \"BTN_MAP\": \"Map\",\n \"BTN_MAP_HELP\": \"Open the map of the pages\"\n },\n \"VIEW\": {\n \"TITLE\": \"Map of pages\",\n \"LAYER\": {\n \"SHOP\": \"<i class=\\\"icon ion-page-shop positive\\\"></i> Local shops\",\n \"COMPANY\": \"<i class=\\\"icon ion-page-company positive\\\"></i> Companies\",\n \"ASSOCIATION\": \"<i class=\\\"icon ion-page-association energized\\\"></i> Associations\",\n \"INSTITUTION\": \"<i class=\\\"icon ion-page-institution gray\\\"></i> Institutions\"\n }\n }\n },\n \"PROFILE\": {\n \"MARKER_HELP\": \"<b>Drag and drop</b> this marker to <b>update<br/>your position</b>, or use the buttons<br/>on top of the map.\"\n },\n \"ERROR\": {\n \"LOCALIZE_ME_FAILED\": \"Unable to retrieve your current position\"\n },\n \"SETTINGS\": {\n \"MAP_DIVIDER\": \"Maps\",\n \"ENABLE_GOOGLE_API\": \"Enable Google API services?\",\n \"ENABLE_GOOGLE_API_HELP\": \"In the <b>members map</b>, allows you to display accounts with an address but without geolocation.\",\n \"GOOGLE_API_KEY\": \"Google API key\",\n \"BTN_GOOGLE_API\": \"Getting a key\",\n \"BTN_GOOGLE_API_WARNING\": \"requires a Google account\",\n \"GOOGLE_API_KEY_PLACEHOLDER\": \"eg: AIzaqyAgszvWm0tM81x1sMK_ipDHBI7EowLqR7I\"\n },\n \"HELP\": {\n \"TIP\": {\n \"WOT\": \"This map displays <b>profiles with a position</b>, whether they are member accounts or not.<br/><br/>Only profiles with the option &quot;appear on the map&quot; has been activated.\",\n \"WOT_BTN_LAYERS\": \"<b>Filter the displayed data</b>: members, pending registrations, simple portfolios, etc.\",\n \"WOT_BTN_SEARCH\": \"You can <b>search</b> by name, public key, or member pseudonym.\"\n }\n }\n }\n}\n);\n\n$translateProvider.translations(\"en\", {\n \"MAP\": {\n \"COMMON\": {\n \"SEARCH_DOTS\": \"Search...\",\n \"BTN_LOCALIZE_ME\": \"Localize me\"\n },\n \"NETWORK\": {\n \"LOOKUP\": {\n \"BTN_MAP\": \"Peers map\",\n \"BTN_MAP_HELP\": \"Open peers map\"\n },\n \"VIEW\": {\n \"TITLE\": \"Peers map\",\n \"LAYER\": {\n \"MEMBER\": \"Member peers\",\n \"MIRROR\": \"Mirror peers\",\n \"OFFLINE\": \"Offline peers\"\n }\n }\n },\n \"WOT\": {\n \"LOOKUP\": {\n \"BTN_MAP\": \"Map\",\n \"BTN_MAP_HELP\": \"Open members map\"\n },\n \"VIEW\": {\n \"TITLE\": \"Members map\",\n \"LAYER\": {\n \"MEMBER\": \"<i class=\\\"icon ion-person positive\\\"></i> Members\",\n \"PENDING\": \"<i class=\\\"icon ion-clock energized\\\"></i> Pending registrations\",\n \"WALLET\": \"<i class=\\\"icon ion-card gray\\\"></i> Simple wallets\"\n }\n },\n \"ERROR\": {\n \"LOAD_POSITION_FAILED\": \"Can not retrieve the positions to display.\"\n }\n },\n \"REGISTRY\": {\n \"LOOKUP\": {\n \"BTN_MAP\": \"Map\",\n \"BTN_MAP_HELP\": \"Open the map of the pages\"\n },\n \"VIEW\": {\n \"TITLE\": \"Map of pages\",\n \"LAYER\": {\n \"SHOP\": \"<i class=\\\"icon ion-page-shop positive\\\"></i> Local shops\",\n \"COMPANY\": \"<i class=\\\"icon ion-page-company positive\\\"></i> Companies\",\n \"ASSOCIATION\": \"<i class=\\\"icon ion-page-association energized\\\"></i> Associations\",\n \"INSTITUTION\": \"<i class=\\\"icon ion-page-institution gray\\\"></i> Institutions\"\n }\n }\n },\n \"PROFILE\": {\n \"MARKER_HELP\": \"<b>Drag and drop</b> this marker to <b>update<br/>your position</b>, or use the buttons<br/>on top of the map.\"\n },\n \"ERROR\": {\n \"LOCALIZE_ME_FAILED\": \"Unable to retrieve your current position\"\n },\n \"SETTINGS\": {\n \"MAP_DIVIDER\": \"Maps\",\n \"ENABLE_GOOGLE_API\": \"Enable Google API services?\",\n \"ENABLE_GOOGLE_API_HELP\": \"In the <b>members map</b>, allows you to display accounts with an address but without geolocation.\",\n \"GOOGLE_API_KEY\": \"Google API key\",\n \"BTN_GOOGLE_API\": \"Getting a key\",\n \"BTN_GOOGLE_API_WARNING\": \"requires a Google account\",\n \"GOOGLE_API_KEY_PLACEHOLDER\": \"eg: AIzaqyAgszvWm0tM81x1sMK_ipDHBI7EowLqR7I\"\n },\n \"HELP\": {\n \"TIP\": {\n \"WOT\": \"This map displays <b>profiles with a position</b>, whether they are member accounts or not.<br/><br/>Only profiles with the option &quot;appear on the map&quot; has been activated.\",\n \"WOT_BTN_LAYERS\": \"<b>Filter the displayed data</b>: members, pending registrations, simple portfolios, etc.\",\n \"WOT_BTN_SEARCH\": \"You can <b>search</b> by name, public key, or member pseudonym.\"\n }\n }\n }\n}\n);\n\n$translateProvider.translations(\"eo-EO\", {\n \"MAP\": {\n \"COMMON\": {\n \"SEARCH_DOTS\": \"Traserĉi...\",\n \"BTN_LOCALIZE_ME\": \"Lokalizi min\"\n },\n \"NETWORK\": {\n \"LOOKUP\": {\n \"BTN_MAP\": \"Mapo\",\n \"BTN_MAP_HELP\": \"Malfermi la mapon pri nodoj\"\n },\n \"VIEW\": {\n \"TITLE\": \"Mapo pri nodoj\",\n \"LAYER\": {\n \"MEMBER\": \"Membro-nodoj\",\n \"MIRROR\": \"Spegul-nodoj\",\n \"OFFLINE\": \"Nekonektitaj nodoj\"\n }\n }\n },\n \"WOT\": {\n \"LOOKUP\": {\n \"BTN_MAP\": \"Mapo\",\n \"BTN_MAP_HELP\": \"Malfermi la mapon pri membroj\"\n },\n \"VIEW\": {\n \"TITLE\": \"Mapo pri membroj\",\n \"LAYER\": {\n \"MEMBER\": \"<i class=\\\"icon ion-person positive\\\"></i> Membroj\",\n \"PENDING\": \"<i class=\\\"icon ion-clock energized\\\"></i> Aliĝoj atendantaj\",\n \"WALLET\": \"<i class=\\\"icon ion-card gray\\\"></i> Simplaj monujoj\"\n }\n },\n \"ERROR\": {\n \"LOAD_POSITION_FAILED\": \"Neeblas ricevi la lokojn afiŝotajn.\"\n }\n },\n \"REGISTRY\": {\n \"LOOKUP\": {\n \"BTN_MAP\": \"Mapo\",\n \"BTN_MAP_HELP\": \"Malfermi la mapon pri paĝoj\"\n },\n \"VIEW\": {\n \"TITLE\": \"Mapo pri paĝoj\",\n \"LAYER\": {\n \"SHOP\": \"<i class=\\\"icon ion-page-shop positive\\\"></i> Lokaj komercoj\",\n \"COMPANY\": \"<i class=\\\"icon ion-page-company positive\\\"></i> Entreprenoj\",\n \"ASSOCIATION\": \"<i class=\\\"icon ion-page-association energized\\\"></i> Asocioj\",\n \"INSTITUTION\": \"<i class=\\\"icon ion-page-institution gray\\\"></i> Institucioj\"\n }\n }\n },\n \"PROFILE\": {\n \"MARKER_HELP\": \"<b>Ŝovu-demetu</b> tiun ĉi markilon por <b>aktualigi<br/> vian lokon</b> sur la mapo, aŭ uzu la serĉo-butonon<br/>super la mapo.\"\n },\n \"ERROR\": {\n \"LOCALIZE_ME_FAILED\": \"Neeblas ricevi vian nunan lokon\"\n },\n \"SETTINGS\": {\n \"MAP_DIVIDER\": \"Mapoj\",\n \"ENABLE_GOOGLE_API\": \"Aktivigi la Google-API-servojn?\",\n \"ENABLE_GOOGLE_API_HELP\": \"Ebligas afiŝi sur la <b>mapo pri membroj</b> kontojn kun adreso sed sen iu GPS-lokalizo.\",\n \"GOOGLE_API_KEY\": \"Google-API-ŝlosilo\",\n \"BTN_GOOGLE_API\": \"Ekhavi ŝlosilon\",\n \"BTN_GOOGLE_API_WARNING\": \"Necesigas havi Google-konton\",\n \"GOOGLE_API_KEY_PLACEHOLDER\": \"Ekzemple: AIzaqyAgszvWm0tM81x1sMK_ipDHBI7EowLqR7I\"\n },\n \"HELP\": {\n \"TIP\": {\n \"WOT\": \"Tiu ĉi mapo afiŝas <b>la profilojn kun loko</b>, ĉu ili rilatas al membro-kontoj aŭ ne.<br/><br/>Nur videblas la profiloj, kies kromaĵo &quot;aperi sur la mapo&quot; estis aktivigita.\",\n \"WOT_BTN_LAYERS\": \"<b>Filtru ĉi tie la afiŝitajn datenojn</b>: membroj, aliĝoj atendantaj, simplaj monujoj, ktp.\",\n \"WOT_BTN_SEARCH\": \"Vi povas <b>efektivigi serĉadon</b> laŭ nomo, publika ŝlosilo aŭ membro-pseŭdonimo.\"\n }\n }\n }\n}\n);\n\n$translateProvider.translations(\"fr-FR\", {\n \"MAP\": {\n \"COMMON\": {\n \"SEARCH_DOTS\": \"Rechercher...\",\n \"BTN_LOCALIZE_ME\": \"Me localiser\"\n },\n \"NETWORK\": {\n \"LOOKUP\": {\n \"BTN_MAP\": \"Carte\",\n \"BTN_MAP_HELP\": \"Ouvrir la carte des noeuds\"\n },\n \"VIEW\": {\n \"TITLE\": \"Carte des noeuds\",\n \"LAYER\": {\n \"MEMBER\": \"Nœuds membre\",\n \"MIRROR\": \"Nœuds miroir\",\n \"OFFLINE\": \"Nœuds hors ligne\"\n }\n }\n },\n \"WOT\": {\n \"LOOKUP\": {\n \"BTN_MAP\": \"Carte\",\n \"BTN_MAP_HELP\": \"Ouvrir la carte des membres\"\n },\n \"VIEW\": {\n \"TITLE\": \"Carte des membres\",\n \"LAYER\": {\n \"MEMBER\": \"<i class=\\\"icon ion-person positive\\\"></i> Membres\",\n \"PENDING\": \"<i class=\\\"icon ion-clock energized\\\"></i> Inscriptions en attente\",\n \"WALLET\": \"<i class=\\\"icon ion-card gray\\\"></i> Simples portefeuilles\"\n }\n },\n \"ERROR\": {\n \"LOAD_POSITION_FAILED\": \"Impossible de récupérer les positions à afficher.\"\n }\n },\n \"REGISTRY\": {\n \"LOOKUP\": {\n \"BTN_MAP\": \"Carte\",\n \"BTN_MAP_HELP\": \"Ouvrir la carte des pages\"\n },\n \"VIEW\": {\n \"TITLE\": \"Carte des pages\",\n \"LAYER\": {\n \"SHOP\": \"<i class=\\\"icon ion-page-shop positive\\\"></i> Commerces locaux\",\n \"COMPANY\": \"<i class=\\\"icon ion-page-company positive\\\"></i> Entreprises\",\n \"ASSOCIATION\": \"<i class=\\\"icon ion-page-association energized\\\"></i> Associations\",\n \"INSTITUTION\": \"<i class=\\\"icon ion-page-institution gray\\\"></i> Institutions\"\n }\n }\n },\n \"PROFILE\": {\n \"MARKER_HELP\": \"<b>Glissez-déposez</b> ce marqueur pour <b>mettre<br/>à jour votre position</b> sur la carte, ou utilisez le bouton<br/>de recherche au-dessus de la carte.\"\n },\n \"ERROR\": {\n \"LOCALIZE_ME_FAILED\": \"Impossible de récupérer votre position actuelle\"\n },\n \"SETTINGS\": {\n \"MAP_DIVIDER\": \"Cartes\",\n \"ENABLE_GOOGLE_API\": \"Activer les services Google API ?\",\n \"ENABLE_GOOGLE_API_HELP\": \"Permet l'affichage dans la <b>carte des membres</b> des comptes ayant une adresse mais aucun positionnement GPS.\",\n \"GOOGLE_API_KEY\": \"Clé d'API Google\",\n \"BTN_GOOGLE_API\": \"Obtenir une clé\",\n \"BTN_GOOGLE_API_WARNING\": \"Nécessite d'avoir un compte Google\",\n \"GOOGLE_API_KEY_PLACEHOLDER\": \"Exemple : AIzaqyAgszvWm0tM81x1sMK_ipDHBI7EowLqR7I\"\n },\n \"HELP\": {\n \"TIP\": {\n \"WOT\": \"Cette carte affiche <b>les profils ayant une position</b>, qu'ils correspondent à des comptes membre ou non.<br/><br/>Seuls sont visibles les profils dont l'option &quot;apparaître sur la carte&quot; a été activée.\",\n \"WOT_BTN_LAYERS\": \"<b>Filtrez ici les données affichées</b> : membres, inscriptions en attente, simples portefeuilles, etc.\",\n \"WOT_BTN_SEARCH\": \"Vous pouvez <b>effectuer une recherche</b> par nom, clef publique ou pseudonyme de membre.\"\n }\n }\n }\n}\n);\n\n$translateProvider.translations(\"it-IT\", {\n \"MAP\": {\n \"COMMON\": {\n \"SEARCH_DOTS\": \"Ricerca...\",\n \"BTN_LOCALIZE_ME\": \"Trovami\"\n },\n \"NETWORK\": {\n \"LOOKUP\": {\n \"BTN_MAP\": \"Mappa dei peers\",\n \"BTN_MAP_HELP\": \"Aprire mappa dei peers\"\n },\n \"VIEW\": {\n \"TITLE\": \"Mappa dei peers\",\n \"LAYER\": {\n \"MEMBER\": \"Peers membri\",\n \"MIRROR\": \"Peers specchi\",\n \"OFFLINE\": \"Peers offline\"\n }\n }\n },\n \"WOT\": {\n \"LOOKUP\": {\n \"BTN_MAP\": \"Mappa dei membri\",\n \"BTN_MAP_HELP\": \"Aprire mappa dei membri\"\n },\n \"VIEW\": {\n \"TITLE\": \"Mappa membri\",\n \"LAYER\": {\n \"MEMBER\": \"<i class=\\\"icon ion-person positive\\\"></i> Membri\",\n \"PENDING\": \"<i class=\\\"icon ion-clock energized\\\"></i> Registrazione pendenti\",\n \"WALLET\": \"<i class=\\\"icon ion-card gray\\\"></i> Portafogli osservatori\"\n }\n },\n \"ERROR\": {\n \"LOAD_POSITION_FAILED\": \"Errore nel caricamento delle posizioni.\"\n }\n },\n \"REGISTRY\": {\n \"LOOKUP\": {\n \"BTN_MAP\": \"Mappa\",\n \"BTN_MAP_HELP\": \"Aprire la mappa delle pagine pro\"\n },\n \"VIEW\": {\n \"TITLE\": \"Mappa delle pagine pro\",\n \"LAYER\": {\n \"SHOP\": \"<i class=\\\"icon ion-page-shop positive\\\"></i> Negozi locali\",\n \"COMPANY\": \"<i class=\\\"icon ion-page-company positive\\\"></i> Aziende\",\n \"ASSOCIATION\": \"<i class=\\\"icon ion-page-association energized\\\"></i> Associazioni\",\n \"INSTITUTION\": \"<i class=\\\"icon ion-page-institution gray\\\"></i> Instituti\"\n }\n }\n },\n \"PROFILE\": {\n \"MARKER_HELP\": \"<b>Drag and drop</b> questo indicatore per <b>aggiornare<br/>tua posizione</b>, o usa i bottoni <br/>sopra la mappa.\"\n },\n \"ERROR\": {\n \"LOCALIZE_ME_FAILED\": \"Impossible trovare tua posizione attuale\"\n },\n \"SETTINGS\": {\n \"MAP_DIVIDER\": \"Mappe\",\n \"ENABLE_GOOGLE_API\": \"Abilitare i servizi Google API ?\",\n \"ENABLE_GOOGLE_API_HELP\": \"Sulla <b>mappa dei membri</b>, ti permette di visualizzare i conti con un indirizzo ma senza geolocalizzazione.\",\n \"GOOGLE_API_KEY\": \"Chiave Google API\",\n \"BTN_GOOGLE_API\": \"Ottenere una chiave\",\n \"BTN_GOOGLE_API_WARNING\": \"necessita un conto Google\",\n \"GOOGLE_API_KEY_PLACEHOLDER\": \"per es. : AIzaqyAgszvWm0tM81x1sMK_ipDHBI7EowLqR7I\"\n },\n \"HELP\": {\n \"TIP\": {\n \"WOT\": \"Questa mappa mostra <b>profili che hanno fornito una posizione</b>, che siano conti membri o no.<br/><br/>Solo i profili che hanno attivato l'opzione &quot;apparire sulla mappa&quot; sono stati attivati.\",\n \"WOT_BTN_LAYERS\": \"<b>Filtrare i dati visibili</b>: membri, registrazioni pendenti, portafogli osservatori, etc.\",\n \"WOT_BTN_SEARCH\": \"Puoi <b>cercare</b> per nome, chiave pubblica, o pseudonimo del membro.\"\n }\n }\n }\n }\n );\n\n$translateProvider.translations(\"fr-FR\", {\n \"RML9\": {\n \"BTN_EXPORT\": \"Télécharger\",\n \"BTN_OPEN\": \"Ouvrir la page RML9\",\n \"BTN_SWOW_TX\": \"Voir les transactions\",\n \"FILE_NAME\": \"relevé du compte {{pubkey|formatPubkey}} au {{currentTime|formatDateForFile}}.csv\",\n \"HEADERS\": {\n \"TIME\": \"Date\",\n \"AMOUNT\": \"Montant\",\n \"COMMENT\": \"Commentaire\"\n },\n \"VIEW\": {\n \"TITLE\": \"RML9\",\n \"DIVIDER\": \"Dernières transactions :\",\n \"BALANCE\": \"Solde du compte\"\n },\n \"CHART\": {\n \"INPUT_CHART_TITLE\": \"Somme des flux entrants, par émetteur :\",\n \"OUTPUT_CHART_TITLE\": \"Somme des flux sortants, par destinaire :\"\n },\n \"SETTINGS\": {\n \"ENABLE_TOGGLE\": \"Activer le plugin RML9 ?\"\n }\n }\n}\n);\n}]);\n","angular.module('cesium.plugins.templates', []).run(['$templateCache', function($templateCache) {$templateCache.put('plugins/es/templates/blockchain/items_blocks.html','\\n<div class=\"item row row-header done in hidden-xs hidden-sm\">\\n\\n <!-- compact -->\\n <a class=\"pull-left gray button button-text button-small no-margin no-padding\" ng-class=\"{\\'positive\\': compactMode}\" ng-click=\"toggleCompactMode()\">\\n <i class=\"icon ion-navicon\"></i>\\n <b class=\"ion-arrow-down-b\" style=\"position: absolute; top: -8px; left: 2px; font-size: 8px;\"></b>\\n <b class=\"ion-arrow-up-b\" style=\"position: absolute; top: 6px; left: 2px; font-size: 8px;\"></b>\\n <span>{{\\'BLOCKCHAIN.LOOKUP.BTN_COMPACT\\'|translate}}</span>\\n </a>\\n\\n <a class=\"no-padding dark col col-header\" ng-if=\":rebind:expertMode\" ng-click=\"toggleSort(\\'medianTime\\')\">\\n <cs-sort-icon asc=\"search.asc\" sort=\"search.sort\" toggle=\"\\'medianTime\\'\"></cs-sort-icon>\\n {{\\'BLOCKCHAIN.LOOKUP.HEADER_MEDIAN_TIME\\' | translate}}\\n </a>\\n <a class=\"no-padding dark col col-header\" ng-if=\":rebind:expertMode\" ng-click=\"toggleSort(\\'issuer\\')\">\\n <cs-sort-icon asc=\"search.asc\" sort=\"search.sort\" toggle=\"\\'issuer\\'\"></cs-sort-icon>\\n {{\\'BLOCKCHAIN.LOOKUP.HEADER_ISSUER\\' | translate}}\\n </a>\\n <div class=\"col col-20\">&nbsp;\\n </div>\\n <a class=\"no-padding dark col col-20 col-header\" ng-if=\":rebind:expertMode\" ng-click=\"toggleSort(\\'number\\')\">\\n <cs-sort-icon asc=\"search.asc\" sort=\"search.sort\" toggle=\"\\'number\\'\"></cs-sort-icon>\\n {{\\'BLOCKCHAIN.LOOKUP.HEADER_BLOCK\\' | translate}}\\n </a>\\n</div>\\n\\n<div class=\"padding gray\" ng-if=\":rebind:!search.loading && !search.results.length\" translate>\\n COMMON.SEARCH_NO_RESULT\\n</div>\\n\\n<!-- blocks (large view) -->\\n<ng-if ng-if=\":rebind:!smallscreen\">\\n <ng-repeat ng-repeat=\"block in :rebind:search.results track by block.number\" ng-include=\"!block.empty ? \\'templates/blockchain/item_block_lg.html\\' : \\'templates/blockchain/item_block_empty_lg.html\\'\">\\n </ng-repeat>\\n</ng-if>\\n<!-- blocks (small screens) -->\\n<ng-if ng-if=\":rebind:smallscreen\">\\n <ng-repeat ng-repeat=\"block in :rebind:search.results track by block.number\" ng-include=\"::\\'templates/blockchain/item_block.html\\'\">\\n </ng-repeat>\\n</ng-if>\\n');\n$templateCache.put('plugins/es/templates/blockchain/lookup_form.html','<div class=\"lookupForm\">\\n\\n\\n <div class=\"item no-padding\">\\n\\n <div class=\"button button-small button-text button-stable button-icon-event padding no-padding-right ink\" ng-repeat=\"filter in search.filters\" ng-if=\"filter\">\\n <span ng-bind-html=\"\\'BLOCKCHAIN.LOOKUP.TX_SEARCH_FILTER.\\'+filter.type|translate:filter\"></span>\\n <i class=\"icon ion-close\" ng-click=\"itemRemove($index)\"></i>\\n\\n </div>\\n\\n <label class=\"item-input\">\\n <i class=\"icon ion-search placeholder-icon\"></i>\\n <input type=\"text\" class=\"visible-xs visible-sm\" placeholder=\"{{\\'BLOCKCHAIN.LOOKUP.SEARCH_HELP\\'|translate}}\" ng-model=\"search.text\" ng-model-options=\"{ debounce: 650 }\" ng-change=\"doSearchText()\">\\n <input type=\"text\" class=\"hidden-xs hidden-sm\" id=\"{{searchTextId}}\" placeholder=\"{{\\'BLOCKCHAIN.LOOKUP.SEARCH_HELP\\'|translate}}\" ng-model=\"search.text\" on-return=\"doSearchText()\">\\n <div class=\"helptip-anchor-center\">\\n <a id=\"helptip-blockchain-search-text\"></a>\\n </div>\\n\\n </label>\\n </div>\\n\\n\\n <div class=\"padding-top padding-xs\" style=\"display: block; height: 60px;\">\\n <div class=\"pull-left\">\\n <h4 ng-if=\"search.type==\\'last\\'\" translate>\\n BLOCKCHAIN.LOOKUP.LAST_BLOCKS\\n </h4>\\n <h4 ng-if=\"search.type==\\'text\\'\">\\n {{\\'COMMON.RESULTS_LIST\\'|translate}}\\n </h4>\\n <h5 class=\"dark\" ng-if=\"!search.loading && search.total\">\\n <span translate=\"COMMON.RESULTS_COUNT\" translate-values=\"{count: search.total}\"></span>\\n <small class=\"gray\" ng-if=\":rebind:search.took && expertMode\">\\n - {{:rebind:\\'COMMON.EXECUTION_TIME\\'|translate: {duration: search.took} }}\\n </small>\\n <small class=\"gray\" ng-if=\":rebind:expertMode && search.filters && search.filters.length\">\\n - <a ng-click=\"toggleShowQuery()\" ng-if=\"!showQuery\">\\n {{\\'DOCUMENT.LOOKUP.SHOW_QUERY\\'|translate }}\\n <i class=\"icon ion-arrow-down-b gray\"></i>\\n </a>\\n <a ng-click=\"toggleShowQuery()\" ng-if=\"showQuery\">\\n {{\\'DOCUMENT.LOOKUP.HIDE_QUERY\\'|translate }}\\n <i class=\"icon ion-arrow-up-b gray\"></i>\\n </a>\\n </small>\\n </h5>\\n <h5 class=\"gray\" ng-if=\"search.loading\">\\n <ion-spinner class=\"icon ion-spinner-small\" icon=\"android\"></ion-spinner>\\n <span translate>COMMON.SEARCHING</span>\\n <br>\\n </h5>\\n </div>\\n\\n <div class=\"pull-right hidden-xs hidden-sm\">\\n <a ng-if=\"enableFilter\" class=\"button button-text button-small ink icon ion-clock\" ng-class=\"{\\'button-text-positive\\': search.type==\\'last\\'}\" ng-click=\"doSearchLast()\">\\n {{\\'BLOCKCHAIN.LOOKUP.BTN_LAST\\' | translate}}\\n </a>\\n\\n <!--<a class=\"button button-text button-small ink icon icon-help\" ng-click=\"showHelpModal(\\'join-salt\\')\">\\n {{\\'BLOCKCHAIN.LOOKUP.HELP\\' | translate}}\\n </a>-->\\n &nbsp;\\n <button class=\"button button-small button-stable ink\" ng-click=\"doSearchText()\">\\n {{\\'COMMON.BTN_SEARCH\\' | translate:search}}\\n </button>\\n </div>\\n </div>\\n\\n <div class=\"item no-border no-padding\" ng-if=\":rebind:search.filters && search.filters.length && expertMode\">\\n <small class=\"no-padding no-margin\" ng-if=\"showQuery\">\\n <span class=\"gray text-wrap dark\">{{:rebind:search.query}}</span>\\n </small>\\n </div>\\n\\n <ion-list class=\"list list-blocks\" ng-class=\"::motion.ionListClass\">\\n\\n <ng-include src=\"::\\'plugins/es/templates/blockchain/items_blocks.html\\'\"></ng-include>\\n\\n </ion-list>\\n\\n <ion-infinite-scroll ng-if=\"search.hasMore\" spinner=\"android\" on-infinite=\"showMore()\" distance=\"1%\">\\n </ion-infinite-scroll>\\n\\n</div>');\n$templateCache.put('plugins/es/templates/blockchain/lookup_popover_actions.html','<ion-popover-view class=\"fit has-header\">\\n <ion-header-bar>\\n <h1 class=\"title\" translate>BLOCKCHAIN.LOOKUP.POPOVER_FILTER_TITLE</h1>\\n </ion-header-bar>\\n <ion-content scroll=\"false\">\\n <div class=\"list item-text-wrap\">\\n\\n <!-- last blocks -->\\n <a ng-if=\"enableFilter\" class=\"item item-icon-left item-icon-right ink\" ng-click=\"doSearchLast()\">\\n <i class=\"icon ion-clock\"></i>\\n {{\\'BLOCKCHAIN.LOOKUP.BTN_LAST\\' | translate}}\\n <i class=\"icon ion-ios-checkmark-empty\" ng-show=\"search.type==\\'last\\'\"></i>\\n </a>\\n\\n </div>\\n </ion-content>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/es/templates/blockchain/lookup.html','<ion-view>\\n <ion-nav-title>\\n <span translate>BLOCKCHAIN.LOOKUP.TITLE</span>\\n </ion-nav-title>\\n\\n <ion-nav-buttons side=\"secondary\">\\n\\n <button class=\"button button-icon button-clear icon ion-navicon visible-xs visible-sm\" ng-click=\"toggleCompactMode()\">\\n <b class=\"icon-secondary\" ng-class=\"{\\'ion-arrow-down-b\\': !compactMode, \\'ion-arrow-up-b\\': compactMode}\" style=\"top: -12px; left: 11px; font-size: 10px;\"></b>\\n <b class=\"icon-secondary\" ng-class=\"{\\'ion-arrow-up-b\\': !compactMode,\\'ion-arrow-down-b\\': compactMode}\" style=\"top: 12px; left: 11px; font-size: 10px;\"></b>\\n </button>\\n\\n <button class=\"button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm\" ng-click=\"showActionsPopover($event)\">\\n </button>\\n\\n </ion-nav-buttons>\\n\\n <ion-content class=\"padding no-padding-xs no-padding-sm\" scroll=\"true\">\\n <ng-include src=\"::\\'plugins/es/templates/blockchain/lookup_form.html\\'\"></ng-include>\\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/common/edit_pictures.html','<div class=\"gallery\" ng-controller=\"ESPicturesEditCtrl as ctrl\">\\n\\n <!-- Picture list -->\\n <div ng-repeat=\"picture in pictures\" class=\"item card card-gallery stable-bg\" ng-class=\"{\\'in done\\': picture.isnew}\">\\n <div>\\n <h2 ng-if=\"picture.title\">{{picture.title}}</h2>\\n <img ng-src=\"{{picture.src}}\">\\n </div>\\n <div class=\"item done in tabs tabs-secondary tabs-icon-left\">\\n <a class=\"tab-item stable-bg assertive\" ng-click=\"removePicture($index)\" title=\"{{\\'COMMON.BTN_PICTURE_DELETE\\' | translate}}\"><i class=\"icon ion-trash-a\"></i>{{\\'COMMON.BTN_PICTURE_DELETE\\'|translate}}</a>\\n <a class=\"tab-item stable-bg dark\" ng-click=\"rotatePicture($index)\" title=\"{{\\'COMMON.BTN_PICTURE_ROTATE\\' | translate}}\"><i class=\"icon ion-forward\"></i>{{\\'COMMON.BTN_PICTURE_ROTATE\\'|translate}}</a>\\n <a class=\"tab-item stable-bg\" ng-click=\"favoritePicture($index)\" ng-class=\"{\\'gray\\': $index !== 0, \\'positive\\': $index === 0}\" title=\"{{\\'COMMON.BTN_PICTURE_FAVORISE\\' | translate}}\"><i class=\"icon ion-star\"></i>{{\\'COMMON.BTN_PICTURE_FAVORISE\\'|translate}}</a>\\n </div>\\n </div>\\n\\n <!-- Add picture button -->\\n <div class=\"item card card-gallery card-gallery-new text-center padding ink\" file-select=\"onFileChanged(file)\" accept=\"image/*\">\\n <i class=\"ion-image stable\" style=\"font-size:150px\"></i>\\n <b class=\"ion-plus gray\" style=\"font-size:80px; position:absolute; top:25px; right: 5px;\"></b>\\n <p translate>COMMON.BTN_ADD_PICTURE</p>\\n </div>\\n\\n</div>\\n\\n');\n$templateCache.put('plugins/es/templates/common/edit_position.html','<div class=\"item item-divider\" translate>LOCATION.LOCATION_DIVIDER</div>\\n\\n<!-- street -->\\n<ion-item class=\"item-input item-floating-label item-button-right\">\\n <span class=\"input-label\">{{\\'LOCATION.ADDRESS\\' | translate}}</span>\\n <textarea placeholder=\"{{\\'LOCATION.ADDRESS_HELP\\' | translate}}\" ng-model=\"formData.address\" ng-model-options=\"{ debounce: 350 }\" rows=\"4\" cols=\"10\">\\n </textarea>\\n</ion-item>\\n\\n<!-- city -->\\n<div class=\"item item-input item-floating-label\" ng-class=\"{\\'item-input-error\\': form.$submitted && form.geoPoint.$invalid}\">\\n <span class=\"input-label\" translate>LOCATION.CITY</span>\\n <input type=\"text\" placeholder=\"{{\\'LOCATION.CITY_HELP\\'|translate}}\" ng-model=\"formData.city\" ng-model-options=\"{ updateOn: \\'blur\\' }\" required-if=\"formData.address\" ng-change=\"onCityChanged()\">\\n</div>\\n<input type=\"hidden\" name=\"geoPoint\" ng-model=\"formData.geoPoint\" required-if=\"formPosition.enable\" geo-point>\\n<div class=\"form-errors\" ng-show=\"form.$submitted && form.city.$error\" ng-messages=\"form.city.$error\">\\n <div class=\"form-error\" ng-message=\"required\">\\n <span translate=\"LOCATION.ERROR.CITY_REQUIRED_IF_STREET\"></span>\\n </div>\\n</div>\\n<div class=\"form-errors\" ng-show=\"form.$submitted && form.geoPoint.$error\" ng-messages=\"form.geoPoint.$error\">\\n <div class=\"form-error\" ng-message=\"required\">\\n <span translate=\"LOCATION.ERROR.REQUIRED_FOR_LOCATION\" ng-if=\"!formData.city\"></span>\\n <span translate=\"LOCATION.ERROR.INVALID_FOR_LOCATION\" ng-if=\"formData.city\"></span>\\n </div>\\n <div class=\"form-error\" ng-message=\"geoPoint\">\\n <span translate=\"LOCATION.ERROR.REQUIRED_FOR_LOCATION\" ng-if=\"!formData.city\"></span>\\n <span translate=\"LOCATION.ERROR.INVALID_FOR_LOCATION\" ng-if=\"formData.city\"></span>\\n </div>\\n</div>\\n\\n\\n<!-- Position (lat/lon) -->\\n<div class=\"item row item-text-wrap no-padding\">\\n\\n <div class=\"col no-padding\">\\n\\n <!-- appear on map ? -->\\n <ion-checkbox ng-model=\"formPosition.enable\" ng-change=\"onUseGeopointChanged()\" class=\"item item-border-large done in\">\\n <div class=\"item-content\">\\n <span translate>LOCATION.USE_GEO_POINT</span>\\n <h4 class=\"gray\" ng-if=\"formPosition.loading\">\\n <ion-spinner class=\"icon ion-spinner-small\" icon=\"android\"></ion-spinner>\\n {{\\'LOCATION.LOADING_LOCATION\\'|translate}}\\n </h4>\\n </div>\\n </ion-checkbox>\\n </div>\\n\\n <div class=\"col col-10 no-padding\" style=\"min-width: 60px;\">\\n <div class=\"row text-center\">\\n\\n <a class=\"button button-stable button-small-padding\" title=\"{{\\'LOCATION.BTN_GEOLOC_ADDRESS\\'|translate}}\" ng-disabled=\"!formPosition.enable\" ng-click=\"openSearchLocationModal()\">\\n <i class=\"icon ion-home\" style=\"left: 15px;\"></i>\\n <b class=\"icon-secondary ion-search\" style=\"top: -9px; left:32px; font-size: 18px;\"></b>\\n </a>\\n\\n </div>\\n </div>\\n</div>\\n\\n\\n<cs-extension-point name=\"after-position\"></cs-extension-point>\\n');\n$templateCache.put('plugins/es/templates/common/edit_socials.html','<div class=\"list no-padding {{::motion.ionListClass}}\">\\n <!-- divider -->\\n <div class=\"item item-divider\">\\n\\n <span translate>PROFILE.SOCIAL_NETWORKS_DIVIDER</span>\\n\\n <a class=\"badge button button-text button-small button-small-padding\" ng-class=\"{\\'button-text-positive\\': socialData.reorder}\" ng-if=\"formData.socials && formData.socials.length &gt; 1\" ng-click=\"socialData.reorder=!socialData.reorder\">\\n <span translate>PROFILE.BTN_REORDER</span>\\n </a>\\n </div>\\n</div>\\n\\n<ion-list show-reorder=\"socialData.reorder\">\\n\\n <ion-item class=\"item-icon-left item-social-edit done in\" type=\"no-padding item-text-wrap\" ng-if=\"formData.socials && formData.socials.length\" ng-repeat=\"social in formData.socials | filter:filterFn track by social.url\" id=\"social-{{social.url|formatSlug}}\">\\n <i class=\"icon ion-social-{{social.type}}\" ng-class=\"{\\'ion-bookmark\\': social.type == \\'other\\', \\'ion-link\\': social.type == \\'web\\', \\'ion-email\\': social.type == \\'email\\', \\'ion-iphone\\': social.type == \\'phone\\'}\"></i>\\n <p ng-if=\"social.type && social.type != \\'web\\'\">\\n {{social.type}}\\n <i class=\"ion-locked\" ng-if=\"social.recipient\"></i>\\n </p>\\n <h2>\\n <span>{{social.url}}</span>\\n <a class=\"gray hidden-device\" ng-if=\"!social.recipient && !socialData.reorder\" ng-click=\"formData.socials.splice($index, 1); dirty = true;\">\\n &nbsp;<b class=\"ion ion-trash-a\"></b>&nbsp;\\n </a>\\n <a class=\"gray hidden-device\" ng-if=\"!social.recipient && !socialData.reorder\" ng-click=\"editSocialNetwork($index)\">\\n &nbsp;<b class=\"ion ion-edit\"></b>&nbsp;\\n </a>\\n </h2>\\n <ion-option-button class=\"button-assertive\" ng-if=\"!social.recipient\" ng-click=\"formData.socials.splice($index, 1); dirty = true;\">\\n {{\\'COMMON.BTN_DELETE\\'|translate}}\\n </ion-option-button>\\n <ion-option-button class=\"button-info\" ng-if=\"!social.recipient\" ng-click=\"editSocialNetwork($index)\">\\n {{\\'COMMON.BTN_EDIT\\'|translate}}\\n </ion-option-button>\\n <ion-reorder-button class=\"ion-drag\" on-reorder=\"reorderSocialNetwork(social, $fromIndex, $toIndex)\">\\n </ion-reorder-button>\\n </ion-item>\\n</ion-list>\\n\\n<ion-list class=\"no-padding\">\\n <div class=\"item item-complex item-input-inset\">\\n <label class=\"item-input-wrapper\">\\n <input type=\"text\" style=\"width:100%\" placeholder=\"{{\\'PROFILE.SOCIAL_HELP\\'|translate}}\" id=\"socialUrl\" on-return=\"addSocialNetwork($event);\" ng-model=\"socialData.url\">\\n </label>\\n <button class=\"button button-small hidden-xs\" type=\"button\" ng-click=\"addSocialNetwork($event)\" translate>COMMON.BTN_ADD</button>\\n <button class=\"button button-small button-icon icon ion-android-add visible-xs\" type=\"button\" ng-click=\"addSocialNetwork($event)\">\\n </button>\\n </div>\\n\\n</ion-list>\\n');\n$templateCache.put('plugins/es/templates/common/item_comment_content.html','\\n<div class=\"item item-avatar done in\">\\n <span class=\"avatar\" ng-if=\"::!comment.avatar\" ng-class=\"::{\\'avatar-member\\': comment.uid, \\'avatar-wallet\\': !comment.uid}\"></span>\\n <span class=\"avatar\" ng-if=\"::comment.avatar\" style=\"background-image: url({{::comment.avatar.src}})\"></span>\\n\\n <a class=\"pull-left\" ui-sref=\"app.wot_identity({pubkey:comment.issuer, uid: comment.uid})\">\\n <span class=\"positive\" ng-if=\"::comment.uid\">\\n {{::comment.name||comment.uid}}\\n </span>\\n <span ng-if=\"::!comment.uid\" class=\"gray\">\\n <i class=\"icon ion-key gray\"></i>\\n {{::comment.name || (comment.issuer|formatPubkey)}}\\n </span>\\n </a>&nbsp;\\n <span trust-as-html=\"comment.html\"></span>\\n</div>\\n');\n$templateCache.put('plugins/es/templates/common/item_comment.html','<ng-init ng-init=\"level = level + 1\">\\n <a name=\"{{::comment.id|formatHash}}\"></a>\\n\\n <ion-item id=\"comment-{{::comment.id|formatHash}}\" class=\"card card-comment card-avatar stable-900-bg item-text-wrap no-padding\" ng-class=\"::{\\'in done\\': comment.isnew}\">\\n\\n <!-- Parent comment -->\\n <div class=\"card-header padding-left\" ng-if=\"comment.parent && !hideParent\">\\n <h5 class=\"gray underline\">\\n <ng-if ng-if=\"!comment.parent.issuer\">\\n {{\\'COMMENTS.REPLY_TO_DELETED_COMMENT\\'|translate}}\\n </ng-if>\\n <ng-if ng-if=\"comment.parent.issuer\">\\n <a ng-click=\"toggleExpandedParent(comment, $index)\">\\n {{\\'COMMENTS.REPLY_TO_LINK\\'|translate}}\\n <ng-if ng-if=\"::comment.parent.uid\">\\n {{::comment.parent.name||comment.parent.uid}}\\n </ng-if>\\n <ng-if ng-if=\"::!comment.parent.uid\">\\n <i class=\"ion-key\"></i>\\n {{::comment.parent.name|| (comment.parent.issuer|formatPubkey) }}\\n </ng-if>\\n </a>\\n <i ng-class=\"{\\'ion-arrow-down-b\\': !comment.expandedParent[$index], \\'ion-arrow-up-b\\': comment.expandedParent[$index]}\"></i>\\n </ng-if>\\n </h5>\\n <div class=\"padding-left\" ng-if=\"comment.expandedParent[$index]\">\\n <div class=\"card card-avatar card-avatar-small stable-bg item-text-wrap no-padding in done\">\\n <ng-include ng-init=\"comment = comment.parent\" src=\"\\'plugins/es/templates/common/item_comment_content.html\\'\">\\n </ng-include>\\n </div>\\n </div>\\n </div>\\n\\n <ng-include src=\"::\\'plugins/es/templates/common/item_comment_content.html\\'\"></ng-include>\\n\\n <div class=\"card-footer gray\">\\n <small class=\"underline\">\\n <a ng-click=\"share($event, comment, $index)\">{{comment.creationTime | formatFromNow}}</a>\\n\\n <ng-if ng-if=\"comment.replyCount\">\\n | <a class=\"dark\" ng-click=\"toggleExpandedReplies(comment, $index)\">{{\\'COMMENTS.REPLY_COUNT\\'|translate:comment}}</a>\\n <i ng-class=\"{\\'ion-arrow-down-b\\': !comment.showReplies, \\'ion-arrow-up-b\\': comment.showReplies}\"></i>\\n </ng-if>\\n </small>\\n\\n <div class=\"pull-right\">\\n <a class=\"ion-android-share-alt\" ng-click=\"share($event, comment)\">\\n </a>\\n <a class=\"ion-edit\" ng-if=\"isUserPubkey(comment.issuer)\" ng-click=\"edit(comment)\">\\n </a>\\n <a class=\"ion-trash-a\" ng-if=\"isUserPubkey(comment.issuer)\" ng-click=\"remove(comment, $index)\">\\n </a>\\n <a class=\"ion-reply\" ng-click=\"reply(comment)\">\\n {{::\\'COMMENTS.REPLY\\'|translate}}\\n </a>\\n </div>\\n </div>\\n </ion-item>\\n\\n <!-- replies -->\\n <div ng-if=\"comment.expandedReplies[$index]\" class=\"padding-left card-avatar-small expanded\" ng-init=\"hideParent=true\">\\n <ng-include ng-repeat=\"comment in comment.replies track by comment.id\" src=\"\\'plugins/es/templates/common/item_comment.html\\'\">\\n </ng-include>\\n </div>\\n\\n</ng-init>\\n');\n$templateCache.put('plugins/es/templates/common/item_location_search.html',' <!-- search text -->\\n <div class=\"item no-padding\">\\n <div class=\"item-input\">\\n <i class=\"icon ion-location placeholder-icon\"></i>\\n <input type=\"text\" placeholder=\"{{(options.location.help||\\'LOCATION.SEARCH_HELP\\')|translate}}\" ng-model-options=\"{ debounce: 350 }\" ng-model=\"search.location\" ng-keydown=\"onKeydown($event)\" ng-change=\"onLocationChanged()\" ng-blur=\"hideDropdown()\">\\n </div>\\n </div>\\n\\n <!-- dropdown -->\\n <ul class=\"item no-padding list dropdown-list\" ng-if=\"locations\" scroll=\"true\">\\n\\n <div ng-if=\"!locations.length\" class=\"item padding assertive\">\\n <span translate>COMMON.SEARCH_NO_RESULT</span>\\n </div>\\n\\n <a ng-repeat=\"res in locations\" class=\"item item-border-large item-text-wrap ink done in {{res.selected && \\'active\\' || \\'\\'}}\" ng-class=\"::{\\'item-divider\\': !res.address, \\'item-icon-left\\': res.address}\" ng-click=\"::res.address ? selectLocation(res) : false\">\\n\\n <!-- if divider -->\\n <h4 class=\"text-italic\" ng-if=\"::!res.address\" ng-bind-html=\"res.name\"></h4>\\n\\n <!-- if divider -->\\n <ng-if ng-if=\"::res.address\">\\n\\n <i class=\"icon ion-location\"></i>\\n\\n <h3 ng-if=\"res.address.road\">\\n {{::res.address.road}}\\n </h3>\\n <h3>\\n <span ng-if=\"res.address.postcode\">{{::res.address.postcode}}</span>\\n {{::res.address.city||res.address.village}}\\n <span class=\"gray\">| {{::res.address.country}}</span>\\n </h3>\\n <h5 class=\"gray\">\\n {{\\'LOCATION.MODAL.POSITION\\'|translate:res }}\\n </h5>\\n </ng-if>\\n\\n </a>\\n\\n </ul>\\n');\n$templateCache.put('plugins/es/templates/common/modal_category.html','<ion-modal-view>\\n <ion-header-bar class=\"bar-positive\">\\n <button class=\"button button-clear\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button>\\n <h1 class=\"title\">{{ (ctrl.title || \\'COMMON.CATEGORIES\\') | translate}}</h1>\\n </ion-header-bar>\\n\\n <ion-content class=\"categoryModal\">\\n\\n <div class=\"center padding\" ng-if=\"loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div class=\"list\">\\n <label class=\"item item-input\">\\n <i class=\"icon ion-search placeholder-icon\"></i>\\n <input type=\"text\" placeholder=\"{{\\'COMMON.CATEGORY_SEARCH_HELP\\'|translate}}\" ng-model=\"ctrl.searchText\" ng-model-options=\"{ debounce: 350 }\" ng-change=\"ctrl.doSearch()\">\\n </label>\\n\\n\\n <div ng-repeat=\"cat in categories\" class=\"item item-category item-text-wrap\" ng-class=\"{\\'item-divider\\': !cat.parent}\" ng-click=\"cat.parent ? closeModal(cat) : false\">\\n <h2 ng-bind-html=\"cat.name\"></h2>\\n </div>\\n </div>\\n </ion-content>\\n</ion-modal-view>\\n');\n$templateCache.put('plugins/es/templates/common/modal_edit_avatar.html','<ion-modal-view>\\n <ion-header-bar class=\"bar-positive\">\\n <button class=\"button button-clear visible-xs visible-sm\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button>\\n\\n <h1 class=\"title\" translate>PROFILE.MODAL_AVATAR.TITLE</h1>\\n\\n <button class=\"button button-clear icon-right visible-xs\" ng-click=\"doCrop()\" ng-disabled=\"formData.imageCropStep == 1\" ng-if=\"formData.imageCropStep <= 2\">\\n <span translate>COMMON.BTN_NEXT</span>\\n <i class=\"icon ion-ios-arrow-right\"></i>\\n </button>\\n <button class=\"button button-clear icon-right visible-xs\" ng-click=\"closeModal(formData.result)\" ng-if=\"formData.imageCropStep == 3\">\\n <i class=\"icon ion-android-done\"></i>\\n </button>\\n </ion-header-bar>\\n\\n <ion-content class=\"modal-avatar padding\">\\n\\n\\n <div ng-show=\"formData.imageCropStep == 1\">\\n\\n <p translate>PROFILE.MODAL_AVATAR.SELECT_FILE_HELP</p>\\n\\n <!-- Add picture drop zone -->\\n <div drop-zone=\"onFileChanged(file)\">\\n <div file-select=\"onFileChanged(file)\" accept=\"image/*\">\\n <i class=\"ion-image stable\" style=\"font-size:150px\"></i>\\n <b class=\"ion-plus gray\" style=\"position:relative; font-size:80px; top:-51px; right: 19px;\"></b>\\n <p class=\"gray\" translate>COMMON.CHOOSE_FILE</p>\\n </div>\\n </div>\\n </div>\\n\\n <div ng-show=\"formData.imageCropStep == 2\">\\n <p translate>PROFILE.MODAL_AVATAR.RESIZE_HELP</p>\\n\\n <!-- <image-crop\\n data-height=\"200\" //shape\\'s height\\n data-width=\"150\" //shape\\'s width\\n data-shape=\"square\" //the shape.. square or circle\\n data-step=\"imageCropStep\"//scope variable that will contain the current step of the crop (1. Waiting for source image; 2. Image loaded, waiting for crop; 3. Crop done)\\n src=\"imgSrc\" //scope variable that will be the source image for the crop (may be a Blob or base64 string)\\n data-result-blob=\"result\" //scope variable that will contain the Blob information\\n data-result=\"resultDataUrl\" //scope variable that will contain the image\\'s base64 string representation\\n crop=\"initCrop\" //scope variable that must be set to true when the image is ready to be cropped\\n padding=\"250\" //space, in pixels, rounding the shape\\n max-size=\"1024\" //max of the image, in pixels\\n ></image-crop> -->\\n\\n <div class=\"item card text-center padding ink\">\\n <image-crop data-height=\"200\" data-width=\"200\" data-shape=\"circle\" data-step=\"formData.imageCropStep\" src=\"formData.imgSrc\" data-result=\"formData.result\" data-result-blob=\"formData.resultBlob\" crop=\"formData.initCrop\" padding=\"150\" max-size=\"1024\">\\n </image-crop>\\n </div>\\n </div>\\n\\n <div ng-show=\"formData.imageCropStep == 3\">\\n <p translate>PROFILE.MODAL_AVATAR.RESULT_HELP</p>\\n\\n <div class=\"item card padding hero\" style=\"height: 110px;\">\\n <div class=\"content\">\\n <img class=\"avatar\" ng-src=\"{{formData.result|trustAsHtml}}\" style=\"height: 88px; width: 88px;\">\\n </div>\\n </div>\\n </div>\\n\\n <!-- buttons bar -->\\n <div class=\"padding hidden-xs text-right\">\\n <button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" ng-if=\"formData.imageCropStep <= 2\" translate>\\n COMMON.BTN_CANCEL\\n </button>\\n <button class=\"button button-stable icon-left ion-chevron-left ink\" ng-click=\"doPrevious()\" translate ng-if=\"formData.imageCropStep >= 2\">\\n COMMON.BTN_BACK\\n </button>\\n <button class=\"button button-calm icon-right ion-chevron-right ink\" ng-click=\"doCrop()\" translate ng-disabled=\"formData.imageCropStep === 1\" ng-if=\"formData.imageCropStep <= 2\">\\n COMMON.BTN_NEXT\\n </button>\\n <button class=\"button button-positive ink\" ng-click=\"closeModal(formData.result)\" translate ng-if=\"formData.imageCropStep === 3\">\\n COMMON.BTN_CONTINUE\\n </button>\\n </div>\\n\\n </ion-content>\\n</ion-modal-view>\\n');\n$templateCache.put('plugins/es/templates/common/modal_location.html','<ion-modal-view class=\"modal-full-height modal-search-location\">\\n <ion-header-bar class=\"bar-positive\">\\n <button class=\"button button-clear\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button>\\n <h1 class=\"title\" translate>LOCATION.MODAL.TITLE</h1>\\n </ion-header-bar>\\n\\n <ion-content class=\"padding no-padding-xs no-padding-sm\" scroll=\"true\">\\n\\n\\n <!-- search text -->\\n <div class=\"item item-input\">\\n <i class=\"icon ion-search placeholder-icon\"></i>\\n\\n <input type=\"text\" class=\"visible-xs visible-sm\" placeholder=\"{{\\'LOCATION.MODAL.SEARCH_HELP\\'|translate}}\" ng-model=\"search.text\" ng-model-options=\"{ debounce: 650 }\" ng-change=\"doSearch()\">\\n <input type=\"text\" class=\"hidden-xs hidden-sm\" placeholder=\"{{\\'LOCATION.MODAL.SEARCH_HELP\\'|translate}}\" ng-model=\"search.text\" on-return=\"doSearch()\">\\n </div>\\n\\n <div class=\"padding-top padding-xs\" style=\"display: block; height: 60px;\">\\n <div class=\"pull-left\" ng-if=\"!search.loading && search.results\">\\n <h4 translate>COMMON.RESULTS_LIST</h4>\\n </div>\\n\\n <div class=\"pull-right hidden-xs hidden-sm\">\\n <button class=\"button button-small button-stable ink\" ng-click=\"doSearch()\">\\n {{\\'COMMON.BTN_SEARCH\\' | translate}}\\n </button>\\n </div>\\n\\n </div>\\n\\n <div class=\"center padding\" ng-if=\"search.loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div ng-if=\"!search.loading && search.results && (!search.results.length || !search.results[0].address)\" class=\"assertive padding\">\\n <span translate>COMMON.SEARCH_NO_RESULT</span>\\n </div>\\n\\n <ion-list ng-if=\"!search.loading\" class=\"padding-top {{::motion.ionListClass}}\">\\n <div ng-repeat=\"res in search.results\" class=\"item item-border-large item-text-wrap ink\" ng-class=\"::{\\'item-divider\\': !res.address, \\'item-icon-left item-icon-right\\': res.address}\" ng-click=\"res.address ? closeModal(res) : false\">\\n\\n <!-- if divider -->\\n <h4 class=\"text-italic\" ng-if=\"::!res.address\" ng-bind-html=\"res.name\"></h4>\\n\\n <!-- if divider -->\\n <ng-if ng-if=\"::res.address\">\\n\\n <i class=\"icon ion-location\"></i>\\n\\n <h2 ng-if=\"res.address.road\">\\n {{::res.address.road}}\\n </h2>\\n <h3>\\n <span ng-if=\"res.address.postcode\">{{::res.address.postcode}}</span>\\n {{::res.address.city||res.address.village}}\\n <span class=\"gray\">| {{::res.address.country}}</span>\\n </h3>\\n <h5 class=\"gray\">\\n {{\\'LOCATION.MODAL.POSITION\\'|translate:res }}\\n </h5>\\n\\n <i class=\"icon ion-ios-arrow-right\"></i>\\n </ng-if>\\n\\n </div>\\n </ion-list>\\n </ion-content>\\n\\n <ion-footer-bar class=\"stable-bg padding-left padding-right block\" ng-if=\"license\">\\n <div class=\"pull-right copyright\">\\n <span class=\"dark\">\\xA9 </span>\\n <a class=\"positive\" href=\"{{license.url}}\" target=\"_blank\">{{license.name}}</a>\\n </div>\\n </ion-footer-bar>\\n</ion-modal-view>\\n');\n$templateCache.put('plugins/es/templates/common/popover_profile_extend.html',' <!-- profile -->\\n <button ng-if=\":state:enable && auth\" class=\"button button-positive button-small ink\" ng-click=\"showEditUserProfile()\">\\n {{\\'PROFILE.BTN_EDIT\\' | translate}}\\n </button>\\n\\n');\n$templateCache.put('plugins/es/templates/common/popup_report_abuse.html','<form name=\"abuseForm\" ng-submit=\"\">\\n <div class=\"list\" ng-init=\"setAbuseForm(abuseForm)\">\\n\\n <!-- reason -->\\n <label class=\"item item-input\" ng-class=\"{\\'item-input-error\\': abuseForm.$submitted && abuseForm.comment.$invalid}\">\\n <textarea class=\"padding\" style=\"background-color: transparent;\" name=\"comment\" type=\"text\" placeholder=\"{{\\'COMMON.REPORT_ABUSE.REASON_HELP\\' | translate}}\" rows=\"3\" ng-model=\"abuseData.comment\" ng-minlength=\"8\" required></textarea>\\n </label>\\n <div class=\"form-errors\" ng-if=\"abuseForm.$submitted && abuseForm.comment.$error\" ng-messages=\"abuseForm.comment.$error\">\\n <div class=\"form-error\" ng-message=\"required\">\\n <span translate=\"ERROR.FIELD_REQUIRED\"></span>\\n </div>\\n <div class=\"form-error\" ng-message=\"minlength\">\\n <span translate=\"ERROR.FIELD_TOO_SHORT\"></span>\\n </div>\\n </div>\\n\\n <div class=\"item item-toggle item-text-wrap dark\">\\n <div class=\"input-label\" translate>COMMON.REPORT_ABUSE.ASK_DELETE</div>\\n <label class=\"toggle toggle-royal\">\\n <input type=\"checkbox\" ng-model=\"abuseData.delete\">\\n <div class=\"track\">\\n <div class=\"handle\"></div>\\n </div>\\n </label>\\n </div>\\n </div>\\n</form>\\n\\n\\n');\n$templateCache.put('plugins/es/templates/common/view_comments.html','\\n<form class=\"comments\" ng-controller=\"ESCommentsCtrl\" ng-submit=\"save()\">\\n\\n <div class=\"item item-divider\">\\n <i class=\"icon ion-chatboxes\"></i>\\n <span translate>COMMENTS.DIVIDER</span>\\n <span class=\"gray\" ng-if=\"comments.total\">({{comments.total}})</span>\\n </div>\\n\\n <span class=\"item item-more-comments\" ng-if=\"comments.hasMore\">\\n <small><a ng-click=\"showMore()\" translate>COMMENTS.SHOW_MORE_COMMENTS</a></small>\\n </span>\\n\\n <div class=\"padding-right\">\\n <ng-repeat ng-repeat=\"comment in comments.result track by comment.id\" ng-include=\"::\\'plugins/es/templates/common/item_comment.html\\'\">\\n </ng-repeat>\\n </div>\\n\\n <div class=\"hidden-xs hidden-sm padding-right\">\\n <div class=\"card card-comment item item-input item-button-right\">\\n\\n <!-- reply to comment-->\\n <ng-if ng-if=\"formData.parent\">\\n <div class=\"padding card-header text-right pull-left\" translate>COMMENTS.REPLY_TO</div><br>\\n <div class=\"padding-left\">\\n <div class=\"card card-avatar card-avatar-small stable-900-bg item-text-wrap no-padding in done\">\\n <ng-include ng-if=\"formData.parent.message\" ng-init=\"comment = formData.parent\" src=\"\\'plugins/es/templates/common/item_comment_content.html\\'\">\\n </ng-include>\\n <div class=\"item dark done in gray\" ng-if=\"!formData.parent.message\">\\n {{::\\'COMMENTS.DELETED_COMMENT\\'|translate}}\\n </div>\\n <div class=\"card-footer text-right gray\">\\n <div class=\"pull-right\">\\n <a class=\"ion-close\" ng-click=\"removeParentLink()\">\\n {{::\\'COMMON.BTN_CANCEL\\'|translate}}\\n </a>\\n </div>\\n </div>\\n </div>\\n </div>\\n </ng-if>\\n <textarea class=\"padding\" style=\"background-color: transparent;\" id=\"comment-form-textarea\" rows=\"3\" placeholder=\"{{formData.replyTo ? \\'COMMENTS.COMMENT_HELP_REPLY_TO\\' : \\'COMMENTS.COMMENT_HELP\\'|translate}}\" ng-model=\"formData.message\" ng-keypress=\"onKeypress($event)\">\\n </textarea>\\n <div class=\"card-footer text-right\">\\n <button type=\"button\" class=\"button button-small button-small-padding\" ng-class=\"{\\'button-positive\\': formData.message.length}\" ng-if=\"!formData.id\" ng-click=\"save()\" translate>\\n COMMON.BTN_SEND\\n </button>\\n <!-- Edit buttons -->\\n <ng-if ng-if=\"formData.id\">\\n <button type=\"button\" class=\"button button-small button-small-padding\" ng-click=\"cancel()\" translate>\\n COMMON.BTN_CANCEL\\n </button>\\n <button type=\"button\" class=\"button button-small button-small-padding button-positive\" ng-click=\"save()\" translate>\\n COMMON.BTN_SAVE\\n </button>\\n </ng-if>\\n </div>\\n </div>\\n </div>\\n\\n <div class=\"visible-xs visible-sm\" style=\"margin-bottom\">\\n <div class=\"block\">\\n <!-- reply to comment-->\\n <div class=\"item item-input-inset done in\" ng-if=\"formData.parent\">\\n <div class=\"padding text-right pull-left\" translate>COMMENTS.REPLY_TO</div><br>\\n <div class=\"padding-left expanded\">\\n <div class=\"card card-comment stable-900-bg item-text-wrap no-padding in done\">\\n <ng-include ng-if=\"::formData.parent.message\" ng-init=\"comment = formData.parent\" src=\"\\'plugins/es/templates/common/item_comment_content.html\\'\">\\n </ng-include>\\n <span ng-if=\"::!formData.parent.message\" translate>\\n COMMENTS.DELETED_COMMENT\\n </span>\\n <div class=\"card-footer text-right gray\">\\n <div class=\"pull-right\">\\n <a class=\"ion-close\" ng-click=\"removeParentLink()\">\\n {{::\\'COMMON.BTN_CANCEL\\'|translate}}\\n </a>\\n </div>\\n </div>\\n </div>\\n </div>\\n </div>\\n\\n <div class=\"item item-input-inset\">\\n <div class=\"item-input-wrapper\">\\n <input type=\"text\" id=\"comment-form-input\" style=\"width: 100%\" placeholder=\"{{\\'COMMENTS.COMMENT_HELP\\'|translate}}\" on-return=\"save();\" ng-model=\"formData.message\">\\n <button type=\"submit\" class=\"button button-small button-small-padding button-icon button-dark button-icon gray\">\\n <i class=\"icon ion-android-send\"></i>\\n </button>\\n </div>\\n </div>\\n </div>\\n </div>\\n</form>\\n');\n$templateCache.put('plugins/es/templates/common/view_likes.html','\\n<div class=\"likes\">\\n\\n <!-- likes -->\\n <ng-if ng-if=\"likeData.likes && likeData.likes.total\">\\n <span ng-class=\"{\\'gray\\': !likeData.likes.wasHitCount, \\'positive\\': likeData.likes.wasHitCount}\">\\n <a title=\"{{\\'COMMON.LIKES_TEXT\\'|translate: likeData.likes }}\" ng-click=\"!canEdit && toggleLike($event, {kind: \\'like\\'})\">\\n {{likeData.likes.total}}\\n <i class=\"icon ion-heart\"></i>\\n </a>\\n </span>\\n </ng-if>\\n\\n <!-- abuses -->\\n <ng-if ng-if=\"likeData.abuses && likeData.abuses.total\">\\n <span class=\"gray\" ng-if=\"likeData.likes && likeData.likes.total\">&nbsp;|&nbsp;</span>\\n <a ng-class=\"{\\'assertive\\': likeData.abuses.wasHitCount}\" ng-click=\"!canEdit && reportAbuse($event)\" title=\"{{\\'COMMON.ABUSES_TEXT\\'|translate: likeData.abuses }}\">\\n {{likeData.abuses.total}}\\n <i class=\"icon ion-android-warning\"></i>\\n </a>\\n </ng-if>\\n</div>\\n');\n$templateCache.put('plugins/es/templates/common/view_pictures.html','<div class=\"item gallery done in\" ng-if=\"pictures && pictures.length>0\">\\n <div ng-repeat=\"picture in pictures\" class=\"item card card-gallery\">\\n <div class=\"ink\">\\n <h2 ng-if=\"picture.title\">{{::picture.title}}</h2>\\n <img ng-src=\"{{picture.src}}\">\\n </div>\\n </div>\\n</div>\\n');\n$templateCache.put('plugins/es/templates/currency/tab_blocks_extend.html','\\n<!-- Buttons section -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'nav-buttons\\'\">\\n\\n <button class=\"button button-icon button-clear icon ion-android-search visible-xs visible-sm\" ui-sref=\"app.blockchain_search\">\\n </button>\\n</ng-if>\\n');\n$templateCache.put('plugins/es/templates/document/item_document_comment.html','<ion-item id=\"doc-{{::doc.id}}\" class=\"item item-document item-document-comment item-icon-left ink {{::ionItemClass}} no-padding-top no-padding-bottom\" ng-class=\"{\\'compacted\\': compactMode}\" ng-click=\"selectDocument($event, doc)\">\\n\\n <i ng-show=\":rebind:!compactMode\" ng-if=\":rebind:!doc.avatar\" class=\"icon ion-ios-chatbubble-outline stable\"></i>\\n <i ng-show=\":rebind:!compactMode\" ng-if=\":rebind:doc.avatar\" class=\"avatar\" style=\"background-image: url(\\'{{:rebind:doc.avatar.src}}\\')\"></i>\\n\\n <div class=\"row no-padding\">\\n <div class=\"col\">\\n <h4>\\n <i class=\"ion-ios-chatbubble-outline dark\"></i>\\n <span class=\"gray\" ng-if=\":rebind:doc.name\">\\n <i class=\"ion-person\" ng-show=\":rebind:!compactMode\"></i>\\n {{:rebind:doc.name}}:\\n </span>\\n <span class=\"dark\">\\n <i class=\"ion-quote\" ng-if=\":rebind:!compactMode\"></i>\\n {{:rebind:doc.message|truncText:50}}\\n </span>\\n </h4>\\n <h4 class=\"gray\"> <i class=\"ion-clock\"></i> {{:rebind:doc.time|formatDate}}</h4>\\n </div>\\n\\n <div class=\"col\">\\n <h3>\\n <a ui-sref=\"app.wot_identity({pubkey: doc.pubkey, uid: doc.name})\">\\n\\n </a>\\n </h3>\\n </div>\\n\\n <div class=\"col\" ng-if=\":rebind:!compactMode\">\\n <a ng-if=\":rebind:login && doc.pubkey==walletData.pubkey\" ng-click=\"remove($event, $index)\" class=\"gray pull-right hidden-xs hidden-sm\" title=\"{{\\'DOCUMENT.LOOKUP.BTN_REMOVE\\'|translate}}\">\\n <i class=\"ion-trash-a\"></i>\\n </a>\\n </div>\\n\\n </div>\\n</ion-item>\\n');\n$templateCache.put('plugins/es/templates/document/item_document_page.html','<ion-item id=\"doc-{{::doc.id}}\" class=\"item item-document item-icon-left ink {{::ionItemClass}} no-padding-top no-padding-bottom\" ng-class=\"{\\'positive-100-bg\\': doc.updated}\" ng-click=\"selectDocument($event, doc)\">\\n\\n <i ng-if=\":rebind:doc.thumbnail\" class=\"avatar\" style=\"background-image: url({{:rebind:doc.thumbnail.src}})\"></i>\\n <i ng-if=\":rebind:!doc.thumbnail\" class=\"avatar icon dark cion-registry-{{doc.docType}}\"></i>\\n\\n <div class=\"row no-padding\">\\n <div class=\"col\">\\n <h3 ng-if=\"doc.title\">\\n {{:rebind:doc.title}}\\n </h3>\\n <h4>\\n <span class=\"dark\" ng-if=\":rebind:doc.picturesCount > 1\">\\n <i class=\"ion-camera\"></i> {{:rebind:doc.picturesCount}}\\n </span>\\n <span class=\"dark\" ng-if=\":rebind:doc.city\">\\n <i class=\"ion-location\"></i> {{:rebind:doc.city}}\\n </span>\\n <span class=\"gray\" ng-if=\":rebind:doc.name\">\\n <i class=\"ion-person\"></i> {{:rebind:doc.name}}\\n </span>\\n </h4>\\n </div>\\n\\n <div class=\"col col-33\">\\n <small class=\"gray pull-right\"><i class=\"ion-clock\"></i> {{:rebind:doc.time|formatDate}}\\n </small>\\n <a ng-if=\":rebind:login && doc.pubkey==walletData.pubkey\" ng-click=\"remove($event, $index)\" class=\"gray pull-right hidden-xs hidden-sm\" title=\"{{\\'DOCUMENT.LOOKUP.BTN_REMOVE\\'|translate}}\">\\n <i class=\"ion-trash-a\"></i>\\n </a>\\n </div>\\n\\n </div>\\n</ion-item>\\n');\n$templateCache.put('plugins/es/templates/document/item_document_profile.html','<ion-item id=\"doc-{{::doc.id}}\" class=\"item item-document item-icon-left ink {{::ionItemClass}} no-padding-top no-padding-bottom\" ng-class=\"{\\'compacted\\': compactMode}\" ng-click=\"selectDocument($event, doc)\">\\n\\n <i ng-show=\":rebind:!compactMode\" ng-if=\":rebind:doc.avatar\" class=\"avatar\" style=\"background-image: url({{:rebind:doc.avatar.src}})\"></i>\\n <i ng-show=\":rebind:!compactMode\" ng-if=\":rebind:!doc.avatar\" class=\"icon ion-person stable\"></i>\\n\\n <div class=\"row no-padding\">\\n <div class=\"col\">\\n <h4 ng-if=\":rebind:doc.title\">\\n <i class=\"ion-person gray\"></i>\\n <span class=\"dark\">\\n {{:rebind:doc.title}}\\n </span>\\n <span class=\"gray\">\\n {{:rebind:\\'DOCUMENT.LOOKUP.HAS_CREATE_OR_UPDATE_PROFILE\\' |translate}}\\n </span>\\n </h4>\\n <h4>\\n <span class=\"dark\" ng-if=\":rebind:doc.city\">\\n <i class=\"ion-location\"></i> {{:rebind:doc.city}}\\n </span>\\n <span class=\"gray\">\\n <i class=\"ion-clock\"></i> {{:rebind:doc.time|formatDate}}\\n </span>\\n </h4>\\n </div>\\n\\n <div class=\"col\" ng-if=\":rebind:!compactMode\">\\n <a ng-if=\":rebind:login && doc.pubkey==walletData.pubkey\" ng-click=\"remove($event, $index)\" class=\"gray pull-right\" title=\"{{\\'DOCUMENT.LOOKUP.BTN_REMOVE\\'|translate}}\">\\n <i class=\"ion-trash-a\"></i>\\n </a>\\n </div>\\n\\n </div>\\n</ion-item>\\n');\n$templateCache.put('plugins/es/templates/document/item_document.html','<ion-item id=\"doc-{{::doc.id}}\" class=\"item item-document item-icon-left ink {{::ionItemClass}} no-padding-top no-padding-bottom\" ng-click=\"selectDocument($event, doc)\">\\n\\n <i class=\"icon ion-document stable\" ng-if=\":rebind:!doc.avatar\"></i>\\n <i class=\"avatar\" ng-if=\":rebind:doc.avatar\" style=\"background-image: url(\\'{{:rebind:doc.avatar.src}}\\')\"></i>\\n\\n <div class=\"row no-padding\">\\n <div class=\"col\">\\n <h3 class=\"dark\">\\n <i class=\"ion-locked\" ng-if=\":rebind:doc.nonce\"></i>\\n {{:rebind:doc.time|formatDate}}</h3>\\n <h4 class=\"gray\">{{:rebind:\\'DOCUMENT.HASH\\'|translate}} {{:rebind:doc.hash|formatHash}}</h4>\\n </div>\\n\\n <div class=\"col\">\\n <h3>\\n <a ui-sref=\"app.wot_identity({pubkey: doc.pubkey, uid: doc.uid})\">\\n <span class=\"gray\">\\n <i class=\"ion-key\"></i> {{:rebind:doc.pubkey|formatPubkey}}\\n </span>\\n <span class=\"positive\" ng-if=\":rebind:doc.uid\">\\n <i class=\"ion-person\"></i> {{:rebind:doc.name||doc.uid}}\\n </span>\\n </a>\\n </h3>\\n </div>\\n\\n <div class=\"col\">\\n <a ng-if=\":rebind:login && doc.pubkey==walletData.pubkey\" ng-click=\"remove($index)\" class=\"gray pull-right\" title=\"{{\\'DOCUMENT.LOOKUP.BTN_REMOVE\\'|translate}}\">\\n <i class=\"ion-trash-a\"></i>\\n </a>\\n <h3 ng-if=\":rebind:doc.recipient\">\\n <a ui-sref=\"app.wot_identity({pubkey: doc.recipient.pubkey, uid: doc.recipient.uid})\">\\n <span class=\"gray\">\\n <i class=\"ion-key\"></i> {{:rebind:doc.recipient.pubkey|formatPubkey}}\\n </span>\\n <span class=\"positive\" ng-if=\":rebind:doc.recipient.uid\">\\n <i class=\"ion-person\"></i> {{:rebind:doc.recipient.name||doc.recipient.uid}}\\n </span>\\n </a>\\n </h3>\\n <h4 class=\"gray\" ng-if=\":rebind:doc.read_signature\">\\n <i class=\"ion-checkmark\"></i>\\n <span translate>DOCUMENT.LOOKUP.READ</span>\\n </h4>\\n\\n </div>\\n\\n </div>\\n</ion-item>\\n');\n$templateCache.put('plugins/es/templates/document/items_documents.html','\\n<div class=\"item row row-header done in hidden-xs hidden-sm\" ng-if=\"showHeaders\">\\n\\n <a class=\"no-padding dark col col-header\" ng-if=\":rebind:expertMode\" ng-click=\"toggleSort(\\'time\\')\">\\n <cs-sort-icon asc=\"search.asc\" sort=\"search.sort\" toggle=\"\\'time\\'\"></cs-sort-icon>\\n {{\\'DOCUMENT.LOOKUP.HEADER_TIME\\' | translate}}\\n </a>\\n <a class=\"no-padding dark col col-header\" ng-if=\":rebind:expertMode\" ng-click=\"toggleSort(\\'issuer\\')\">\\n <cs-sort-icon asc=\"search.asc\" sort=\"search.sort\" toggle=\"\\'issuer\\'\"></cs-sort-icon>\\n {{\\'DOCUMENT.LOOKUP.HEADER_ISSUER\\' | translate}}\\n </a>\\n <a class=\"no-padding dark col col-header\" ng-if=\":rebind:expertMode\" ng-click=\"toggleSort(\\'recipient\\')\">\\n <cs-sort-icon asc=\"search.asc\" sort=\"search.sort\" toggle=\"\\'recipient\\'\"></cs-sort-icon>\\n {{\\'DOCUMENT.LOOKUP.HEADER_RECIPIENT\\' | translate}}\\n </a>\\n</div>\\n\\n<div class=\"padding gray\" ng-if=\":rebind:!search.loading && !search.results.length\" translate>\\n COMMON.SEARCH_NO_RESULT\\n</div>\\n\\n<!-- for each doc -->\\n<ng-repeat ng-repeat=\"doc in :rebind:search.results track by doc.id\" ng-switch on=\"doc.type\">\\n <div ng-switch-when=\"comment\">\\n <ng-include src=\"::\\'plugins/es/templates/document/item_document_comment.html\\'\"></ng-include>\\n </div>\\n <div ng-switch-when=\"profile\">\\n <ng-include src=\"::\\'plugins/es/templates/document/item_document_profile.html\\'\"></ng-include>\\n </div>\\n <div ng-switch-when=\"record\">\\n <ng-include ng-if=\"doc.index === \\'page\\'\" src=\"::\\'plugins/es/templates/document/item_document_page.html\\'\"></ng-include>\\n <ng-include ng-if=\"doc.index !== \\'page\\'\" src=\"::\\'plugins/es/templates/document/item_document.html\\'\"></ng-include>\\n </div>\\n <div ng-switch-default>\\n <ng-include src=\"::\\'plugins/es/templates/document/item_document.html\\'\"></ng-include>\\n </div>\\n</ng-repeat>\\n');\n$templateCache.put('plugins/es/templates/document/list_documents.html','\\n<ion-list class=\"list\" ng-class=\"::motion.ionListClass\">\\n\\n <ng-include src=\"::\\'plugins/es/templates/document/items_documents.html\\'\"></ng-include>\\n\\n</ion-list>\\n\\n<ion-infinite-scroll ng-if=\"!search.loading && search.hasMore\" spinner=\"android\" on-infinite=\"showMore()\" distance=\"1%\">\\n</ion-infinite-scroll>\\n');\n$templateCache.put('plugins/es/templates/document/lookup_form.html','<div class=\"lookupForm\">\\n\\n\\n <div class=\"item no-padding\">\\n\\n <!--<div class=\"button button-small button-text button-stable button-icon-event padding no-padding-right ink\"\\n ng-repeat=\"filter in search.filters\" ng-if=\"filter\">\\n <span ng-bind-html=\"\\'DOCUMENT.LOOKUP.TX_SEARCH_FILTER.\\'+filter.type|translate:filter\"></span>\\n <i class=\"icon ion-close\" ng-click=\"itemRemove($index)\"></i>\\n\\n </div>-->\\n\\n <label class=\"item-input\">\\n <i class=\"icon ion-search placeholder-icon\"></i>\\n <input type=\"text\" class=\"visible-xs visible-sm\" placeholder=\"{{\\'DOCUMENT.LOOKUP.SEARCH_HELP\\'|translate}}\" ng-model=\"search.text\" ng-model-options=\"{ debounce: 650 }\" ng-change=\"doSearchText()\">\\n <input type=\"text\" class=\"hidden-xs hidden-sm\" id=\"{{searchTextId}}\" placeholder=\"{{\\'DOCUMENT.LOOKUP.SEARCH_HELP\\'|translate}}\" ng-model=\"search.text\" on-return=\"doSearchText()\">\\n <div class=\"helptip-anchor-center\">\\n <a id=\"{{helptipPrefix}}-search-text\"></a>\\n </div>\\n\\n </label>\\n </div>\\n\\n\\n <div class=\"padding-top padding-xs\" style=\"display: block; height: 60px;\">\\n <div class=\"pull-left\">\\n <h4 ng-if=\"search.last\" translate>\\n DOCUMENT.LOOKUP.LAST_DOCUMENTS\\n </h4>\\n <h4 ng-if=\"!search.last\">\\n {{\\'COMMON.RESULTS_LIST\\'|translate}}\\n </h4>\\n <h5 class=\"dark\" ng-if=\"!search.loading && search.total\">\\n <span translate=\"COMMON.RESULTS_COUNT\" translate-values=\"{count: search.total}\"></span>\\n <small class=\"gray\" ng-if=\":rebind:search.took && expertMode\">\\n - {{:rebind:\\'COMMON.EXECUTION_TIME\\'|translate: {duration: search.took} }}\\n </small>\\n <small class=\"gray\" ng-if=\":rebind:expertMode && search.filters && search.filters.length\">\\n - <a ng-click=\"toggleShowQuery()\" ng-if=\"!showQuery\">\\n <span translate>DOCUMENT.LOOKUP.SHOW_QUERY</span>\\n <i class=\"icon ion-arrow-down-b gray\"></i>\\n </a>\\n <a ng-click=\"toggleShowQuery()\" ng-if=\"showQuery\">\\n <span translate>DOCUMENT.LOOKUP.HIDE_QUERY</span>\\n <i class=\"icon ion-arrow-up-b gray\"></i>\\n </a>\\n </small>\\n </h5>\\n <h5 class=\"gray\" ng-if=\"search.loading\">\\n <ion-spinner class=\"icon ion-spinner-small\" icon=\"android\"></ion-spinner>\\n <span translate>COMMON.SEARCHING</span>\\n <br>\\n </h5>\\n </div>\\n\\n <div class=\"pull-right hidden-xs hidden-sm\">\\n <a class=\"button button-text button-small ink\" ng-if=\"login\" ng-click=\"showActionsPopover($event)\">\\n {{\\'DOCUMENT.LOOKUP.BTN_ACTIONS\\' | translate}}\\n <i class=\"icon ion-arrow-down-b\"></i>\\n </a>\\n &nbsp;\\n <button class=\"button button-small button-stable ink\" ng-click=\"doSearchText()\">\\n {{\\'COMMON.BTN_SEARCH\\' | translate:search}}\\n </button>\\n </div>\\n </div>\\n\\n <div class=\"item no-border no-padding\" ng-if=\":rebind:search.filters && search.filters.length && expertMode\">\\n <small class=\"no-padding no-margin\" ng-if=\"showQuery\">\\n <span class=\"gray text-wrap dark\">{{:rebind:search.query}}</span>\\n </small>\\n </div>\\n\\n <ion-list class=\"list\" ng-class=\"::motion.ionListClass\">\\n\\n <ng-include src=\"::\\'plugins/es/templates/document/items_documents.html\\'\"></ng-include>\\n\\n </ion-list>\\n\\n <ion-infinite-scroll ng-if=\"search.hasMore\" spinner=\"android\" on-infinite=\"showMore()\" distance=\"1%\">\\n </ion-infinite-scroll>\\n\\n</div>');\n$templateCache.put('plugins/es/templates/document/lookup_popover_actions.html','<ion-popover-view class=\"fit has-header\">\\n <ion-header-bar>\\n <h1 class=\"title\" translate>DOCUMENT.LOOKUP.POPOVER_ACTIONS.TITLE</h1>\\n </ion-header-bar>\\n <ion-content scroll=\"false\">\\n <div class=\"list item-text-wrap\">\\n <a class=\"item item-icon-left assertive ink\" ng-class=\"{\\'gray\\': !search.total}\" ng-click=\"removeAll()\">\\n <i class=\"icon ion-trash-a\"></i>\\n {{\\'DOCUMENT.LOOKUP.POPOVER_ACTIONS.REMOVE_ALL\\' | translate}}\\n </a>\\n </div>\\n </ion-content>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/es/templates/document/lookup.html','<ion-view>\\n <ion-nav-title>\\n <span translate>DOCUMENT.LOOKUP.TITLE</span>\\n </ion-nav-title>\\n\\n <ion-nav-buttons side=\"secondary\">\\n\\n <button class=\"button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm\" ng-click=\"showActionsPopover($event)\">\\n </button>\\n\\n </ion-nav-buttons>\\n\\n <ion-content class=\"padding no-padding-xs no-padding-sm\" scroll=\"true\">\\n\\n <ng-include src=\"::\\'plugins/es/templates/document/lookup_form.html\\'\"></ng-include>\\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/group/edit_group.html','<ion-view left-buttons=\"leftButtons\">\\n <ion-nav-title>\\n <span class=\"visible-xs\" ng-if=\"id\" ng-bind-html=\"formData.title\"></span>\\n <span class=\"visible-xs\" ng-if=\"!loading && !id\" translate>GROUP.EDIT.TITLE_NEW</span>\\n </ion-nav-title>\\n\\n <ion-nav-buttons side=\"secondary\">\\n <button class=\"button button-icon button-clear visible-xs visible-sm\" ng-class=\"{\\'ion-android-send\\':!id, \\'ion-android-done\\': id}\" ng-click=\"save()\">\\n </button>\\n </ion-nav-buttons>\\n\\n <ion-content scroll=\"true\">\\n <div class=\"row no-padding\">\\n\\n <div class=\"col col-20 hidden-xs hidden-sm\">&nbsp;</div>\\n\\n <div class=\"col\">\\n <!-- loading -->\\n <div class=\"center padding\" ng-if=\"loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <form name=\"recordForm\" novalidate=\"\" ng-submit=\"save()\">\\n\\n <!-- -->\\n <div class=\"list\" ng-class=\"motion.ionListClass\" ng-init=\"setForm(recordForm)\">\\n\\n <div class=\"item hidden-xs\">\\n <h1 ng-if=\"id\" ng-bind-html=\"formData.title\"></h1>\\n <h1 ng-if=\"!id\" translate>GROUP.EDIT.TITLE_NEW</h1>\\n <h2 class=\"balanced\" ng-if=\"!id\">\\n <i class=\"icon ion-android-people\"></i>\\n <i class=\"icon ion-android-lock\" ng-if=\"formData.type==\\'managed\\'\"></i>\\n {{\\'GROUP.TYPE.ENUM.\\'+formData.type|upper|translate}}\\n </h2>\\n </div>\\n <div class=\"item\" ng-if=\"id\">\\n <h4 class=\"gray\">\\n <i class=\"icon ion-calendar\"></i>\\n {{\\'COMMON.LAST_MODIFICATION_DATE\\'|translate}}&nbsp;{{formData.time | formatDate}}\\n </h4>\\n <div class=\"badge badge-balanced badge-editable\" ng-click=\"showRecordTypeModal()\">\\n {{\\'GROUP.TYPE.ENUM.\\'+formData.type|upper|translate}}\\n </div>\\n </div>\\n\\n <!-- pictures -->\\n <ng-include src=\"::\\'plugins/es/templates/common/edit_pictures.html\\'\"></ng-include>\\n\\n <div class=\"item item-divider\" translate>GROUP.GENERAL_DIVIDER</div>\\n\\n <!-- title -->\\n <div class=\"item item-input item-floating-label\" ng-class=\"{\\'item-input-error\\': form.$submitted && form.title.$invalid}\">\\n <span class=\"input-label\" translate>GROUP.EDIT.RECORD_TITLE</span>\\n <input type=\"text\" placeholder=\"{{\\'GROUP.EDIT.RECORD_TITLE_HELP\\'|translate}}\" name=\"title\" id=\"group-record-title\" ng-model=\"formData.title\" ng-minlength=\"3\" ng-required=\"true\">\\n </div>\\n <div class=\"form-errors\" ng-if=\"form.$submitted && form.title.$error\" ng-messages=\"form.title.$error\">\\n <div class=\"form-error\" ng-message=\"required\">\\n <span translate=\"ERROR.FIELD_REQUIRED\"></span>\\n </div>\\n <div class=\"form-error\" ng-message=\"minlength\">\\n <span translate=\"ERROR.FIELD_TOO_SHORT\"></span>\\n </div>\\n </div>\\n\\n <!-- description -->\\n <div class=\"item item-input item-floating-label\">\\n <span class=\"input-label\" translate>GROUP.EDIT.RECORD_DESCRIPTION</span>\\n <textarea placeholder=\"{{\\'GROUP.EDIT.RECORD_DESCRIPTION_HELP\\'|translate}}\" ng-model=\"formData.description\" rows=\"8\" cols=\"10\">\\n </textarea>\\n </div>\\n\\n <!-- social networks -->\\n <ng-include src=\"::\\'plugins/es/templates/common/edit_socials.html\\'\" ng-controller=\"ESSocialsEditCtrl\"></ng-include>\\n\\n </div>\\n\\n <div class=\"padding hidden-xs hidden-sm text-right\">\\n <button class=\"button button-clear button-dark ink\" ng-click=\"cancel()\" type=\"button\" translate>\\n COMMON.BTN_CANCEL\\n </button>\\n <button class=\"button button-positive button-raised ink\" type=\"submit\" ng-if=\"!id\" translate>\\n COMMON.BTN_PUBLISH\\n </button>\\n <button class=\"button button-assertive button-raised ink\" type=\"submit\" ng-if=\"id\" translate>\\n COMMON.BTN_SAVE\\n </button>\\n </div>\\n </form>\\n </div>\\n\\n <div class=\"col col-20 hidden-xs hidden-sm\">&nbsp;</div>\\n\\n </div>\\n \\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/group/item_group.html','<a name=\"group-{{:rebind:group.hash}}\"></a>\\n<div id=\"group-{{:rebind:group.hash}}\" class=\"item item-icon-right item-avatar {{::ionItemClass}} ink\" ng-click=\"select(group)\">\\n\\n <i class=\"item-image avatar\" style=\"background-image: url({{::group.avatar.src}})\" ng-if=\"group.avatar\"></i>\\n <i class=\"item-image icon ion-android-people\" ng-if=\"!group.avatar\"></i>\\n <i class=\"item-image icon-secondary ion-android-lock\" ng-if=\"!group.avatar\" style=\"left: 20px; top: 17px; font-size: 19px; color: #d9d9d9;\"></i>\\n\\n <h2 ng-bind-html=\":rebind:group.title\"></h2>\\n\\n <!-- creation time-->\\n <h4 class=\"gray pull-right\">\\n <i class=\"ion-clock\"></i>\\n {{:rebind:\\'GROUP.CREATED_TIME\\'|translate: group }}\\n </h4>\\n\\n <!-- membersCount -->\\n <h4 class=\"dark pull-left\" ng-if=\":rebind:group.membersCount\">\\n <i class=\"dark ion-person\"></i>\\n <span class=\"dark\">+{{:rebind:group.membersCount}}</span>\\n </h4>\\n\\n <i class=\"icon ion-ios-arrow-right\"></i>\\n</div>\\n');\n$templateCache.put('plugins/es/templates/group/items_groups.html','\\n\\n<div class=\"item row row-header hidden-xs hidden-sm\" ng-if=\"expertMode\">\\n\\n <a class=\"no-padding dark col col-header\" ng-click=\"toggleSort(\\'medianTime\\')\">\\n <cs-sort-icon asc=\"search.asc\" sort=\"search.sort\" toggle=\"\\'medianTime\\'\"></cs-sort-icon>\\n {{\\'GROUP.LOOKUP.HEADER_CREATION_TIME\\' | translate}}\\n </a>\\n <a class=\"no-padding dark col col-header\" ng-click=\"toggleSort(\\'issuer\\')\">\\n <cs-sort-icon asc=\"search.asc\" sort=\"search.sort\" toggle=\"\\'issuer\\'\"></cs-sort-icon>\\n {{\\'GROUP.LOOKUP.HEADER_ISSUER\\' | translate}}\\n </a>\\n <div class=\"col col-20\">&nbsp;\\n </div>\\n <a class=\"no-padding dark col col-20 col-header\" ng-click=\"toggleSort(\\'number\\')\">\\n <cs-sort-icon asc=\"search.asc\" sort=\"search.sort\" toggle=\"\\'number\\'\"></cs-sort-icon>\\n {{\\'GROUP.LOOKUP.HEADER_NAME\\' | translate}}\\n </a>\\n</div>\\n\\n<div class=\"padding gray\" ng-if=\":rebind:!search.loading && !search.results.length\" translate>\\n COMMON.SEARCH_NO_RESULT\\n</div>\\n\\n<ng-repeat ng-repeat=\"group in :rebind:search.results\" ng-include=\"::\\'plugins/es/templates/group/item_group.html\\'\">\\n</ng-repeat>\\n');\n$templateCache.put('plugins/es/templates/group/list.html','<ion-list class=\"{{::motion.ionListClass}}\">\\n\\n <ion-item ng-repeat=\"notification in search.results\" class=\"item-border-large item-text-wrap ink item-avatar\" ng-class=\"{\\'unread\\': !notification.read}\" ng-click=\"select(notification)\">\\n\\n <i ng-if=\"!notification.avatar\" class=\"item-image icon {{::notification.avatarIcon}}\"></i>\\n <i ng-if=\"notification.avatar\" class=\"item-image avatar\" style=\"background-image: url({{::notification.avatar.src}})\"></i>\\n\\n <h3 trust-as-html=\"notification.message | translate:notification\"></h3>\\n <h4>\\n <i class=\"icon {{notification.icon}}\"></i>&thinsp;<span class=\"dark\">{{notification.time|formatFromNow}}</span>\\n <span class=\"gray\">| {{notification.time|formatDate}}</span>\\n </h4>\\n </ion-item>\\n</ion-list>\\n\\n<ion-infinite-scroll ng-if=\"!search.loading && search.hasMore\" spinner=\"android\" on-infinite=\"showMore()\" distance=\"1%\">\\n</ion-infinite-scroll>\\n');\n$templateCache.put('plugins/es/templates/group/lookup_form.html','<div class=\"lookupForm\">\\n\\n <button class=\"button button-small button-positive button-clear ink pull-right padding-right hidden-sm hidden-xs\" ng-click=\"showNewRecordModal()\">\\n <i class=\"icon ion-plus\"></i>\\n {{\\'GROUP.LOOKUP.BTN_NEW\\' | translate}}\\n </button>\\n\\n <!-- search text-->\\n <label class=\"item item-input\">\\n <i class=\"icon ion-search placeholder-icon\"></i>\\n <input type=\"text\" class=\"visible-xs visible-sm\" placeholder=\"{{\\'GROUP.LOOKUP.SEARCH_HELP\\'|translate}}\" ng-model=\"search.text\" ng-model-options=\"{ debounce: 650 }\" ng-change=\"doSearchText()\">\\n <input type=\"text\" class=\"hidden-xs hidden-sm\" id=\"{{searchTextId}}\" placeholder=\"{{\\'GROUP.LOOKUP.SEARCH_HELP\\'|translate}}\" ng-model=\"search.text\" on-return=\"doSearchText()\">\\n <div class=\"helptip-anchor-center\">\\n <a id=\"helptip-group-search-text\"></a>\\n </div>\\n\\n </label>\\n\\n <div class=\"padding-top padding-xs\" style=\"display: block; height: 60px;\">\\n <div class=\"pull-left\">\\n <h4 ng-if=\"search.type==\\'open\\'\" translate>\\n GROUP.LOOKUP.OPEN_RESULTS_LIST\\n </h4>\\n <h4 ng-if=\"search.type==\\'last\\'\" translate>\\n GROUP.LOOKUP.LAST_RESULTS_LIST\\n </h4>\\n <h4 ng-if=\"search.type==\\'managed\\'\" translate>\\n GROUP.LOOKUP.MANAGED_RESULTS_LIST\\n </h4>\\n <h4 ng-if=\"search.type==\\'text\\'\">\\n {{\\'COMMON.RESULTS_LIST\\'|translate}}\\n </h4>\\n <h5 class=\"dark\" ng-if=\"!search.loading && search.total\">\\n <span translate=\"COMMON.RESULTS_COUNT\" translate-values=\"{count: search.total}\"></span>\\n <small class=\"gray\" ng-if=\":rebind:search.took && expertMode\">\\n - {{:rebind:\\'COMMON.EXECUTION_TIME\\'|translate: {duration: search.took} }}\\n </small>\\n </h5>\\n <h5 class=\"gray\" ng-if=\"search.loading\">\\n <ion-spinner class=\"icon ion-spinner-small\" icon=\"android\"></ion-spinner>\\n <span translate>COMMON.SEARCHING</span>\\n <br>\\n </h5>\\n </div>\\n\\n <div class=\"pull-right hidden-xs hidden-sm\">\\n <a ng-if=\"enableFilter\" class=\"button button-text button-small ink icon ion-clock\" ng-class=\"{\\'button-text-positive\\': search.type==\\'last\\'}\" ng-click=\"doSearchLast()\">\\n {{\\'GROUP.LOOKUP.BTN_LAST\\' | translate}}\\n </a>\\n &nbsp;\\n <button class=\"button button-small button-stable ink\" ng-click=\"doSearchText()\">\\n {{\\'COMMON.BTN_SEARCH\\' | translate:search}}\\n </button>\\n </div>\\n </div>\\n\\n <div class=\"list {{::motion.ionListClass}}\" ng-if=\"!$scope.search.loading\">\\n\\n <ng-include src=\"::\\'plugins/es/templates/group/items_groups.html\\'\"></ng-include>\\n\\n </div>\\n\\n <ion-infinite-scroll ng-if=\"search.hasMore\" spinner=\"android\" on-infinite=\"showMore()\" distance=\"1%\">\\n </ion-infinite-scroll>\\n\\n</div>');\n$templateCache.put('plugins/es/templates/group/lookup_item.html','\\n <i class=\"item-image avatar\" style=\"background-image: url({{::item.avatar.src}})\" ng-if=\"item.avatar\"></i>\\n <i class=\"item-image icon ion-android-people\" ng-if=\"!item.avatar\"></i>\\n <i class=\"item-image icon-secondary ion-android-lock\" ng-if=\"!item.avatar\" style=\"left: 20px; top: 17px; font-size: 19px; color: #d9d9d9;\"></i>\\n\\n <h2 ng-bind-html=\":rebind:item.title\"></h2>\\n\\n <!-- creation time-->\\n <h4 class=\"gray pull-right\">\\n <i class=\"ion-clock\"></i>\\n {{:rebind:\\'GROUP.CREATED_TIME\\'|translate: item }}\\n </h4>\\n\\n <!-- membersCount -->\\n <h4 class=\"dark pull-left\" ng-if=\":rebind:item.membersCount\">\\n <i class=\"dark ion-person\"></i>\\n <span class=\"dark\">+{{:rebind:item.membersCount}}</span>\\n </h4>\\n');\n$templateCache.put('plugins/es/templates/group/lookup.html','<ion-view class=\"view-group\">\\n <ion-nav-title>\\n <span translate>GROUP.LOOKUP.TITLE</span>\\n </ion-nav-title>\\n\\n <ion-nav-buttons side=\"secondary\">\\n\\n <button class=\"button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm\" ng-click=\"showActionsPopover($event)\">\\n </button>\\n\\n </ion-nav-buttons>\\n\\n <ion-content class=\"padding no-padding-xs no-padding-sm\" scroll=\"true\">\\n <ng-include src=\"::\\'plugins/es/templates/group/lookup_form.html\\'\"></ng-include>\\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/group/modal_record_type.html','<ion-modal-view>\\n <ion-header-bar class=\"bar-positive\">\\n <button class=\"button button-clear\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button>\\n <h1 class=\"title\" translate>GROUP.TYPE.TITLE</h1>\\n </ion-header-bar>\\n\\n <ion-content class=\"lookupForm padding\">\\n <h3 translate>GROUP.TYPE.SELECT_TYPE</h3>\\n\\n \\t<div class=\"list\">\\n\\n <!-- open group -->\\n <div class=\"item item-complex card stable-bg item-icon-left ink\" ng-click=\"closeModal(\\'open\\')\">\\n <div class=\"item-content item-text-wrap\">\\n <i class=\"item-image icon ion-android-people dark\"></i>\\n <h2 translate>GROUP.TYPE.OPEN_GROUP</h2>\\n <h4 class=\"gray\" translate>GROUP.TYPE.OPEN_GROUP_HELP</h4>\\n </div>\\n </div>\\n\\n <!-- managed group -->\\n <div class=\"item item-complex card stable-bg item-icon-left ink\" ng-click=\"closeModal(\\'managed\\')\">\\n <div class=\"item-content item-text-wrap\">\\n <i class=\"item-image icon ion-android-people dark\"></i>\\n <i class=\"icon-secondary ion-android-lock dark\" style=\"left: 10px; top: -8px;\"></i>\\n <h2 translate>GROUP.TYPE.MANAGED_GROUP</h2>\\n <h4 class=\"gray\" translate>GROUP.TYPE.MANAGED_GROUP_HELP</h4>\\n </div>\\n </div>\\n\\n </div>\\n</ion-content>\\n</ion-modal-view>\\n');\n$templateCache.put('plugins/es/templates/group/view_popover_actions.html','<ion-popover-view class=\"fit has-header\">\\n <ion-header-bar>\\n <h1 class=\"title\" translate>GROUP.VIEW.MENU_TITLE</h1>\\n </ion-header-bar>\\n <ion-content scroll=\"false\">\\n <div class=\"list item-text-wrap\">\\n\\n <a class=\"item item-icon-left ink\" ng-click=\"showSharePopover($event)\">\\n <i class=\"icon ion-android-share-alt\"></i>\\n {{\\'COMMON.BTN_SHARE\\' | translate}}\\n </a>\\n\\n <!--<a class=\"item item-icon-left assertive ink\"\\n ng-if=\"canEdit\"\\n ng-click=\"delete()\">\\n <i class=\"icon ion-trash-a\"></i>\\n {{\\'COMMON.BTN_DELETE\\' | translate}}\\n </a>-->\\n </div>\\n </ion-content>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/es/templates/group/view_record.html','<ion-view left-buttons=\"leftButtons\">\\n <ion-nav-title>\\n\\n </ion-nav-title>\\n\\n <ion-nav-buttons side=\"secondary\">\\n <button class=\"button button-bar button-icon button-clear visible-xs visible-sm\" ng-click=\"edit()\" ng-if=\"canEdit\">\\n <i class=\"icon ion-android-create\"></i>\\n </button>\\n <button class=\"button button-bar button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm\" ng-click=\"showActionsPopover($event)\">\\n </button>\\n </ion-nav-buttons>\\n\\n <ion-content scroll=\"true\">\\n <div class=\"positive-900-bg hero\">\\n <div class=\"content\" ng-if=\"!loading\">\\n <i class=\"avatar cion-registry-{{formData.type}}\" ng-if=\"!formData.avatar\"></i>\\n <i class=\"avatar\" style=\"background-image: url({{::formData.avatar.src}})\" ng-if=\"formData.avatar\"></i>\\n <h3 ng-bind-html=\"formData.title\"></h3>\\n <h4>&nbsp;</h4>\\n </div>\\n <h4 class=\"content light\" ng-if=\"loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </h4>\\n </div>\\n\\n <div class=\"row no-padding-xs no-padding-sm\">\\n <div class=\"col col-20 hidden-xs hidden-sm\">&nbsp;\\n </div>\\n\\n <div class=\"col list item-text-wrap no-padding-xs no-padding-sm\" ng-class=\"::motion.ionListClass\">\\n\\n <div class=\"item\">\\n <h2 class=\"gray\">\\n <a ng-if=\"formData.city\" ui-sref=\"app.groups({location:formData.city})\">\\n <i class=\"icon ion-location\"></i>\\n <span ng-bind-html=\"formData.city\"></span>\\n </a>\\n <span ng-if=\"formData.city && formData.type\">&nbsp;|&nbsp;</span>\\n <a ng-if=\"formData.type\" ui-sref=\"app.groups({type:formData.type})\">\\n <i class=\"icon ion-flag\"></i>\\n {{\\'GROUP.TYPE.ENUM.\\'+formData.type|upper|translate}}\\n </a>\\n </h2>\\n <h4>\\n <i class=\"icon ion-clock\" ng-if=\"formData.time\"></i>\\n <span translate>COMMON.SUBMIT_BY</span>\\n <a ng-class=\"{\\'positive\\': issuer.uid, \\'gray\\': !issuer.uid}\" ui-sref=\"app.wot_identity({pubkey:issuer.pubkey, uid: issuer.name||issuer.uid})\">\\n <ng-if ng-if=\"issuer.uid\">\\n <i class=\"icon ion-person\"></i>\\n {{::issuer.name||issuer.uid}}\\n </ng-if>\\n <span ng-if=\"!issuer.uid\">\\n <i class=\"icon ion-key\"></i>\\n {{issuer.pubkey|formatPubkey}}\\n </span>\\n </a>\\n <span>\\n {{formData.time|formatFromNow}}\\n <h4 class=\"gray hidden-xs\">|\\n {{formData.time | formatDate}}\\n </h4>\\n </span>\\n </h4>\\n </div>\\n\\n <!-- Buttons bar-->\\n <a id=\"group-share-anchor-{{id}}\"></a>\\n <div class=\"item large-button-bar hidden-xs hidden-sm\">\\n <button class=\"button button-stable button-small-padding icon ion-android-share-alt\" ng-click=\"showSharePopover($event)\">\\n </button>\\n <button class=\"button button-calm ink-dark\" ng-if=\"formData.pubkey && !isUserPubkey(formData.pubkey)\" ng-click=\"showTransferModal({pubkey:formData.pubkey, uid: formData.title})\">\\n {{\\'COMMON.BTN_SEND_MONEY\\' | translate}}\\n </button>\\n <button class=\"button button-stable icon-left ink-dark\" ng-if=\"canEdit\" ng-click=\"delete()\">\\n <i class=\"icon ion-trash-a assertive\"></i>\\n <span class=\"assertive\"> {{\\'COMMON.BTN_DELETE\\' | translate}}</span>\\n </button>\\n <button class=\"button button-calm icon-left ion-android-create ink\" ng-if=\"canEdit\" ng-click=\"edit()\">\\n {{\\'COMMON.BTN_EDIT\\' | translate}}\\n </button>\\n </div>\\n\\n <ion-item>\\n <h2>\\n <span trust-as-html=\"formData.description\"></span>\\n </h2>\\n </ion-item>\\n\\n <ion-item>\\n <h4 ng-if=\"formData.address\">\\n <span class=\"gray\" translate>REGISTRY.VIEW.LOCATION</span>\\n <a class=\"positive\" target=\"_blank\" href=\"https://www.google.fr/maps/?q={{formData.address}},%20{{formData.city}}\">\\n <span ng-bind-html=\"formData.address\"></span>\\n <span ng-if=\"formData.city\"> - </span>\\n <span ng-bind-html=\"formData.city\"></span>\\n </a>\\n </h4>\\n </ion-item>\\n\\n <!-- Socials networks -->\\n <ng-if ng-if=\"formData.socials && formData.socials.length>0\">\\n <ion-item class=\"item-icon-left\" type=\"no-padding item-text-wrap\" ng-repeat=\"social in formData.socials track by social.url\" id=\"social-{{social.url|formatSlug}}\">\\n <i class=\"icon ion-social-{{social.type}}\" ng-class=\"{\\'ion-bookmark\\': social.type == \\'other\\', \\'ion-link\\': social.type == \\'web\\', \\'ion-email\\': social.type == \\'email\\'}\"></i>\\n <p ng-if=\"social.type && social.type != \\'web\\'\">{{social.type}}</p>\\n <h2>\\n <a href=\"{{social.url}}\" ng-if=\"social.type != \\'email\\'\" target=\"_blank\">{{social.url}}</a>\\n <a href=\"mailto:{{social.url}}\" ng-if=\"social.type == \\'email\\'\">{{social.url}}</a>\\n </h2>\\n </ion-item>\\n </ng-if>\\n\\n <div class=\"lazy-load\">\\n\\n <!-- pictures -->\\n <ng-include src=\"::\\'plugins/es/templates/common/view_pictures.html\\'\"></ng-include>\\n\\n\\n <span class=\"item item-divider\" ng-if=\"formData.pubkey\">\\n <span translate>REGISTRY.TECHNICAL_DIVIDER</span>\\n </span>\\n\\n <!-- pubkey -->\\n <div class=\"item item-icon-left item-text-wrap ink\" ng-if=\"formData.pubkey\" copy-on-click=\"{{::formData.pubkey}}\">\\n <i class=\"icon ion-key\"></i>\\n <span translate>REGISTRY.EDIT.RECORD_PUBKEY</span>\\n <h4 class=\"dark\">{{::formData.pubkey}}</h4>\\n </div>\\n\\n <!-- comments -->\\n <ng-include src=\"::\\'plugins/es/templates/common/view_comments.html\\'\"></ng-include>\\n </div>\\n </div>\\n\\n <div class=\"col col-20 hidden-xs hidden-sm\">&nbsp;\\n </div>\\n </div>\\n </ion-content>\\n\\n <button class=\"button button-fab button-fab-bottom-right button-assertive icon ion-android-send visible-xs visible-sm\" ng-if=\"formData.pubkey && !isUserPubkey(formData.pubkey)\" ng-click=\"showTransferModal({pubkey: formData.pubkey, uid: formData.title})\">\\n </button>\\n\\n\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/invitation/list_invitation.html','<ion-list class=\"{{::motion.ionListClass}}\">\\n\\n <ion-item ng-repeat=\"invitation in search.results\" class=\"item-border-large item-text-wrap item-avatar\">\\n\\n <i ng-if=\"::!invitation.avatar\" class=\"item-image icon {{::invitation.avatarIcon}}\"></i>\\n <i ng-if=\"::invitation.avatar\" class=\"item-image avatar\" style=\"background-image: url({{::invitation.avatar.src}})\"></i>\\n <h3 trust-as-html=\"invitation.message | translate:invitation\"></h3>\\n <h3 class=\"dark text-italic\" ng-if=\"invitation.comment\">\\n <i class=\"icon ion-quote\"></i>\\n <span ng-bind-html=\"invitation.comment\"></span>\\n </h3>\\n <h4>\\n <i class=\"icon {{::invitation.icon}}\"></i>\\n <span class=\"dark\" ng-if=\"::invitation.issuer\" trust-as-html=\"\\'INVITATION.SUGGESTED_BY\\' | translate:invitation\"></span>\\n <span class=\"dark\">{{::invitation.time|formatFromNow}}</span>\\n <span class=\"gray\">| {{::invitation.time|formatDate}}</span>\\n </h4>\\n <div class=\"block text-right\">\\n <button class=\"button button-positive button-small button-small-padding\" ng-click=\"accept(invitation)\" ng-if=\"::invitation.state\" translate>{{::(invitation.okText||\\'COMMON.BTN_SHOW\\') |translate}}</button>\\n <button class=\"button button-stable button-small button-small-padding\" ng-click=\"delete($index)\" translate>INVITATION.BTN_DELETE</button>\\n </div>\\n </ion-item>\\n\\n</ion-list>\\n\\n<ion-infinite-scroll ng-if=\"!search.loading && search.hasMore\" spinner=\"android\" on-infinite=\"showMore()\" distance=\"1%\">\\n</ion-infinite-scroll>\\n');\n$templateCache.put('plugins/es/templates/invitation/modal_new_invitation.html','<ion-modal-view id=\"transfer\" class=\"modal-invitation modal-full-height\">\\n <ion-header-bar class=\"bar-positive\">\\n <button class=\"button button-clear visible-xs\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button>\\n <h1 class=\"title\" translate>INVITATION.NEW.TITLE</h1>\\n\\n <button class=\"button button-icon button-clear icon ion-android-send visible-xs\" ng-click=\"doSend()\">\\n </button>\\n </ion-header-bar>\\n\\n <ion-content scroll=\"true\">\\n <ng-include src=\"::\\'plugins/es/templates/invitation/new_invitation_form.html\\'\"></ng-include>\\n </ion-content>\\n</ion-modal-view>\\n');\n$templateCache.put('plugins/es/templates/invitation/new_invitation_form.html',' <form name=\"invitationForm\" novalidate=\"\" ng-submit=\"doSend()\">\\n\\n <div class=\"list\" ng-init=\"setForm(invitationForm)\">\\n\\n <a class=\"item item-icon-right gray ink\" ng-class=\"{\\'disable-pointer-events\\': recipients.length, \\'item-input-error\\': form.$submitted && !recipients.length}\" ng-click=\"showSelectRecipientModal($event)\">\\n <span class=\"gray\" translate>INVITATION.NEW.RECIPIENTS</span>\\n <span class=\"item-note\">\\n <span class=\"hidden-xs\" ng-if=\"!recipients.length\" translate>INVITATION.NEW.RECIPIENTS_HELP</span>\\n <ng-repeat ng-repeat=\"identity in recipients track by identity.id\" class=\"button button-small button-text button-stable button-icon-event ink\" ng-class=\"{\\'button-text-positive\\': identity.selected}\">\\n <ng-bind-html ng-bind-html=\"identity.name||identity.uid||(identity.pubkey|formatPubkey)\"></ng-bind-html>\\n <b class=\"enable-pointer-events ion-close\" ng-click=\"removeRecipient($index, $event)\">&nbsp;&nbsp;</b>\\n </ng-repeat>\\n </span>\\n\\n <i class=\"gray icon enable-pointer-events ion-ios-arrow-right\"></i>\\n </a>\\n <div class=\"form-errors\" ng-if=\"form.$submitted && !recipients.length\">\\n <div class=\"form-error\">\\n <span translate=\"ERROR.FIELD_REQUIRED\"></span>\\n </div>\\n </div>\\n\\n <a class=\"item item-icon-right gray ink\" ng-class=\"{\\'disable-pointer-events\\': suggestions.length, \\'item-input-error\\': form.$submitted && !suggestions.length}\" ng-click=\"showSelectSuggestionModal($event)\">\\n <span class=\"gray enable-pointer-events\" translate>INVITATION.NEW.SUGGESTION_IDENTITIES</span>\\n\\n <span class=\"item-note\">\\n <span class=\"hidden-xs\" ng-if=\"!suggestions.length\" translate>INVITATION.NEW.SUGGESTION_IDENTITIES_HELP</span>\\n <ng-repeat ng-repeat=\"identity in suggestions track by identity.id\" class=\"button button-small button-text button-stable button-icon-event ink\" ng-class=\"{\\'button-text-positive\\': identity.selected}\">\\n <ng-bind-html ng-bind-html=\"identity.name||identity.uid||(identity.pubkey|formatPubkey)\"></ng-bind-html>\\n <b class=\"enable-pointer-events ion-close\" ng-click=\"removeSuggestion($index, $event)\">&nbsp;&nbsp;</b>\\n </ng-repeat>\\n </span>\\n <i class=\"gray icon enable-pointer-events ion-ios-arrow-right\"></i>\\n </a>\\n <div class=\"form-errors\" ng-if=\"form.$submitted && !suggestions.length\">\\n <div class=\"form-error\">\\n <span translate=\"ERROR.FIELD_REQUIRED\"></span>\\n </div>\\n </div>\\n\\n <!-- Enable comment ? -->\\n <div class=\"item item-content item-toggle dark visible-xs visible-sm\">\\n <span class=\"input-label gray\">{{\\'TRANSFER.BTN_ADD_COMMENT\\' | translate}}</span>\\n <label class=\"toggle toggle-royal\">\\n <input type=\"checkbox\" ng-model=\"formData.useComment\">\\n <div class=\"track\">\\n <div class=\"handle\"></div>\\n </div>\\n </label>\\n </div>\\n\\n <!-- Comment -->\\n <label class=\"item item-input item-floating-label hidden-xs hidden-sm\" ng-class=\"{\\'item-input-error\\': form.$submitted && form.comment.$invalid}\">\\n <span class=\"input-label\">{{\\'TRANSFER.COMMENT\\' | translate}}</span>\\n <textarea placeholder=\"{{\\'TRANSFER.COMMENT_HELP\\' | translate}}\" name=\"comment\" ng-model=\"formData.comment\" ng-maxlength=\"255\">\\n </textarea>\\n </label>\\n <label class=\"item item-input item-floating-label visible-xs visible-sm\" ng-if=\"formData.useComment\" ng-class=\"{\\'item-input-error\\': form.$submitted && form.comment.$invalid}\">\\n <span class=\"input-label\">{{\\'TRANSFER.COMMENT\\' | translate}}</span>\\n <textarea placeholder=\"{{\\'TRANSFER.COMMENT_HELP\\' | translate}}\" name=\"comment\" ng-model=\"formData.comment\" ng-maxlength=\"255\">\\n </textarea>\\n </label>\\n <div class=\"form-errors\" ng-show=\"form.$submitted && form.comment.$error\" ng-messages=\"form.comment.$error\">\\n <div class=\"form-error\" ng-message=\"maxlength\">\\n <span translate=\"ERROR.FIELD_TOO_LONG\"></span>\\n </div>\\n <div class=\"form-error\" ng-message=\"pattern\">\\n <span translate=\"ERROR.FIELD_ACCENT\"></span>\\n </div>\\n </div>\\n\\n </div>\\n\\n <div class=\"padding hidden-xs text-right\">\\n <button class=\"button button-clear button-dark ink\" tabindex=\"-1\" ng-click=\"cancel()\" type=\"button\" translate>COMMON.BTN_CANCEL\\n </button>\\n <button class=\"button button-positive ink\" tabindex=\"8\" type=\"submit\" translate>\\n TRANSFER.BTN_SEND\\n </button>\\n </div>\\n </form>\\n\\n');\n$templateCache.put('plugins/es/templates/invitation/popover_actions.html','<ion-popover-view class=\"fit has-header\">\\n <ion-header-bar>\\n <h1 class=\"title\" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\\n </ion-header-bar>\\n <ion-content scroll=\"false\">\\n <div class=\"list item-text-wrap\">\\n\\n <a class=\"item item-icon-left ink\" ng-class=\"{\\'gray\\': !search.results.length, \\'assertive\\': search.results.length}\" ng-click=\"deleteAll()\">\\n <i class=\"icon ion-trash-a\"></i>\\n <span translate>INVITATION.BTN_DELETE_ALL</span>\\n </a>\\n\\n </div>\\n </ion-content>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/es/templates/invitation/popover_invitation.html','<ion-popover-view class=\"fit hidden-xs hidden-sm popover-notification popover-invitation\" ng-controller=\"PopoverInvitationCtrl\">\\n <ion-header-bar class=\"stable-bg block\">\\n <div class=\"title\" translate>INVITATION.NOTIFICATIONS.TITLE</div>\\n\\n <div class=\"pull-right\">\\n <a class=\"positive\" ng-click=\"showNewInvitationModal()\" translate>INVITATION.BTN_NEW_INVITATION</a>\\n </div>\\n </ion-header-bar>\\n <ion-content scroll=\"true\">\\n <div class=\"center padding\" ng-if=\"search.loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n <div class=\"padding gray\" ng-if=\"!search.loading && !search.results.length\" translate>\\n INVITATION.NO_RESULT\\n </div>\\n\\n <ng-include src=\"::\\'plugins/es/templates/invitation/list_invitation.html\\'\"></ng-include>\\n\\n </ion-content>\\n\\n <ion-footer-bar class=\"stable-bg block\">\\n <!-- settings -->\\n <div class=\"pull-left\">\\n <a class=\"positive\" ui-sref=\"app.es_settings\" ng-click=\"closePopover()\" translate>MENU.SETTINGS</a>\\n </div>\\n\\n <!-- show all -->\\n <div class=\"pull-right\">\\n <a class=\"positive\" ui-sref=\"app.view_invitations\" ng-click=\"closePopover()\" translate>COMMON.NOTIFICATIONS.SHOW_ALL</a>\\n </div>\\n </ion-footer-bar>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/es/templates/invitation/view_invitations.html','<ion-view left-buttons=\"leftButtons\" class=\"view-invitation\">\\n <ion-nav-title>\\n {{\\'INVITATION.LIST.TITLE\\' | translate}}\\n </ion-nav-title>\\n\\n <ion-content class=\"padding no-padding-xs no-padding-sm\" scroll=\"true\">\\n\\n <!-- Buttons bar-->\\n <div class=\"hidden-xs hidden-sm padding text-center\" ng-if=\"!loading\">\\n\\n <button class=\"button button-stable button-small-padding icon ion-loop ink\" ng-click=\"load()\">\\n </button>\\n\\n <button class=\"button button-raised button-calm ink\" ng-click=\"showNewInvitationModal()\">\\n {{\\'INVITATION.BTN_NEW_INVITATION\\' | translate}}\\n </button>\\n\\n <button class=\"button button-stable icon-right ink\" ng-click=\"showActionsPopover($event)\">\\n &nbsp; <i class=\"icon ion-android-more-vertical\"></i>&nbsp;\\n {{\\'COMMON.BTN_OPTIONS\\' | translate}}\\n </button>\\n </div>\\n\\n <div class=\"row no-padding\">\\n <div class=\"col col-20 hidden-xs hidden-sm\">&nbsp;</div>\\n\\n <div class=\"col no-padding-xs no-padding-sm\">\\n\\n <div class=\"center padding\" ng-if=\"search.loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div class=\"padding gray\" ng-if=\"!search.loading && !search.results.length\" translate>\\n INVITATION.NO_RESULT\\n </div>\\n\\n <ng-include src=\"::\\'plugins/es/templates/invitation/list_invitation.html\\'\"></ng-include>\\n\\n </div>\\n\\n <div class=\"col col-20 hidden-xs hidden-sm\">&nbsp;</div>\\n\\n </div>\\n\\n </ion-content>\\n\\n <button id=\"fab-new-invitation\" class=\"button button-fab button-fab-bottom-right button-assertive icon ion-android-send visible-xs visible-sm spin\" ng-click=\"showNewInvitationModal()\">\\n </button>\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/join/modal_join_extend.html','<ng-if ng-if=\":state:enable && extensionPoint === \\'select-account-type\\'\">\\n\\n <!-- organization wallet -->\\n <div class=\"item item-complex card stable-bg item-icon-left item-icon-right ink\" ng-class=\"{ activated: accountTypeMember != null && !accountTypeMember }\" ng-click=\"selectAccountType(\\'organization\\')\">\\n <div class=\"item-content item-text-wrap\">\\n <i class=\"item-image icon dark cion-registry-association\"></i>\\n <h2 translate>ACCOUNT.NEW.ORGANIZATION_ACCOUNT</h2>\\n <h4 class=\"gray\" translate>ACCOUNT.NEW.ORGANIZATION_ACCOUNT_HELP</h4>\\n <i class=\"icon dark ion-ios-arrow-right\"></i>\\n </div>\\n </div>\\n\\n</ng-if>\\n\\n<!-- Add a slide -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'last-slide\\'\">\\n\\n <!-- STEP 6: organization type -->\\n <ion-slide-page>\\n <ion-content class=\"has-header\" scroll=\"false\">\\n\\n <p>TOTO</p>\\n\\n </ion-content>\\n </ion-slide-page>\\n\\n</ng-if>\\n');\n$templateCache.put('plugins/es/templates/menu_extend.html','\\n<!-- Top header: Main section -->\\n<div ng-if=\":state:enable && extensionPoint === \\'nav-buttons-right\\'\" class=\"hidden-xs hidden-sm\">\\n\\n\\n <!-- invitation event -->\\n <button class=\"button button-clear icon ion-person-stalker\" ng-if=\"login\" active-link=\"gray\" active-link-path-prefix=\"#/app/invitations\" ng-click=\"showInvitationsPopover($event)\">\\n <span ng-if=\"walletData.invitations.unreadCount\" class=\"badge badge-button badge-positive\">{{walletData.invitations.unreadCount}}</span>\\n </button>\\n\\n <!-- messages -->\\n <button class=\"button button-clear icon ion-email\" ng-if=\"login\" active-link=\"gray\" active-link-path-prefix=\"#/app/user/message\" ng-click=\"showMessagesPopover($event)\">\\n <span ng-if=\"walletData.messages.unreadCount\" class=\"badge badge-button badge-positive\">{{walletData.messages.unreadCount}}</span>\\n </button>\\n\\n <!-- notifications -->\\n <button class=\"button button-clear icon ion-android-notifications\" ng-if=\"login\" active-link=\"gray\" active-link-path-prefix=\"#/app/notifications\" ng-click=\"showNotificationsPopover($event)\">\\n <span ng-class=\"{\\'badge-positive\\': !walletData.notifications.warnCount, \\'badge-assertive\\': walletData.notifications.warnCount}\" ng-if=\"walletData.notifications.unreadCount || walletData.notifications.warnCount\" class=\"badge badge-button\">{{walletData.notifications.unreadCount+walletData.notifications.warnCount}}</span>\\n </button>\\n</div>\\n\\n<!-- Left menu: User section -->\\n<div ng-if=\":state:enable && extensionPoint === \\'menu-user\\' && !$root.config.readonly\" class=\"visible-xs visible-sm\">\\n\\n <a menu-close class=\"item item-icon-left\" active-link=\"active\" ng-if=\"login && walletData.isMember\" active-link-path-prefix=\"#/app/invitations\" ui-sref=\"app.view_invitations\">\\n <i class=\"icon ion-person-stalker\"></i>\\n <span translate>MENU.INVITATIONS</span>\\n <span class=\"badge badge-positive\" ng-if=\"walletData.invitations.unreadCount\">{{walletData.invitations.unreadCount}}</span>\\n </a>\\n\\n <a menu-close class=\"item item-icon-left\" active-link=\"active\" active-link-path-prefix=\"#/app/user/message\" ng-class=\"{\\'item-menu-disable\\': !login}\" ui-sref=\"app.user_message.tab_inbox\">\\n <i class=\"icon ion-email\"></i>\\n <span translate>MENU.MESSAGES</span>\\n <span class=\"badge badge-positive\" ng-if=\"walletData.messages.unreadCount\">{{walletData.messages.unreadCount}}</span>\\n </a>\\n\\n <a menu-close class=\"item item-icon-left\" active-link=\"active\" active-link-path-prefix=\"#/app/notifications\" ng-class=\"{\\'item-menu-disable\\': !login}\" ui-sref=\"app.view_notifications\">\\n <i class=\"icon ion-android-notifications\"></i>\\n <span translate>MENU.NOTIFICATIONS</span>\\n <span class=\"badge badge-positive\" ng-if=\"walletData.notifications.unreadCount\">{{walletData.notifications.unreadCount}}</span>\\n </a>\\n\\n</div>\\n');\n$templateCache.put('plugins/es/templates/message/compose_form.html',' <form name=\"messageForm\" novalidate=\"\" ng-submit=\"doSend()\">\\n\\n <div class=\"list no-margin\" ng-init=\"setForm(messageForm)\">\\n\\n <!-- TODO: allow multi dest ?\\n Do IT with a ion-scroll - see https://stackoverflow.com/a/38308803 -->\\n <a class=\"item item-icon-right gray ink\" ng-class=\"{\\'item-input-error\\': form.$submitted && !formData.destPub}\" ng-click=\"showWotLookupModal()\">\\n <span class=\"gray\" translate>MESSAGE.COMPOSE.TO</span>\\n <span class=\"badge badge-royal\" ng-if=\"destUid\"><i class=\"ion-person\"></i> {{destName||destUid}}</span>&nbsp;\\n <span class=\"badge badge-stable\" ng-if=\"!destUid && destPub\">{{destName}}\\n <span ng-if=\"!destName\"><i class=\"ion-key\"></i>{{destPub | formatPubkey}}</span>\\n </span>&nbsp;\\n <i class=\"gray icon ion-ios-arrow-right\"></i>\\n </a>\\n <div class=\"form-errors\" ng-if=\"form.$submitted && !formData.destPub\">\\n <div class=\"form-error\">\\n <span translate=\"ERROR.FIELD_REQUIRED\"></span>\\n </div>\\n </div>\\n\\n <ion-item class=\"item-text-wrap ink\" ng-class=\"{\\'item-icon-right\\': enableSelectWallet}\" ng-click=\"showSelectWalletModal()\">\\n <span class=\"gray\" translate>TRANSFER.FROM</span>\\n <span class=\"badge badge-balanced animate-fade-in animate-show-hide\" ng-show=\"!loading\">\\n <ion-spinner icon=\"android\" ng-if=\"!walletData.pubkey\"></ion-spinner>\\n <span ng-if=\"walletData.pubkey && !walletData.isMember\">\\n <i class=\"ion-key\"></i> {{walletData.pubkey| formatPubkey}}&nbsp;&nbsp;\\n </span>\\n <span ng-if=\"walletData.isMember\">\\n <i class=\"ion-person\"></i> {{walletData.name||walletData.uid}}\\n </span>\\n </span>\\n <i class=\"gray icon ion-ios-arrow-right\" ng-if=\"enableSelectWallet\"></i>\\n </ion-item>\\n\\n <!-- Object -->\\n <div class=\"item item-input\" ng-class=\"{\\'item-input-error\\': form.$submitted && form.title.$invalid}\">\\n <input type=\"text\" autocomplete=\"off\" placeholder=\"{{\\'MESSAGE.COMPOSE.OBJECT_HELP\\' | translate}}\" name=\"title\" ng-model=\"formData.title\" ng-maxlength=\"256\" required>\\n <span class=\"badge item-note\" ng-if=\"isReply\">({{\\'MESSAGE.COMPOSE.OBJECT\\' | translate}})</span>\\n </div>\\n <div class=\"form-errors\" ng-show=\"form.$submitted && form.title.$error\" ng-messages=\"form.title.$error\">\\n <div class=\"form-error\" ng-message=\"maxlength\">\\n <span translate=\"MESSAGE.ERROR.MESSAGE_CONTENT_TOO_LONG\" translate-values=\"{maxLength: 256}\"></span>\\n </div>\\n <div class=\"form-error\" ng-message=\"required\">\\n <span translate=\"ERROR.FIELD_REQUIRED\"></span>\\n </div>\\n </div>\\n\\n <!-- Content -->\\n <div class=\"item item-input item-floating-label\" ng-class=\"{\\'item-input-error\\': form.$submitted && form.content.$invalid}\">\\n <span class=\"input-label\">{{\\'MESSAGE.COMPOSE.MESSAGE\\' | translate}}</span>\\n <textarea placeholder=\"{{\\'MESSAGE.COMPOSE.MESSAGE_HELP\\' | translate}}\" autocomplete=\"off\" name=\"content\" ng-model=\"formData.content\" rows=\"8\" ng-maxlength=\"5000\">\\n </textarea>\\n </div>\\n <div class=\"form-errors\" ng-show=\"form.$submitted && form.content.$error\" ng-messages=\"form.content.$error\">\\n <div class=\"form-error\" ng-message=\"maxlength\">\\n <span translate=\"MESSAGE.ERROR.MESSAGE_CONTENT_TOO_LONG\" translate-values=\"{maxLength: 5000}\"></span>\\n </div>\\n </div>\\n\\n </div>\\n\\n <div class=\"padding hidden-xs text-right\">\\n <button class=\"button button-clear button-dark ink\" ng-click=\"cancel()\" type=\"button\" translate>COMMON.BTN_CANCEL</button>\\n <button class=\"button button-positive ink\" type=\"submit\" ng-disabled=\"sending\" translate>TRANSFER.BTN_SEND</button>\\n </div>\\n\\n <!-- Encryption info -->\\n <div class=\"list no-margin\">\\n <div class=\"item item-icon-left item-text-wrap\">\\n <i class=\"icon ion-ios-information-outline positive\"></i>\\n <h4 class=\"positive\" translate>MESSAGE.COMPOSE.ENCRYPTED_HELP</h4>\\n </div>\\n </div>\\n </form>\\n\\n');\n$templateCache.put('plugins/es/templates/message/compose.html','<ion-view left-buttons=\"leftButtons\" id=\"composeMessage\">\\n <ion-nav-title>\\n <span class=\"visible-xs visible-sm\" nf-if=\"!isReply\" translate>MESSAGE.COMPOSE.TITLE</span>\\n <span class=\"visible-xs visible-sm\" nf-if=\"isReply\" translate>MESSAGE.COMPOSE.TITLE_REPLY</span>\\n </ion-nav-title>\\n\\n <ion-nav-buttons side=\"secondary\">\\n <button class=\"button button-icon button-clear icon ion-android-send visible-xs\" ng-click=\"doSend()\">\\n </button>\\n </ion-nav-buttons>\\n\\n <ion-content scroll=\"true\">\\n <div class=\"row\">\\n <div class=\"col col-20 hidden-xs hidden-sm\">&nbsp;</div>\\n <div class=\"col\">\\n <h2 class=\"hidden-xs hidden-sm\">\\n {{\\'MESSAGE.COMPOSE.SUB_TITLE\\'|translate}}\\n </h2>\\n <h4 class=\"hidden-xs hidden-sm\">&nbsp;</h4>\\n <ng-include src=\"::\\'plugins/es/templates/message/compose_form.html\\'\"></ng-include>\\n </div>\\n <div class=\"col col-20 hidden-xs hidden-sm\">&nbsp;</div>\\n </div>\\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/message/list.html','<div class=\"padding gray\" ng-if=\"!search.loading && !search.results.length\">\\n <span ng-if=\"search.type==\\'last\\'\">{{ (\\'MESSAGE.NO_MESSAGE_\\' + type) | upper | translate }}</span>\\n <span ng-if=\"search.type==\\'text\\'\" translate>COMMON.SEARCH_NO_RESULT</span>\\n</div>\\n\\n<ion-list class=\"{{::motion.ionListClass}}\" can-swipe=\"$root.device.enable\">\\n\\n <ion-item class=\"item item-border-large item-avatar item-icon-right ink\" ng-repeat=\"msg in :rebind:search.results track by msg.id\" ng-click=\"select(msg, $event)\">\\n\\n <i ng-if=\"::!msg.avatar\" class=\"item-image icon\" ng-class=\"{\\'ion-person\\': msg.uid, \\'ion-email\\': !msg.uid}\"></i>\\n <i ng-if=\"::msg.avatar\" class=\"item-image avatar\" style=\"background-image: url({{::msg.avatar.src}})\"></i>\\n\\n <h4 class=\"pull-right hidden-xs hidden-sm\">\\n <span class=\"dark\"><i class=\"ion-clock\"></i> {{::msg.time|formatFromNow}}</span>\\n <span class=\"gray\">| {{::msg.time|formatDate}}</span>\\n </h4>\\n <h4 class=\"pull-right visible-xs visible-sm dark\"><i class=\"ion-clock\"></i> {{::msg.time|formatFromNow}}</h4>\\n <h3>\\n <a class=\"positive\" ng-if=\"::msg.name||msg.uid\" ui-sref=\"app.wot_identity({pubkey:msg.issuer, uid:msg.name||msg.uid})\">\\n <i class=\"ion-person\"></i>\\n {{::msg.name||msg.uid}}\\n </a>\\n <a class=\"gray\" ng-if=\"::!msg.name && !msg.uid\" ui-sref=\"app.wot_identity({pubkey:msg.issuer})\">\\n <i class=\"ion-key\"></i>\\n {{::msg.issuer|formatPubkey}}\\n </a>\\n </h3>\\n <h2 ng-class=\"{\\'unread\\': !msg.read}\" ng-bind-html=\"::msg.title\"></h2>\\n <p ng-bind-html=\"::msg.summary||msg.content\"></p>\\n <i class=\"icon ion-ios-arrow-right\"></i>\\n <ion-option-button class=\"button-stable\" ng-click=\"showReplyModal($index)\" translate>MESSAGE.BTN_REPLY</ion-option-button>\\n <ion-option-button class=\"button-assertive\" ng-click=\"delete($index)\" translate>COMMON.BTN_DELETE</ion-option-button>\\n\\n </ion-item>\\n</ion-list>\\n\\n<ion-infinite-scroll ng-if=\"!search.loading && search.hasMore\" icon=\"ion-loading-c\" on-infinite=\"showMore()\" distance=\"10%\">\\n</ion-infinite-scroll>\\n');\n$templateCache.put('plugins/es/templates/message/lookup_by_id.html','<ion-view left-buttons=\"leftButtons\" class=\"view-messages\">\\n\\n <ion-tabs class=\"tabs-positive tabs-icon-top\">\\n\\n <ion-tab title=\"{{\\'MESSAGE.LIST.INBOX\\'|translate}}\" icon=\"ion-archive\" ui-sref=\"app.user_messages_by_id.tab_inbox\">\\n <ion-nav-view name=\"tab_inbox\"></ion-nav-view>\\n </ion-tab>\\n\\n <ion-tab title=\"{{\\'MESSAGE.LIST.OUTBOX\\'|translate}}\" icon=\"ion-paper-airplane\" ui-sref=\"app.user_messages_by_id.tab_outbox\">\\n <ion-nav-view name=\"tab_outbox\"></ion-nav-view>\\n </ion-tab>\\n\\n </ion-tabs>\\n\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/message/lookup_lg.html','<ion-view left-buttons=\"leftButtons\" class=\"view-messages\">\\n <ion-nav-title>\\n <span translate>MESSAGE.LIST.TITLE</span>\\n </ion-nav-title>\\n\\n <ion-nav-buttons side=\"secondary\">\\n <button class=\"button button-icon button-clear visible-xs visible-sm\" ng-click=\"showActionsPopover($event)\">\\n <i class=\"icon ion-android-more-vertical\"></i>\\n </button>\\n </ion-nav-buttons>\\n\\n <ion-content class=\"padding no-padding-xs no-padding-sm\">\\n <ion-refresher pulling-text=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\" on-refresh=\"refresh(true, $event)\">\\n </ion-refresher>\\n\\n <!-- Buttons bar-->\\n <div class=\"hidden-xs hidden-sm padding text-center\">\\n\\n <button class=\"button button-stable button-small-padding icon ion-loop\" ng-click=\"load()\">\\n </button>\\n\\n <button class=\"button button-calm\" ng-click=\"showNewMessageModal()\" translate>\\n MESSAGE.BTN_COMPOSE\\n </button>\\n\\n <button class=\"button button-stable button-small-padding icon ion-android-more-vertical\" ng-click=\"showActionsPopover($event)\" title=\"{{\\'COMMON.POPOVER_ACTIONS_TITLE\\' | translate}}\">\\n </button>\\n\\n\\n </div>\\n\\n <!-- button tabs -->\\n <div class=\"buttons-tabs border-bottom hidden-sm hidden-xs\">\\n <div class=\"pull-right\">\\n\\n <!-- inbox tab -->\\n <a ng-hide=\"!isDefaultWallet\" class=\"button button-tab ink dark\" title=\"{{\\'MESSAGE.LIST.INBOX\\' | translate}}\" nav-transition=\"none\" ng-class=\"{\\'active\\': type==\\'inbox\\'}\" ui-sref=\"app.user_messages_lg_inbox\">\\n <i class=\"icon ion-archive\"></i>\\n {{\\'MESSAGE.LIST.INBOX\\' | translate}}\\n </a>\\n <a ng-hide=\"isDefaultWallet\" class=\"button button-tab ink dark\" title=\"{{\\'MESSAGE.LIST.INBOX\\' | translate}}\" nav-transition=\"none\" ng-class=\"{\\'active\\': type==\\'inbox\\'}\" ui-sref=\"app.user_messages_lg_inbox_by_id({id: walletId})\">\\n <i class=\"icon ion-archive\"></i>\\n {{\\'MESSAGE.LIST.INBOX\\' | translate}}\\n </a>\\n\\n <!-- outbox tab -->\\n <a ng-hide=\"!isDefaultWallet\" class=\"button button-tab ink dark\" title=\"{{\\'MESSAGE.LIST.OUTBOX\\' | translate}}\" nav-transition=\"none\" ng-class=\"{\\'active\\': type==\\'outbox\\'}\" ui-sref=\"app.user_messages_lg_outbox\">\\n <i class=\"icon ion-paper-airplane\"></i>\\n {{\\'MESSAGE.LIST.OUTBOX\\' | translate}}\\n </a>\\n <a ng-hide=\"isDefaultWallet\" class=\"button button-tab ink dark\" title=\"{{\\'MESSAGE.LIST.OUTBOX\\' | translate}}\" nav-transition=\"none\" ng-class=\"{\\'active\\': type==\\'outbox\\'}\" ui-sref=\"app.user_messages_lg_outbox_by_id({id: walletId})\">\\n <i class=\"icon ion-paper-airplane\"></i>\\n {{\\'MESSAGE.LIST.OUTBOX\\' | translate}}\\n </a>\\n </div>\\n </div>\\n\\n <div class=\"item no-padding\">\\n <div class=\"item-input\">\\n <i class=\"icon ion-search placeholder-icon\"></i>\\n\\n <input type=\"text\" class=\"visible-xs visible-sm\" placeholder=\"{{\\'MESSAGE.LIST.SEARCH_HELP\\'|translate}}\" ng-model=\"search.text\" ng-model-options=\"{ debounce: 650 }\" ng-change=\"doSearch()\" on-return=\"doSearch()\" select-on-click>\\n <input type=\"text\" class=\"hidden-xs hidden-sm\" placeholder=\"{{\\'MESSAGE.LIST.SEARCH_HELP\\'|translate}}\" ng-model=\"search.text\" on-return=\"doSearch()\">\\n <div class=\"helptip-anchor-center\">\\n <a id=\"helptip-message-search-text\"></a>\\n </div>\\n </div>\\n </div>\\n\\n <div class=\"padding-top hidden-xs\" style=\"display: block; height: 60px;\">\\n\\n <div class=\"pull-left\" ng-if=\"!search.loading\">\\n <ng-if ng-if=\"search.type==\\'last\\'\">\\n <h4>{{ (\\'MESSAGE.LIST.LAST_\\' + type) | upper | translate}}</h4>\\n </ng-if>\\n <ng-if ng-if=\"search.type==\\'text\\'\">\\n <h4 translate>COMMON.RESULTS_LIST</h4>\\n </ng-if>\\n </div>\\n\\n <div class=\"pull-right hidden-xs hidden-sm\">\\n <a class=\"button button-text button-small ink\" ng-class=\"{\\'button-text-positive\\': search.type==\\'last\\'}\" ng-click=\"doSearchLast()\">\\n <i class=\"icon ion-clock\"></i>\\n {{\\'MESSAGE.LIST.BTN_LAST_MESSAGES\\' | translate}}\\n </a>\\n\\n <!-- Allow extension here -->\\n <cs-extension-point name=\"filter-buttons\"></cs-extension-point>\\n &nbsp;\\n <button class=\"button button-small button-stable ink\" ng-click=\"doSearch()\">\\n {{\\'COMMON.BTN_SEARCH\\' | translate}}\\n </button>\\n\\n </div>\\n </div>\\n\\n <div class=\"center padding\" ng-if=\"search.loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <!-- list -->\\n <ng-include src=\"::\\'plugins/es/templates/message/list.html\\'\"></ng-include>\\n\\n </ion-content>\\n\\n <button id=\"fab-add-message-record\" class=\"button button-fab button-fab-bottom-right button-assertive icon ion-compose visible-xs visible-sm spin\" ng-click=\"showNewMessageModal()\">\\n </button>\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/message/lookup_popover_actions.html','<ion-popover-view class=\"fit has-header\">\\n <ion-header-bar>\\n <h1 class=\"title\" translate>MESSAGE.LIST.POPOVER_ACTIONS.TITLE</h1>\\n </ion-header-bar>\\n <ion-content scroll=\"false\">\\n <div class=\"list item-text-wrap\">\\n <a class=\"item item-icon-left ink\" ng-class=\"{\\'gray\\': (type != \\'inbox\\' && !messages.length)}\" ng-click=\"markAllAsRead()\">\\n <i class=\"icon ion-android-checkmark-circle\"></i>\\n {{\\'COMMON.NOTIFICATIONS.MARK_ALL_AS_READ\\' | translate}}\\n </a>\\n\\n <a class=\"item item-icon-left assertive ink\" ng-class=\"{\\'gray\\': !messages.length}\" ng-click=\"deleteAll()\">\\n <i class=\"icon ion-trash-a\"></i>\\n {{\\'MESSAGE.LIST.POPOVER_ACTIONS.DELETE_ALL\\' | translate}}\\n </a>\\n </div>\\n </ion-content>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/es/templates/message/lookup.html','<ion-view left-buttons=\"leftButtons\" class=\"view-messages\">\\n\\n <ion-tabs class=\"tabs-positive tabs-icon-top\">\\n\\n <ion-tab title=\"{{\\'MESSAGE.LIST.INBOX\\'|translate}}\" icon=\"ion-archive\" ui-sref=\"app.user_message.tab_inbox\">\\n <ion-nav-view name=\"tab_inbox\"></ion-nav-view>\\n </ion-tab>\\n\\n <ion-tab title=\"{{\\'MESSAGE.LIST.OUTBOX\\'|translate}}\" icon=\"ion-paper-airplane\" ui-sref=\"app.user_message.tab_outbox\">\\n <ion-nav-view name=\"tab_outbox\"></ion-nav-view>\\n </ion-tab>\\n\\n </ion-tabs>\\n\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/message/modal_compose.html','<ion-modal-view id=\"composeMessage\" class=\"modal-full-height\">\\n <ion-header-bar class=\"bar-positive\">\\n <button class=\"button button-clear visible-xs\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button>\\n <h1 class=\"title\" ng-if=\"!isReply\" translate>MESSAGE.COMPOSE.TITLE</h1>\\n <h1 class=\"title\" ng-if=\"isReply\" translate>MESSAGE.COMPOSE.TITLE_REPLY</h1>\\n\\n <button class=\"button button-icon button-clear icon ion-android-send visible-xs\" ng-click=\"doSend()\">\\n </button>\\n </ion-header-bar>\\n\\n <ion-content scroll=\"true\">\\n <ng-include src=\"::\\'plugins/es/templates/message/compose_form.html\\'\"></ng-include>\\n </ion-content>\\n</ion-modal-view>\\n');\n$templateCache.put('plugins/es/templates/message/popover_message.html','<ion-popover-view class=\"fit hidden-xs hidden-sm popover-light\" ng-controller=\"PopoverMessageCtrl\">\\n <ion-header-bar class=\"stable-bg block\">\\n <div class=\"title\" translate>MESSAGE.NOTIFICATIONS.TITLE</div>\\n\\n <div class=\"pull-right\">\\n <a class=\"positive\" ng-click=\"showNewMessageModal()\" translate>MESSAGE.BTN_COMPOSE</a>\\n </div>\\n </ion-header-bar>\\n <ion-content scroll=\"true\">\\n <div class=\"center padding\" ng-if=\"search.loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n <div class=\"padding gray\" ng-if=\"!search.loading && !search.results.length\" translate>\\n MESSAGE.NO_MESSAGE_INBOX\\n </div>\\n\\n <ion-list>\\n\\n <ion-item ng-repeat=\"notification in search.results\" class=\"item-border-large item-text-wrap ink item-avatar\" ng-class=\"{\\'unread\\': !notification.read}\" ng-click=\"select(notification)\">\\n\\n <i ng-if=\"!notification.avatar\" class=\"item-image icon\" ng-class=\"{\\'ion-person\\': notification.uid, \\'ion-email\\': !notification.uid}\"></i>\\n <i ng-if=\"notification.avatar\" class=\"item-image avatar\" style=\"background-image: url({{::notification.avatar.src}})\"></i>\\n\\n <h3>\\n <span translate>MESSAGE.NOTIFICATIONS.MESSAGE_RECEIVED</span>\\n <span class=\"positive\" ng-if=\"notification.uid\"><i class=\"ion-person\"></i>&thinsp;{{notification.name||notification.uid}}</span>\\n <span class=\"gray\" ng-if=\"!notification.uid\"><i class=\"ion-key\"></i>&thinsp;{{notification.issuer|formatPubkey}}</span>\\n </h3>\\n <h4>\\n <i class=\"icon ion-archive balanced\"></i>&thinsp;<span class=\"dark\">{{notification.time|formatFromNow}}</span>\\n <span class=\"gray\">| {{notification.time|formatDate}}</span>\\n </h4>\\n </ion-item>\\n </ion-list>\\n\\n <ion-infinite-scroll ng-if=\"!search.loading && search.hasMore\" spinner=\"android\" on-infinite=\"showMore()\" distance=\"1%\">\\n </ion-infinite-scroll>\\n </ion-content>\\n\\n <ion-footer-bar class=\"stable-bg block\">\\n\\n <!-- show all -->\\n <div class=\"pull-right\">\\n <a class=\"positive\" ui-sref=\"app.user_message.tab_inbox\" ng-click=\"closePopover()\" translate>COMMON.NOTIFICATIONS.SHOW_ALL</a>\\n </div>\\n </ion-footer-bar>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/es/templates/message/tabs/tab_list.html','<ion-view>\\n <ion-nav-buttons side=\"secondary\">\\n\\n <!-- Allow extension here -->\\n <cs-extension-point name=\"nav-buttons\"></cs-extension-point>\\n\\n <button class=\"button button-icon button-clear icon ion-android-more-vertical\" ng-click=\"showActionsPopover($event)\">\\n </button>\\n </ion-nav-buttons>\\n\\n <ion-content>\\n\\n <ion-refresher pulling-text=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\" on-refresh=\"refresh()\">\\n </ion-refresher>\\n\\n <cs-extension-point name=\"buttons\"></cs-extension-point>\\n\\n <!-- list -->\\n <ng-include src=\"::\\'plugins/es/templates/message/list.html\\'\"></ng-include>\\n\\n </ion-content>\\n\\n <!-- fab button -->\\n <div class=\"visible-xs visible-sm\">\\n <button ng-if=\"fabButtonNewMessageId\" id=\"{{::fabButtonNewMessageId}}\" class=\"button button-fab button-fab-bottom-right button-assertive spin has-footer\" ng-click=\"showNewMessageModal()\">\\n <i class=\"icon ion-compose\"></i>\\n </button>\\n </div>\\n\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/message/view_message.html','<ion-view left-buttons=\"leftButtons\" class=\"view-message\">\\n <ion-nav-title>\\n <span translate>MESSAGE.VIEW.TITLE</span>\\n </ion-nav-title>\\n\\n <ion-nav-buttons side=\"secondary\">\\n\\n <button class=\"button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm\" ng-click=\"showActionsPopover($event)\">\\n </button>\\n </ion-nav-buttons>\\n\\n <ion-content scroll=\"true\">\\n\\n <div class=\"row no-padding\">\\n <div class=\"col col-20 hidden-xs hidden-sm\">&nbsp;</div>\\n\\n <div class=\"col no-padding\">\\n\\n <div class=\"center padding\" ng-if=\"loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div class=\"list animate-fade-slide-in item-text-wrap\">\\n\\n <!-- Buttons bar-->\\n <div class=\"item large-button-bar hidden-xs hidden-sm\">\\n <button class=\"button button-stable icon-left ink-dark\" ng-click=\"delete()\">\\n <i class=\"icon ion-trash-a assertive\"></i>\\n <span class=\"assertive\"> {{\\'COMMON.BTN_DELETE\\' | translate}}</span>\\n </button>\\n <button class=\"button button-stable icon ion-reply\" ng-click=\"showReplyModal()\">\\n {{\\'MESSAGE.BTN_REPLY\\' | translate}}\\n </button>\\n <!--<button class=\"button button-small button-stable icon ion-reply\"\\n ng-click=\"showForwardModal()\">\\n {{\\'MESSAGE.BTN_FORWARD\\' | translate}}\\n </button>-->\\n </div>\\n\\n <div class=\"item item-avatar\" ng-class=\"{\\'item-avatar\\': formData.avatar}\">\\n\\n <i ng-if=\"!formData.avatar\" class=\"item-image\" ng-class=\"{\\'ion-person\\': formData.uid, \\'ion-email\\': !formData.uid}\"></i>\\n <i ng-if=\"formData.avatar\" class=\"item-image avatar\" style=\"background-image: url({{::formData.avatar.src}})\"></i>\\n\\n <h1 class=\"title hidden-xs hidden-sm\" ng-bind-html=\"formData.title\"></h1>\\n <h4>\\n {{type == \\'inbox\\' ? \\'MESSAGE.VIEW.SENDER\\': \\'MESSAGE.VIEW.RECIPIENT\\'|translate}}\\n <a class=\"positive\" ui-sref=\"app.wot_identity({pubkey: (type == \\'inbox\\') ? formData.issuer : formData.recipient, uid: formData.name||formData.uid})\">\\n <span ng-if=\"formData.uid\">\\n <i class=\"ion-person\"></i>\\n {{formData.name||formData.uid}}\\n </span>\\n <span ng-if=\"!formData.uid\" class=\"gray\">\\n <i class=\"ion-key gray\"></i>\\n {{formData.name||(formData.issuer|formatPubkey)}}\\n </span>\\n </a>\\n <span class=\"hidden-xs hidden-sm\">\\n <i class=\"ion-clock\"></i>\\n {{formData.time|formatFromNow}}\\n <span class=\"gray\">|\\n {{formData.time | formatDate}}\\n </span>\\n </span>\\n </h4>\\n <h5 class=\"gray visible-xs visible-sm\">\\n <i class=\"ion-clock\"></i> {{formData.time | formatDate}}\\n </h5>\\n </div>\\n\\n <!-- content -->\\n <ion-item class=\"visible-xs visible-sm\">\\n <h1 class=\"title\" ng-bind-html=\"formData.title\"></h1>\\n </ion-item>\\n\\n <!-- content -->\\n <ion-item>\\n <p ng-bind-html=\"formData.html\">\\n </p>\\n\\n <div class=\"padding gray\" ng-if=\"!formData.content\" translate>\\n MESSAGE.VIEW.NO_CONTENT\\n </div>\\n </ion-item>\\n\\n\\n </div>\\n </div>\\n\\n <div class=\"col col-20 hidden-xs hidden-sm\">&nbsp;</div>\\n </div>\\n </ion-content>\\n\\n <button id=\"fab-view-message-reply\" class=\"button button-fab button-fab-bottom-right button-calm icon ion-reply visible-xs visible-sm spin\" ng-click=\"showReplyModal()\">\\n </button>\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/message/view_popover_actions.html','<ion-popover-view class=\"fit has-header\">\\n <ion-header-bar>\\n <h1 class=\"title\" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\\n </ion-header-bar>\\n <ion-content scroll=\"false\">\\n <div class=\"list item-text-wrap\">\\n\\n <a class=\"item item-icon-left assertive ink\" ng-click=\"delete()\">\\n <i class=\"icon ion-trash-a\"></i>\\n {{\\'MESSAGE.VIEW.DELETE\\' | translate}}\\n </a>\\n </div>\\n </ion-content>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/es/templates/network/item_content_peer.html','\\n <i class=\"icon ion-android-desktop\" ng-class=\":rebind:{\\'balanced\\': peer.online && peer.hasMainConsensusBlock, \\'energized\\': peer.online && peer.hasConsensusBlock, \\'gray\\': peer.online && !peer.hasConsensusBlock && !peer.hasMainConsensusBlock, \\'stable\\': !peer.online}\" ng-if=\":rebind:!peer.avatar\"></i>\\n <b class=\"icon-secondary ion-person\" ng-if=\":rebind:!peer.avatar\" ng-class=\":rebind:{\\'balanced\\': peer.online && peer.hasMainConsensusBlock, \\'energized\\': peer.online && peer.hasConsensusBlock, \\'gray\\': peer.online && !peer.hasConsensusBlock && !peer.hasMainConsensusBlock, \\'stable\\': !peer.online}\" style=\"left: 26px; top: -3px;\"></b>\\n <i class=\"avatar\" ng-if=\":rebind:peer.avatar\" style=\"background-image: url(\\'{{:rebind:peer.avatar.src}}\\')\"></i>\\n <b class=\"icon-secondary assertive ion-close-circled\" ng-if=\":rebind:!peer.online\" style=\"left: 37px; top: -10px;\"></b>\\n\\n <div class=\"row no-padding\">\\n <div class=\"col no-padding\">\\n <h3 class=\"dark\">{{:rebind:peer.dns || peer.server}}</h3>\\n <h4>\\n <span class=\"gray\" ng-if=\":rebind:!peer.name\">\\n <i class=\"ion-key\"></i> {{:rebind:peer.pubkey|formatPubkey}}\\n </span>\\n <span class=\"positive\" ng-if=\":rebind:peer.name\">\\n <i class=\"ion-person\"></i> {{:rebind:peer.name}}\\n </span>\\n <span class=\"gray\">{{:rebind:peer.dns && (\\' | \\' + peer.server) + (peer.ep.path||\\'\\') }}</span>\\n </h4>\\n </div>\\n <div class=\"col col-15 no-padding text-center hidden-xs hidden-sm\" ng-if=\"::expertMode\">\\n <div style=\"min-width: 50px; padding-top: 5px;\">\\n <span ng-if=\":rebind:peer.isSsl()\" title=\"SSL\">\\n <i class=\"ion-locked\"></i><small class=\"hidden-md\"> SSL</small>\\n </span>\\n <span ng-if=\":rebind:peer.hasEndpoint(\\'ES_SUBSCRIPTION_API\\')\" title=\"{{\\'ES_PEER.EMAIL_SUBSCRIPTION_COUNT\\'|translate: peer.docCount }}\">\\n <i class=\"ion-email\"></i> {{:rebind:peer.docCount.emailSubscription}}\\n </span>\\n </div>\\n <div ng-if=\":rebind:peer.isTor()\">\\n <i class=\"ion-bma-tor-api\"></i>\\n </div>\\n <div ng-if=\":rebind:peer.isWs2p()&&peer.isTor()\" ng-click=\"showWs2pPopover($event, peer)\">\\n <i class=\"ion-bma-tor-api\"></i>\\n </div>\\n </div>\\n <div class=\"col col-20 no-padding text-center\" ng-if=\"::!expertMode && search.type != \\'offline\\'\">\\n <div style=\"min-width: 50px; padding-top: 5px;\" ng-if=\":rebind:peer.docCount.emailSubscription!==undefined\">\\n <span ng-if=\":rebind:peer.hasEndpoint(\\'ES_SUBSCRIPTION_API\\')\" title=\"{{\\'ES_PEER.EMAIL_SUBSCRIPTION_COUNT\\'|translate: peer.docCount }}\">\\n <i class=\"ion-email\"></i> {{:rebind:peer.docCount.emailSubscription || \\'?\\'}}\\n </span>\\n </div>\\n </div>\\n <div class=\"col col-20 no-padding text-center\" ng-if=\"::expertMode && search.type != \\'offline\\'\">\\n <h4 class=\"hidden-sm hidden-xs gray\">\\n {{:rebind:peer.software||\\'?\\'}}\\n </h4>\\n <h4 class=\"hidden-sm hidden-xs gray\">{{:rebind: peer.version ? (\\'v\\'+peer.version) : \\'\\'}}</h4>\\n </div>\\n <div class=\"col col-20 no-padding text-center\" id=\"{{$index === 0 ? helptipPrefix + \\'-peer-0-block\\' : \\'\\'}}\">\\n <span class=\"badge badge-stable\">\\n {{:rebind:peer.docCount.record !== undefined ? (peer.docCount.record|formatInteger) : \\'?\\'}}\\n <span ng-if=\":rebind:!expertMode && peer.docCount.record!==undefined\">\\n {{::\\'ES_PEER.DOCUMENTS\\'|translate|lowercase }}\\n </span>\\n </span>\\n <span class=\"badge badge-secondary\" ng-class=\":rebind:{\\'balanced\\': peer.hasMainConsensusBlock, \\'energized\\': peer.hasConsensusBlock, \\'ng-hide\\': !peer.currentNumber }\" ng-if=\"::expertMode\">\\n {{:rebind:\\'BLOCKCHAIN.VIEW.TITLE\\'|translate: {number:peer.currentNumber} }}\\n </span>\\n\\n </div>\\n </div>\\n');\n$templateCache.put('plugins/es/templates/network/items_peers.html','<div ng-class=\"::motion.ionListClass\" class=\"no-padding\">\\n\\n <div class=\"item item-text-wrap no-border done in gray no-padding-top no-padding-bottom inline text-italic\" ng-if=\"::isHttps && expertMode\">\\n <small><i class=\"icon ion-alert-circled\"></i> {{::\\'NETWORK.INFO.ONLY_SSL_PEERS\\'|translate}}</small>\\n </div>\\n\\n <div class=\"item row row-header hidden-xs hidden-sm done in\" ng-if=\"::expertMode\">\\n <a class=\"col col-header no-padding dark\" ng-click=\"toggleSort(\\'name\\')\">\\n <cs-sort-icon asc=\"search.asc\" sort=\"search.sort\" toggle=\"\\'name\\'\"></cs-sort-icon>\\n {{::\\'ES_PEER.NAME\\' | translate}} / {{::\\'COMMON.PUBKEY\\' | translate}}\\n </a>\\n <a class=\"no-padding dark hidden-md col col-15 col-header\" ng-click=\"toggleSort(\\'api\\')\">\\n <cs-sort-icon asc=\"search.asc\" sort=\"search.sort\" toggle=\"\\'api\\'\"></cs-sort-icon>\\n {{::\\'PEER.API\\' | translate}}\\n </a>\\n <a class=\"no-padding dark col col-20 col-header\" ng-click=\"toggleSort(\\'difficulty\\')\">\\n <cs-sort-icon asc=\"search.asc\" sort=\"search.sort\" toggle=\"\\'software\\'\"></cs-sort-icon>\\n {{::\\'ES_PEER.SOFTWARE\\' | translate}}\\n </a>\\n <a class=\"col col-20 col-header no-padding dark\" ng-click=\"toggleSort(\\'doc_count\\')\">\\n <cs-sort-icon asc=\"search.asc\" sort=\"search.sort\" toggle=\"\\'doc_count\\'\"></cs-sort-icon>\\n {{::\\'ES_PEER.DOCUMENTS\\' | translate}}\\n </a>\\n </div>\\n\\n <div ng-repeat=\"peer in :rebind:search.results track by peer.id\" class=\"item item-peer item-icon-left ink\" ng-class=\"::ionItemClass\" id=\"{{helptipPrefix}}-peer-{{$index}}\" ng-click=\"selectPeer(peer)\" ng-include=\"::\\'plugins/es/templates/network/item_content_peer.html\\'\">\\n </div>\\n\\n</div>\\n');\n$templateCache.put('plugins/es/templates/network/lookup_popover_actions.html','<ion-popover-view class=\"fit has-header\">\\n <ion-header-bar>\\n <h1 class=\"title\" translate>PEER.POPOVER_FILTER_TITLE</h1>\\n </ion-header-bar>\\n <ion-content scroll=\"false\">\\n <div class=\"list item-text-wrap\">\\n\\n <a class=\"item item-icon-left item-icon-right ink\" ng-click=\"toggleSearchType(\\'member\\')\">\\n <i class=\"icon ion-person\"></i>\\n {{\\'PEER.MEMBERS\\' | translate}}\\n <i class=\"icon ion-ios-checkmark-empty\" ng-show=\"search.type==\\'member\\'\"></i>\\n </a>\\n\\n <a class=\"item item-icon-left item-icon-right ink\" ng-click=\"toggleSearchType(\\'mirror\\')\">\\n <i class=\"icon ion-radio-waves\"></i>\\n {{\\'PEER.MIRRORS\\' | translate}}\\n <i class=\"icon ion-ios-checkmark-empty\" ng-show=\"search.type==\\'mirror\\'\"></i>\\n </a>\\n\\n <a class=\"item item-icon-left item-icon-right ink\" ng-click=\"toggleSearchType(\\'offline\\')\">\\n <i class=\"icon ion-eye-disabled\"></i>\\n {{\\'PEER.OFFLINE\\' | translate}}\\n <i class=\"icon ion-ios-checkmark-empty\" ng-show=\"search.type==\\'offline\\'\"></i>\\n </a>\\n\\n </div>\\n </ion-content>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/es/templates/network/modal_network.html','<ion-modal-view id=\"nodes\" class=\"modal-full-height\" cache-view=\"false\">\\n <ion-header-bar class=\"bar-positive\">\\n <button class=\"button button-clear\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button>\\n <h1 class=\"title\" translate>PEER.PEER_LIST</h1>\\n <div class=\"buttons buttons-right header-item\">\\n <span class=\"secondary\">\\n <button class=\"button button-clear icon ion-loop button-clear\" ng-click=\"refresh()\">\\n\\n </button>\\n <button class=\"button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm\" ng-click=\"showActionsPopover($event)\">\\n </button>\\n </span>\\n </div>\\n </ion-header-bar>\\n\\n <ion-content>\\n <div class=\"list\">\\n <div class=\"padding padding-xs\" style=\"display: block; height: 60px;\">\\n\\n <div class=\"pull-left\">\\n <h4 ng-if=\"!enableFilter || !search.type\">\\n {{\\'PEER.ALL_PEERS\\' | translate}} <span ng-if=\"!search.loading\">({{search.results.length}})</span>\\n </h4>\\n </div>\\n\\n <div class=\"pull-right\">\\n <ion-spinner class=\"icon\" icon=\"android\" ng-if=\"search.loading\"></ion-spinner>&nbsp;\\n </div>\\n </div>\\n\\n <ng-include src=\"::\\'plugins/es/templates/network/items_peers.html\\'\"></ng-include>\\n\\n\\t </div>\\n </ion-content>\\n</ion-modal-view>\\n');\n$templateCache.put('plugins/es/templates/network/popover_endpoints.html','<ion-popover-view class=\"popover-endpoints popover-light\" style=\"height: {{(titleKey?30:0)+((!items || items.length &lt;= 1) ? 55 : 3+items.length*52)}}px\">\\n <ion-header-bar class=\"bar bar-header stable-bg\" ng-if=\"titleKey\">\\n <div class=\"title\">\\n {{titleKey | translate:titleValues }}\\n </div>\\n </ion-header-bar>\\n <ion-content scroll=\"false\">\\n <div class=\"list\" ng-class=\"{\\'has-header\\': titleKey}\">\\n <div class=\"item item-text-wrap\" ng-repeat=\"item in items\">\\n <div class=\"item-label\" ng-if=\"item.label\">{{item.label | translate}}</div>\\n <div id=\"endpoint_{{$index}}\" class=\"badge item-note dark\">{{item.value}}\\n </div>\\n </div>\\n </div></ion-content>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/es/templates/network/popover_network.html','<ion-popover-view class=\"fit hidden-xs hidden-sm popover-notification popover-network\" ng-controller=\"NetworkLookupPopoverCtrl\">\\n <ion-header-bar class=\"stable-bg block\">\\n <div class=\"title\">\\n {{\\'MENU.NETWORK\\'|translate}}\\n <ion-spinner class=\"ion-spinner-small\" icon=\"android\" ng-if=\"search.loading\"></ion-spinner>\\n </div>\\n\\n <div class=\"pull-right\">\\n <a ng-class=\"{\\'positive\\': search.type==\\'member\\', \\'dark\\': search.type!==\\'member\\'}\" ng-click=\"toggleSearchType(\\'member\\')\" translate>PEER.MEMBERS</a>\\n </div>\\n </ion-header-bar>\\n <ion-content scroll=\"true\">\\n <div class=\"list no-padding\">\\n <ng-include src=\"::\\'plugins/es/templates/network/items_peers.html\\'\"></ng-include>\\n </div>\\n </ion-content>\\n\\n <ion-footer-bar class=\"stable-bg block\">\\n <!-- settings -->\\n <div class=\"pull-left\">\\n <a class=\"positive\" ui-sref=\"app.settings\" ng-click=\"closePopover()\" translate>COMMON.NOTIFICATIONS.SETTINGS</a>\\n </div>\\n\\n <!-- show all -->\\n <div class=\"pull-right\">\\n <a class=\"positive\" ui-sref=\"app.es_network\" ng-click=\"closePopover()\" translate>COMMON.NOTIFICATIONS.SHOW_ALL</a>\\n </div>\\n </ion-footer-bar>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/es/templates/network/popover_peer_info.html','<ion-popover-view class=\"fit hidden-xs hidden-sm popover-notification popover-peer-info\" ng-controller=\"PeerInfoPopoverCtrl\">\\n <ion-header-bar class=\"stable-bg block\">\\n <div class=\"title\">\\n {{\\'PEER.VIEW.TITLE\\'|translate}}\\n </div>\\n </ion-header-bar>\\n <ion-content scroll=\"true\">\\n <div class=\"center padding\" ng-if=\"loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div class=\"list no-padding\" ng-if=\"!loading\">\\n\\n <div class=\"item\" ng-if=\":rebind:formData.software\">\\n <i class=\"ion-outlet\"></i>\\n {{\\'NETWORK.VIEW.SOFTWARE\\'|translate}}\\n <div class=\"badge\" ng-class=\":rebind:{\\'badge-energized\\': formData.isPreRelease, \\'badge-assertive\\': formData.hasNewRelease }\">\\n {{formData.software}} v{{:rebind:formData.version}}\\n </div>\\n <div class=\"gray badge badge-secondary\" ng-if=\"formData.isPreRelease\">\\n <i class=\"ion-alert-circled\"></i>\\n <span ng-bind-html=\"\\'NETWORK.VIEW.WARN_PRE_RELEASE\\'|translate: formData.latestRelease\"></span>\\n </div>\\n <div class=\"gray badge badge-secondary\" ng-if=\"formData.hasNewRelease\">\\n <i class=\"ion-alert-circled\"></i>\\n <span ng-bind-html=\"\\'NETWORK.VIEW.WARN_NEW_RELEASE\\'|translate: formData.latestRelease\"></span>\\n </div>\\n </div>\\n\\n <div class=\"item\">\\n <i class=\"ion-locked\"></i>\\n {{\\'NETWORK.VIEW.ENDPOINTS.BMAS\\'|translate}}\\n <div class=\"badge badge-balanced\" ng-if=\":rebind:formData.useSsl\" translate>COMMON.BTN_YES</div>\\n <div class=\"badge badge-assertive\" ng-if=\":rebind:!formData.useSsl\" translate>COMMON.BTN_NO</div>\\n </div>\\n\\n <div class=\"item\">\\n <i class=\"ion-cube\"></i>\\n {{\\'BLOCKCHAIN.VIEW.TITLE_CURRENT\\'|translate}}\\n <div class=\"badge badge-balanced\">\\n {{:rebind:formData.number | formatInteger}}\\n </div>\\n </div>\\n\\n <div class=\"item\">\\n <i class=\"ion-clock\"></i>\\n {{\\'CURRENCY.VIEW.MEDIAN_TIME\\'|translate}}\\n <div class=\"badge dark\">\\n {{:rebind:formData.medianTime | medianDate}}\\n </div>\\n </div>\\n\\n <div class=\"item\">\\n <i class=\"ion-lock-combination\"></i>\\n {{\\'CURRENCY.VIEW.POW_MIN\\'|translate}}\\n <div class=\"badge dark\">\\n {{:rebind:formData.powMin | formatInteger}}\\n </div>\\n </div>\\n\\n <!-- Allow extension here -->\\n <cs-extension-point name=\"default\"></cs-extension-point>\\n\\n </div>\\n </ion-content>\\n\\n <ion-footer-bar class=\"stable-bg block\">\\n <!-- settings -->\\n <div class=\"pull-left\">\\n <a class=\"positive\" ui-sref=\"app.settings\" ng-click=\"closePopover()\" translate>MENU.SETTINGS</a>\\n </div>\\n\\n <!-- show all -->\\n <div class=\"pull-right\">\\n <a class=\"positive\" ui-sref=\"app.view_es_peer\" ng-click=\"closePopover()\" translate>PEER.BTN_SHOW_PEER</a>\\n </div>\\n </ion-footer-bar>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/es/templates/network/view_es_network.html','<ion-view>\\n <ion-nav-title>\\n <span translate>MENU.NETWORK</span>&nbsp;\\n <span translate>ES_SETTINGS.PLUGIN_NAME</span>\\n </ion-nav-title>\\n\\n <ion-nav-buttons side=\"secondary\">\\n <button class=\"button button-icon button-clear icon ion-loop visible-xs visible-sm\" ng-click=\"refresh()\">\\n </button>\\n </ion-nav-buttons>\\n\\n\\n <ion-content scroll=\"true\" ng-init=\"enableFilter=true; ionItemClass=\\'item-border-large\\';\">\\n\\n <div class=\"row responsive-sm responsive-md responsive-lg\">\\n <div class=\"col list col-border-right\">\\n <div class=\"padding padding-xs\" style=\"display: block; height: 60px;\">\\n <div class=\"pull-left\">\\n <h4>\\n <span ng-if=\"enableFilter && !search.online\" translate>PEER.OFFLINE_PEERS</span>\\n <span ng-if=\"!enableFilter || search.online\" translate>PEER.ALL_PEERS</span>\\n <span ng-if=\"search.results.length\">({{search.results.length}})</span>\\n <ion-spinner ng-if=\"search.loading\" class=\"icon ion-spinner-small\" icon=\"android\"></ion-spinner>\\n </h4>\\n </div>\\n\\n <div class=\"pull-right\">\\n\\n <div class=\"pull-right\" ng-if=\"enableFilter\">\\n\\n <a class=\"button button-text button-small hidden-xs hidden-sm ink\" ng-class=\"{\\'button-text-positive\\': !search.online, \\'button-text-stable\\': search.online}\" ng-click=\"toggleOnline(!search.online)\">\\n <i class=\"icon ion-close-circled light-gray\"></i>\\n <span>{{\\'PEER.OFFLINE\\'|translate}}</span>\\n </a>\\n\\n <!-- Allow extension here -->\\n <cs-extension-point name=\"filter-buttons\"></cs-extension-point>\\n </div>\\n </div>\\n </div>\\n\\n <div id=\"helptip-network-peers\" style=\"display: block\"></div>\\n\\n <ng-include src=\"::\\'plugins/es/templates/network/items_peers.html\\'\"></ng-include>\\n </div>\\n\\n <div class=\"col col-33\" ng-controller=\"ESLastDocumentsCtrl\">\\n <div class=\"padding padding-xs\" style=\"display: block;\">\\n <h4 translate>DOCUMENT.LOOKUP.LAST_DOCUMENTS_DOTS</h4>\\n\\n <div class=\"pull-right hidden-xs hidden-sm\">\\n <a class=\"button button-text button-small ink\" ng-class=\"{\\'button-text-positive\\': compactMode, \\'button-text-stable\\': !compactMode}\" ng-click=\"toggleCompactMode()\">\\n <i class=\"icon ion-navicon\"></i>\\n <b class=\"icon-secondary ion-arrow-down-b\" style=\"top: -8px; left: 5px; font-size: 8px;\"></b>\\n <b class=\"icon-secondary ion-arrow-up-b\" style=\"top: 4px; left: 5px; font-size: 8px;\"></b>\\n <span>{{\\'DOCUMENT.LOOKUP.BTN_COMPACT\\'|translate}}</span>\\n </a>\\n\\n <!-- Allow extension here -->\\n <cs-extension-point name=\"documents-buttons\"></cs-extension-point>\\n\\n <a class=\"button button-text button-small ink\" ui-sref=\"app.document_search({index: search.index, type: search.type})\">\\n <i class=\"icon ion-android-search\"></i>\\n <span>{{\\'COMMON.BTN_SEARCH\\'|translate}}</span>\\n </a>\\n\\n </div>\\n </div>\\n\\n <ng-include src=\"::\\'plugins/es/templates/document/list_documents.html\\'\"></ng-include>\\n\\n </div>\\n </div>\\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/network/view_es_peer.html','<ion-view>\\n <ion-nav-title>\\n <span translate>PEER.VIEW.TITLE</span>&nbsp;\\n <span translate>ES_SETTINGS.PLUGIN_NAME</span>\\n </ion-nav-title>\\n\\n <ion-content>\\n\\n <div class=\"row no-padding\">\\n <div class=\"col col-20 hidden-xs hidden-sm\">&nbsp;\\n </div>\\n\\n <div class=\"col list\">\\n\\n <ion-item>\\n <h1>\\n <span translate>PEER.VIEW.TITLE</span>\\n <span class=\"gray\">\\n {{node.host}}\\n </span>\\n </h1>\\n <h2 class=\"gray\">\\n <i class=\"gray icon ion-android-globe\"></i>\\n {{node.ep.dns || node.server}}\\n <span class=\"gray\" ng-if=\"!loading && node.useSsl\">\\n <i class=\"gray ion-locked\"></i> <small>SSL</small>\\n </span>\\n <span class=\"gray\" ng-if=\"!loading && node.useTor\">\\n <i class=\"gray ion-bma-tor-api\"></i>\\n </span>\\n </h2>\\n\\n <!-- node owner -->\\n <h3>\\n <span class=\"dark\">\\n <i class=\"icon ion-android-desktop\"></i>\\n {{\\'PEER.VIEW.OWNER\\'|translate}}\\n </span>\\n <a class=\"positive\" ng-if=\"node.name\" ui-sref=\"app.wot_identity({pubkey: node.pubkey, uid: node.name})\">\\n <i class=\"ion-person\"></i> {{node.name}}\\n </a>\\n <span ng-if=\"!loading && !node.name\">\\n <a class=\"gray\" ui-sref=\"app.wot_identity({pubkey: node.pubkey})\">\\n <i class=\"ion-key\"></i>\\n {{node.pubkey|formatPubkey}}\\n </a>\\n </span>\\n </h3>\\n\\n <h3>\\n <a ng-click=\"openRawPeering($event)\">\\n <i class=\"icon ion-share\"></i> {{\\'PEER.VIEW.SHOW_RAW_PEERING\\'|translate}}\\n </a>\\n\\n <span class=\"gray\" ng-if=\"!isReachable\"> | </span>\\n <a ng-if=\"!isReachable\" ng-click=\"openRawCurrentBlock($event)\">\\n <i class=\"icon ion-share\"></i> <span translate>PEER.VIEW.SHOW_RAW_CURRENT_BLOCK</span>\\n </a>\\n </h3>\\n </ion-item>\\n\\n\\n <div class=\"item item-divider\" translate>\\n PEER.VIEW.GENERAL_DIVIDER\\n </div>\\n\\n <ion-item class=\"item-icon-left item-text-wrap ink\" copy-on-click=\"{{node.pubkey}}\">\\n <i class=\"icon ion-key\"></i>\\n <span translate>COMMON.PUBKEY</span>\\n <h4 class=\"dark text-left\">{{node.pubkey}}</h4>\\n </ion-item>\\n\\n\\n <ion-item class=\"item item-icon-left item-text-wrap ink\" ng-if=\"isReachable\">\\n <i class=\"icon ion-cube\"></i>\\n <span translate>BLOCKCHAIN.VIEW.TITLE_CURRENT</span>\\n <div class=\"badge badge-calm\" ng-if=\"!loading\">\\n {{current.number|formatInteger}}\\n </div>\\n </ion-item>\\n\\n <ion-item class=\"item item-icon-left item-text-wrap\" ng-if=\"isReachable\">\\n <i class=\"icon ion-document\"></i>\\n <span translate>ES_PEER.DOCUMENT_COUNT</span>\\n <div class=\"badge badge-stable\" ng-if=\"!loading\">\\n {{node.docCount|formatInteger}}\\n </div>\\n </ion-item>\\n\\n <a class=\"item item-icon-left item-icon-right item-text-wrap ink\" ng-if=\"isReachable\" ui-sref=\"app.document_search(options.document)\">\\n <i class=\"icon ion-document\" style=\"font-size: 25px;\"></i>\\n <i class=\"icon-secondary ion-clock\" style=\"font-size: 18px; left: 33px; top: -12px;\"></i>\\n <span translate>DOCUMENT.LOOKUP.LAST_DOCUMENTS</span>\\n <i class=\"gray icon ion-ios-arrow-right\"></i>\\n </a>\\n\\n <!-- Allow extension here -->\\n <cs-extension-point name=\"general\"></cs-extension-point>\\n\\n <div class=\"item item-divider\" ng-hide=\"loading || !isReachable\" translate>\\n PEER.VIEW.KNOWN_PEERS\\n </div>\\n\\n <ion-item class=\"item item-text-wrap no-border done in gray no-padding-top no-padding-bottom inline text-italic\" ng-show=\"!loading && !isReachable\">\\n <small><i class=\"icon ion-alert-circled\"></i> {{\\'NETWORK.INFO.ONLY_SSL_PEERS\\'|translate}}</small>\\n </ion-item>\\n\\n <div class=\"item center\" ng-if=\"loading\">\\n <ion-spinner class=\"icon\" icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div class=\"list no-padding {{::motion.ionListClass}}\" ng-if=\"isReachable\">\\n\\n <div ng-repeat=\"peer in :rebind:peers track by peer.id\" class=\"item item-peer item-icon-left ink\" ng-class=\"::ionItemClass\" ng-click=\"selectPeer(peer)\" ng-include=\"::\\'plugins/es/templates/network/item_content_peer.html\\'\">\\n </div>\\n\\n </div>\\n </div>\\n\\n <div class=\"col col-20 hidden-xs hidden-sm\">&nbsp;\\n </div>\\n </div>\\n\\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/network/view_network_extend.html','<!-- Network: buttons section -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'network-buttons\\'\">\\n <a class=\"button button-text button-small hidden-xs hidden-sm ink\" ng-if=\"::expertMode\" title=\"{{\\'NETWORK.VIEW.ENDPOINTS.ES_USER_API\\'|translate}}\" ui-sref=\"app.es_network\">\\n <i class=\"icon ion-image\"></i>\\n <span>{{\\'ES_SETTINGS.PLUGIN_NAME\\'|translate}}</span>\\n </a>\\n</ng-if>\\n\\n<!-- Blockchain: buttons section -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'blockchain-buttons\\'\">\\n <a class=\"button button-text button-small ink\" ui-sref=\"app.blockchain_search\">\\n <i class=\"icon ion-android-search\"></i>\\n <span>{{\\'COMMON.BTN_SEARCH\\'|translate}}</span>\\n </a>\\n</ng-if>\\n\\n');\n$templateCache.put('plugins/es/templates/notification/list_notification.html','<ion-list class=\"{{::motion.ionListClass}}\">\\n\\n <ion-item ng-repeat=\"notification in search.results track by notification.id\" class=\"item-border-large item-text-wrap ink item-avatar\" ng-class=\"{\\'unread\\': !notification.read}\" ng-click=\"select($event, notification)\">\\n\\n <i ng-if=\"!notification.avatar\" class=\"item-image icon {{::notification.avatarIcon}}\"></i>\\n <i ng-if=\"notification.avatar\" class=\"item-image avatar\" style=\"background-image: url({{::notification.avatar.src}})\"></i>\\n\\n <h3 trust-as-html=\"notification.message | translate:(notification.messageParams||notification)\"></h3>\\n <h4 ng-if=\"!notification.medianTime\">\\n <i class=\"icon {{notification.icon}}\"></i>&thinsp;<span class=\"dark\">{{notification.time|formatFromNow}}</span>\\n <span class=\"gray\">| {{notification.time|formatDate}}</span>\\n </h4>\\n <h4 ng-if=\"notification.medianTime\">\\n <i class=\"icon {{notification.icon}}\"></i>&thinsp;<span class=\"dark\">{{notification.medianTime|medianFromNow}}</span>\\n <span class=\"gray\">| {{notification.medianTime|medianDate}}</span>\\n </h4>\\n </ion-item>\\n</ion-list>\\n\\n<ion-infinite-scroll ng-if=\"!search.loading && search.hasMore\" spinner=\"android\" on-infinite=\"showMore()\" distance=\"1%\">\\n</ion-infinite-scroll>\\n');\n$templateCache.put('plugins/es/templates/notification/popover_actions.html','<ion-popover-view class=\"fit has-header\">\\n <ion-header-bar>\\n <h1 class=\"title\" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\\n </ion-header-bar>\\n <ion-content scroll=\"false\">\\n <div class=\"list item-text-wrap\">\\n\\n <a class=\"item item-icon-left ink\" ng-disabled=\"!search.results.length\" ng-click=\"markAllAsRead()\">\\n <i class=\"icon ion-android-checkmark-circle\"></i>\\n {{\\'COMMON.NOTIFICATIONS.MARK_ALL_AS_READ\\' | translate}}\\n </a>\\n\\n </div>\\n </ion-content>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/es/templates/notification/popover_notification.html','<ion-popover-view class=\"fit hidden-xs hidden-sm popover-notification\" ng-controller=\"PopoverNotificationsCtrl\">\\n <ion-header-bar class=\"stable-bg block\">\\n <div class=\"title\" translate>COMMON.NOTIFICATIONS.TITLE</div>\\n\\n <div class=\"pull-right\">\\n <a class=\"positive\" ng-click=\"markAllAsRead()\" translate>COMMON.NOTIFICATIONS.MARK_ALL_AS_READ</a>\\n </div>\\n </ion-header-bar>\\n <ion-content scroll=\"true\">\\n <div class=\"center padding\" ng-if=\"search.loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n <div class=\"padding gray\" ng-if=\"!search.loading && !search.results.length\" translate>\\n COMMON.NOTIFICATIONS.NO_RESULT\\n </div>\\n\\n <ng-include src=\"::\\'plugins/es/templates/notification/list_notification.html\\'\"></ng-include>\\n\\n </ion-content>\\n\\n <ion-footer-bar class=\"stable-bg block\">\\n <!-- settings -->\\n <div class=\"pull-left\">\\n <a class=\"positive\" ui-sref=\"app.es_settings\" ng-click=\"closePopover()\" translate>MENU.SETTINGS</a>\\n </div>\\n\\n <!-- show all -->\\n <div class=\"pull-right\">\\n <a class=\"positive\" ui-sref=\"app.view_notifications\" ng-click=\"closePopover()\" translate>COMMON.NOTIFICATIONS.SHOW_ALL</a>\\n </div>\\n </ion-footer-bar>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/es/templates/notification/view_notifications.html','<ion-view left-buttons=\"leftButtons\" class=\"view-notification\">\\n <ion-nav-title>\\n {{\\'COMMON.NOTIFICATIONS.TITLE\\' | translate}}\\n </ion-nav-title>\\n\\n <ion-nav-buttons side=\"secondary\">\\n <button class=\"button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm\" ng-click=\"showActionsPopover($event)\">\\n </button>\\n </ion-nav-buttons>\\n\\n <ion-content scroll=\"true\">\\n <ion-refresher pulling-text=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\" on-refresh=\"refresh(true)\">\\n </ion-refresher>\\n\\n <!-- Buttons bar-->\\n <div class=\"hidden-xs hidden-sm padding text-center\">\\n\\n <button class=\"button button-stable button-small-padding icon ion-loop ink\" ng-click=\"refresh()\">\\n </button>\\n\\n <button class=\"button button-raised icon-left ion-checkmark ink\" ng-click=\"markAllAsRead()\">\\n {{\\'COMMON.NOTIFICATIONS.MARK_ALL_AS_READ\\' | translate}}\\n </button>\\n </div>\\n\\n <div class=\"row no-padding\">\\n <div class=\"col col-20 hidden-xs hidden-sm\">&nbsp;</div>\\n\\n <div class=\"col no-padding-xs no-padding-sm\">\\n\\n <div class=\"center padding\" ng-if=\"search.loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div class=\"padding gray\" ng-if=\"!search.loading && !search.results.length\" translate>\\n COMMON.NOTIFICATIONS.NO_RESULT\\n </div>\\n\\n <ng-include src=\"::\\'plugins/es/templates/notification/list_notification.html\\'\"></ng-include>\\n\\n\\n </div>\\n\\n <div class=\"col col-20 hidden-xs hidden-sm\">&nbsp;</div>\\n\\n </div>\\n\\n </ion-content>\\n\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/registry/edit_record.html','<ion-view left-buttons=\"leftButtons\" class=\"view-page\">\\n <ion-nav-title>\\n <span class=\"visible-xs\" ng-if=\"id\" ng-bind-html=\"formData.title\"></span>\\n <span class=\"visible-xs\" ng-if=\"!loading && !id\" translate>REGISTRY.EDIT.TITLE_NEW</span>\\n </ion-nav-title>\\n\\n <ion-nav-buttons side=\"secondary\">\\n <button class=\"button button-icon button-clear visible-xs visible-sm\" ng-class=\"{\\'ion-android-send\\':!id, \\'ion-android-done\\': id}\" ng-click=\"save()\">\\n </button>\\n </ion-nav-buttons>\\n\\n <ion-content scroll=\"true\">\\n\\n <div class=\"hero\">\\n <div class=\"content\">\\n <i class=\"avatar\" ng-class=\"avatarClass\" ng-style=\"avatarStyle\">\\n <button class=\"button button-positive button-large button-clear flat icon ion-camera visible-xs visible-sm\" style=\"display: inline-block;\" ng-click=\"showAvatarModal()\"></button>\\n <button ng-if=\"avatar.src\" class=\"button button-positive button-large button-clear flat visible-xs visible-sm\" style=\"display: inline-block; left: 85px; bottom:15px;\" ng-click=\"rotateAvatar()\">\\n <i class=\"icon-secondary ion-image\" style=\"left: 24px; top: 3px; font-size: 24px;\"></i>\\n <i class=\"icon-secondary ion-forward\" style=\"left: 26px; top: -13px;\"></i>\\n </button>\\n <button class=\"button button-positive button-large button-clear icon ion-camera hidden-xs hidden-sm\" ng-click=\"showAvatarModal()\"></button>\\n </i>\\n <h3 class=\"dark\">\\n <span ng-if=\"!loading && formData.title\">{{formData.title}}</span>\\n <span ng-if=\"!loading && !id && !formData.title\" translate>REGISTRY.EDIT.TITLE_NEW</span>\\n </h3>\\n <h4 class=\"dark\">\\n <ion-spinner ng-if=\"loading\" icon=\"android\"></ion-spinner>\\n </h4>\\n </div>\\n </div>\\n\\n <div class=\"row no-padding\">\\n\\n <div class=\"col col-20 hidden-xs hidden-sm\">&nbsp;</div>\\n\\n <div class=\"col no-padding-xs no-padding-sm\">\\n\\n <form name=\"recordForm\" novalidate=\"\" ng-submit=\"save()\">\\n <div class=\"list {{::motion.ionListClass}}\" ng-init=\"setForm(recordForm)\">\\n <div class=\"item\" ng-if=\"id\">\\n <h4 class=\"gray\">\\n <i class=\"icon ion-calendar\"></i>\\n {{\\'COMMON.LAST_MODIFICATION_DATE\\'|translate}}&nbsp;{{formData.time | formatDate}}\\n </h4>\\n <div class=\"badge badge-balanced badge-editable\" ng-click=\"showRecordTypeModal()\">\\n {{\\'REGISTRY.TYPE.ENUM.\\'+formData.type|upper|translate}}\\n </div>\\n </div>\\n\\n <!-- pictures -->\\n <ng-include src=\"::\\'plugins/es/templates/common/edit_pictures.html\\'\"></ng-include>\\n\\n <div class=\"item item-divider\" translate>REGISTRY.GENERAL_DIVIDER</div>\\n\\n <!-- title -->\\n <div class=\"item item-input item-floating-label\" ng-class=\"{\\'item-input-error\\': form.$submitted && form.title.$invalid}\">\\n <span class=\"input-label\" translate>REGISTRY.EDIT.RECORD_TITLE</span>\\n <input type=\"text\" placeholder=\"{{\\'REGISTRY.EDIT.RECORD_TITLE_HELP\\'|translate}}\" name=\"title\" id=\"registry-record-title\" ng-model=\"formData.title\" ng-minlength=\"3\" ng-required=\"true\">\\n </div>\\n <div class=\"form-errors\" ng-if=\"form.$submitted && form.title.$error\" ng-messages=\"form.title.$error\">\\n <div class=\"form-error\" ng-message=\"required\">\\n <span translate=\"ERROR.FIELD_REQUIRED\"></span>\\n </div>\\n <div class=\"form-error\" ng-message=\"minlength\">\\n <span translate=\"ERROR.FIELD_TOO_SHORT\"></span>\\n </div>\\n </div>\\n\\n <!-- description -->\\n <div class=\"item item-input item-floating-label\">\\n <span class=\"input-label\" translate>REGISTRY.EDIT.RECORD_DESCRIPTION</span>\\n <textarea placeholder=\"{{\\'REGISTRY.EDIT.RECORD_DESCRIPTION_HELP\\'|translate}}\" ng-model=\"formData.description\" rows=\"8\" cols=\"10\">\\n </textarea>\\n </div>\\n\\n <!-- category -->\\n <div class=\"item item-icon-right ink\" ng-if=\"loading || formData.type===\\'company\\' || formData.type===\\'shop\\'\" ng-class=\"{\\'item-input-error\\': form.$submitted && !formData.category.id, \\'done in\\': !loading}\" ng-click=\"showCategoryModal()\">\\n <span translate>REGISTRY.CATEGORY</span>\\n <span class=\"badge badge-royal\">{{formData.category.name | formatCategory}}</span>&nbsp;\\n <i class=\"gray icon ion-ios-arrow-right\"></i>\\n </div>\\n <input type=\"hidden\" name=\"category\" ng-model=\"formData.category.id\" required-if=\"formData.type==\\'company\\' || formData.type==\\'shop\\'\">\\n <div class=\"form-errors\" ng-if=\"form.$submitted && form.category.$error\" ng-messages=\"form.category.$error\">\\n <div class=\"form-error\" ng-message=\"required\">\\n <span translate=\"ERROR.FIELD_REQUIRED\"></span>\\n </div>\\n </div>\\n\\n <!-- position -->\\n <ng-include src=\"::\\'plugins/es/templates/common/edit_position.html\\'\" ng-controller=\"ESPositionEditCtrl as ctrl\"></ng-include>\\n\\n <!-- social networks -->\\n <ng-include src=\"::\\'plugins/es/templates/common/edit_socials.html\\'\" ng-controller=\"ESSocialsEditCtrl\"></ng-include>\\n\\n <div class=\"item item-divider\" translate>REGISTRY.TECHNICAL_DIVIDER</div>\\n\\n <!-- pubkey -->\\n <div class=\"item item-input item-floating-label\">\\n <span class=\"input-label\" translate>REGISTRY.EDIT.RECORD_PUBKEY</span>\\n <input type=\"text\" placeholder=\"{{\\'REGISTRY.EDIT.RECORD_PUBKEY_HELP\\'|translate}}\" ng-model=\"formData.pubkey\">\\n </div>\\n\\n </div>\\n\\n <div class=\"padding hidden-xs hidden-sm text-right\">\\n <button class=\"button button-clear button-dark ink\" ng-click=\"cancel()\" type=\"button\" translate>\\n COMMON.BTN_CANCEL\\n </button>\\n <button class=\"button button-positive button-raised ink\" type=\"submit\" ng-if=\"!id\" translate>\\n COMMON.BTN_PUBLISH\\n </button>\\n <button class=\"button button-assertive button-raised ink\" type=\"submit\" ng-if=\"id\" translate>\\n COMMON.BTN_SAVE\\n </button>\\n </div>\\n </form>\\n </div>\\n\\n <div class=\"col col-20 hidden-xs hidden-sm\">&nbsp;</div>\\n\\n </div>\\n \\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/registry/lookup_form_options.html','\\n <!-- removeIf(device) -->\\n <div class=\"item item-icon-left item-icon-right item-input stable-bg\" remove-if=\"device\" ng-click=\"showRecordTypeModal($event)\" ng-if=\"!smallscreen && search.advanced && !search.type\">\\n <b class=\"icon-secondary ion-help gray\" style=\"left:10px; top: -8px;\"></b>\\n <b class=\"icon-secondary cion-page-association gray\" style=\"left:14px; top: 2px;\"></b>\\n <b class=\"icon-secondary cion-page-company gray\" style=\"left:28px; top: -6px;\"></b>\\n\\n <span class=\"input-label item-icon-left-padding\" translate>REGISTRY.SEARCH.TYPE</span>\\n <i class=\"gray icon ion-ios-arrow-right\"></i>\\n </div>\\n\\n <div class=\"item item-icon-left item-icon-right item-input stable-bg\" remove-if=\"device\" ng-click=\"showCategoryModal($event)\" ng-if=\"!smallscreen && search.advanced && !search.category\">\\n <i class=\"icon ion-flag gray\"></i>\\n <span class=\"input-label item-icon-left-padding\" translate>REGISTRY.CATEGORY</span>\\n <i class=\"gray icon ion-ios-arrow-right\"></i>\\n </div>\\n\\n <div class=\"item item-icon-left item-input item-select stable-bg\" ng-if=\"search.advanced && options.location.show\">\\n <i class=\"icon ion-arrow-resize gray\"></i>\\n <span class=\"input-label item-icon-left-padding\" translate>LOCATION.DISTANCE</span>\\n <label>\\n <select ng-model=\"search.geoDistance\" class=\"col-border-left\" ng-options=\"i as (geoDistanceLabels[i].labelKey | translate:geoDistanceLabels[i].labelParams ) for i in geoDistances track by i\">\\n </select>\\n </label>\\n </div>\\n');\n$templateCache.put('plugins/es/templates/registry/lookup_form.html','\\n<!-- selected location\\n<a\\n class=\"button button-small button-text button-stable button-icon-event stable-900-bg\"\\n style=\"margin-right: 10px;\">\\n &nbsp;<i class=\"icon ion-location\"></i>\\n {{search.location}}\\n <i class=\"icon ion-close\" ng-click=\"removeLocation2()\">&nbsp;&nbsp;</i>\\n</a>-->\\n<form ng-submit=\"doSearch()\">\\n <div class=\"item no-padding\">\\n\\n <div class=\"item-input\">\\n <i class=\"icon ion-search placeholder-icon\"></i>\\n <input type=\"text\" class=\"visible-xs visible-sm\" placeholder=\"{{\\'REGISTRY.SEARCH.SEARCH_HELP\\'|translate}}\" ng-model=\"search.text\" ng-model-options=\"{ debounce: 650 }\" ng-change=\"doSearch()\" on-return=\"doSearchText()\" select-on-click>\\n <input type=\"text\" class=\"hidden-xs hidden-sm\" placeholder=\"{{\\'REGISTRY.SEARCH.SEARCH_HELP\\'|translate}}\" id=\"registrySearchText\" ng-model=\"search.text\" on-return=\"doSearchText()\">\\n </div>\\n\\n <div class=\"row double-padding-x item-text-wrap animate-show-hide ng-hide hidden-xs hidden-sm\" ng-show=\"entered\" ng-if=\"search.geoPoint || search.type || search.category\">\\n\\n <!-- selected location -->\\n <div ng-show=\"search.geoPoint\" class=\"button button-small button-text button-stable button-icon-event stable-900-bg\" style=\"margin-right: 10px;\">\\n &nbsp;<i class=\"icon ion-location\"></i>\\n <span ng-bind-html=\"search.location\"></span>\\n <i class=\"icon ion-close\" ng-click=\"removeLocation()\">&nbsp;&nbsp;</i>\\n </div>\\n\\n <!-- selected type -->\\n <div ng-show=\"search.type\" class=\"button button-small button-text button-stable button-icon-event stable-900-bg\" style=\"margin-right: 10px;\">\\n &nbsp;<i class=\"icon cion-page-{{search.type}}\"></i>\\n <span>{{\\'REGISTRY.TYPE.ENUM.\\'+search.type|uppercase|translate}}</span>\\n <i class=\"icon ion-close\" ng-click=\"removeType()\">&nbsp;&nbsp;</i>\\n </div>\\n\\n <!-- selected category -->\\n <div ng-show=\"search.category.name\" class=\"button button-small button-text button-stable button-icon-event stable-900-bg\" style=\"margin-right: 10px;\">\\n &nbsp;<i class=\"icon ion-flag\"></i>\\n <span>{{search.category.name|truncText:40}}</span>\\n <i class=\"icon ion-close\" ng-click=\"removeCategory()\">&nbsp;&nbsp;</i>\\n </div>\\n </div>\\n </div>\\n\\n <!-- location -->\\n <ng-include src=\"::\\'plugins/es/templates/common/item_location_search.html\\'\" ng-if=\"entered && options.location.show && (!search.geoPoint || smallscreen)\" ng-controller=\"ESSearchPositionItemCtrl\"></ng-include>\\n\\n <!-- options -->\\n <ng-include src=\"::\\'plugins/es/templates/registry/lookup_form_options.html\\'\"></ng-include>\\n\\n\\n\\n<div class=\"padding-top hidden-xs hidden-sm\" style=\"display: block; height: 60px;\">\\n <div class=\"pull-left\">\\n\\n <a class=\"button button-text button-small ink\" ng-class=\"{\\'button-text-stable\\': !search.advanced, \\'button-text-positive\\': search.advanced}\" ng-click=\"search.advanced=!search.advanced\">\\n {{\\'REGISTRY.SEARCH.BTN_ADVANCED_SEARCH\\' | translate}}\\n <i class=\"icon\" ng-class=\"{\\'ion-arrow-down-b\\': !search.advanced, \\'ion-arrow-up-b\\': search.advanced}\"></i>\\n </a>\\n\\n &nbsp;\\n\\n </div>\\n\\n <div class=\"pull-right\">\\n\\n <a ng-if=\"enableFilter\" class=\"button button-text button-small ink\" ng-class=\"{\\'button-text-positive\\': search.lastRecords}\" ng-click=\"doGetLastRecords()\">\\n <i class=\"icon ion-clock\"></i>\\n {{\\'REGISTRY.SEARCH.BTN_LAST_RECORDS\\' | translate}}\\n </a>\\n &nbsp;\\n\\n <!-- Allow extension here -->\\n <cs-extension-point name=\"filter-buttons\"></cs-extension-point>\\n\\n &nbsp;\\n\\n <button class=\"button button-small button-stable ink\" ng-click=\"doSearchText()\">\\n {{\\'COMMON.BTN_SEARCH\\' | translate}}\\n </button>\\n </div>\\n</div>\\n\\n<div class=\"padding-top padding-xs padding-sm\" style=\"display: block; height: 60px;\">\\n <div class=\"pull-left ng-hide\" ng-show=\"!search.loading && search.results\">\\n <ng-if ng-if=\"search.lastRecords\">\\n <h4 translate>REGISTRY.SEARCH.LAST_RECORDS</h4>\\n <small class=\"gray no-padding\" ng-if=\"search.total\">\\n <span ng-if=\"search.geoPoint && search.total\">{{\\'REGISTRY.SEARCH.LAST_RECORD_COUNT_LOCATION\\'|translate:{count: search.total, location: search.location} }}</span>\\n <span ng-if=\"!search.geoPoint && search.total\">{{\\'REGISTRY.SEARCH.LAST_RECORD_COUNT\\'|translate:{count: search.total} }}</span>\\n </small>\\n </ng-if>\\n\\n <ng-if ng-if=\"!search.lastRecords\">\\n <h4 translate>COMMON.RESULTS_LIST</h4>\\n <small class=\"gray no-padding\" ng-if=\"search.total\">\\n <span ng-if=\"search.geoPoint && search.total\">{{\\'REGISTRY.SEARCH.RESULT_COUNT_LOCATION\\'|translate:{count: search.total, location: search.location} }}</span>\\n <span ng-if=\"!search.geoPoint && search.total\">{{\\'REGISTRY.SEARCH.RESULT_COUNT\\'|translate:{count: search.total} }}</span>\\n </small>\\n </ng-if>\\n\\n </div>\\n</div>\\n\\n<div class=\"center\" ng-if=\"search.loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n</div>\\n\\n<div class=\"padding assertive\" ng-if=\"!search.loading && search.results.length===0\" translate>\\n COMMON.SEARCH_NO_RESULT\\n</div>\\n');\n$templateCache.put('plugins/es/templates/registry/lookup_lg.html','<ion-view left-buttons=\"leftButtons\">\\n <ion-nav-title>\\n {{\\'REGISTRY.SEARCH.TITLE\\' | translate}}\\n </ion-nav-title>\\n\\n <ion-content class=\"lookupForm padding no-padding-xs no-padding-sm\">\\n\\n <ng-include src=\"::\\'plugins/es/templates/wot/lookup_lg_extend.html\\'\" ng-init=\"enable= true; showNewPageButton=true;\"></ng-include>\\n\\n <ng-include src=\"::\\'plugins/es/templates/registry/lookup_form.html\\'\"></ng-include>\\n\\n <ng-include src=\"::\\'plugins/es/templates/registry/lookup_list_lg.html\\'\"></ng-include>\\n </ion-content>\\n\\n <button id=\"fab-add-registry-record\" class=\"button button-fab button-fab-bottom-right button-assertive icon ion-plus hidden-md hidden-lg spin\" ng-click=\"showNewPageModal()\">\\n </button>\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/registry/lookup_list_lg.html','\\n\\n<div class=\"list {{::motion.ionListClass}}\" ng-if=\"!search.loading && search.results && search.results.length > 0\">\\n\\n <a ng-repeat=\"item in search.results\" class=\"item item-record item-border-large ink padding-xs\" ui-sref=\"app.view_page({id: item.id, title: item.urlTitle})\">\\n\\n <div class=\"row row-record\">\\n <div class=\"col item-text-wrap item-avatar-left-padding\" ng-class=\"::{\\'item-avatar\\': item.avatar || item.type}\">\\n <i class=\"item-image icon cion-page-{{::item.type}}\" ng-if=\"::!item.avatar\"></i>\\n <i class=\"item-image avatar\" style=\"background-image: url({{::item.avatar.src}})\" ng-if=\"::item.avatar\"></i>\\n <h2 ng-bind-html=\"::item.title\"></h2>\\n <h4>\\n <span class=\"dark\" ng-if=\"::item.city\">\\n <b class=\"ion-location\"></b>\\n <span ng-bind-html=\"::item.city\"></span>\\n </span>\\n <span class=\"gray\" ng-if=\"::item.distance\">\\n ({{::item.distance|formatDecimal}} {{::geoUnit}})\\n </span>\\n </h4>\\n <h4>\\n <span class=\"gray\" ng-if=\"::item.time && search.lastRecords\">\\n <b class=\"ion-clock\"></b>\\n {{::item.time | formatFromNow}}\\n </span>\\n <span ng-if=\"::item.tags\" class=\"dark\">\\n <ng-repeat ng-repeat=\"tag in ::item.tags\">\\n #<ng-bind-html ng-bind-html=\"::tag\"></ng-bind-html>\\n </ng-repeat>\\n </span>\\n </h4>\\n <span ng-if=\"::item.picturesCount > 1\" class=\"badge badge-balanced badge-picture-count\">{{::item.picturesCount}}&nbsp;<i class=\"icon ion-camera\"></i></span>\\n </div>\\n <div class=\"col col-20 hidden-xs hidden-sm\">\\n <h3 class=\"gray\">\\n <ng-if ng-if=\"::item.category\">{{::item.category.name}}</ng-if>\\n <ng-if ng-if=\"::!item.category\">{{::\\'REGISTRY.TYPE.ENUM.\\'+item.type|uppercase|translate}}</ng-if>\\n </h3>\\n </div>\\n <div class=\"col hidden-xs\">\\n <h4 class=\"text-wrap\">\\n <span class=\"visible-sm\">\\n <b class=\"ion-flag\"></b>\\n <ng-if ng-if=\"::item.category\">{{::item.category.name|truncText:50}}</ng-if>\\n <ng-if ng-if=\"::!item.category\">{{::\\'REGISTRY.TYPE.ENUM.\\'+item.type|uppercase|translate}}</ng-if>\\n </span>\\n <span class=\"gray text-italic\" ng-if=\"::item.description\">\\n <b class=\"ion-quote\"></b>\\n <span ng-bind-html=\"::item.description|truncText:500\" ng-if=\"::item.description\"></span>\\n </span>\\n </h4>\\n </div>\\n </div>\\n\\n </a>\\n</div>\\n\\n<ion-infinite-scroll ng-if=\"!search.loading && search.hasMore\" spinner=\"android\" on-infinite=\"showMore()\" distance=\"10%\">\\n</ion-infinite-scroll>\\n');\n$templateCache.put('plugins/es/templates/registry/lookup_list.html','\\n<ion-list class=\"{{::motion.ionListClass}}\" ng-if=\"!search.loading && search.results\">\\n\\n <div class=\"item item-avatar item-icon-right item-border-large ink\" ng-repeat=\"item in search.results\" ui-sref=\"app.view_page({id: item.id, title: item.urlTitle})\">\\n\\n <i ng-if=\"::!item.avatar\" class=\"item-image icon cion-page-{{::item.type}}\"></i>\\n <i ng-if=\"::item.avatar\" class=\"item-image avatar\" style=\"background-image: url({{::item.avatar.src}})\"></i>\\n\\n <h2 ng-bind-html=\"::item.title\"></h2>\\n <h4>\\n <span class=\"dark\" ng-if=\"::item.city\">\\n <b class=\"ion-location\"></b>\\n <span ng-bind-html=\"::item.city\"></span>\\n </span>\\n <span class=\"gray\" ng-if=\"::item.distance\">\\n ({{::item.distance|formatDecimal}} {{::geoUnit}})\\n </span>\\n </h4>\\n <h4 class=\"gray\" ng-if=\"::item.time && search.lastRecords\">\\n <i class=\"ion-clock\"></i>\\n {{::item.time | formatFromNow}}\\n </h4>\\n <h4 class=\"gray\" ng-if=\"!search.lastRecords\">\\n <i class=\"cion-page-{{::item.type}}\"></i>\\n <span ng-if=\"item.category\">{{::item.category.name}}</span>\\n <span ng-if=\"!item.category\">{{::\\'REGISTRY.TYPE.ENUM.\\'+item.type|uppercase|translate}}</span>\\n </h4>\\n <i class=\"icon ion-ios-arrow-right\"></i>\\n </div>\\n</ion-list>\\n');\n$templateCache.put('plugins/es/templates/registry/lookup_popover_actions.html','<ion-popover-view class=\"fit has-header\">\\n <ion-header-bar>\\n <h1 class=\"title\" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\\n </ion-header-bar>\\n <ion-content scroll=\"false\">\\n <div class=\"list item-text-wrap\">\\n\\n <!-- new page -->\\n <a class=\"item item-icon-left ink\" ng-click=\"showNewPageModal();\">\\n <i class=\"icon ion-plus\"></i>\\n <span translate>REGISTRY.BTN_NEW</span>\\n </a>\\n\\n </div>\\n </ion-content>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/es/templates/registry/lookup_popover_filters.html','<ion-popover-view class=\"fit has-header\">\\n <ion-header-bar>\\n <h1 class=\"title\" translate>COMMON.POPOVER_FILTER_TITLE</h1>\\n </ion-header-bar>\\n <ion-content scroll=\"false\">\\n <div class=\"list item-text-wrap\">\\n\\n <!-- last record -->\\n <a class=\"item item-icon-left ink\" ng-click=\"doGetLastRecords()\">\\n <i class=\"icon ion-clock\"></i>\\n {{\\'REGISTRY.SEARCH.BTN_LAST_RECORDS\\' | translate}}\\n </a>\\n\\n <!-- advanced options -->\\n <a class=\"item item-icon-left ink\" ng-click=\"toggleAdvanced();\">\\n <i class=\"icon ion-android-checkbox-outline-blank\" ng-show=\"!search.advanced\"></i>\\n <i class=\"icon ion-android-checkbox-outline\" ng-show=\"search.advanced\"></i>\\n <span translate>REGISTRY.SEARCH.POPOVER_FILTERS.BTN_ADVANCED_SEARCH</span>\\n </a>\\n </div>\\n </ion-content>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/es/templates/registry/modal_record_type.html','<ion-modal-view>\\n <ion-header-bar class=\"bar-positive\">\\n <button class=\"button button-clear\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button>\\n <h1 class=\"title\" translate>{{getParameters().title||\\'REGISTRY.TYPE.TITLE\\'|translate}}</h1>\\n </ion-header-bar>\\n\\n <ion-content class=\"lookupForm\">\\n <div class=\"list padding\">\\n <h3 translate>REGISTRY.TYPE.SELECT_TYPE</h3>\\n <button class=\"button button-block button-stable icon-left cion-page-shop\" ng-click=\"closeModal(\\'shop\\')\" translate>REGISTRY.TYPE.ENUM.SHOP</button>\\n\\n <button class=\"button button-block button-stable icon-left cion-page-association\" ng-click=\"closeModal(\\'association\\')\" translate>REGISTRY.TYPE.ENUM.ASSOCIATION</button>\\n\\n <button class=\"button button-block button-stable icon-left cion-page-company\" ng-click=\"closeModal(\\'company\\')\" translate>REGISTRY.TYPE.ENUM.COMPANY</button>\\n\\n <button class=\"button button-block button-stable icon-left cion-page-institution\" ng-click=\"closeModal(\\'institution\\')\" translate>REGISTRY.TYPE.ENUM.INSTITUTION</button>\\n </div>\\n </ion-content>\\n</ion-modal-view>\\n');\n$templateCache.put('plugins/es/templates/registry/tabs/tab_registry.html','<ion-view>\\n <ion-nav-buttons side=\"secondary\">\\n\\n <!-- Allow extension here -->\\n <cs-extension-point name=\"nav-buttons\"></cs-extension-point>\\n\\n <button class=\"button button-icon button-clear\" ng-click=\"showFiltersPopover($event)\">\\n <i class=\"icon ion-android-funnel\"></i>\\n </button>\\n\\n <button class=\"button button-icon button-clear icon ion-android-more-vertical\" ng-click=\"showActionsPopover($event)\">\\n </button>\\n </ion-nav-buttons>\\n\\n <ion-content>\\n\\n <ion-refresher pulling-text=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\" on-refresh=\"doSearch()\">\\n </ion-refresher>\\n\\n <cs-extension-point name=\"buttons\"></cs-extension-point>\\n\\n <ng-include src=\"::\\'plugins/es/templates/registry/lookup_form.html\\'\"></ng-include>\\n\\n <ng-include src=\"::\\'plugins/es/templates/registry/lookup_list.html\\'\"></ng-include>\\n </ion-content>\\n\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/registry/view_popover_actions.html','<ion-popover-view class=\"fit has-header\">\\n <ion-header-bar>\\n <h1 class=\"title\" translate>REGISTRY.VIEW.MENU_TITLE</h1>\\n </ion-header-bar>\\n <ion-content scroll=\"false\">\\n <div class=\"list item-text-wrap\">\\n\\n <a class=\"item item-icon-left ink visible-xs visible-sm\" ng-click=\"showSharePopover($event)\">\\n <i class=\"icon ion-android-share-alt\"></i>\\n {{\\'COMMON.BTN_SHARE\\' | translate}}\\n </a>\\n\\n <a class=\"item item-icon-left assertive ink visible-xs visible-sm\" ng-if=\"canEdit\" ng-click=\"delete()\">\\n <i class=\"icon ion-trash-a\"></i>\\n {{\\'COMMON.BTN_DELETE\\' | translate}}\\n </a>\\n\\n <!-- report abuse -->\\n <ng-if ng-if=\"!canEdit && likeData.abuses\">\\n <button class=\"item item-icon-left ink\" ng-disabled=\"!!likeData.abuses.wasHitCount\" ng-class=\"{\\'gray\\': !!likeData.abuses.wasHitCount}\" ng-click=\"hideActionsPopover() && reportAbuse($event)\">\\n <i class=\"icon ion-android-warning\"></i>\\n {{\\'COMMON.BTN_REPORT_ABUSE_DOTS\\' | translate}}\\n </button>\\n </ng-if>\\n </div>\\n </ion-content>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/es/templates/registry/view_record.html','<ion-view left-buttons=\"leftButtons\" class=\"view-page\">\\n <ion-nav-title>\\n\\n </ion-nav-title>\\n\\n <ion-nav-buttons side=\"secondary\">\\n <button class=\"button button-bar button-icon button-clear visible-xs visible-sm\" ng-click=\"edit()\" ng-if=\"canEdit\">\\n <i class=\"icon ion-android-create\"></i>\\n </button>\\n <button class=\"button button-bar button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm\" ng-click=\"showActionsPopover($event)\">\\n </button>\\n </ion-nav-buttons>\\n\\n <ion-content scroll=\"true\" class=\"refresher-top-bg\">\\n\\n <ion-refresher pulling-text=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\" on-refresh=\"load()\">\\n </ion-refresher>\\n\\n <div class=\"hero\">\\n <div class=\"content\" ng-if=\"!loading\">\\n <i class=\"avatar cion-page-{{formData.type}}\" ng-if=\"!formData.avatar\"></i>\\n <i class=\"avatar\" ng-style=\"{{avatarStyle}}\" ng-if=\"formData.avatar\"></i>\\n <h3><span class=\"dark\" ng-bind-html=\"formData.title\"></span></h3>\\n <h4 class=\"gray\">\\n <span ng-if=\"formData.city\" class=\"gray hidden-xs hidden-sm\">\\n <i class=\"icon ion-location\"></i> <span ng-bind-html=\"formData.city\"></span>\\n </span>\\n <!-- likes -->\\n <small ng-include=\"::\\'plugins/es/templates/common/view_likes.html\\'\"></small>\\n </h4>\\n\\n </div>\\n\\n <h4 class=\"content dark\" ng-if=\"loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </h4>\\n </div>\\n\\n <!-- Top fab button -->\\n <div class=\"visible-xs visible-sm\">\\n <!-- like -->\\n <button class=\"button button-fab button-fab-top-right button-stable\" ng-click=\"toggleLike($event)\">\\n <i class=\"icon ion-heart\" ng-class=\"{\\'gray\\': !likeData.likes.wasHitCount, \\'calm\\': likeData.likes.wasHitCount}\"></i>\\n </button>\\n </div>\\n\\n <div class=\"row no-padding-xs no-padding-sm\">\\n <div class=\"col col-20 hidden-xs hidden-sm\">&nbsp;\\n </div>\\n\\n <div class=\"col list animate-fade-slide-in item-text-wrap no-padding-xs no-padding-sm\">\\n\\n <div class=\"item\">\\n <h2 class=\"gray\">\\n <a ng-if=\"formData.city\" ui-sref=\"app.wot_lookup.tab_registry({location:formData.city})\">\\n <i class=\"icon ion-location\"></i>\\n <span ng-bind-html=\"formData.city\"></span>\\n </a>\\n <span ng-if=\"formData.city && formData.type\">&nbsp;|&nbsp;</span>\\n <a ng-if=\"formData.type\" ui-sref=\"app.wot_lookup.tab_registry({type:formData.type})\">\\n <i class=\"cion-page-{{formData.type}}\"></i>\\n {{\\'REGISTRY.TYPE.ENUM.\\'+formData.type|upper|translate}}\\n </a>\\n </h2>\\n <h4>\\n <i class=\"icon ion-clock\" ng-if=\"formData.time\"></i>\\n <span translate>COMMON.SUBMIT_BY</span>\\n <a ng-class=\"{\\'positive\\': issuer.uid, \\'gray\\': !issuer.uid}\" ui-sref=\"app.wot_identity({pubkey:issuer.pubkey, uid: issuer.name||issuer.uid})\">\\n <ng-if ng-if=\"issuer.uid\">\\n <i class=\"icon ion-person\"></i>\\n {{::issuer.name||issuer.uid}}\\n </ng-if>\\n <span ng-if=\"!issuer.uid\">\\n <i class=\"icon ion-key\"></i>\\n {{issuer.pubkey|formatPubkey}}\\n </span>\\n </a>\\n <span>\\n {{formData.time|formatFromNow}}\\n <h4 class=\"gray hidden-xs\">|\\n {{formData.time | formatDate}}\\n </h4>\\n </span>\\n </h4>\\n </div>\\n\\n <!-- Buttons bar-->\\n <a id=\"registry-share-anchor-{{id}}\"></a>\\n <div class=\"item large-button-bar hidden-xs hidden-sm\">\\n <button class=\"button button-stable button-small-padding icon ion-android-share-alt\" ng-click=\"showSharePopover($event)\">\\n </button>\\n <!-- Like button -->\\n <button class=\"button button-stable button-small-padding ink-dark\" ng-if=\"!canEdit\" title=\"{{\\'COMMON.BTN_LIKE\\' | translate }}\" ng-click=\"toggleLike($event)\">\\n <i class=\"icon ion-heart\" ng-class=\"{\\'gray\\': !likeData.likes.wasHitCount, \\'calm\\': likeData.likes.wasHitCount}\"></i>\\n </button>\\n\\n <button class=\"button button-calm ink-dark\" ng-if=\"showTransfer\" ng-click=\"showTransferModal({pubkey:formData.pubkey, uid: formData.title})\">\\n {{\\'COMMON.BTN_SEND_MONEY\\' | translate}}\\n </button>\\n <button class=\"button button-stable icon-left ink-dark\" ng-if=\"canEdit\" ng-click=\"delete()\">\\n <i class=\"icon ion-trash-a assertive\"></i>\\n <span class=\"assertive\"> {{\\'COMMON.BTN_DELETE\\' | translate}}</span>\\n </button>\\n <button class=\"button button-calm icon-left ion-android-create ink\" ng-if=\"canEdit\" ng-click=\"edit()\">\\n {{\\'COMMON.BTN_EDIT\\' | translate}}\\n </button>\\n\\n <!-- options -->\\n <button class=\"button button-stable button-small-padding icon ion-android-more-vertical\" ng-if=\"!canEdit\" ng-click=\"showActionsPopover($event)\">\\n </button>\\n </div>\\n\\n <div class=\"item\">\\n <h2 trust-as-html=\"formData.description\"></h2>\\n </div>\\n\\n <div class=\"item\" ng-if=\"formData.category || formData.address\">\\n <h4 ng-if=\"formData.category\">\\n <span class=\"gray\" translate>REGISTRY.VIEW.CATEGORY</span>\\n <a class=\"positive\" ng-if=\"formData.category\" ui-sref=\"app.wot_lookup.tab_registry({category:formData.category.id})\">\\n <span ng-bind-html=\"formData.category.name\"></span>\\n </a>\\n </h4>\\n <h4 ng-if=\"formData.address\">\\n <span class=\"gray\" translate>REGISTRY.VIEW.LOCATION</span>\\n <a class=\"positive\" target=\"_system\" href=\"https://www.openstreetmap.org/search?query={{formData.address}},%20{{formData.city}}\">\\n <span ng-bind-html=\"formData.address\"></span>\\n <span ng-if=\"formData.city\"> - </span>\\n <span ng-bind-html=\"formData.city\"></span>\\n </a>\\n </h4>\\n </div>\\n\\n <!-- Socials networks -->\\n <ng-if ng-if=\"formData.socials && formData.socials.length>0\">\\n <div class=\"item item-icon-left\" type=\"no-padding item-text-wrap\" ng-repeat=\"social in formData.socials track by social.url\" id=\"social-{{social.url|formatSlug}}\">\\n <i class=\"icon ion-social-{{social.type}}\" ng-class=\"{\\'ion-bookmark\\': social.type == \\'other\\', \\'ion-link\\': social.type == \\'web\\', \\'ion-email\\': social.type == \\'email\\'}\"></i>\\n <p ng-if=\"social.type && social.type != \\'web\\'\">{{social.type}}</p>\\n <h2>\\n <a ng-click=\"openLink($event, social.url, social.type)\">{{social.url}}</a>\\n </h2>\\n </div>\\n </ng-if>\\n\\n <!-- pubkey -->\\n <div class=\"item item-icon-left item-text-wrap ink\" ng-if=\"formData.pubkey\" copy-on-click=\"{{::formData.pubkey}}\">\\n <i class=\"icon ion-key\"></i>\\n <span translate>REGISTRY.EDIT.RECORD_PUBKEY</span>\\n <h4 class=\"dark\">{{::formData.pubkey}}</h4>\\n </div>\\n\\n <div class=\"lazy-load\">\\n\\n <!-- pictures -->\\n <ng-include src=\"::\\'plugins/es/templates/common/view_pictures.html\\'\"></ng-include>\\n\\n <!-- comments -->\\n <ng-include src=\"::\\'plugins/es/templates/common/view_comments.html\\'\"></ng-include>\\n </div>\\n </div>\\n\\n <div class=\"col col-20 hidden-xs hidden-sm\">&nbsp;\\n </div>\\n </div>\\n </ion-content>\\n\\n <button class=\"button button-fab button-fab-bottom-right button-assertive icon ion-android-send visible-xs visible-sm\" ng-if=\"formData.pubkey && !isUserPubkey(formData.pubkey)\" ng-click=\"showTransferModal({pubkey: formData.pubkey, uid: formData.title})\">\\n </button>\\n\\n\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/registry/view_wallet_pages.html','<ion-view left-buttons=\"leftButtons\" class=\"view-notification\">\\n <ion-nav-title>\\n {{\\'REGISTRY.MY_PAGES\\' | translate}}\\n </ion-nav-title>\\n\\n <ion-content class=\"padding no-padding-xs no-padding-sm\" scroll=\"true\">\\n\\n <ion-refresher pulling-text=\"{{:locale:\\'COMMON.BTN_REFRESH\\' | translate}}\" on-refresh=\"doUpdate()\">\\n </ion-refresher>\\n\\n <!-- Buttons bar -->\\n <div class=\"hidden-xs hidden-sm padding text-center\">\\n\\n <button class=\"button button-stable button-small-padding icon ion-loop ink\" ng-click=\"doUpdate()\" title=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\">\\n </button>\\n\\n <button class=\"button button-calm icon-left ink\" ng-click=\"showNewPageModal()\">\\n {{\\'REGISTRY.BTN_NEW\\' | translate}}\\n </button>\\n </div>\\n\\n <div class=\"center padding\" ng-if=\"search.loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div class=\"center padding gray\" ng-if=\"!search.loading && !search.results.length\" translate>\\n REGISTRY.NO_PAGE\\n </div>\\n\\n <ng-include src=\"::\\'plugins/es/templates/registry/lookup_list.html\\'\"></ng-include>\\n\\n </ion-content>\\n\\n <button id=\"fab-wallet-add-registry-record\" class=\"button button-fab button-fab-bottom-right button-assertive hidden-md hidden-lg spin\" ng-click=\"showNewPageModal()\">\\n <i class=\"icon ion-plus\"></i>\\n </button>\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/settings/plugin_settings.html','<ion-view left-buttons=\"leftButtons\" class=\"settings\">\\n <ion-nav-title translate>ES_SETTINGS.PLUGIN_NAME</ion-nav-title>\\n\\n <ion-content scroll=\"true\">\\n\\n <div class=\"item item-toggle dark\">\\n <div class=\"input-label\" translate>ES_SETTINGS.ENABLE_TOGGLE</div>\\n <label class=\"toggle toggle-royal\">\\n <input type=\"checkbox\" ng-model=\"formData.enable\">\\n <div class=\"track\">\\n <div class=\"handle\"></div>\\n </div>\\n </label>\\n </div>\\n\\n <span class=\"item item-divider hidden-readonly hidden-demo\" translate>SETTINGS.STORAGE_DIVIDER</span>\\n\\n <div class=\"item item-toggle item-text-wrap dark hidden-demo hidden-readonly\">\\n <div class=\"input-label\" ng-class=\"{\\'gray\\': !formData.enable}\" class=\"input-label\" translate>ES_SETTINGS.ENABLE_REMOTE_STORAGE</div>\\n <h4 class=\"gray text-wrap\" ng-bind-html=\"\\'ES_SETTINGS.ENABLE_REMOTE_STORAGE_HELP\\' | translate\"></h4>\\n <label class=\"toggle toggle-royal\">\\n <input type=\"checkbox\" ng-model=\"formData.useRemoteStorage\" ng-disabled=\"!formData.enable\">\\n <div class=\"track\">\\n <div class=\"handle\"></div>\\n </div>\\n </label>\\n </div>\\n\\n <span class=\"item item-divider\" translate>SETTINGS.NETWORK_SETTINGS</span>\\n\\n <div class=\"item ink hidden-xs hidden-sm\" ng-click=\"formData.enable && changeEsNode()\" ng-disabled=\"!formData.enable\">\\n <div class=\"input-label\" ng-class=\"{\\'gray\\': !formData.enable}\" translate>ES_SETTINGS.PEER</div>\\n\\n <!-- node fallback node -->\\n <ng-if ng-if=\"isFallbackNode\">\\n <h4 class=\"gray text-wrap assertive\">\\n <i class=\"icon ion-alert-circled\"></i>\\n <span ng-bind-html=\"\\'SETTINGS.PEER_CHANGED_TEMPORARY\\' | translate \"></span>\\n </h4>\\n <div class=\"item-note assertive text-italic\">{{server}}</div>\\n </ng-if>\\n\\n <span ng-if=\"!isFallbackNode\" class=\"item-note\" ng-class=\"{\\'dark\\': formData.enable}\">{{server}}</span>\\n </div>\\n <ion-item class=\"ink item-icon-right item-text-wrap visible-xs visible-sm\" ng-click=\"formData.enable && changeEsNode()\" ng-disabled=\"!formData.enable\">\\n <div class=\"input-label\" ng-class=\"{\\'gray\\': !formData.enable}\" translate>ES_SETTINGS.PEER</div>\\n\\n <!-- node temporary changed -->\\n <ng-if ng-if=\"isFallbackNode\">\\n <h4 class=\"gray text-wrap assertive\">\\n <b class=\"ion-alert-circled\"></b>\\n <span ng-bind-html=\"\\'SETTINGS.PEER_CHANGED_TEMPORARY\\' | translate \"></span>\\n </h4>\\n <div class=\"badge badge-assertive\">{{server}}</div>\\n </ng-if>\\n <div class=\"badge\" ng-class=\"{\\'badge-balanced\\': formData.enable, \\'badge-stable\\': !formData.enable}\" ng-if=\"!isFallbackNode\">{{server}}</div>\\n <i class=\"icon ion-ios-arrow-right\"></i>\\n </ion-item>\\n\\n <span class=\"item item-divider hidden-readonly\" translate>ES_SETTINGS.NOTIFICATIONS.DIVIDER</span>\\n\\n <!-- Enable HTML notifications -->\\n <div class=\"item item-toggle dark hidden-xs hidden-sm hidden-readonly\">\\n <div ng-class=\"{\\'gray\\': !formData.enable}\" class=\"input-label\" translate>ES_SETTINGS.NOTIFICATIONS.ENABLE_HTML5_NOTIFICATION</div>\\n <h4 class=\"gray\" ng-bind-html=\"\\'ES_SETTINGS.NOTIFICATIONS.ENABLE_HTML5_NOTIFICATION_HELP\\' | translate\"></h4>\\n <label class=\"toggle toggle-royal\">\\n <input type=\"checkbox\" ng-model=\"formData.notifications.emitHtml5\" ng-disabled=\"!formData.enable\">\\n <div class=\"track\">\\n <div class=\"handle\"></div>\\n </div>\\n </label>\\n </div>\\n\\n <span class=\"item gray item-text-wrap hidden-readonly\" translate>ES_SETTINGS.NOTIFICATIONS.HELP_TEXT</span>\\n\\n <label class=\"item item-toggle dark item-text-wrap hidden-readonly\">\\n <span ng-class=\"{\\'gray\\': !formData.enable}\" translate>ES_SETTINGS.NOTIFICATIONS.ENABLE_TX_SENT</span>\\n <div class=\"toggle toggle-royal\">\\n <input type=\"checkbox\" ng-model=\"formData.notifications.txSent\" ng-disabled=\"!formData.enable\">\\n <div class=\"track\">\\n <div class=\"handle\"></div>\\n </div>\\n </div>\\n </label>\\n <label class=\"item item-toggle dark item-text-wrap hidden-readonly\">\\n <span ng-class=\"{\\'gray\\': !formData.enable}\" translate>ES_SETTINGS.NOTIFICATIONS.ENABLE_TX_RECEIVED</span>\\n <label class=\"toggle toggle-royal\">\\n <input type=\"checkbox\" ng-model=\"formData.notifications.txReceived\" ng-disabled=\"!formData.enable\">\\n <div class=\"track\">\\n <div class=\"handle\"></div>\\n </div>\\n </label>\\n </label>\\n <label class=\"item item-toggle dark item-text-wrap hidden-readonly\">\\n <span ng-class=\"{\\'gray\\': !formData.enable}\" translate>ES_SETTINGS.NOTIFICATIONS.ENABLE_CERT_SENT</span>\\n <div class=\"toggle toggle-royal\">\\n <input type=\"checkbox\" ng-model=\"formData.notifications.certSent\" ng-disabled=\"!formData.enable\">\\n <div class=\"track\">\\n <div class=\"handle\"></div>\\n </div>\\n </div>\\n </label>\\n <label class=\"item item-toggle dark item-text-wrap hidden-readonly\">\\n <span ng-class=\"{\\'gray\\': !formData.enable}\" translate>ES_SETTINGS.NOTIFICATIONS.ENABLE_CERT_RECEIVED</span>\\n <div class=\"toggle toggle-royal\">\\n <input type=\"checkbox\" ng-model=\"formData.notifications.certReceived\" ng-disabled=\"!formData.enable\">\\n <div class=\"track\">\\n <div class=\"handle\"></div>\\n </div>\\n </div>\\n </label>\\n\\n\\n <!-- Allow extension here -->\\n <cs-extension-point name=\"common\"></cs-extension-point>\\n\\n\\n\\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/settings/settings_extend.html','\\n<div class=\"item item-text-wrap item-icon-right ink\" ui-sref=\"app.es_settings\">\\n <div class=\"input-label ng-binding\" translate>ES_SETTINGS.PLUGIN_NAME</div>\\n\\n <h4 class=\"gray\" translate>ES_SETTINGS.PLUGIN_NAME_HELP</h4>\\n\\n <i class=\"icon ion-ios-arrow-right\"></i>\\n</div>\\n');\n$templateCache.put('plugins/es/templates/subscription/edit_subscriptions.html','<ion-view left-buttons=\"leftButtons\" class=\"view-notification\">\\n <ion-nav-title>\\n {{\\'SUBSCRIPTION.EDIT.TITLE\\' | translate}}\\n </ion-nav-title>\\n\\n <ion-nav-buttons side=\"secondary\">\\n\\n </ion-nav-buttons>\\n\\n <ion-content class=\"padding no-padding-xs no-padding-sm\" scroll=\"true\">\\n\\n <ion-refresher pulling-text=\"{{:locale:\\'COMMON.BTN_REFRESH\\' | translate}}\" on-refresh=\"load()\">\\n </ion-refresher>\\n\\n <!-- Buttons bar -->\\n <div class=\"hidden-xs hidden-sm padding text-center\">\\n\\n <button class=\"button button-stable button-small-padding icon ion-loop ink\" ng-click=\"load()\" title=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\">\\n </button>\\n\\n <button class=\"button button-calm ink\" ng-click=\"addSubscription()\">\\n {{\\'SUBSCRIPTION.BTN_ADD\\' | translate}}\\n </button>\\n </div>\\n\\n <div class=\"center padding\" ng-if=\"search.loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div class=\"center padding gray\" ng-if=\"!search.loading && !search.results.length\" translate>\\n SUBSCRIPTION.NO_SUBSCRIPTION\\n </div>\\n\\n <div class=\"row no-padding\">\\n <div class=\"col col-20 hidden-xs hidden-sm\">&nbsp;</div>\\n\\n <div class=\"col list {{::motion.ionListClass}} item-border-large\">\\n\\n <!-- emails -->\\n <ng-repeat ng-repeat=\"subscriptions in search.results | filter: { type: \\'email\\' }\" ng-include=\"\\'plugins/es/templates/subscription/item_\\' + subscriptions.type.toLowerCase() + \\'_subscription.html\\'\">>\\n </ng-repeat>\\n\\n </div>\\n\\n <div class=\"col col-20 hidden-xs hidden-sm\">&nbsp;</div>\\n\\n </div>\\n\\n </ion-content>\\n\\n <button id=\"fab-add-subscription-record\" class=\"button button-fab button-fab-bottom-right button-assertive icon ion-plus hidden-md hidden-lg spin\" ng-click=\"addSubscription()\">\\n </button>\\n\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/subscription/item_email_subscription.html','<div class=\"item item-avatar\">\\n <i class=\"item-image icon ion-email\"></i>\\n <h3>\\n {{\\'SUBSCRIPTION.TYPE.ENUM.\\' + subscriptions.type.toUpperCase() | translate}}\\n </h3>\\n <h4 class=\"gray\">\\n {{\\'SUBSCRIPTION.EDIT.PROVIDER\\'|translate}}\\n <a ui-sref=\"app.wot_identity({pubkey: subscriptions.recipient, uid: subscriptions.uid})\">\\n <span ng-class=\"{\\'positive\\': subscriptions.uid, \\'dark\\': !subscriptions.uid}\" ng-if=\"subscriptions.name||subscriptions.uid\">\\n <i class=\"ion-person\" ng-if=\"subscriptions.uid\"></i>\\n {{subscriptions.name||subscriptions.uid}}\\n </span>\\n <span class=\"gray\" ng-if=\"!subscriptions.uid\">\\n <i class=\"ion-key\"></i>\\n {{subscriptions.recipient | formatPubkey}}\\n </span>\\n </a>\\n </h4>\\n <div class=\"item-note text-right\">\\n <span ng-repeat=\"item in subscriptions.items\">\\n {{item.content.email}}\\n <a class=\"ion-trash-a gray padding-left\" ng-click=\"deleteSubscription(item)\"></a>\\n <a class=\"ion-edit gray padding-left\" ng-click=\"editSubscription(item)\"></a>\\n <br>\\n </span>\\n </div>\\n</div>\\n');\n$templateCache.put('plugins/es/templates/subscription/modal_email.html','\\n<ion-modal-view id=\"composeMessage\" class=\"modal-full-height\">\\n <ion-header-bar class=\"bar-positive\">\\n <button class=\"button button-clear visible-xs\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button>\\n <h1 class=\"title\" translate>SUBSCRIPTION.MODAL_EMAIL.TITLE</h1>\\n\\n <button class=\"button button-icon button-clear icon ion-android-send visible-xs\" ng-click=\"doSubmit()\">\\n </button>\\n </ion-header-bar>\\n\\n <ion-content scroll=\"true\">\\n\\n <!-- Encryption info -->\\n <div class=\"item item-icon-left item-text-wrap\">\\n <i class=\"icon ion-ios-information-outline positive\"></i>\\n <h4 class=\"positive\" translate>SUBSCRIPTION.MODAL_EMAIL.HELP</h4>\\n </div>\\n\\n <form name=\"subscriptionForm\" novalidate=\"\" ng-submit=\"doSubmit()\">\\n\\n <div class=\"list\" ng-init=\"setForm(subscriptionForm)\">\\n\\n <!-- email -->\\n <label class=\"item item-input\" ng-class=\"{\\'item-input-error\\': form.$submitted && (form.email.$invalid || form.email.$error)}\">\\n <span class=\"input-label\" translate>SUBSCRIPTION.MODAL_EMAIL.EMAIL_LABEL</span>\\n <input name=\"email\" type=\"text\" placeholder=\"{{\\'SUBSCRIPTION.MODAL_EMAIL.EMAIL_HELP\\' | translate}}\" ng-model=\"formData.content.email\" ng-minlength=\"3\" required email>\\n </label>\\n <div class=\"form-errors\" ng-if=\"form.$submitted && (form.email.$invalid || form.email.$error)\" ng-messages=\"form.email.$error\">\\n <div class=\"form-error\" ng-message=\"minlength\">\\n <span translate=\"ERROR.FIELD_TOO_SHORT\"></span>\\n </div>\\n <div class=\"form-error\" ng-message=\"email\">\\n <span translate=\"ERROR.FIELD_NOT_EMAIL\"></span>\\n </div>\\n </div>\\n\\n <!-- Frequency -->\\n <label class=\"item item-input item-select\" ng-class=\"{\\'item-input-error\\': form.$submitted && !formData.content.frequency}\">\\n <span class=\"input-label\" translate>SUBSCRIPTION.MODAL_EMAIL.FREQUENCY_LABEL</span>\\n <select name=\"frequency\" ng-model=\"formData.content.frequency\" style=\"height: 46px;margin-top: 1px;\">\\n <option value=\"weekly\" translate>SUBSCRIPTION.MODAL_EMAIL.FREQUENCY_WEEKLY</option>\\n <option value=\"daily\" translate>SUBSCRIPTION.MODAL_EMAIL.FREQUENCY_DAILY</option>\\n </select>\\n </label>\\n <div class=\"form-errors\" ng-if=\"form.$submitted && !formData.content.frequency\">\\n <div class=\"form-error\">\\n <span translate=\"ERROR.FIELD_REQUIRED\"></span>\\n </div>\\n </div>\\n\\n <!-- Recipient (service provider) -->\\n <a class=\"item item-input item-icon-right gray ink\" ng-class=\"{\\'item-input-error\\': form.$submitted && !formData.recipient}\" ng-click=\"showNetworkLookup()\" style=\"height: 67px;\">\\n <span class=\"input-label\" translate>SUBSCRIPTION.MODAL_EMAIL.PROVIDER</span>\\n <span class=\"badge animate-fade-in animate-show-hide ng-hide\" ng-class=\"{\\'badge-royal\\': recipient.uid, \\'badge-stable\\': !recipient.uid}\" ng-show=\"recipient && (recipient.name||recipient.uid)\">\\n <i class=\"ion-person\" ng-if=\"recipient.uid\"></i> {{recipient.name||recipient.uid}}\\n </span>\\n <span class=\"badge badge-secondary animate-fade-in animate-show-hide ng-hide\" ng-show=\"formData.recipient\">\\n <i class=\"ion-key\"></i> {{formData.recipient | formatPubkey}}\\n </span>\\n <i class=\"gray icon ion-ios-arrow-right\"></i>\\n </a>\\n <div class=\"form-errors\" ng-if=\"form.$submitted && !formData.recipient\">\\n <div class=\"form-error\">\\n <span translate=\"ERROR.FIELD_REQUIRED\"></span>\\n </div>\\n </div>\\n\\n </div>\\n\\n <div class=\"padding hidden-xs text-right\">\\n <button class=\"button button-clear button-dark ink\" ng-click=\"cancel()\" type=\"button\" translate>COMMON.BTN_CANCEL\\n </button>\\n <button class=\"button button-positive ink\" type=\"submit\">\\n {{\\'COMMON.BTN_ADD\\' | translate}}\\n </button>\\n </div>\\n\\n </form>\\n </ion-content>\\n</ion-modal-view>\\n\\n\\n\\n\\n');\n$templateCache.put('plugins/es/templates/user/edit_popover_actions.html','<ion-popover-view class=\"fit has-header\">\\n <ion-header-bar>\\n <h1 class=\"title\" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\\n </ion-header-bar>\\n <ion-content scroll=\"false\">\\n <div class=\"list item-text-wrap\">\\n\\n <!-- delete profile -->\\n <a class=\"item item-icon-left assertive ink\" ng-click=\"removeProfile()\">\\n <i class=\"icon ion-trash-a\"></i>\\n {{\\'PROFILE.BTN_DELETE\\' | translate}}\\n </a>\\n\\n </div>\\n </ion-content>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/es/templates/user/edit_profile.html','<ion-view left-buttons=\"leftButtons\">\\n <ion-nav-title>\\n <!-- no title-->\\n </ion-nav-title>\\n\\n <ion-nav-buttons side=\"secondary\">\\n <!-- remove button -->\\n <button class=\"button button-icon button-clear button-assertive ion-trash-a visible-xs visible-sm\" ng-click=\"removeProfile()\" ng-if=\"existing\">\\n </button>\\n <!-- save button -->\\n <button class=\"button button-icon button-clear ion-android-done visible-xs visible-sm\" ng-click=\"submitAndSaveAndClose()\">\\n </button>\\n </ion-nav-buttons>\\n\\n <ion-content scroll=\"true\">\\n\\n <div class=\"positive-900-bg hero\">\\n <div class=\"content\">\\n <i class=\"avatar\" ng-style=\"avatarStyle\" ng-class=\"{\\'avatar-wallet\\': !loading && !avatar && walletData && !walletData.isMember, \\'avatar-member\\': !loading && !avatar && walletData.isMember}\">\\n <button class=\"button button-positive button-large button-clear flat icon ion-camera visible-xs visible-sm\" style=\"display: inline-block;\" ng-click=\"showAvatarModal()\"></button>\\n <button ng-if=\"avatar.src\" class=\"button button-positive button-large button-clear flat visible-xs visible-sm\" style=\"display: inline-block; left: 85px; bottom:15px;\" ng-click=\"rotateAvatar()\">\\n <i class=\"icon-secondary ion-image\" style=\"left: 24px; top: 3px; font-size: 24px;\"></i>\\n <i class=\"icon-secondary ion-forward\" style=\"left: 26px; top: -13px;\"></i>\\n </button>\\n <button class=\"button button-positive button-large button-clear icon ion-camera hidden-xs hidden-sm\" ng-click=\"showAvatarModal()\"></button>\\n </i>\\n <h3 class=\"light\">\\n <ng-if ng-if=\"!loading && !formData.title && walletData && walletData.isMember\">{{walletData.uid}}</ng-if>\\n <ng-if ng-if=\"!loading && !formData.title && walletData && !walletData.isMember\">{{::walletData.pubkey | formatPubkey}}</ng-if>\\n <ng-if ng-if=\"!loading && formData.title\">{{formData.title}}</ng-if>\\n </h3>\\n <h4 class=\"light\">\\n <ion-spinner ng-if=\"loading\" icon=\"android\"></ion-spinner>\\n </h4>\\n </div>\\n </div>\\n\\n\\n <div class=\"row no-padding\">\\n <div class=\"col col-20 hidden-xs hidden-sm\">&nbsp;\\n </div>\\n\\n <div class=\"col\">\\n\\n <!-- Buttons bar-->\\n <div class=\"hidden-xs hidden-sm padding text-center animate-show-hide ng-hide\" ng-show=\"existing\">\\n\\n <button class=\"button button-stable icon-right ink\" ng-disabled=\"saving\" ng-click=\"showActionsPopover($event)\">\\n &nbsp; <i class=\"icon ion-android-more-vertical\"></i>&nbsp;\\n {{\\'COMMON.BTN_OPTIONS\\' | translate}}\\n </button>\\n </div>\\n\\n <form name=\"profileForm\" novalidate=\"\" ng-submit=\"saveAndClose()\">\\n\\n <div class=\"list item-text-wrap {{::motion.ionListClass}}\" ng-init=\"setForm(profileForm)\">\\n\\n <!-- Public info -->\\n <div class=\"item item-icon-left item-text-wrap\">\\n <i class=\"icon ion-ios-information-outline positive\"></i>\\n <h4 class=\"positive\" translate>PROFILE.HELP.WARNING_PUBLIC_DATA</h4>\\n </div>\\n\\n <div class=\"item item-divider\" translate>PROFILE.GENERAL_DIVIDER</div>\\n\\n <!-- title -->\\n <ion-item class=\"item-input item-floating-label item-button-right\" ng-class=\"{\\'item-input-error\\': form.$submitted && form.title.$invalid}\">\\n <span class=\"input-label\">{{\\'PROFILE.TITLE\\' | translate}}</span>\\n <input type=\"text\" name=\"title\" placeholder=\"{{\\'PROFILE.TITLE_HELP\\' | translate}}\" id=\"profile-name\" ng-model=\"formData.title\" ng-model-options=\"{ debounce: 350 }\" ng-maxlength=\"50\" required>\\n </ion-item>\\n <div class=\"form-errors\" ng-show=\"form.$submitted && form.title.$error\" ng-messages=\"form.title.$error\">\\n <div class=\"form-error\" ng-message=\"required\">\\n <span translate=\"ERROR.FIELD_REQUIRED\"></span>\\n </div>\\n <div class=\"form-error\" ng-message=\"maxlength\">\\n <span translate=\"ERROR.FIELD_TOO_LONG_WITH_LENGTH\" translate-values=\"{maxLength: 50}\"></span>\\n </div>\\n </div>\\n\\n <!-- description -->\\n <ion-item class=\"item-input item-floating-label item-button-right\">\\n <span class=\"input-label\" style=\"width: 100%\">{{\\'PROFILE.DESCRIPTION\\' | translate}}</span>\\n <textarea placeholder=\"{{\\'PROFILE.DESCRIPTION_HELP\\' | translate}}\" ng-model=\"formData.description\" ng-model-options=\"{ debounce: 350 }\" rows=\"4\" cols=\"10\">\\n </textarea>\\n </ion-item>\\n\\n <!-- position -->\\n <ng-include src=\"::\\'plugins/es/templates/common/edit_position.html\\'\" ng-controller=\"ESPositionEditCtrl as ctrl\"></ng-include>\\n\\n </div>\\n\\n <!-- social networks -->\\n <ng-include src=\"::\\'plugins/es/templates/common/edit_socials.html\\'\" ng-controller=\"ESSocialsEditCtrl\"></ng-include>\\n\\n <div class=\"list item-text-wrap {{::motion.ionListClass}}\">\\n\\n <div class=\"item item-divider\" translate>PROFILE.TECHNICAL_DIVIDER</div>\\n\\n <!-- uid -->\\n <ion-item class=\"item-icon-left\" ng-if=\"walletData && walletData.uid\">\\n <span translate>COMMON.UID</span>\\n <span class=\"badge badge-stable\">{{::walletData.uid}}</span>\\n </ion-item>\\n\\n <!-- pubkey-->\\n <ion-item class=\"item-icon-left item-icon-right item-text-wrap ink\" on-hold=\"copy(formData.pubkey)\" copy-on-click>\\n <i class=\"icon ion-key\"></i>\\n <span translate>COMMON.PUBKEY</span>\\n <p class=\"gray\">{{walletData.pubkey}}</p>\\n </ion-item>\\n\\n <div class=\"item padding hidden-xs hidden-sm text-right\">\\n <button class=\"button button-clear button-dark ink\" ng-click=\"cancel()\" type=\"button\" translate>COMMON.BTN_CANCEL\\n </button>\\n <button class=\"button button-calm ink\" ng-class=\"{\\'button-assertive\\': dirty}\" type=\"submit\">\\n {{\\'COMMON.BTN_SAVE\\' | translate}}\\n </button>\\n </div>\\n </div>\\n </form>\\n </div>\\n\\n <div class=\"col col-20 hidden-xs hidden-sm\">&nbsp;\\n </div>\\n </div>\\n\\n </ion-content>\\n\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/user/items_profile.html','<div ng-if=\"!formData.profile\" class=\"item gray\" translate>PROFILE.NO_PROFILE_DEFINED</div>\\n\\n<!-- name -->\\n<div class=\"item\" ng-if=\"formData.profile && formData.name && showName\">\\n <span class=\"gray\" translate>PROFILE.TITLE</span>\\n <h3>{{formData.name}}</h3>\\n</div>\\n\\n<!-- About me -->\\n<div class=\"item item-text-wrap\" ng-if=\"formData.profile.descriptionHtml\">\\n <span class=\"gray\" translate>PROFILE.DESCRIPTION</span>\\n <h3 trust-as-html=\"formData.profile.descriptionHtml\"></h3>\\n</div>\\n\\n<!-- Localisation -->\\n<div class=\"item\" ng-if=\"formData.profile && (formData.profile.address || formData.profile.city)\" copy-on-click=\"{{formData.profile.address ? formData.profile.address + \\'&#10;\\' : \\'\\'}}{{formData.profile.city}}\">\\n <span class=\"gray\" translate>LOCATION.LOCATION_DIVIDER</span>\\n <h3>\\n <span class=\"text-keep-lines\" ng-if=\"formData.profile.address\">{{formData.profile.address}}<br></span>\\n {{formData.profile.city}}\\n </h3>\\n</div>\\n\\n<!-- Socials networks -->\\n<div class=\"item\" ng-if=\"formData.profile && formData.profile.socials && formData.profile.socials.length\" ng-controller=\"ESSocialsViewCtrl\">\\n <span class=\"gray\" translate>PROFILE.SOCIAL_NETWORKS_DIVIDER</span>\\n <div class=\"list no-padding\">\\n <ion-item ng-repeat=\"social in formData.profile.socials | filter:filterFn track by social.url \" id=\"social-{{::social.url|formatSlug}}\" class=\"item-icon-left item-text-wrap no-padding-bottom ink\" on-tap=\"openSocial($event, social)\">\\n <i class=\"icon ion-social-{{social.type}}\" ng-class=\"{\\'ion-bookmark\\': social.type == \\'other\\', \\'ion-link\\': social.type == \\'web\\', \\'ion-email\\': social.type == \\'email\\', \\'ion-iphone\\': social.type == \\'phone\\'}\"></i>\\n <p ng-if=\"social.type && social.type != \\'web\\'\">\\n {{social.type}}\\n <i class=\"ion-locked\" ng-if=\"social.recipient\"></i>\\n </p>\\n <h4>\\n <a on-tap=\"openSocial($event, social)\" href=\"{{::social.url}}\" target=\"_blank\">{{::social.url}}</a>\\n </h4>\\n </ion-item>\\n </div>\\n</div>\\n\\n\\n');\n$templateCache.put('plugins/es/templates/wallet/item_wallet_extend.html','<h4 class=\"dark\" ng-if=\":state:enable && wallet.id!=\\'default\\'\">\\n <a ng-if=\"walletData.invitations.unreadCount\">\\n <i class=\"dark ion-person-stalker\"></i>\\n {{walletData.invitations.unreadCount}}\\n </a>\\n <a ng-if=\"walletData.messages.unreadCount\" ui-sref=\"app.user_messages_by_id.tab_inbox({id: wallet.id})\">\\n <i class=\"dark ion-email\"></i>\\n {{walletData.messages.unreadCount}}\\n </a>\\n <a ng-if=\"walletData.notifications.unreadCount\" ui-sref=\"app.view_notifications_by_id({id: wallet.id})\">\\n <i class=\"dark ion-android-notifications\"></i>\\n {{walletData.notifications.unreadCount}}\\n </a>\\n</h4>\\n');\n$templateCache.put('plugins/es/templates/wallet/view_wallet_extend.html','<ng-if ng-if=\":state:enable && extensionPoint === \\'hero\\'\">\\n <!-- likes -->\\n <small class=\"light\" style=\"display: inline-block;\" ng-include=\"::\\'plugins/es/templates/common/view_likes.html\\'\" ng-init=\"canEdit=true\"></small>\\n</ng-if>\\n\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'after-general\\'\">\\n\\n <!-- profile -->\\n <div class=\"item item-divider item-divider-top-border\">\\n <span>\\n {{\\'PROFILE.PROFILE_DIVIDER\\' | translate}}\\n <i style=\"font-size: 12pt; cursor: pointer;\" ng-click=\"showProfileHelp=!showProfileHelp\" class=\"icon positive ion-ios-help-outline\" title=\"{{\\'PROFILE.PROFILE_DIVIDER_HELP\\' | translate}}\"></i>\\n </span>\\n <a class=\"badge button button-text button-small button-small-padding\" ng-if=\"isDefaultWallet\" ui-sref=\"app.edit_profile\">\\n <i class=\"icon ion-edit\"></i>\\n <span ng-if=\"!formData.profile\" translate>PROFILE.BTN_ADD</span>\\n <span ng-if=\"formData.profile\" translate>PROFILE.BTN_EDIT</span>\\n </a>\\n <a class=\"badge button button-text button-small button-small-padding\" ng-if=\"!isDefaultWallet\" ui-sref=\"app.edit_profile_by_id({id: walletId})\">\\n <i class=\"icon ion-edit\"></i>\\n <span ng-if=\"!formData.profile\" translate>PROFILE.BTN_ADD</span>\\n <span ng-if=\"formData.profile\" translate>PROFILE.BTN_EDIT</span>\\n </a>\\n </div>\\n\\n\\n <div class=\"item item-text-wrap positive item-small-height item-wallet-help\" ng-show=\"showProfileHelp\">\\n <small trust-as-html=\"\\'PROFILE.PROFILE_DIVIDER_HELP\\'|translate\"></small>\\n </div>\\n\\n <ng-include src=\"::\\'plugins/es/templates/user/items_profile.html\\'\" ng-init=\"showName=true\"></ng-include>\\n\\n <!-- subscriptions -->\\n <div class=\"item item-divider item-divider-top-border\">\\n <span>\\n {{\\'SUBSCRIPTION.SUBSCRIPTION_DIVIDER\\' | translate}}\\n <i style=\"font-size: 12pt; cursor: pointer;\" ng-click=\"showSubscriptionHelp=!showSubscriptionHelp\" class=\"icon positive ion-ios-help-outline\" title=\"{{\\'SUBSCRIPTION.SUBSCRIPTION_DIVIDER_HELP\\' | translate}}\"></i>\\n <span>\\n\\n <a class=\"badge button button-text button-small button-small-padding\" ng-if=\"!formData.subscriptions.count && isDefaultWallet\" ui-sref=\"app.edit_subscriptions\">\\n <i class=\"icon ion-edit\"></i>\\n <span translate>SUBSCRIPTION.BTN_ADD</span>\\n </a>\\n <a class=\"badge button button-text button-small button-small-padding\" ng-if=\"!formData.subscriptions.count && !isDefaultWallet\" ui-sref=\"app.edit_subscriptions_by_id({id: walletId})\">\\n <i class=\"icon ion-edit\"></i>\\n <span translate>SUBSCRIPTION.BTN_ADD</span>\\n </a>\\n </span></span></div>\\n\\n <div class=\"item item-text-wrap positive item-small-height\" ng-show=\"showSubscriptionHelp\">\\n <small translate>SUBSCRIPTION.SUBSCRIPTION_DIVIDER_HELP</small>\\n </div>\\n\\n <div ng-if=\"!formData.subscriptions.count\" class=\"item gray\" translate>SUBSCRIPTION.NO_SUBSCRIPTION</div>\\n\\n <a class=\"item item-icon-left item-text-wrap item-icon-right ink\" ng-if=\"formData.subscriptions.count && isDefaultWallet\" ui-sref=\"app.edit_subscriptions\">\\n <i class=\"icon ion-gear-a\"></i>\\n <span translate>SUBSCRIPTION.SUBSCRIPTION_COUNT</span>\\n <span class=\"badge badge-calm\">{{formData.subscriptions.count}}</span>\\n\\n <i class=\"gray icon ion-ios-arrow-right\"></i>\\n </a>\\n <a class=\"item item-icon-left item-text-wrap item-icon-right ink\" ng-if=\"formData.subscriptions.count && !isDefaultWallet\" ui-sref=\"app.edit_subscriptions_by_id({id: walletId})\">\\n <i class=\"icon ion-gear-a\"></i>\\n <span translate>SUBSCRIPTION.SUBSCRIPTION_COUNT</span>\\n <span class=\"badge badge-calm\">{{formData.subscriptions.count}}</span>\\n\\n <i class=\"gray icon ion-ios-arrow-right\"></i>\\n </a>\\n\\n <!-- page -->\\n <div class=\"item item-divider item-divider-top-border\">\\n <span>\\n {{\\'REGISTRY.WALLET.PAGE_DIVIDER\\' | translate}}\\n <i style=\"font-size: 12pt; cursor: pointer;\" ng-click=\"showPagesHelp=!showPagesHelp\" class=\"icon positive ion-ios-help-outline\" title=\"{{\\'REGISTRY.WALLET.PAGE_DIVIDER_HELP\\' | translate}}\"></i>\\n <span>\\n\\n <a class=\"badge button button-text button-small button-small-padding\" ng-if=\"!formData.pages.count\" ng-click=\"showNewPageModal($event)\">\\n <i class=\"icon ion-edit\"></i>\\n <span translate>REGISTRY.BTN_NEW</span>\\n </a>\\n </span></span></div>\\n\\n <div class=\"item item-text-wrap positive item-small-height item-wallet-help\" ng-show=\"showPagesHelp\">\\n <small trust-as-html=\"\\'REGISTRY.WALLET.PAGE_DIVIDER_HELP\\'|translate\"></small>\\n </div>\\n\\n <div ng-if=\"!formData.pages.count\" class=\"item gray\" translate>REGISTRY.NO_PAGE</div>\\n\\n <a class=\"item item-icon-left item-text-wrap item-icon-right ink\" ng-if=\"formData.pages.count && isDefaultWallet\" ui-sref=\"app.wallet_pages\">\\n <i class=\"icon ion-social-buffer\"></i>\\n <span translate>REGISTRY.MY_PAGES</span>\\n <span class=\"badge badge-calm\">{{formData.pages.count}}</span>\\n\\n <i class=\"gray icon ion-ios-arrow-right\"></i>\\n </a>\\n <a class=\"item item-icon-left item-text-wrap item-icon-right ink\" ng-if=\"formData.pages.count && !isDefaultWallet\" ui-sref=\"app.wallet_pages_by_id({id: walletId})\">\\n <i class=\"icon ion-social-buffer\"></i>\\n <span translate>REGISTRY.MY_PAGES</span>\\n <span class=\"badge badge-calm\">{{formData.pages.count}}</span>\\n\\n <i class=\"gray icon ion-ios-arrow-right\"></i>\\n </a>\\n</ng-if>\\n');\n$templateCache.put('plugins/es/templates/wot/lookup_extend.html','<ion-tab ng-if=\":state:enable\" title=\"{{\\'MENU.REGISTRY\\'|translate}}\" icon=\"ion-social-buffer\" ui-sref=\"app.wot_lookup.tab_registry\">\\n <ion-nav-view name=\"tab_registry\"></ion-nav-view>\\n</ion-tab>\\n');\n$templateCache.put('plugins/es/templates/wot/lookup_item_group.html','\\n<i ng-if=\"::!item.avatar\" class=\"item-image icon ion-android-people\"></i>\\n<i ng-if=\"::!item.avatar\" class=\"item-image icon-secondary ion-android-lock\" style=\"left: 20px; top: 17px; font-size: 19px; color: #d9d9d9;\"></i>\\n<i ng-if=\"::item.avatar\" class=\"item-image avatar\" style=\"background-image: url({{::item.avatar.src}})\"></i>\\n\\n<h2 ng-bind-html=\":rebind:item.name\"></h2>\\n\\n<!-- creation time-->\\n<h4 class=\"gray\">\\n <i class=\"ion-clock\"></i>\\n {{:rebind:\\'GROUP.CREATED_TIME\\'|translate: item }}\\n</h4>\\n\\n<!-- membersCount -->\\n<h4 class=\"dark pull-left\" ng-if=\":rebind:item.membersCount\">\\n <i class=\"dark ion-person\"></i>\\n <span class=\"dark\">+{{:rebind:item.membersCount}}</span>\\n</h4>\\n\\n<h4 class=\"dark\">\\n <span class=\"dark\" ng-if=\"::item.description\">\\n <i class=\"ion-quote\"></i>\\n {{::item.description|truncText}}\\n </span>\\n</h4>\\n<h4 ng-if=\"::item.tags\">\\n <span ng-if=\"::item.tags\" class=\"dark\">\\n <ng-repeat ng-repeat=\"tag in ::item.tags\">\\n #<ng-bind-html ng-bind-html=\"::tag\"></ng-bind-html>\\n </ng-repeat>\\n </span>\\n</h4>\\n');\n$templateCache.put('plugins/es/templates/wot/lookup_item_page.html','<i ng-if=\"::!item.avatar\" class=\"item-image icon cion-page-{{item.type}}\"></i>\\n<i ng-if=\"::item.avatar\" class=\"item-image avatar\" style=\"background-image: url({{::item.avatar.src}})\"></i>\\n\\n<h2 ng-bind-html=\":rebind:item.name\"></h2>\\n\\n<h4 class=\"gray\">\\n <span class=\"gray\" ng-if=\"::item.city\">\\n <i class=\"ion-location\"></i>\\n {{::item.city|truncText}}\\n </span>\\n <span ng-if=\"::item.city && item.type\">|</span>\\n <span ng-if=\"item.type\">\\n <i class=\"cion-page-{{item.type}}\"></i>\\n {{::\\'REGISTRY.TYPE.ENUM.\\'+item.type|uppercase|translate}}\\n </span>\\n</h4>\\n<h4 class=\"dark\">\\n <span class=\"dark\" ng-if=\"::item.description\">\\n <i class=\"ion-quote\"></i>\\n {{::item.description|truncText}}\\n </span>\\n</h4>\\n<h4 ng-if=\"::item.tags\">\\n <span ng-if=\"::item.tags\" class=\"dark\">\\n <ng-repeat ng-repeat=\"tag in ::item.tags\">\\n #<ng-bind-html ng-bind-html=\"::tag\"></ng-bind-html>\\n </ng-repeat>\\n </span>\\n</h4>\\n');\n$templateCache.put('plugins/es/templates/wot/lookup_lg_extend.html','<div class=\"buttons-tabs\" ng-if=\":state:enable\">\\n <div class=\"pull-right\">\\n <div class=\"button button-tab dark\" title=\"{{\\'REGISTRY.BTN_SHOW_WOT_HELP\\' | translate}}\" nav-transition=\"none\" active-link=\"active\" active-link-path-prefix=\"#/app/wot/lg\" ui-sref=\"app.wot_lookup_lg\">\\n <i class=\"icon ion-person-stalker\"></i>\\n {{\\'REGISTRY.BTN_SHOW_WOT\\' | translate}}\\n </div>\\n <a class=\"button button-tab ink dark\" title=\"{{\\'REGISTRY.BTN_SHOW_PAGES_HELP\\' | translate}}\" nav-transition=\"none\" active-link=\"active\" active-link-path-prefix=\"#/app/wot/page\" ui-sref=\"app.registry_lookup_lg\">\\n <i class=\"icon ion-social-buffer\"></i>\\n {{\\'REGISTRY.BTN_SHOW_PAGES\\' | translate}}\\n </a>\\n </div>\\n\\n <div class=\"pull-right\" ng-if=\"showNewPageButton\">\\n <button class=\"button button-small button-positive button-small-padding button-clear ink hidden-sm hidden-xs\" ng-click=\"showNewPageModal()\">\\n <i class=\"icon ion-plus\"></i>\\n {{\\'REGISTRY.BTN_NEW\\' | translate}}\\n </button>\\n &nbsp;\\n </div>\\n</div>\\n');\n$templateCache.put('plugins/es/templates/wot/popover_certification_actions.html','<ion-popover-view class=\"fit has-header\">\\n <ion-header-bar>\\n <h1 class=\"title\" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\\n </ion-header-bar>\\n <ion-content scroll=\"false\">\\n <div class=\"list item-text-wrap\">\\n\\n <!-- certify -->\\n <a class=\"item item-icon-left ink\" ng-if=\"canCertify\" ng-click=\"certify()\">\\n <i class=\"icon ion-ribbon-b\"></i>\\n {{\\'WOT.BTN_CERTIFY\\' | translate}}\\n </a>\\n\\n <!-- ask certification to current identities -->\\n <a class=\"item item-icon-left ink\" ng-if=\"!isUserPubkey(formData.pubkey) && formData.isMember\" ng-click=\"askCertification()\">\\n <i class=\"icon-secondary ion-ribbon-b\" style=\"left: 16px; top: 0px; font-size: 25px;\"></i>\\n <b class=\"icon-secondary ion-help\" style=\"left: 35px; top: 0px;\"></b>\\n {{\\'WOT.BTN_ASK_CERTIFICATION\\' | translate}}\\n </a>\\n\\n <!-- ask certifications to many identities -->\\n <a class=\"item item-icon-left ink\" ng-if=\"isUserPubkey(formData.pubkey)\" ng-click=\"showAskCertificationModal()\">\\n <i class=\"icon-secondary ion-ribbon-b\" style=\"left: 16px; top: 0px; font-size: 25px;\"></i>\\n <b class=\"icon-secondary ion-help\" style=\"left: 35px; top: 0px;\"></b>\\n {{\\'WOT.BTN_ASK_CERTIFICATIONS_DOTS\\' | translate}}\\n </a>\\n\\n <!-- suggest certifications to current identity -->\\n <a class=\"item item-icon-left ink\" ng-if=\"!isUserPubkey(formData.pubkey)\" ng-click=\"showSuggestCertificationModal()\">\\n <i class=\"icon-secondary ion-person-stalker\" style=\"left: 16px; top: 0px; font-size: 25px;\"></i>\\n <b class=\"icon-secondary ion-help\" style=\"left: 37px; top: -4px;\"></b>\\n {{\\'WOT.BTN_SUGGEST_CERTIFICATIONS_DOTS\\' | translate}}\\n </a>\\n </div>\\n </ion-content>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/es/templates/wot/view_certifications_extend.html','<!-- nav buttons section -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'nav-buttons\\' && !$root.config.readonly\">\\n\\n <button class=\"button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm\" ng-click=\"showCertificationActionsPopover($event)\">\\n </button>\\n\\n</ng-if>\\n\\n<!-- Buttons section -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'buttons\\' && !$root.config.readonly\">\\n\\n <button class=\"button button-stable button-small-padding icon ion-android-more-vertical\" ng-click=\"showCertificationActionsPopover($event)\" title=\"{{\\'COMMON.POPOVER_ACTIONS_TITLE\\' | translate}}\">\\n </button>\\n\\n</ng-if>\\n');\n$templateCache.put('plugins/es/templates/wot/view_identity_extend.html','<!-- Hero -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'hero\\'\">\\n <!-- likes -->\\n <small class=\"light\" style=\"display: inline-block;\" ng-include=\"::\\'plugins/es/templates/common/view_likes.html\\'\"></small>\\n</ng-if>\\n\\n<!-- Top fab buttons -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'buttons-top-fab\\' && !$root.config.readonly\">\\n <button id=\"fab-compose-{{:rebind:formData.pubkey}}\" class=\"button button-fab button-fab-top-left button-fab-hero mini button-stable spin\" style=\"left: 88px;\" ng-click=\"showNewMessageModal()\">\\n <i class=\"icon ion-email\"></i>\\n </button>\\n</ng-if>\\n\\n<!-- Buttons section -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'buttons\\' && !$root.config.readonly\">\\n <button class=\"button button-stable button-small-padding icon ion-email\" ng-disabled=\"loading\" ng-click=\"showNewMessageModal()\" title=\"{{\\'MESSAGE.BTN_WRITE\\' | translate}}\">\\n </button>\\n</ng-if>\\n\\n<!-- End of buttons section -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'after-buttons\\' && !$root.config.readonly\">\\n <!-- options -->\\n <button class=\"button button-stable button-small-padding icon ion-android-more-vertical\" ng-click=\"showActionsPopover($event)\">\\n </button>\\n</ng-if>\\n\\n<!-- General section -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'after-general\\'\">\\n\\n <span class=\"item item-divider item-divider-top-border\">\\n <span>\\n {{\\'PROFILE.PROFILE_DIVIDER\\' | translate}}\\n <a style=\"font-size: 12pt; cursor: pointer;\" ng-click=\"showProfileHelp=!showProfileHelp\" class=\"icon positive ion-ios-help-outline ink\" title=\"{{\\'PROFILE.PROFILE_DIVIDER_HELP\\' | translate}}\"></a>\\n </span>\\n </span>\\n\\n <div class=\"item item-text-wrap positive item-small-height\" ng-show=\"showProfileHelp\">\\n <small translate>PROFILE.PROFILE_DIVIDER_HELP</small>\\n </div>\\n\\n <ng-include src=\"::\\'plugins/es/templates/user/items_profile.html\\'\" ng-init=\"showName=false;\"></ng-include>\\n\\n</ng-if>\\n');\n$templateCache.put('plugins/es/templates/wot/view_popover_actions.html','<ion-popover-view class=\"fit has-header\">\\n <ion-header-bar>\\n <h1 class=\"title\" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\\n </ion-header-bar>\\n <ion-content scroll=\"false\">\\n <div class=\"list item-text-wrap\">\\n\\n <a class=\"item item-icon-left ink visible-xs visible-sm\" ng-click=\"showSharePopover($event)\">\\n <i class=\"icon ion-android-share-alt\"></i>\\n {{\\'COMMON.BTN_SHARE\\' | translate}}\\n </a>\\n\\n <a class=\"item item-icon-left assertive ink\" ng-if=\"canDelete\" ng-click=\"delete()\">\\n <i class=\"icon ion-trash-a\"></i>\\n {{\\'COMMON.BTN_DELETE\\' | translate}}\\n </a>\\n\\n <!-- Like -->\\n <a class=\"item item-icon-left ink\" ng-if=\"!canEdit && likeData.likes\" ng-click=\"hideActionsPopover() && toggleLike($event)\">\\n <i class=\"icon\" ng-class=\"{\\'ion-heart-broken\\': likeData.likes.wasHit, \\'ion-heart\\': !likeData.likes.wasHit}\"></i>\\n {{(likeData.likes.wasHit ? \\'COMMON.BTN_LIKE_REMOVE\\' : \\'COMMON.BTN_LIKE\\' )| translate}}\\n </a>\\n\\n <!-- report abuse -->\\n <a class=\"item item-icon-left ink\" ng-if=\"!canEdit && likeData.abuses\" ng-disabled=\"!!likeData.abuses.wasHitCount\" ng-class=\"{\\'gray\\': !!likeData.abuses.wasHitCount}\" ng-click=\"hideActionsPopover() && reportAbuse($event)\">\\n <i class=\"icon ion-android-warning\"></i>\\n {{\\'COMMON.BTN_REPORT_ABUSE_DOTS\\' | translate}}\\n </a>\\n </div>\\n </ion-content>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/graph/templates/account/graph_balance.html','\\n <!-- button bar -->\\n <div class=\"button-bar-inline\" style=\"top: 33px; margin-top:-33px; position: relative;\">\\n <button class=\"button button-stable button-clear no-padding-xs pull-right\" ng-click=\"showActionsPopover($event)\">\\n <i class=\"icon ion-navicon-round\"></i>\\n </button>\\n </div>\\n\\n <div class=\"padding-left padding-right\">\\n <canvas id=\"account-balance\" class=\"chart-bar\" height=\"{{height}}\" width=\"{{width}}\" chart-data=\"data\" chart-dataset-override=\"datasetOverride\" chart-colors=\"colors\" chart-options=\"options\" chart-labels=\"labels\" chart-click=\"onChartClick\">\\n </canvas>\\n </div>\\n\\n <ng-include src=\"::\\'plugins/graph/templates/common/graph_range_bar.html\\'\"></ng-include>\\n');\n$templateCache.put('plugins/graph/templates/account/graph_certifications.html','\\n <div class=\"padding-left padding-right\">\\n <canvas id=\"account-certifications\" class=\"chart-bar\" height=\"{{height}}\" width=\"{{width}}\" chart-data=\"data\" chart-dataset-override=\"datasetOverride\" chart-colors=\"colors\" chart-options=\"options\" chart-labels=\"labels\" chart-click=\"onChartClick\">\\n </canvas>\\n </div>\\n');\n$templateCache.put('plugins/graph/templates/account/graph_sum_tx.html','<div class=\"row responsive-sm\" ng-if=\"!loading\">\\n\\n <div class=\"col col-10 hidden-xs hidden-sm\">&nbsp;</div>\\n\\n <div class=\"col text-center\">\\n\\n <!-- TX input chart -->\\n <p class=\"gray padding text-wrap\" ng-if=\"inputChart.data.length\" translate>GRAPH.ACCOUNT.INPUT_CHART_TITLE</p>\\n <canvas id=\"chart-received-pie\" class=\"chart-pie\" chart-data=\"inputChart.data\" chart-labels=\"inputChart.labels\" chart-colors=\"inputChart.colors\" chart-click=\"onInputChartClick\">\\n </canvas>\\n\\n </div>\\n\\n <div class=\"col col-10 hidden-xs hidden-sm\">&nbsp;</div>\\n\\n <div class=\"col text-center\">\\n\\n <!-- TX output chart -->\\n <p class=\"gray padding text-wrap\" ng-if=\"outputChart.data.length\" translate>GRAPH.ACCOUNT.OUTPUT_CHART_TITLE</p>\\n <canvas id=\"chart-sent-pie\" class=\"chart-pie\" chart-data=\"outputChart.data\" chart-labels=\"outputChart.labels\" chart-colors=\"outputChart.colors\" chart-click=\"onOutputChartClick\">\\n </canvas>\\n\\n </div>\\n\\n <div class=\"col col-10 hidden-xs hidden-sm\">&nbsp;</div>\\n\\n</div>\\n');\n$templateCache.put('plugins/graph/templates/account/view_identity_tx_extend.html','<!-- Buttons section -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'buttons\\'\">\\n\\n <button class=\"button button-stable button-small-padding icon ion-stats-bars\" ui-sref=\"app.wot_identity_stats({pubkey: formData.pubkey})\" title=\"{{\\'GRAPH.ACCOUNT.BTN_SHOW_STATS\\' | translate}}\">\\n </button>\\n\\n</ng-if>\\n');\n$templateCache.put('plugins/graph/templates/account/view_stats.html','<ion-view left-buttons=\"leftButtons\" cache-view=\"false\">\\n <ion-nav-title>\\n {{\\'GRAPH.ACCOUNT.TITLE\\' | translate}}{{id}}\\n </ion-nav-title>\\n\\n <ion-content scroll=\"true\" class=\"no-padding\">\\n\\n\\n\\n <div class=\"list\">\\n\\n <!-- - - - - Balance - - - - -->\\n <ng-controller ng-controller=\"GpAccountBalanceCtrl\">\\n <div class=\"center padding\" ng-if=\"loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div class=\"item item-divider\" ng-if=\"!loading\">\\n {{\\'GRAPH.ACCOUNT.BALANCE_DIVIDER\\'|translate}}\\n <ion-spinner ng-if=\"loadingRange\" class=\"ion-spinner-small\" icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div class=\"item no-padding-xs\" ng-if=\"!loading\" ng-include=\"::\\'plugins/graph/templates/account/graph_balance.html\\'\" ng-init=\"setSize(350, 1000)\">\\n </div>\\n </ng-controller>\\n\\n </div>\\n\\n <div class=\"item no-padding-xs\" ng-include=\"::\\'plugins/graph/templates/account/graph_sum_tx.html\\'\" ng-controller=\"GpAccountSumTxCtrl\">\\n </div>\\n\\n <!-- - - - - WOT - - - -\\n <div class=\"item item-divider\" translate>\\n GRAPH.ACCOUNT.WOT_DIVIDER\\n </div>\\n\\n <div class=\"item no-padding-xs\"\\n ng-include=\"::\\'plugins/graph/templates/account/graph_certifications.html\\'\"\\n ng-controller=\"GpAccountCertificationCtrl\"\\n ng-init=\"setSize(350, 1000)\">\\n </div>-->\\n\\n </ion-content>\\n\\n</ion-view>\\n');\n$templateCache.put('plugins/graph/templates/account/view_wallet_tx_extend.html','<!-- Buttons section -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'buttons\\'\">\\n\\n <button class=\"button button-stable button-small-padding icon ion-stats-bars\" ui-sref=\"app.wot_identity_stats({pubkey: formData.pubkey})\" title=\"{{\\'GRAPH.ACCOUNT.BTN_SHOW_STATS\\' | translate}}\">\\n </button>\\n\\n</ng-if>\\n');\n$templateCache.put('plugins/graph/templates/blockchain/graph_block_issuers.html','\\n <div class=\"row responsive-lg\">\\n\\n <!-- bar -->\\n <div class=\"col col-75\">\\n <canvas id=\"bar\" class=\"chart-bar\" height=\"{{height}}\" width=\"{{width}}\" chart-data=\"data\" chart-labels=\"labels\" chart-colors=\"colors\" chart-options=\"barOptions\" chart-click=\"onChartClick\">\\n </canvas>\\n </div>\\n\\n <!-- pie -->\\n <div class=\"col col-25 padding-top\">\\n <canvas id=\"blocksByIssuer-pie\" class=\"chart-pie\" chart-data=\"data\" chart-labels=\"labels\" chart-colors=\"colors\" chart-click=\"onChartClick\">\\n </canvas>\\n\\n <div class=\"gray padding-top text-center\">\\n <small ng-bind-html=\"\\'GRAPH.BLOCKCHAIN.BLOCKS_ISSUERS_HELP\\'| translate:{issuerCount: data.length, blockCount: blockCount }\"></small>\\n </div>\\n </div>\\n </div>\\n');\n$templateCache.put('plugins/graph/templates/blockchain/graph_tx_count.html','\\n <!-- button bar -->\\n <div class=\"button-bar-inline\" style=\"top: 33px; margin-top:-33px; position: relative;\">\\n <button class=\"button button-stable button-clear no-padding-xs pull-right\" ng-click=\"showActionsPopover($event)\">\\n <i class=\"icon ion-navicon-round\"></i>\\n </button>\\n </div>\\n\\n <div class=\"padding-left padding-right\">\\n <canvas id=\"tx-line\" class=\"chart-bar\" height=\"{{height}}\" width=\"{{width}}\" chart-data=\"data\" chart-dataset-override=\"datasetOverride\" chart-colors=\"colors\" chart-options=\"options\" chart-labels=\"labels\" chart-click=\"onChartClick\">\\n </canvas>\\n </div>\\n\\n <ng-include src=\"::\\'plugins/graph/templates/common/graph_range_bar.html\\'\"></ng-include>\\n');\n$templateCache.put('plugins/graph/templates/blockchain/view_stats.html','<ion-view left-buttons=\"leftButtons\" cache-view=\"false\">\\n <ion-nav-title>\\n {{\\'GRAPH.BLOCKCHAIN.TITLE\\' | translate}}{{id}}\\n </ion-nav-title>\\n\\n <ion-content scroll=\"true\" class=\"no-padding\">\\n\\n <div class=\"center padding\" ng-if=\"loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div class=\"list\" ng-if=\"!loading\">\\n\\n\\n <!-- TX count -->\\n <ng-controller ng-controller=\"GpBlockchainTxCountCtrl\">\\n <div class=\"center padding\" ng-if=\"loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div class=\"item item-divider\" ng-if=\"!loading\">\\n {{\\'GRAPH.BLOCKCHAIN.TX_DIVIDER\\'|translate}}\\n <ion-spinner ng-if=\"loadingRange\" class=\"ion-spinner-small\" icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div class=\"item no-padding-xs no-padding-sm\" ng-if=\"!loading\" ng-include=\"::\\'plugins/graph/templates/blockchain/graph_tx_count.html\\'\" ng-init=\"setSize(350, 1000)\">\\n </div>\\n </ng-controller>\\n\\n\\n <!-- Blocks issuer -->\\n <ng-controller ng-controller=\"GpBlockchainIssuersCtrl\">\\n\\n <div class=\"item item-divider\" ng-if=\"!loading\" translate>GRAPH.BLOCKCHAIN.BLOCKS_ISSUERS_DIVIDER</div>\\n\\n <div class=\"item no-padding-xs no-padding-sm\" ng-if=\"!loading\" ng-include=\"::\\'plugins/graph/templates/blockchain/graph_block_issuers.html\\'\" ng-init=\"setSize(300, 750)\">\\n </div>\\n\\n </ng-controller>\\n\\n </div></ion-content>\\n\\n</ion-view>\\n');\n$templateCache.put('plugins/graph/templates/common/graph_range_bar.html','\\n <div class=\"range range-positive no-padding-left no-padding-right\">\\n <a class=\"button button-stable button-clear no-padding pull-left\" ng-click=\"goPreviousRange($event)\">\\n <i class=\"icon ion-chevron-left\"></i>\\n </a>\\n <input type=\"range\" ng-model=\"formData.timePct\" name=\"timePct\" min=\"0\" max=\"100\" value=\"{{formData.timePct}}\" ng-change=\"onRangeChanged();\" ng-model-options=\"{ debounce: 250 }\">\\n <a class=\"button button-stable button-clear no-padding pull-right\" ng-click=\"goNextRange($event)\">\\n <i class=\"icon ion-chevron-right\"></i>\\n </a>\\n </div>\\n');\n$templateCache.put('plugins/graph/templates/common/popover_range_actions.html','<ion-popover-view class=\"has-header popover-graph-currency\">\\n <ion-header-bar>\\n <h1 class=\"title\" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\\n </ion-header-bar>\\n <ion-content scroll=\"false\">\\n <div class=\"list item-text-wrap\">\\n\\n <!-- scale -->\\n <a class=\"item item-icon-left ink\" ng-click=\"toggleScale()\">\\n <i class=\"icon ion-ios-checkmark-empty\" ng-show=\"formData.scale==\\'logarithmic\\'\"></i>\\n <span ng-bind-html=\"\\'GRAPH.COMMON.LOGARITHMIC_SCALE\\' | translate\"></span>\\n </a>\\n\\n <!-- duration divider -->\\n <div class=\"item item-divider\">\\n {{\\'GRAPH.COMMON.RANGE_DURATION_DIVIDER\\'|translate}}\\n </div>\\n\\n <!-- duration: hour -->\\n <a class=\"item item-icon-left ink\" ng-click=\"setRangeDuration(\\'hour\\')\">\\n <i class=\"icon ion-ios-checkmark-empty\" ng-show=\"formData.rangeDuration==\\'hour\\'\"></i>\\n <span ng-bind-html=\"\\'GRAPH.COMMON.RANGE_DURATION.HOUR\\' | translate\"></span>\\n </a>\\n\\n <!-- duration: day -->\\n <a class=\"item item-icon-left ink\" ng-click=\"setRangeDuration(\\'day\\')\">\\n <i class=\"icon ion-ios-checkmark-empty\" ng-show=\"formData.rangeDuration==\\'day\\'\"></i>\\n <span ng-bind-html=\"\\'GRAPH.COMMON.RANGE_DURATION.DAY\\' | translate\"></span>\\n </a>\\n\\n <!-- duration: month -->\\n <a class=\"item item-icon-left ink\" ng-click=\"setRangeDuration(\\'month\\')\">\\n <i class=\"icon ion-ios-checkmark-empty\" ng-show=\"formData.rangeDuration==\\'month\\'\"></i>\\n <span ng-bind-html=\"\\'GRAPH.COMMON.RANGE_DURATION.MONTH\\' | translate\"></span>\\n </a>\\n\\n </div>\\n </ion-content>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/graph/templates/currency/graph_du.html','\\n <!-- graphs button bar -->\\n <div class=\"button-bar-inline\" style=\"top: 33px; margin-top:-33px; position: relative;\">\\n <button class=\"button button-stable button-clear no-padding-xs no-padding-sm pull-right\" ng-click=\"showActionsPopover($event)\">\\n <i class=\"icon ion-navicon-round\"></i>\\n </button>\\n </div>\\n\\n <canvas id=\"monetaryMass-bar\" class=\"chart-bar\" height=\"{{height}}\" width=\"{{width}}\" chart-data=\"data\" chart-labels=\"labels\" chart-colors=\"colors\" chart-dataset-override=\"datasetOverride\" chart-options=\"options\" chart-click=\"showBlock\">\\n </canvas>\\n');\n$templateCache.put('plugins/graph/templates/currency/graph_members_count.html',' <canvas id=\"membersCount-bar\" class=\"chart-line\" height=\"{{height}}\" width=\"{{width}}\" chart-data=\"data\" chart-labels=\"labels\" chart-colors=\"colors\" chart-options=\"options\" chart-dataset-override=\"datasetOverride\" chart-click=\"onChartClick\">\\n </canvas>\\n');\n$templateCache.put('plugins/graph/templates/currency/graph_monetary_mass.html','\\n <!-- graphs button bar -->\\n <div class=\"button-bar-inline\" style=\"top: 33px; margin-top:-33px; position: relative;\">\\n <button class=\"button button-stable button-clear no-padding-xs pull-right\" ng-click=\"showActionsPopover($event)\">\\n <i class=\"icon ion-navicon-round\"></i>\\n </button>\\n </div>\\n\\n <canvas id=\"monetaryMass-bar\" class=\"chart-bar\" height=\"{{height}}\" width=\"{{width}}\" chart-data=\"data\" chart-labels=\"labels\" chart-colors=\"colors\" chart-dataset-override=\"datasetOverride\" chart-options=\"options\" chart-click=\"onChartClick\">\\n </canvas>\\n');\n$templateCache.put('plugins/graph/templates/currency/popover_monetary_mass_actions.html','<ion-popover-view class=\"fit has-header\">\\n <ion-header-bar>\\n <h1 class=\"title\" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\\n </ion-header-bar>\\n <ion-content scroll=\"false\">\\n <div class=\"list item-text-wrap\">\\n\\n <a class=\"item item-icon-left ink\" ng-click=\"toggleScale()\">\\n <i class=\"icon ion-ios-checkmark-empty\" ng-show=\"formData.scale==\\'logarithmic\\'\"></i>\\n <span ng-bind-html=\"\\'GRAPH.COMMON.LOGARITHMIC_SCALE\\' | translate\"></span>\\n </a>\\n\\n </div>\\n </ion-content>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/graph/templates/currency/tab_blocks_extend.html','<!-- buttons -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'buttons\\'\">\\n <div class=\"item item-divider\">\\n <a class=\"badge button button-text button-small button-small-padding ink\" ui-sref=\"app.currency.tab_blocks_stats\">\\n <i class=\"icon ion-stats-bars\"></i>\\n <span translate>GRAPH.COMMON.BTN_SHOW_STATS</span>\\n </a>\\n </div>\\n</ng-if>\\n');\n$templateCache.put('plugins/graph/templates/currency/tabs/tab_blocks_stats.html','<ion-view>\\n <ion-content>\\n <div ng-include=\"::\\'plugins/graph/templates/blockchain/graph_tx_count.html\\'\" ng-controller=\"GpBlockchainTxCountCtrl\" ng-init=\"setSize(500,700,false)\">\\n </div>\\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/graph/templates/currency/tabs/tab_network_stats.html','<ion-view>\\n <ion-content>\\n\\n <div class=\"list\">\\n <div class=\"item\" ng-include=\"::\\'plugins/graph/templates/blockchain/graph_block_issuers.html\\'\" ng-controller=\"GpBlockchainIssuersCtrl\" ng-init=\"setSize(500,700,true)\">\\n </div>\\n </div>\\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/graph/templates/currency/tabs/tab_parameters_stats.html','<ion-view>\\n <ion-content>\\n <div class=\"list no-padding-xs no-padding-sm\">\\n\\n <ng-container ng-controller=\"GpCurrencyMonetaryMassCtrl\">\\n\\n <div class=\"center padding\" ng-if=\"loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <!-- Monetary mass -->\\n <div class=\"item\" ng-include=\"::\\'plugins/graph/templates/currency/graph_monetary_mass.html\\'\" ng-init=\"setSize(500,700,true)\">\\n </div>\\n </ng-container>\\n\\n <!-- DU -->\\n <ng-container ng-controller=\"GpCurrencyDUCtrl\">\\n <div class=\"item\" ng-include=\"::\\'plugins/graph/templates/currency/graph_du.html\\'\" ng-init=\"setSize(500,700,true)\">\\n </div>\\n </ng-container>\\n </div>\\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/graph/templates/currency/tabs/tab_wot_stats.html','<ion-view>\\n <ion-content>\\n <div class=\"center padding\" ng-if=\"loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div class=\"list no-padding\">\\n <div class=\"item no-padding-top\" ng-include=\"::\\'plugins/graph/templates/currency/graph_members_count.html\\'\" ng-init=\"setSize(600,700,false)\">\\n </div>\\n </div>\\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/graph/templates/currency/view_currency_extend.html','\\n<!-- section actual parameters -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'parameters-actual\\'\">\\n\\n <ng-if ng-if=\"!smallscreen\">\\n <div class=\"item padding-left padding-right no-padding-xs no-padding-sm\" ng-include=\"::\\'plugins/graph/templates/currency/graph_monetary_mass.html\\'\" ng-controller=\"GpCurrencyMonetaryMassCtrl\" ng-init=\"displayShareAxis=false;\">\\n </div>\\n <div class=\"item buttons no-padding-top\">\\n <a class=\"pull-right button button-text button-small button-small-padding ink\" ui-sref=\"app.currency_stats_lg\">\\n <i class=\"icon ion-stats-bars\"></i>\\n <span translate>GRAPH.COMMON.BTN_SHOW_DETAILED_STATS</span>\\n </a>\\n </div>\\n </ng-if>\\n\\n <div class=\"item item-divider\" ng-if=\"smallscreen\">\\n <a class=\"badge button button-text button-small button-small-padding ink\" ui-sref=\"app.currency.tab_parameters_stats\">\\n <i class=\"icon ion-stats-bars\"></i>\\n <span translate>GRAPH.COMMON.BTN_SHOW_STATS</span>\\n </a>\\n </div>\\n</ng-if>\\n\\n<!-- section Wot -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'wot-actual\\'\">\\n\\n <ng-if ng-if=\"!smallscreen\">\\n <div class=\"item padding-left padding-right no-padding-xs no-padding-sm\" ng-include=\"::\\'plugins/graph/templates/currency/graph_members_count.html\\'\" ng-controller=\"GpCurrencyMembersCountCtrl\">\\n </div>\\n <div class=\"item buttons no-padding-top\">\\n <a class=\"pull-right button button-text button-small button-small-padding ink\" ui-sref=\"app.currency_stats_lg\">\\n <i class=\"icon ion-stats-bars\"></i>\\n <span translate>GRAPH.COMMON.BTN_SHOW_DETAILED_STATS</span>\\n </a>\\n </div>\\n </ng-if>\\n\\n <div class=\"item item-divider\" ng-if=\"smallscreen\">\\n <a class=\"badge button button-text button-small button-small-padding ink\" ui-sref=\"app.currency.tab_wot_stats\">\\n <i class=\"icon ion-stats-bars\"></i>\\n <span translate>GRAPH.COMMON.BTN_SHOW_STATS</span>\\n </a>\\n </div>\\n</ng-if>\\n\\n<!-- section Wot -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'network-actual\\'\">\\n\\n <div class=\"item padding-left padding-right no-padding-xs no-padding-sm\" ng-if=\"!smallscreen\" ng-include=\"::\\'plugins/graph/templates/blockchain/graph_block_issuers.html\\'\" ng-controller=\"GpBlockchainIssuersCtrl\">\\n </div>\\n\\n <div class=\"item item-divider\" ng-if=\"smallscreen\">\\n <a class=\"badge button button-text button-small button-small-padding ink\" ui-sref=\"app.currency.tab_network_stats\">\\n <i class=\"icon ion-stats-bars\"></i>\\n <span translate>GRAPH.COMMON.BTN_SHOW_STATS</span>\\n </a>\\n </div>\\n</ng-if>\\n\\n');\n$templateCache.put('plugins/graph/templates/currency/view_stats_lg.html','<ion-view left-buttons=\"leftButtons\" cache-view=\"false\">\\n <ion-nav-title>\\n {{\\'GRAPH.BLOCKCHAIN.TITLE\\' | translate}}\\n </ion-nav-title>\\n\\n <ion-content scroll=\"true\" class=\"padding\">\\n\\n\\n\\n <div class=\"list\">\\n\\n <!-- Monetary mass -->\\n <ng-controller ng-controller=\"GpCurrencyMonetaryMassCtrl\">\\n\\n <div class=\"center padding\" ng-if=\"loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div class=\"item no-padding-xs\" ng-if=\"!loading\" ng-include=\"::\\'plugins/graph/templates/currency/graph_monetary_mass.html\\'\" ng-init=\"setSize(250, 1000)\">\\n </div>\\n\\n <div ng-if=\"!loading\" class=\"item item-toggle dark no-border text-right\">\\n <span class=\"\" translate>COMMON.BTN_RELATIVE_UNIT</span>\\n <label class=\"toggle toggle-royal\" id=\"helptip-currency-change-unit\">\\n <input type=\"checkbox\" ng-model=\"formData.useRelative\">\\n <div class=\"track\">\\n <div class=\"handle\"></div>\\n </div>\\n </label>\\n </div>\\n </ng-controller>\\n\\n <!-- DU -->\\n <ng-controller ng-controller=\"GpCurrencyDUCtrl\">\\n <div class=\"item no-padding-xs\" ng-if=\"!loading\" ng-include=\"::\\'plugins/graph/templates/currency/graph_du.html\\'\" ng-init=\"setSize(250, 1000)\">\\n </div>\\n </ng-controller>\\n\\n <!-- Member count -->\\n <ng-controller ng-controller=\"GpCurrencyMembersCountCtrl\">\\n <div class=\"item no-padding-xs\" ng-if=\"!loading\" ng-include=\"::\\'plugins/graph/templates/currency/graph_members_count.html\\'\" ng-init=\"setSize(250, 1000)\">\\n </div>\\n\\n\\n </ng-controller></div>\\n\\n </ion-content>\\n\\n</ion-view>\\n');\n$templateCache.put('plugins/graph/templates/currency/view_wot_stats.html','<ion-view left-buttons=\"leftButtons\" cache-view=\"false\">\\n\\n <ion-content scroll=\"true\">\\n\\n <div class=\"center padding\" ng-if=\"loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <ng-include ng-if=\"!loading\" src=\"\\'plugins/graph/templates/currency/graph_members_count.html\\'\"></ng-include>\\n </ion-content>\\n </ion-view>\\n');\n$templateCache.put('plugins/graph/templates/docstats/graph.html','\\n <!-- graphs button bar -->\\n <div class=\"button-bar-inline\" style=\"top: 33px; margin-top:-33px; position: relative;\">\\n <button class=\"button button-stable button-clear no-padding-xs no-padding-sm pull-right\" ng-click=\"showActionsPopover($event)\">\\n <i class=\"icon ion-navicon-round\"></i>\\n </button>\\n </div>\\n\\n <canvas id=\"{{::chartIdPrefix}}{{chart.id}}\" class=\"chart-line\" height=\"{{height}}\" width=\"{{width}}\" chart-data=\"chart.data\" chart-labels=\"labels\" chart-dataset-override=\"chart.datasetOverride\" chart-options=\"chart.options\" chart-click=\"onChartClick\">\\n </canvas>\\n\\n <ng-include src=\"::\\'plugins/graph/templates/common/graph_range_bar.html\\'\"></ng-include>\\n');\n$templateCache.put('plugins/graph/templates/docstats/view_stats.html','<ion-view left-buttons=\"leftButtons\" cache-view=\"false\">\\n <ion-nav-title>\\n {{\\'GRAPH.DOC_STATS.TITLE\\' | translate}}\\n </ion-nav-title>\\n\\n <ion-content scroll=\"true\" class=\"padding\">\\n\\n <div class=\"list\">\\n\\n <!-- Doc stat -->\\n <div class=\"center padding\" ng-if=\"loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div class=\"item no-padding-xs no-padding-sm\" ng-if=\"!loading\" ng-repeat=\"chart in charts\" ng-include=\"::\\'plugins/graph/templates/docstats/graph.html\\'\" ng-init=\"setSize(250, 1000)\">\\n </div>\\n\\n </div>\\n\\n </ion-content>\\n\\n</ion-view>\\n');\n$templateCache.put('plugins/graph/templates/network/view_es_network_extend.html','<!-- Buttons section -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'documents-buttons\\'\">\\n <a class=\"button button-text button-small ink\" ui-sref=\"app.doc_stats_lg\">\\n <i class=\"icon ion-stats-bars\"></i>\\n <span>{{\\'NETWORK.VIEW.BTN_GRAPH\\'|translate}}</span>\\n </a>\\n</ng-if>\\n');\n$templateCache.put('plugins/graph/templates/network/view_es_peer_extend.html','<!-- Buttons section -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'general\\'\">\\n\\n <a class=\"item item-icon-left item-icon-right item-text-wrap ink\" ng-if=\"isReachable\" ui-sref=\"app.doc_stats_lg(node)\">\\n <i class=\"icon ion-stats-bars\"></i>\\n <span translate>GRAPH.DOC_STATS.TITLE</span>\\n <i class=\"gray icon ion-ios-arrow-right\"></i>\\n </a>\\n\\n <a class=\"item item-icon-left item-icon-right item-text-wrap ink\" ng-if=\"isReachable\" ui-sref=\"app.doc_synchro_lg(node)\">\\n <i class=\"icon ion-stats-bars\"></i>\\n <span translate>GRAPH.SYNCHRO.TITLE</span>\\n <i class=\"gray icon ion-ios-arrow-right\"></i>\\n </a>\\n</ng-if>\\n\\n');\n$templateCache.put('plugins/graph/templates/network/view_network_extend.html','<!-- Buttons section -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'blockchain-buttons\\'\">\\n <a class=\"button button-text button-small ink\" ui-sref=\"app.blockchain_stats\">\\n <i class=\"icon ion-stats-bars\"></i>\\n <span>{{\\'NETWORK.VIEW.BTN_GRAPH\\'|translate}}</span>\\n </a>\\n</ng-if>\\n');\n$templateCache.put('plugins/graph/templates/network/view_peer_extend.html','<!-- Buttons section -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'general\\'\">\\n\\n <a class=\"item item-icon-left item-icon-right item-text-wrap ink\" ui-sref=\"app.view_peer_stats({pubkey: node.pubkey})\">\\n <i class=\"icon ion-stats-bars\"></i>\\n <span translate>GRAPH.PEER.VIEW.BLOCK_COUNT_LABEL</span>\\n <span class=\"badge\" ng-if=\"!loading\" ng-class=\"{\\'badge-stable\\': blockCount > 0, \\'badge-assertive\\': !blockCount}\">\\n {{!blockCount ? \\'GRAPH.PEER.VIEW.NO_BLOCK\\' : \\'GRAPH.PEER.VIEW.BLOCK_COUNT\\' | translate:{count: blockCount} }}\\n </span>\\n <ion-spinner class=\"badge\" icon=\"android\" ng-if=\"loading\"></ion-spinner>\\n <i class=\"gray icon ion-ios-arrow-right\"></i>\\n </a>\\n</ng-if>\\n\\n');\n$templateCache.put('plugins/graph/templates/network/view_peer_stats.html','<ion-view left-buttons=\"leftButtons\" cache-view=\"false\">\\n <ion-nav-title>\\n {{\\'GRAPH.BLOCKCHAIN.TITLE\\' | translate}}{{id}}\\n </ion-nav-title>\\n\\n <ion-content scroll=\"true\" class=\"no-padding\">\\n\\n <div class=\"center padding\" ng-if=\"loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div class=\"list\" ng-if=\"!loading\">\\n\\n <!-- - - - - TX divider - - - - -->\\n <div class=\"item item-divider hidden-xs hidden-sm\" translate>\\n GRAPH.BLOCKCHAIN.TX_DIVIDER\\n </div>\\n\\n <div class=\"item no-padding-xs\" ng-include=\"::\\'plugins/graph/templates/blockchain/graph_tx_count.html\\'\" ng-init=\"setSize(350, 1000)\">\\n </div>\\n\\n </div></ion-content>\\n\\n</ion-view>\\n');\n$templateCache.put('plugins/graph/templates/synchro/graph.html','\\n <!-- graphs button bar -->\\n <div class=\"button-bar-inline\" style=\"top: 33px; margin-top:-33px; position: relative;\">\\n <button class=\"button button-stable button-clear no-padding-xs pull-right\" ng-click=\"showActionsPopover($event)\">\\n <i class=\"icon ion-navicon-round\"></i>\\n </button>\\n </div>\\n\\n <canvas id=\"synchro-chart-{{chart.id}}\" class=\"chart-bar\" height=\"{{height}}\" width=\"{{width}}\" chart-data=\"chart.data\" chart-labels=\"labels\" chart-dataset-override=\"chart.datasetOverride\" chart-options=\"chart.options\">\\n </canvas>\\n\\n <ng-include src=\"::\\'plugins/graph/templates/common/graph_range_bar.html\\'\"></ng-include>\\n');\n$templateCache.put('plugins/graph/templates/synchro/view_stats.html','<ion-view left-buttons=\"leftButtons\" cache-view=\"false\">\\n <ion-nav-title>\\n {{\\'GRAPH.SYNCHRO.TITLE\\' | translate}}\\n </ion-nav-title>\\n\\n <ion-content scroll=\"true\" class=\"padding\">\\n\\n <div class=\"list\">\\n\\n <div class=\"center padding\" ng-if=\"loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div class=\"item no-padding-xs\" ng-if=\"!loading\" ng-repeat=\"chart in charts\" ng-include=\"::\\'plugins/graph/templates/synchro/graph.html\\'\" ng-init=\"setSize(250, 1000)\">\\n </div>\\n\\n </div>\\n\\n </ion-content>\\n\\n</ion-view>\\n');\n$templateCache.put('plugins/map/templates/common/edit_position_extend.html','<div class=\"item no-padding hidden-xs hidden-sm {{ionItemClass}}\" ng-if=\"formData.geoPoint && formData.geoPoint.lat && formData.geoPoint.lon\">\\n <leaflet id=\"{{::mapId}}\" height=\"250px\" center=\"map.center\" markers=\"map.markers\" defaults=\"map.defaults\">\\n </leaflet>\\n</div>\\n');\n$templateCache.put('plugins/map/templates/network/item_search_tooltip.html','<a href=\"#\">\\n {{peer.dns || peer.server}}\\n <span class=\"{{peer.uid ? \\'positive\\' : \\'gray\\'}}\">\\n <i class=\"icon {{peer.uid ? \\'ion-person\\' : \\'ion-key\\'}}\"></i>\\n {{peer.uid ? (peer.name||peer.uid) : (peer.pubkey|formatPubkey) }}\\n </span>\\n <span class=\"gray\">{{peer.ipv4 ? (peer.ipv4 + \\':\\' + peer.port) : \\'\\'}}</span>\\n <span class=\"{{peer.bma.useSsl ? \\'\\' : \\'ng-hide\\'}}\"><i class=\"ion-locked\"></i> <small>SSL</small></span>\\n</a>\\n');\n$templateCache.put('plugins/map/templates/network/lookup_extend.html','<!-- FIXME issue #755 - https://git.duniter.org/clients/cesium-grp/cesium/issues/755\\n<a ng-if=\"enable\"\\n class=\"button button-text button-small ink hidden-sm hidden-xs\"\\n title=\"{{\\'MAP.NETWORK.LOOKUP.BTN_MAP_HELP\\' | translate}}\"\\n ui-sref=\"app.view_network_map\">\\n <i class=\"icon ion-ios-location\"></i>\\n {{\\'MAP.NETWORK.LOOKUP.BTN_MAP\\' | translate}}\\n</a>\\n -->\\n');\n$templateCache.put('plugins/map/templates/network/view_map.html','<ion-view left-buttons=\"leftButtons\" class=\"view-map-network\">\\n <ion-nav-title>\\n <span class=\"hidden-xs\" translate>MAP.NETWORK.VIEW.TITLE</span>\\n </ion-nav-title>\\n\\n <ion-nav-buttons side=\"secondary\">\\n </ion-nav-buttons>\\n\\n <ion-content data-tap-disabled=\"true\">\\n <leaflet id=\"{{::mapId}}\" height=\"100%\" center=\"map.center\" markers=\"map.markers\" layers=\"map.layers\">\\n </leaflet>\\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/map/templates/registry/item_search_tooltip.html','<a href=\"#\" class=\"{{type}}\">\\n <i class=\"{{\\'cion-page-\\' + type}}\"></i>\\n {{name != uid ? name +\\' \\' : \\'\\'}}\\n <span class=\"gray\">\\n {{pubkey ? (pubkey|formatPubkey) : \\'\\'}}\\n </span>\\n</a>\\n');\n$templateCache.put('plugins/map/templates/registry/lookup_lg_extend.html','<a class=\"button button-text button-small ink hidden-sm hidden-xs\" title=\"{{\\'MAP.REGISTRY.LOOKUP.BTN_MAP_HELP\\' | translate}}\" ui-sref=\"app.view_registry_map\">\\n <i class=\"icon ion-ios-location\"></i>\\n {{\\'MAP.REGISTRY.LOOKUP.BTN_MAP\\' | translate}}\\n</a>\\n');\n$templateCache.put('plugins/map/templates/registry/popup_marker.html','<div class=\"item no-border no-padding item-avatar\" ng-if=\"loadingMarker\">\\n\\n <i class=\"item-image icon ion-person\"></i>\\n\\n <div class=\"item-content item-avatar-left-padding padding-top\">\\n <h2 class=\"stable-bg\">\\n &nbsp;\\n </h2>\\n <h4 class=\"stable-bg col-75\">\\n &nbsp;\\n </h4>\\n <h4 class=\"stable-bg col-50\">\\n &nbsp;\\n </h4>\\n </div>\\n</div>\\n\\n<a class=\"item no-border no-padding item-avatar ink animate-fade-in animate-show-hide ng-hide\" ng-show=\"!loadingMarker\" ui-sref=\"app.view_page({id: formData.id, title: formData.name})\">\\n <i ng-if=\"formData.avatar\" class=\"item-image avatar\" style=\"background-image: url({{::formData.avatar.src}}\"></i>\\n <i ng-if=\"!formData.avatar\" class=\"item-image icon cion-page-{{::formData.type}}\"></i>\\n <div class=\"item-content item-avatar-left-padding padding-top\">\\n <h2 class=\"dark\">\\n {{::formData.name}}\\n </h2>\\n <h4 ng-if=\"::formData.category\" class=\"gray\" title=\"{{::formData.category.name}}\">\\n <b class=\"ion-flag\"></b> {{::formData.category.name}}\\n </h4>\\n <h4 ng-if=\"::formData.city\" class=\"gray\" title=\"{{::formData.city}}\">\\n <b class=\"ion-location\"></b> {{::formData.city}}\\n </h4>\\n </div>\\n</a>\\n<!-- buttons -->\\n<div class=\"item no-border no-padding\">\\n <div class=\"pull-left gray\">\\n <!-- show description -->\\n <a class=\"animate-fade-in animate-show-hide gray ng-hide\" ng-class=\"{\\'ion-arrow-down-b\\': !showDescription, \\'ion-arrow-up-b\\': showDescription}\" ng-click=\"showDescription=!showDescription;\" title=\"{{\\'PROFILE.DESCRIPTION\\'|translate}}\" ng-show=\"!loadingMarker && formData.description\">\\n &nbsp;\\n </a>\\n </div>\\n</div>\\n<div class=\"item no-border no-padding item-text-wrap hidden-xs ng-hide\" ng-show=\"showDescription\">\\n <small trust-as-html=\"::formData.description|truncText:500\"></small>\\n</div>\\n');\n$templateCache.put('plugins/map/templates/registry/view_map.html','<ion-view left-buttons=\"leftButtons\" class=\"view-map-registry\">\\n <ion-nav-title>\\n <span class=\"hidden-xs\" translate>MAP.REGISTRY.VIEW.TITLE</span>\\n </ion-nav-title>\\n\\n <ion-nav-buttons side=\"secondary\">\\n <button class=\"button button-icon button-clear icon ion-loop visible-xs visible-sm\" ng-click=\"load()\">\\n </button>\\n </ion-nav-buttons>\\n\\n <ion-content data-tap-disabled=\"true\">\\n <a id=\"helptip-map-registry\" style=\"left: 150px; top: 50px; position: relative;\"></a>\\n <leaflet id=\"{{::mapId}}\" height=\"100%\" layers=\"map.layers\" markers=\"map.markers\" lf-center=\"map.center\" bounds=\"map.bounds\">\\n </leaflet>\\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/map/templates/settings/es_settings_extend.html','\\n<!--<span class=\"item item-divider\" translate>MAP.SETTINGS.MAP_DIVIDER</span>\\n\\n<label class=\"item item-toggle dark item-text-wrap\">\\n <span translate>MAP.SETTINGS.ENABLE_GOOGLE_API</span>\\n <h4 class=\"gray\" translate>MAP.SETTINGS.ENABLE_GOOGLE_API_HELP</h4>\\n <div class=\"toggle toggle-royal\">\\n <input type=\"checkbox\" ng-model=\"formData.enableGoogleApi\">\\n <div class=\"track\">\\n <div class=\"handle\"></div>\\n </div>\\n </div>\\n</label>\\n\\n<ion-item class=\"item-input\"\\n ng-if=\"!$root.config.plugins.es.googleApiKey\"\\n ng-class=\"{\\'item-input-error\\': formData.enableGoogleApi && !formData.googleApiKey}\">\\n <div class=\"input-label col-33\">\\n <span class=\"\" ng-class=\"{\\'gray\\': !formData.enableGoogleApi}\"translate>MAP.SETTINGS.GOOGLE_API_KEY</span>\\n <h4>\\n <a ng-click=\"openLink($event, \\'https://console.developers.google.com/apis/credentials/key\\')\" translate>MAP.SETTINGS.BTN_GOOGLE_API</a>\\n <span class=\"gray\"> ({{\\'MAP.SETTINGS.BTN_GOOGLE_API_WARNING\\'|translate}})</span>\\n </h4>\\n </div>\\n <input type=\"text\"\\n placeholder=\"{{\\'MAP.SETTINGS.GOOGLE_API_KEY_PLACEHOLDER\\' | translate}}\"\\n ng-model=\"formData.googleApiKey\"\\n ng-if=\"formData.enableGoogleApi\">\\n</ion-item>\\n<div class=\"form-errors\"\\n ng-show=\"formData.enableGoogleApi && !formData.googleApiKey\">\\n <div class=\"form-error\">\\n <span translate=\"ERROR.FIELD_REQUIRED\"></span>\\n </div>\\n</div>-->\\n');\n$templateCache.put('plugins/map/templates/wot/item_search_tooltip.html','<a href=\"#\" class=\"{{type}}\">\\n <i class=\"{{pending ? \\'ion-clock\\': (type ? \\'cion-page-\\' + type : \\'\\')}}\"></i>\\n {{name != uid ? name +\\' \\' : \\'\\'}}\\n <span class=\"{{uid ? \\'positive\\' : \\'gray\\'}}\">\\n <i class=\"{{uid ? \\'ion-person\\' : \\'ion-key\\'}}\"></i>\\n {{uid ? uid : (pubkey|formatPubkey) }}\\n </span>\\n</a>\\n');\n$templateCache.put('plugins/map/templates/wot/lookup_lg_extend.html','<a ng-if=\"enable\" class=\"button button-text button-small ink hidden-sm hidden-xs\" title=\"{{\\'MAP.WOT.LOOKUP.BTN_MAP_HELP\\' | translate}}\" ui-sref=\"app.view_wot_map\">\\n <i class=\"icon ion-ios-location\"></i>\\n {{\\'MAP.WOT.LOOKUP.BTN_MAP\\' | translate}}\\n</a>\\n');\n$templateCache.put('plugins/map/templates/wot/popup_marker.html','\\n<div class=\"item no-border no-padding item-avatar\" ng-if=\"loadingMarker\">\\n\\n <i class=\"item-image icon ion-person\"></i>\\n\\n <div class=\"item-content item-avatar-left-padding padding-top\">\\n <h2 class=\"stable-bg\">\\n &nbsp;\\n </h2>\\n <h4 class=\"stable-bg col-75\">\\n &nbsp;\\n </h4>\\n <h4 class=\"stable-bg col-50\">\\n &nbsp;\\n </h4>\\n </div>\\n</div>\\n\\n<a class=\"item no-border no-padding item-avatar ink animate-fade-in animate-show-hide ng-hide\" ng-show=\"!loadingMarker\" ui-sref=\"app.wot_identity({pubkey: formData.pubkey, uid: formData.uid})\">\\n\\n <i ng-if=\"formData.avatar\" class=\"item-image avatar\" style=\"background-image: url({{::formData.avatar.src}})\"></i>\\n <i ng-if=\"!formData.avatar && formData.uid\" class=\"item-image icon ion-person\"></i>\\n <i ng-if=\"!formData.avatar && !formData.uid\" class=\"item-image icon ion-card\"></i>\\n\\n <div class=\"item-content item-avatar-left-padding padding-top\">\\n <h2 class=\"dark\">\\n {{formData.name}}\\n </h2>\\n <h4>\\n <span ng-if=\"formData.uid\" class=\"positive\">\\n <b class=\"ion-person\"></b>\\n {{formData.uid}}\\n </span>\\n <span class=\"gray\" title=\"{{formData.pubkey}}\"><b class=\"ion-key\"></b> {{formData.pubkey|formatPubkey}}</span>\\n <span class=\"assertive\" ng-if=\"!formData.isMember\">\\n {{::\\'WOT.NOT_MEMBER_PARENTHESIS\\'|translate}}\\n </span>\\n </h4>\\n <h4 ng-if=\"formData.profile.city\" class=\"gray\" title=\"{{formData.profile.city}}\">\\n <b class=\"ion-location\"></b> {{formData.profile.city}}\\n </h4>\\n </div>\\n</a>\\n<!-- buttons -->\\n<div class=\"item no-border no-padding\">\\n <div class=\"pull-left gray\">\\n <!-- show description -->\\n <a class=\"animate-fade-in animate-show-hide gray ng-hide\" ng-class=\"{\\'ion-arrow-down-b\\': !showDescription, \\'ion-arrow-up-b\\': showDescription}\" ng-click=\"showDescription=!showDescription;\" title=\"{{\\'PROFILE.DESCRIPTION\\'|translate}}\" ng-show=\"!loadingMarker && formData.profile.description\">\\n &nbsp;\\n </a>\\n </div>\\n <div style=\"font-size: 18px;\" class=\"pull-right gray\">\\n <!-- share -->\\n <a class=\"icon ion-android-share-alt\" ng-click=\"showSharePopover($event)\" title=\"{{\\'COMMON.BTN_SHARE\\' | translate}}\">&nbsp;</a>\\n <!-- certify -->\\n <a class=\"icon ion-ribbon-b\" ng-click=\"certify()\" title=\"{{\\'WOT.BTN_CERTIFY\\' | translate}}\" ng-hide=\"!canCertify\">&nbsp;</a>\\n <!-- compose message -->\\n <a class=\"icon ion-compose\" ng-click=\"showNewMessageModal()\" title=\"{{\\'MESSAGE.BTN_WRITE\\' | translate}}\">&nbsp;</a>\\n <!-- transfer -->\\n <a class=\"icon ion-card\" ng-click=\"showTransferModal({pubkey:formData.pubkey, uid: formData.name||formData.uid})\" title=\"{{\\'COMMON.BTN_SEND_MONEY\\' | translate}}\">&nbsp;</a>\\n\\n </div>\\n</div>\\n<div class=\"item no-border no-padding item-text-wrap hidden-xs ng-hide\" ng-show=\"showDescription\">\\n <small trust-as-html=\"formData.profile.description|truncText:500\"></small>\\n</div>\\n');\n$templateCache.put('plugins/map/templates/wot/view_map.html','<ion-view left-buttons=\"leftButtons\" class=\"view-map-wot\">\\n <ion-nav-title>\\n <span class=\"hidden-xs\" translate>MAP.WOT.VIEW.TITLE</span>\\n </ion-nav-title>\\n\\n <ion-nav-buttons side=\"secondary\">\\n <button class=\"button button-icon button-clear icon ion-loop visible-xs visible-sm\" ng-click=\"load()\">\\n </button>\\n </ion-nav-buttons>\\n\\n <ion-content data-tap-disabled=\"true\">\\n <a id=\"helptip-map-wot\" style=\"left: 150px; top: 50px; position: relative;\"></a>\\n <leaflet id=\"{{::mapId}}\" height=\"100%\" layers=\"map.layers\" markers=\"map.markers\" lf-center=\"map.center\" bounds=\"map.bounds\">\\n </leaflet>\\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/rml9/templates/01-button.html','<!-- Button that call a function of the controller -->\\n<button class=\"button button-balanced button-small-padding icon ion-android-archive\" ng-click=\"onButtonClick()\" title=\"{{\\'RML9.BTN_OPEN\\' | translate}}\">\\n</button>\\n\\n<!-- Button: Open a view, using `ui-sref` attribute\\n<button class=\"button button-balanced button-small-padding icon ion-plus-circled\"\\n ui-sref=\"app.rml9({pubkey: formData.pubkey})\"\\n title=\"{{\\'RML9.BTN_OPEN\\' | translate}}\">\\n</button> -->\\n\\n');\n$templateCache.put('plugins/rml9/templates/02-view.html','<ion-view left-buttons=\"leftButtons\">\\n <ion-nav-title>\\n {{\\'RML9.VIEW.TITLE\\' | translate}}\\n </ion-nav-title>\\n\\n <ion-content>\\n <div class=\"list\">\\n\\n <!-- the pubkey -->\\n <div class=\"item\">\\n {{\\'COMMON.PUBKEY\\'|translate}}\\n <div class=\"badge\">{{pubkey|formatPubkey}}</div>\\n </div>\\n\\n <!-- a text divider-->\\n <div class=\"item item-divider\">{{\\'RML9.VIEW.DIVIDER\\'|translate:{pubkey: pubkey} }}</div>\\n\\n <!-- iterate on each TX -->\\n <div class=\"item\" ng-repeat=\"item in items\">\\n <h3>{{item.time|formatDate}}</h3>\\n <h4>{{item.pubkey|formatPubkey}}</h4>\\n <div class=\"badge\">{{item.amount|formatAmount}}</div>\\n </div>\\n </div>\\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/rml9/templates/03-button.html','<!-- Button: Open a view, using `ui-sref` attribute -->\\n<button class=\"button button-balanced button-small-padding icon ion-android-archive\" ui-sref=\"app.rml9({pubkey: formData.pubkey})\" title=\"{{\\'RML9.BTN_SWOW_TX\\' | translate}}\">\\n</button>\\n\\n');\n$templateCache.put('plugins/rml9/templates/03-view_with_button.html','<ion-view left-buttons=\"leftButtons\">\\n <ion-nav-title>\\n {{\\'RML9.VIEW.TITLE\\' | translate}}\\n </ion-nav-title>\\n\\n <ion-content>\\n <div class=\"list\">\\n\\n <!-- buttons bar -->\\n <div class=\"center padding\">\\n <div class=\"buttons\">\\n <button class=\"button button-balanced icon-left icon ion-archive\" ng-click=\"onExportButtonClick()\">{{\\'RML9.BTN_EXPORT\\' | translate}}\\n </button>\\n </div>\\n </div>\\n\\n <!-- the pubkey -->\\n <div class=\"item\">\\n {{\\'COMMON.PUBKEY\\'|translate}}\\n <div class=\"badge\">{{pubkey|formatPubkey}}</div>\\n </div>\\n\\n <!-- the balance -->\\n <div class=\"item\">\\n {{\\'RML9.VIEW.BALANCE\\'|translate}}\\n <div class=\"badge badge-calm\">\\n {{balance|formatAmount}} <span ng-bind-html=\"$root.currency.name|currencySymbol\"></span>\\n </div>\\n </div>\\n\\n <!-- a text divider-->\\n <div class=\"item item-divider\">{{\\'RML9.VIEW.DIVIDER\\'|translate:{pubkey: pubkey} }}</div>\\n\\n <!-- iterate on each TX -->\\n <div class=\"item item-text-wrap\" ng-repeat=\"item in items\">\\n\\n <h3>\\n {{item.time|formatDate}}\\n <span ng-if=\"item.comment\" class=\"gray\"> | {{item.comment}}</span>\\n </h3>\\n\\n <h4 ng-if=\"item.uid\" class=\"positive\"><i class=\"icon ion-person\"></i> {{item.name||item.uid}}</h4>\\n <h4 ng-if=\"!item.uid\" class=\"gray\"><i class=\"icon ion-key\"></i> {{item.pubkey|formatPubkey}}</h4>\\n\\n <div class=\"badge\" ng-class=\"{\\'badge-balanced\\': item.amount > 0}\">\\n {{item.amount|formatAmount}} <span ng-bind-html=\"$root.currency.name|currencySymbol\"></span>\\n </div>\\n </div>\\n </div>\\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/rml9/templates/04-view_chart.html','<ion-view left-buttons=\"leftButtons\">\\n <ion-nav-title>\\n {{\\'RML9.VIEW.TITLE\\' | translate}}\\n </ion-nav-title>\\n\\n <ion-content>\\n <div class=\"list\">\\n\\n <!-- buttons bar -->\\n <div class=\"center padding\">\\n <div class=\"buttons\">\\n <button class=\"button button-balanced icon-left icon ion-archive\" ng-click=\"onExportButtonClick()\">{{\\'RML9.BTN_EXPORT\\' | translate}}\\n </button>\\n </div>\\n </div>\\n\\n <!-- the pubkey -->\\n <div class=\"item\">\\n {{\\'COMMON.PUBKEY\\'|translate}}\\n <div class=\"badge\">{{pubkey|formatPubkey}}</div>\\n </div>\\n\\n <!-- the balance -->\\n <div class=\"item\">\\n {{\\'RML9.VIEW.BALANCE\\'|translate}}\\n <div class=\"badge badge-calm\">\\n {{balance|formatAmount}} <span ng-bind-html=\"$root.currency.name|currencySymbol\"></span>\\n </div>\\n </div>\\n\\n <!-- a text divider-->\\n <div class=\"item item-divider\">{{\\'RML9.VIEW.DIVIDER\\'|translate:{pubkey: pubkey} }}</div>\\n\\n\\n <div class=\"row\">\\n <div class=\"col col-75\">\\n <!-- iterate on each TX -->\\n <div class=\"item item-text-wrap\" ng-repeat=\"item in items\">\\n\\n <h3>\\n {{item.time|formatDate}}\\n <span ng-if=\"item.comment\" class=\"gray\"> | {{item.comment}}</span>\\n </h3>\\n\\n <h4 ng-if=\"item.uid\" class=\"positive\"><i class=\"icon ion-person\"></i> {{item.name||item.uid}}</h4>\\n <h4 ng-if=\"!item.uid\" class=\"gray\"><i class=\"icon ion-key\"></i> {{item.pubkey|formatPubkey}}</h4>\\n\\n <div class=\"badge\" ng-class=\"{\\'badge-balanced\\': item.amount > 0}\">\\n {{item.amount|formatAmount}} <span ng-bind-html=\"$root.currency.name|currencySymbol\"></span>\\n </div>\\n </div>\\n </div>\\n\\n <div class=\"col col-25\">\\n\\n <!-- [NEW] TX input chart -->\\n <p class=\"gray\" translate>RML9.CHART.INPUT_CHART_TITLE</p>\\n <canvas id=\"chart-received-pie\" class=\"chart-pie\" chart-data=\"inputChart.data\" chart-labels=\"inputChart.labels\" chart-colors=\"inputChart.colors\">\\n </canvas>\\n\\n <!-- [NEW] TX input chart -->\\n <p class=\"gray\" translate>RML9.CHART.OUTPUT_CHART_TITLE</p>\\n <canvas id=\"chart-sent-pie\" class=\"chart-pie\" chart-data=\"outputChart.data\" chart-labels=\"outputChart.labels\" chart-colors=\"outputChart.colors\">\\n </canvas>\\n </div>\\n </div>\\n </div>\\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/rml9/templates/06-button.html','<!-- [NEW] Display only if plugin is enable -->\\n\\n <!-- Button: call a method from the state controller -->\\n <button ng-if=\"enable\" class=\"button button-balanced button-small-padding icon ion-android-archive\" ng-click=\"onButtonClick()\" title=\"{{\\'RML9.BTN_SWOW_TX\\' | translate}}\">\\n </button>\\n\\n\\n');\n$templateCache.put('plugins/rml9/templates/06-settings_item.html','\\n<div class=\"item item-toggle dark\">\\n <div class=\"input-label\" translate>RML9.SETTINGS.ENABLE_TOGGLE</div>\\n <label class=\"toggle toggle-royal\">\\n <input type=\"checkbox\" ng-model=\"formData.plugins.rml9.enable\">\\n <div class=\"track\">\\n <div class=\"handle\"></div>\\n </div>\\n </label>\\n</div>\\n');\n$templateCache.put('plugins/rml9/templates/07-button.html','<!-- Button: Open a view, using `ui-sref` attribute -->\\n<button class=\"button button-balanced button-small-padding icon ion-android-archive\" ui-sref=\"app.rml9({pubkey: formData.pubkey})\" title=\"{{\\'RML9.BTN_SWOW_TX\\' | translate}}\">\\n</button>\\n\\n');\n$templateCache.put('plugins/rml9/templates/07-view.html','<leaflet id=\"map-geojson\" center=\"map.center\" geojson=\"map.geojson\"></leaflet>\\n');\n$templateCache.put('plugins/rml9/templates/final-button.html','<!-- Button: Open a view, using `ui-sref` attribute -->\\n<button ng-if class=\"button button-balanced button-small-padding icon ion-android-archive\" ui-sref=\"app.rml9({pubkey: formData.pubkey})\" title=\"{{\\'RML9.BTN_SWOW_TX\\' | translate}}\">\\n</button>\\n\\n');\n$templateCache.put('plugins/rml9/templates/final-view.html','<ion-view left-buttons=\"leftButtons\">\\n <ion-nav-title>\\n {{\\'RML9.VIEW.TITLE\\' | translate}}\\n </ion-nav-title>\\n\\n <ion-content>\\n <div class=\"list\">\\n\\n <!-- buttons bar -->\\n <div class=\"center padding\">\\n <div class=\"buttons\">\\n <button class=\"button button-balanced icon-left icon ion-archive\" ng-click=\"onExportButtonClick()\">{{\\'RML9.BTN_EXPORT\\' | translate}}\\n </button>\\n </div>\\n </div>\\n\\n <!-- the pubkey -->\\n <div class=\"item\">\\n {{\\'COMMON.PUBKEY\\'|translate}}\\n <div class=\"badge\">{{pubkey|formatPubkey}}</div>\\n </div>\\n\\n <!-- the balance -->\\n <div class=\"item\">\\n {{\\'RML9.VIEW.BALANCE\\'|translate}}\\n <div class=\"badge badge-calm\">\\n {{balance|formatAmount}} <span ng-bind-html=\"$root.currency.name|currencySymbol\"></span>\\n </div>\\n </div>\\n\\n <!-- a text divider-->\\n <div class=\"item item-divider\">{{\\'RML9.VIEW.DIVIDER\\'|translate:{pubkey: pubkey} }}</div>\\n\\n <!-- iterate on each TX -->\\n <div class=\"row\">\\n <div class=\"col col-75\">\\n <div class=\"item item-text-wrap\" ng-repeat=\"item in items\">\\n\\n <h3>\\n {{item.time|formatDate}}\\n <span ng-if=\"item.comment\" class=\"gray\"> | {{item.comment}}</span>\\n </h3>\\n\\n <h4 ng-if=\"item.uid\" class=\"positive\"><i class=\"icon ion-person\"></i> {{item.name||item.uid}}</h4>\\n <h4 ng-if=\"!item.uid\" class=\"gray\"><i class=\"icon ion-key\"></i> {{item.pubkey|formatPubkey}}</h4>\\n\\n <div class=\"badge\" ng-class=\"{\\'badge-balanced\\': item.amount > 0}\">\\n {{item.amount|formatAmount}} <span ng-bind-html=\"$root.currency.name|currencySymbol\"></span>\\n </div>\\n </div>\\n\\n </div>\\n\\n <div class=\"col col-25\">\\n\\n <!-- [NEW] TX input chart -->\\n <p class=\"gray\" translate>RML9.CHART.INPUT_CHART_TITLE</p>\\n <canvas id=\"chart-received-pie\" class=\"chart-pie\" chart-data=\"inputChart.data\" chart-labels=\"inputChart.labels\">\\n </canvas>\\n\\n <!-- [NEW] TX input chart -->\\n <p class=\"gray\" translate>RML9.CHART.OUTPUT_CHART_TITLE</p>\\n <canvas id=\"chart-sent-pie\" class=\"chart-pie\" chart-data=\"outputChart.data\" chart-labels=\"outputChart.labels\">\\n </canvas>\\n </div>\\n </div>\\n </div>\\n </ion-content>\\n</ion-view>\\n');}]);","\nangular.module('cesium.es.plugin', [\n // Services\n 'cesium.es.services',\n // Controllers\n 'cesium.es.app.controllers',\n 'cesium.es.common.controllers',\n 'cesium.es.settings.controllers',\n 'cesium.es.currency.controllers',\n 'cesium.es.wot.controllers',\n 'cesium.es.wallet.controllers',\n 'cesium.es.profile.controllers',\n 'cesium.es.message.controllers',\n 'cesium.es.notification.controllers',\n 'cesium.es.blockchain.controllers',\n 'cesium.es.network.controllers',\n 'cesium.es.registry.controllers',\n 'cesium.es.group.controllers',\n 'cesium.es.invitation.controllers',\n 'cesium.es.subscription.controllers',\n 'cesium.es.document.controllers',\n 'cesium.es.like.controllers'\n ])\n;\n","\nangular.module('cesium.es.services', [\n // Services\n 'cesium.es.http.services',\n 'cesium.es.comment.services',\n 'cesium.es.social.services',\n 'cesium.es.settings.services',\n 'cesium.es.crypto.services',\n 'cesium.es.profile.services',\n 'cesium.es.notification.services',\n 'cesium.es.message.services',\n 'cesium.es.modal.services',\n 'cesium.es.blockchain.services',\n 'cesium.es.registry.services',\n 'cesium.es.group.services',\n 'cesium.es.wallet.services',\n 'cesium.es.invitation.services',\n 'cesium.es.subscription.services',\n 'cesium.es.wot.services',\n 'cesium.es.tx.services',\n 'cesium.es.geo.services',\n 'cesium.es.document.services',\n 'cesium.es.network.services',\n 'cesium.es.like.services'\n ])\n;\n","angular.module('cesium.es.comment.services', ['ngResource', 'cesium.services',\n 'cesium.es.http.services', 'cesium.es.profile.services'])\n\n .factory('esComment', ['$rootScope', '$q', 'esHttp', 'csWallet', 'csWot', function($rootScope, $q, esHttp, csWallet, csWot) {\n 'ngInject';\n\n function EsComment(index) {\n\n var\n DEFAULT_SIZE = 20,\n fields = {\n commons: [\"issuer\", \"creationTime\", \"time\", \"message\", \"reply_to\"]\n },\n exports = {\n index: index,\n fields: {\n commons: fields.commons\n },\n raw: {\n search: esHttp.post('/'+index+'/comment/_search'),\n remove: esHttp.record.remove(index, 'comment'),\n wsChanges: esHttp.ws('/ws/_changes'),\n add: new esHttp.record.post('/'+index+'/comment', {creationTime: true}),\n update: new esHttp.record.post('/'+index+'/comment/:id/_update', {creationTime: true})\n }\n };\n\n exports.raw.refreshTreeLinks = function(data) {\n return exports.raw.addTreeLinks(data, true);\n };\n\n exports.raw.addTreeLinks = function(data, refresh) {\n data = data || {};\n data.result = data.result || [];\n data.mapById = data.mapById || {};\n\n var incompleteCommentIdByParentIds = {};\n _.forEach(_.values(data.mapById), function(comment) {\n if (comment.reply_to && !comment.parent) {\n var parent = data.mapById[comment.reply_to];\n if (!parent) {\n parent = new Comment(comment.reply_to);\n incompleteCommentIdByParentIds[parent.id] = comment.id;\n data.mapById[parent.id] = parent;\n }\n if (!refresh || !parent.containsReply(comment)) {\n parent.addReply(comment);\n }\n }\n });\n\n if (!_.size(incompleteCommentIdByParentIds)) {\n var deferred = $q.defer();\n deferred.resolve(data);\n return deferred.promise;\n }\n\n var request = {\n query : {\n terms: {\n _id: _.keys(incompleteCommentIdByParentIds)\n }\n },\n sort : [\n // Need desc, because of size+offset (will be sort in 'asc' order later)\n { \"creationTime\" : {\"order\" : \"desc\"}},\n { \"time\" : {\"order\" : \"desc\"}} // for backward compatibility\n ],\n from: 0,\n size: 1000,\n _source: fields.commons\n };\n\n console.debug(\"[ES] [comment] Getting missing comments in tree\");\n return exports.raw.search(request)\n .then(function(res){\n if (!res.hits.total) {\n console.error(\"[ES] [comment] Comments has invalid [reply_to]: \" + _.values(incompleteCommentIdByParentIds).join(','));\n return data;\n }\n\n _.forEach(res.hits.hits, function(hit) {\n var comment = data.mapById[hit._id];\n comment.copyFromJson(hit._source);\n // Parse URL and hashtags\n comment.html = esHttp.util.parseAsHtml(comment.message);\n delete incompleteCommentIdByParentIds[comment.id];\n });\n\n if (_.size(incompleteCommentIdByParentIds)) {\n console.error(\"Comments has invalid [reply_to]: \" + _.values(incompleteCommentIdByParentIds).join(','));\n }\n\n return exports.raw.addTreeLinks(data); // recursive call\n });\n };\n\n exports.raw.loadDataByRecordId = function(recordId, options) {\n options = options || {};\n options.from = options.from || 0;\n options.size = options.size || DEFAULT_SIZE;\n options.loadAvatar = angular.isDefined(options.loadAvatar) ? options.loadAvatar : true;\n options.loadAvatarAllParent = angular.isDefined(options.loadAvatarAllParent) ? (options.loadAvatar && options.loadAvatarAllParent) : false;\n if (options.size < 0) options.size = 1000; // all comments\n\n var request = {\n query : {\n term: { record : recordId}\n },\n sort : [\n // Need desc, because of size+offset (will be sort in 'asc' order later)\n { \"creationTime\" : {\"order\" : \"desc\"}},\n { \"time\" : {\"order\" : \"desc\"}} // for backward compatibility\n ],\n from: options.from,\n size: options.size,\n _source: fields.commons\n };\n\n var data = {\n total: 0,\n mapById: {},\n result: [],\n pendings: {}\n };\n\n // Search comments\n return exports.raw.search(request)\n .then(function(res){\n if (!res.hits.total) return data;\n data.total = res.hits.total;\n data.result = res.hits.hits.reduce(function (result, hit) {\n var comment = new Comment(hit._id, hit._source);\n // Parse URL and hashtags\n comment.html = esHttp.util.parseAsHtml(comment.message);\n // fill map by id\n data.mapById[comment.id] = comment;\n return result.concat(comment);\n }, data.result);\n\n // Add tree (parent/child) link\n return exports.raw.addTreeLinks(data);\n })\n\n // Fill avatars (and uid)\n .then(function() {\n if (!options.loadAvatar) return;\n if (options.loadAvatarAllParent) {\n return csWot.extendAll(_.values(data.mapById), 'issuer');\n }\n return csWot.extendAll(data.result, 'issuer');\n })\n\n // Sort (creationTime asc)\n .then(function() {\n data.result = data.result.sort(function(cm1, cm2) {\n return (cm1.creationTime - cm2.creationTime);\n });\n return data;\n });\n };\n\n // Add listener to send deletion\n exports.raw.createOnDeleteListener = function(data) {\n return function(comment) {\n var index = _.findIndex(data.result, {id: comment.id});\n if (index === -1) return;\n data.result.splice(index, 1);\n delete data.mapById[comment.id];\n\n var wallet = !csWallet.isUserPubkey(comment.issuer) ? csWallet.children.getByPubkey(comment.issuer) : csWallet;\n\n // Send deletion request\n if (wallet) {\n return exports.raw.remove(comment.id)\n .catch(function(err){\n console.error(err);\n throw new Error('COMMENTS.ERROR.FAILED_REMOVE_COMMENT');\n });\n }\n else {\n return $q.reject(\"No wallet found corresponding to the comment issuer\");\n }\n };\n };\n\n exports.raw.startListenChanges = function(recordId, data, scope) {\n data = data || {};\n data.result = data.result || [];\n data.mapById = data.mapById || {};\n data.pendings = data.pendings || {};\n\n scope = scope||$rootScope;\n\n // Add listener to send deletion\n var onRemoveListener = exports.raw.createOnDeleteListener(data);\n _.forEach(data.result, function(comment) {\n comment.addOnRemoveListener(onRemoveListener);\n });\n\n // Open websocket\n var now = Date.now();\n console.info(\"[ES] [comment] Starting websocket to listen comments on [{0}/record/{1}]\".format(index, recordId.substr(0,8)));\n var wsChanges = esHttp.websocket.changes(index + '/comment');\n return wsChanges.open()\n\n // Listen changes\n .then(function(){\n console.debug(\"[ES] [comment] Websocket opened in {0} ms\".format(Date.now() - now));\n wsChanges.on(function(change) {\n if (!change) return;\n scope.$applyAsync(function() {\n var comment = data.mapById[change._id];\n if (change._operation === 'DELETE') {\n if (comment) comment.remove();\n }\n else if (change._source && change._source.record === recordId) {\n // update\n if (comment) {\n comment.copyFromJson(change._source);\n // Parse URL and hashtags\n comment.html = esHttp.util.parseAsHtml(comment.message);\n exports.raw.refreshTreeLinks(data);\n }\n // create (if not in pending comment)\n else if ((!data.pendings || !data.pendings[change._source.creationTime]) && change._source.issuer != csWallet.data.pubkey) {\n comment = new Comment(change._id, change._source);\n comment.addOnRemoveListener(onRemoveListener);\n comment.isnew = true;\n // Parse URL and hashtags\n comment.html = esHttp.util.parseAsHtml(comment.message);\n // fill map by id\n data.mapById[change._id] = comment;\n exports.raw.refreshTreeLinks(data)\n // fill avatars (and uid)\n .then(function() {\n return csWot.extend(comment, 'issuer');\n })\n .then(function() {\n data.result.push(comment);\n });\n }\n else {\n console.debug(\"Skip comment received by WS (already in pending)\");\n }\n }\n });\n });\n });\n };\n\n /**\n * Save a comment (add or update)\n * @param recordId\n * @param data\n * @param comment\n * @returns {*}\n */\n exports.raw.save = function(recordId, data, comment) {\n data = data || {};\n data.result = data.result || [];\n data.mapById = data.mapById || {};\n data.pendings = data.pendings || {};\n\n // Preparing JSON to sent\n var id = comment.id;\n var json = {\n creationTime: id ? comment.creationTime || comment.time/*for compat*/ : moment().utc().unix(),\n message: comment.message,\n record: recordId,\n issuer: csWallet.data.pubkey\n };\n if (comment.reply_to || comment.parent) {\n json.reply_to = comment.reply_to || comment.parent.id;\n }\n else {\n json.reply_to = null; // force to null because ES ignore missing field, when updating\n }\n\n // Create or update the entity\n var entity;\n if (!id) {\n entity = new Comment(null, json);\n entity.addOnRemoveListener(exports.raw.createOnDeleteListener(data));\n // copy additional wallet data\n entity.uid = csWallet.data.uid;\n entity.name = csWallet.data.name;\n entity.avatar = csWallet.data.avatar;\n\n entity.isnew = true;\n if (comment.parent) {\n comment.parent.addReply(entity);\n }\n data.result.push(entity);\n }\n else {\n entity = data.mapById[id];\n entity.copy(comment);\n }\n\n // Parse URL and hashtags\n entity.html = esHttp.util.parseAsHtml(entity.message);\n\n // Send add request\n if (!id) {\n data.pendings = data.pendings || {};\n data.pendings[json.creationTime] = json;\n\n return exports.raw.add(json)\n .then(function (id) {\n entity.id = id;\n data.mapById[id] = entity;\n delete data.pendings[json.creationTime];\n return entity;\n });\n }\n // Send update request\n else {\n return exports.raw.update(json, {id: id})\n .then(function () {\n return entity;\n });\n }\n };\n\n exports.raw.stopListenChanges = function(data) {\n console.debug(\"[ES] [comment] Stopping websocket on comments\");\n _.forEach(data.result, function(comment) {\n comment.cleanAllListeners();\n });\n // Close previous\n exports.raw.wsChanges().close();\n };\n\n // Expose functions\n exports.load = exports.raw.loadDataByRecordId;\n exports.save = exports.raw.save;\n exports.changes = {\n start: exports.raw.startListenChanges,\n stop: exports.raw.stopListenChanges\n };\n return exports;\n }\n\n return {\n instance: EsComment\n };\n }])\n;\n","angular.module('cesium.es.http.services', ['ngResource', 'ngApi', 'cesium.services', 'cesium.config'])\n\n/**\n * Elastic Search Http\n */\n.factory('esHttp', ['$q', '$timeout', '$rootScope', '$state', '$sce', '$translate', '$window', '$filter', 'CryptoUtils', 'UIUtils', 'csHttp', 'csConfig', 'csSettings', 'csCache', 'BMA', 'csWallet', 'csPlatform', 'Api', function($q, $timeout, $rootScope, $state, $sce, $translate, $window, $filter,\n CryptoUtils, UIUtils, csHttp, csConfig, csSettings, csCache, BMA, csWallet, csPlatform, Api) {\n 'ngInject';\n\n // Allow to force SSL connection with port different from 443\n var forceUseSsl = (csConfig.httpsMode === 'true' || csConfig.httpsMode === true || csConfig.httpsMode === 'force') ||\n ($window.location && $window.location.protocol === 'https:') ? true : false;\n if (forceUseSsl) {\n console.debug('[ES] [https] Enable SSL (forced by config or detected in URL)');\n }\n\n function EsHttp(host, port, useSsl, enableCache) {\n\n var\n that = this,\n cachePrefix = 'esHttp-',\n constants = {\n ES_USER_API: 'ES_USER_API',\n ES_SUBSCRIPTION_API: 'ES_SUBSCRIPTION_API',\n ES_USER_API_ENDPOINT: 'ES_USER_API( ([a-z_][a-z0-9-_.]*))?( ([0-9.]+))?( ([0-9a-f:]+))?( ([0-9]+))',\n ANY_API_ENDPOINT: '([A-Z_]+)(?:[ ]+([a-z_][a-z0-9-_.ğĞ]*))?(?:[ ]+([0-9.]+))?(?:[ ]+([0-9a-f:]+))?(?:[ ]+([0-9]+))(?:\\\\/[^\\\\/]+)?',\n MAX_UPLOAD_BODY_SIZE: csConfig.plugins && csConfig.plugins.es && csConfig.plugins.es.maxUploadBodySize || 2097152 /*=2M*/\n },\n regexp = {\n IMAGE_SRC: exact('data:([A-Za-z//]+);base64,(.+)'),\n URL: match('(www\\\\.|https?:\\/\\/(www\\\\.)?)[-a-zA-Z0-9@:%._\\\\+~#=]{2,256}\\\\.[a-z]{2,6}\\\\b([-a-zA-Z0-9@:%_\\\\+.~#?&//=]*)'),\n HASH_TAG: match('(?:^|[\\t\\n\\r\\s ])#([0-9_-\\\\wḡĞǦğàáâãäåçèéêëìíîïðòóôõöùúûüýÿ]+)'),\n USER_TAG: match('(?:^|[\\t\\n\\r\\s ])@('+BMA.constants.regexp.USER_ID+')'),\n ES_USER_API_ENDPOINT: exact(constants.ES_USER_API_ENDPOINT),\n API_ENDPOINT: exact(constants.ANY_API_ENDPOINT),\n },\n fallbackNodeIndex = 0,\n listeners,\n defaultSettingsNode,\n truncUrlFilter = $filter('truncUrl');\n\n that.data = {\n isFallback: false\n };\n that.useCache = angular.isDefined(enableCache) ? enableCache : false; // need here because used in get() function\n that.raw = {\n getByPath: {},\n postByPath: {},\n wsByPath: {}\n };\n that.api = new Api(this, \"esHttp\");\n that.started = false;\n that.init = init;\n\n init(host, port, useSsl);\n\n function init(host, port, useSsl) {\n // Use settings as default\n if (!host && csSettings.data) {\n host = host || (csSettings.data.plugins && csSettings.data.plugins.es ? csSettings.data.plugins.es.host : null);\n port = port || (host ? csSettings.data.plugins.es.port : null);\n useSsl = angular.isDefined(useSsl) ? useSsl : (port == 443 || csSettings.data.plugins.es.useSsl || forceUseSsl);\n }\n\n that.alive = false;\n that.host = host;\n that.port = port || ((useSsl || forceUseSsl) ? 443 : 80);\n that.useSsl = angular.isDefined(useSsl) ? useSsl : (that.port == 443 || forceUseSsl);\n\n that.server = csHttp.getServer(host, port);\n }\n\n function isSameNodeAsSettings(data) {\n data = data || csSettings.data;\n if (!data.plugins || !data.plugins.es) return false;\n\n var host = data.plugins.es.host;\n var useSsl = data.plugins.es.port == 443 || data.plugins.es.useSsl || forceUseSsl;\n var port = data.plugins.es.port || (useSsl ? 443 : 80);\n\n return isSameNode(host, port, useSsl);\n }\n\n function isSameNode(host, port, useSsl) {\n return (that.host === host) &&\n (that.port === port) &&\n (angular.isUndefined(useSsl) || useSsl == that.useSsl);\n }\n\n // Say if the ES node is a fallback node or the configured node\n function isFallbackNode() {\n return that.data.isFallback;\n }\n\n // Set fallback flag (e.g. called by ES settings, when resetting settings)\n function setIsFallbackNode(isFallback) {\n that.data.isFallback = isFallback;\n }\n\n function exact(regexpContent) {\n return new RegExp('^' + regexpContent + '$');\n }\n function match(regexpContent) {\n return new RegExp(regexpContent);\n }\n\n function onSettingsReset(data, deferred) {\n deferred = deferred || $q.defer();\n\n if (that.data.isFallback) {\n // Force a restart\n if (that.started) {\n that.stop();\n }\n }\n\n // Reset to default values\n that.data.isFallback = false;\n defaultSettingsNode = null;\n\n deferred.resolve(data);\n return deferred.promise;\n }\n\n that.closeWs = function() {\n\n if (!that.raw) return;\n\n console.warn('[ES] [http] Closing all websockets...');\n _.keys(that.raw.wsByPath||{}).forEach(function(key) {\n var sock = that.raw.wsByPath[key];\n sock.close();\n });\n that.raw.wsByPath = {};\n };\n\n that.cleanCache = function() {\n console.debug(\"[ES] [http] Cleaning cache {prefix: '{0}'}...\".format(cachePrefix));\n csCache.clear(cachePrefix);\n\n that.raw.getByPath = {};\n that.raw.postByPath = {};\n that.raw.wsByPath = {};\n };\n\n that.copy = function(otherNode) {\n if (that.started) that.stop();\n that.init(otherNode.host, otherNode.port, otherNode.useSsl || otherNode.port == 443);\n that.data.isTemporary = false; // reset temporary flag\n return that.start(true /*skipInit*/);\n };\n\n // Get node time (UTC) FIXME: get it from the node\n that.date = { now : csHttp.date.now };\n\n that.byteCount = function (s) {\n s = (typeof s == 'string') ? s : JSON.stringify(s);\n return encodeURI(s).split(/%(?:u[0-9A-F]{2})?[0-9A-F]{2}|./).length - 1;\n };\n\n that.getUrl = function(path) {\n return csHttp.getUrl(that.host, that.port, path, that.useSsl);\n };\n\n that.get = function (path, cacheTime) {\n\n cacheTime = that.useCache && cacheTime;\n var requestKey = path + (cacheTime ? ('#'+cacheTime) : '');\n\n var getRequestFn = function(params) {\n if (!that.started) {\n if (!that._startPromise) {\n console.warn('[ES] [http] Trying to get [{0}] before start(). Waiting...'.format(path));\n }\n return that.ready().then(function(start) {\n if (!start) return $q.reject('ERROR.ES_CONNECTION_ERROR');\n return getRequestFn(params); // loop\n });\n }\n\n var request = that.raw.getByPath[requestKey];\n if (!request) {\n if (cacheTime) {\n request = csHttp.getWithCache(that.host, that.port, path, that.useSsl, cacheTime, null, null, cachePrefix);\n }\n else {\n request = csHttp.get(that.host, that.port, path, that.useSsl);\n }\n that.raw.getByPath[requestKey] = request;\n }\n return request(params);\n };\n\n return getRequestFn;\n };\n\n that.post = function(path) {\n var postRequest = function(obj, params) {\n if (!that.started) {\n if (!that._startPromise) {\n console.error('[ES] [http] Trying to post [{0}] before start()...'.format(path));\n }\n return that.ready().then(function(start) {\n if (!start) return $q.reject('ERROR.ES_CONNECTION_ERROR');\n return postRequest(obj, params); // loop\n });\n }\n\n var request = that.raw.postByPath[path];\n if (!request) {\n request = csHttp.post(that.host, that.port, path, that.useSsl);\n that.raw.postByPath[path] = request;\n }\n return request(obj, params);\n };\n return postRequest;\n };\n\n that.ws = function(path) {\n return function() {\n var sock = that.raw.wsByPath[path];\n if (!sock || sock.isClosed()) {\n sock = csHttp.ws(that.host, that.port, path, that.useSsl);\n\n // When close, remove from cache\n sock.onclose = function() {\n delete that.raw.wsByPath[path];\n };\n\n that.raw.wsByPath[path] = sock;\n }\n return sock;\n };\n };\n\n that.wsChanges = function(source) {\n var wsChanges = that.ws('/ws/_changes')();\n if (!source) return wsChanges;\n\n // If a source is given, send it just after connection open\n var _inheritedOpen = wsChanges.open;\n wsChanges.open = function() {\n return _inheritedOpen.call(wsChanges).then(function(sock) {\n if(sock) {\n sock.send(source);\n }\n else {\n console.warn('Trying to access ws changes, but no sock anymore... already open ?');\n }\n });\n };\n return wsChanges;\n };\n\n that.isAlive = function() {\n return csHttp.get(that.host, that.port, '/node/summary', that.useSsl)()\n .then(function(json) {\n var software = json && json.duniter && json.duniter.software || 'unknown';\n if (software === \"cesium-plus-pod\" || software === \"duniter4j-elasticsearch\") return true;\n console.error(\"[ES] [http] Not a Cesium+ Pod, but a {0} node. Please check '/node/summary'\".format(software));\n return false;\n })\n .catch(function() {\n return false;\n });\n };\n\n // Alert user if node not reached - fix issue #\n that.checkNodeAlive = function(alive) {\n if (alive) {\n setIsFallbackNode(!isSameNodeAsSettings());\n return true;\n }\n if (angular.isUndefined(alive)) {\n return that.isAlive().then(that.checkNodeAlive);\n }\n\n var settings = csSettings.data.plugins && csSettings.data.plugins.es || {};\n\n // Remember the default node\n defaultSettingsNode = defaultSettingsNode || {\n host: settings.host,\n port: settings.port\n };\n\n var fallbackNode = settings.fallbackNodes && fallbackNodeIndex < settings.fallbackNodes.length && settings.fallbackNodes[fallbackNodeIndex++];\n if (!fallbackNode) {\n $translate('ERROR.ES_CONNECTION_ERROR', {server: that.server})\n .then(UIUtils.alert.info);\n return false; // stop the loop\n }\n var newServer = csHttp.getServer(fallbackNode.host, fallbackNode.port);\n UIUtils.loading.hide();\n return $translate('CONFIRM.ES_USE_FALLBACK_NODE', {old: that.server, new: newServer})\n .then(UIUtils.alert.confirm)\n .then(function (confirm) {\n if (!confirm) return false; // stop the loop\n\n that.cleanCache();\n\n that.init(fallbackNode.host, fallbackNode.port, fallbackNode.useSsl || fallbackNode.port == 443);\n\n // check is alive then loop\n return that.isAlive().then(that.checkNodeAlive);\n });\n };\n\n that.isStarted = function() {\n return that.started;\n };\n\n that.ready = function() {\n if (that.started) return $q.when(true);\n return that._startPromise || that.start();\n };\n\n that.start = function(skipInit) {\n if (that._startPromise) return that._startPromise;\n if (that.started) return $q.when(that.alive);\n\n that._startPromise = csPlatform.ready()\n .then(function() {\n\n if (!skipInit) {\n // Init with defaults settings\n that.init();\n }\n })\n .then(function() {\n console.debug('[ES] [http] Starting on [{0}]{1}...'.format(\n that.server,\n (that.useSsl ? ' (SSL on)' : '')\n ));\n var now = Date.now();\n\n return that.checkNodeAlive()\n .then(function(alive) {\n that.alive = alive;\n if (!alive) {\n console.error('[ES] [http] Could not start [{0}]: node unreachable'.format(that.server));\n that.started = true;\n delete that._startPromise;\n fallbackNodeIndex = 0; // reset the fallback node counter\n return false;\n }\n\n // Add listeners\n addListeners();\n\n console.debug('[ES] [http] Started in '+(Date.now()-now)+'ms');\n that.api.node.raise.start();\n\n that.started = true;\n delete that._startPromise;\n fallbackNodeIndex = 0; // reset the fallback node counter\n\n\n return true;\n });\n });\n return that._startPromise;\n };\n\n that.stop = function() {\n if (!that.started && !that._startPromise) return $q.when(); // Skip multiple call\n\n console.debug('[ES] [http] Stopping...');\n\n removeListeners();\n\n setIsFallbackNode(false); // will be re-computed during start phase\n delete that._startPromise;\n if (that.alive) {\n that.closeWs();\n that.cleanCache();\n that.alive = false;\n that.started = false;\n that.api.node.raise.stop();\n }\n else {\n that.started = false;\n }\n return $q.when();\n };\n\n that.restart = function() {\n that.stop();\n return $timeout(that.start, 200);\n };\n\n function parseTagsFromText(value, prefix) {\n prefix = prefix || '#';\n var reg = prefix === '@' ? regexp.USER_TAG : regexp.HASH_TAG;\n var matches = value && reg.exec(value);\n var tags = matches && [];\n while(matches) {\n var tag = matches[1];\n if (!_.contains(tags, tag)) {\n tags.push(tag);\n }\n value = value.substr(matches.index + matches[1].length + 1);\n matches = value.length > 0 && reg.exec(value);\n }\n return tags;\n }\n\n function parseUrlsFromText(value) {\n var matches = value && regexp.URL.exec(value);\n var urls = matches && [];\n while(matches) {\n var url = matches[0];\n if (!_.contains(urls, url)) {\n urls.push(url);\n }\n value = value.substr(matches.index + matches[0].length + 1);\n matches = value && regexp.URL.exec(value);\n }\n return urls;\n }\n\n function parseMarkdownTitlesFromText(value, prefix, suffix) {\n prefix = prefix || '##';\n var reg = match('(?:^|[\\\\r\\\\s])('+prefix+'([^#></]+)' + (suffix||'') + ')');\n var matches = value && reg.exec(value);\n var lines = matches && [];\n var res = matches && [];\n while(matches) {\n var line = matches[1];\n if (!_.contains(lines, line)) {\n lines.push(line);\n res.push({\n line: line,\n title: matches[2]\n });\n }\n value = value.substr(matches.index + matches[1].length + 1);\n matches = value.length > 0 && reg.exec(value);\n }\n return res;\n }\n\n\n function escape(text) {\n if (!text) return text;\n return text.replace(/</g, '&lt;').replace(/>/g, '&gt;');\n }\n\n function parseAsHtml(text, options) {\n\n var content = text ? escape(text.trim()) : undefined;\n if (content) {\n options = options || {};\n options.tagState = options.tagState || 'app.wot_lookup.tab_search';\n options.uidState = options.uidState || 'app.wot_identity_uid';\n if (options.newLine || !angular.isDefined(options.newLine)) {\n content = content.replace(/\\n/g, '<br>\\n');\n }\n\n // Replace URL in description\n var urls = parseUrlsFromText(content);\n _.forEach(urls, function(url){\n // Make sure protocol is defined\n var href = (url.startsWith('http://') || url.startsWith('https://')) ? url : ('http://' + url);\n // Redirect URL to the function 'openLink', to open a new window if need (e.g. desktop app)\n var link = '<a on-tap=\\\"openLink($event, \\'{0}\\')\\\" href=\\\"{1}\\\" target=\"_blank\">{2}</a>'.format(href, href, truncUrlFilter(url));\n content = content.replace(url, link);\n });\n\n // Replace hashtags\n var hashTags = parseTagsFromText(content);\n _.forEach(hashTags, function(tag){\n var link = '<a ui-sref=\\\"{0}({hash: \\'{1}\\'})\\\">#{2}</a>'.format(options.tagState, tag, tag);\n content = content.replace('#'+tag, link);\n });\n\n // Replace user tags\n var userTags = parseTagsFromText(content, '@');\n _.forEach(userTags, function(tag){\n var link = '<a ui-sref=\\\"{0}({uid: \\'{1}\\'})\\\">@{2}</a>'.format(options.uidState, tag, tag);\n content = content.replace('@'+tag, link);\n });\n\n // Replace markdown titles\n var titles = parseMarkdownTitlesFromText(content, '#+[ ]*', '<br>');\n _.forEach(titles, function(matches){\n var size = matches.line.lastIndexOf('#', 5)+1;\n content = content.replace(matches.line, '<h{0}>{1}</h{2}>'.format(size, matches.title, size));\n });\n }\n return content;\n }\n\n function fillRecordTags(record, fieldNames) {\n fieldNames = fieldNames || ['title', 'description'];\n\n record.tags = fieldNames.reduce(function(res, fieldName) {\n var value = record[fieldName];\n var tags = value && parseTagsFromText(value);\n return tags ? res.concat(tags) : res;\n }, []);\n }\n\n function findObjectInTree(obj, attrName) {\n if (!obj) return;\n if (obj[attrName]) return obj[attrName];\n if (Array.isArray(obj)) {\n return obj.reduce(function(res, item) {\n return res ? res : findObjectInTree(item, attrName);\n }, false);\n }\n else if (typeof obj == \"object\") {\n return _.reduce(_.keys(obj), function (res, key) {\n return res ? res : findObjectInTree(obj[key], attrName);\n }, false);\n }\n }\n\n function postRecord(path, options) {\n options = options || {};\n var postRequest = that.post(path);\n return function(record, params) {\n params = params || {};\n var wallet = params.wallet || (params.walletId && csWallet.children.get(params.walletId)) ||\n ((!params.pubkey || csWallet.isUserPubkey(params.pubkey)) && csWallet) ||\n (params.pubkey && csWallet.children.getByPubkey(params.pubkey));\n\n var keypair = params.keypair || wallet && wallet.data && wallet.data.keypair;\n\n if (!keypair && !wallet) {\n throw new Error('Missing wallet or keypair, to sign record');\n }\n\n // Create the POSt request params,\n // but BEFORE, remove protected options\n delete params.wallet;\n delete params.walletId;\n delete params.keypair;\n var postParams = angular.copy(params);\n postParams.pubkey = postParams.pubkey || wallet.data.pubkey;\n\n return (wallet.isAuth() ? $q.when(wallet.data) : wallet.auth({silent: true, minData: true}))\n .then(function() {\n if (params.creationTime && !record.creationTime) {\n record.creationTime = moment().utc().unix();\n }\n // Always update the time - fix #572\n // Make sure time is always > previous (required by ES node)\n var now = moment().utc().unix();\n record.time = (!record.time || record.time < now) ? now : (record.time+1);\n\n var obj = angular.copy(record);\n delete obj.signature;\n delete obj.hash;\n obj.issuer = postParams.pubkey; // force keypair pubkey\n if (!obj.version) {\n obj.version = 2;\n }\n\n // Fill tags\n if (options.tagFields) {\n fillRecordTags(obj, options.tagFields);\n }\n\n // Remove unused fields\n if (options.ignoreFields) {\n _.forEach(options.ignoreFields, function(key) {\n if (angular.isDefined(obj[key])) {\n delete obj[key];\n }\n });\n }\n\n var str = JSON.stringify(obj);\n\n return CryptoUtils.util.hash(str)\n .then(function(hash) {\n return CryptoUtils.sign(hash, keypair)\n .then(function(signature) {\n // Prepend hash+signature\n str = '{\"hash\":\"{0}\",\"signature\":\"{1}\",'.format(hash, signature) + str.substring(1);\n // Send data\n return postRequest(str, postParams)\n .then(function (id){\n\n // Clear cache\n csCache.clear(cachePrefix);\n\n return id;\n })\n .catch(function(err) {\n var bodyLength = that.byteCount(obj);\n if (bodyLength > constants.MAX_UPLOAD_BODY_SIZE) {\n throw {message: 'ERROR.ES_MAX_UPLOAD_BODY_SIZE', length: bodyLength};\n }\n throw err;\n });\n });\n });\n });\n };\n }\n\n function countRecords(index, type, cacheTime) {\n var getRequest = that.get(\"/{0}/{1}/_search?size=0\".format(index, type), cacheTime);\n return function(params) {\n return getRequest(params)\n .then(function(res) {\n return res && res.hits && res.hits.total;\n });\n };\n }\n\n function removeRecord(index, type) {\n return function(id, options) {\n options = options || {};\n var wallet = options.wallet || options.walletId && csWallet.children.get(options.walletId) || csWallet;\n return (wallet.isAuth() ? $q.when(wallet.data) : wallet.auth({silent: true, minData: true}))\n .then(function(walletData) {\n\n var obj = {\n version: 2,\n index: index,\n type: type,\n id: id,\n issuer: walletData.pubkey,\n time: moment().utc().unix()\n };\n var str = JSON.stringify(obj);\n return CryptoUtils.util.hash(str)\n .then(function (hash) {\n return CryptoUtils.sign(hash, walletData.keypair)\n .then(function (signature) {\n // Prepend hash+signature\n str = '{\"hash\":\"{0}\",\"signature\":\"{1}\",'.format(hash, signature) + str.substring(1);\n // Send data\n return that.post('/history/delete')(str)\n .then(function (id) {\n return id;\n });\n });\n });\n });\n };\n }\n\n that.image = {};\n\n function imageFromAttachment(attachment) {\n if (!attachment || !attachment._content_type || !attachment._content || attachment._content.length === 0) {\n return null;\n }\n var image = {\n src: \"data:\" + attachment._content_type + \";base64,\" + attachment._content\n };\n if (attachment._title) {\n image.title = attachment._title;\n }\n if (attachment._name) {\n image.name = attachment._name;\n }\n return image;\n }\n\n function imageToAttachment(image) {\n if (!image || !image.src) return null;\n var match = regexp.IMAGE_SRC.exec(image.src);\n if (!match) return null;\n var attachment = {\n _content_type: match[1],\n _content: match[2]\n };\n if (image.title) {\n attachment._title = image.title;\n }\n if (image.name) {\n attachment._name = image.name;\n }\n return attachment;\n }\n\n /**\n * This will create a image (src, title, name) using the _content is present, or computing a image URL to the ES node\n * @param host\n * @param port\n * @param hit\n * @param imageField\n * @returns {{}}\n */\n that.image.fromHit = function(hit, imageField) {\n if (!hit || !hit._source) return;\n var attachment = hit._source[imageField];\n if (!attachment || !attachment._content_type || !attachment._content_type.startsWith(\"image/\")) return;\n var image = {};\n // If full content: then use it directly\n if (attachment._content) {\n image.src = \"data:\" + attachment._content_type + \";base64,\" + attachment._content;\n }\n // Compute an url\n else {\n var extension = attachment._content_type.substr(6);\n var path = [hit._index, hit._type, hit._id, '_image', imageField].join('/');\n path = '/' + path + '.' + extension;\n image.src = that.getUrl(path);\n }\n if (attachment._title) {\n image.title = attachment._title;\n }\n if (attachment._name) {\n image.name = attachment._name;\n }\n return image;\n };\n\n function parseEndPoint(endpoint) {\n var matches = regexp.API_ENDPOINT.exec(endpoint);\n if (!matches) return;\n return {\n \"api\": matches[1] || '',\n \"dns\": matches[2] || '',\n \"ipv4\": matches[3] || '',\n \"ipv6\": matches[4] || '',\n \"port\": matches[5] || 80,\n \"path\": matches[6] || '',\n \"useSsl\": matches[5] == 443\n };\n }\n\n function emptyHit() {\n return {\n _id: null,\n _index: null,\n _type: null,\n _version: null,\n _source: {}\n };\n }\n\n // Get latest release, of Cesium+ pod\n function getLatestVersion() {\n var getRequest = that.raw.getLatestRelease;\n if (!getRequest) {\n var url = csHttp.uri.parse(csSettings.data.plugins.es.latestReleaseUrl);\n var useSsl = (url.port == 443 || url.protocol === 'https:' || forceUseSsl);\n getRequest = csHttp.getWithCache(url.host, url.port, \"/\" + url.pathname, useSsl, csCache.constants.LONG);\n that.raw.getLatestRelease = getRequest;\n }\n\n return getRequest()\n .then(function (json) {\n if (!json) return;\n if (json.name && json.html_url) {\n return {\n version: json.name,\n url: json.html_url\n };\n }\n if (json.tag_name && json.html_url) {\n return {\n version: json.tag_name.substring(1),\n url: json.html_url\n };\n }\n })\n .catch(function(err) {\n // silent (just log it)\n console.error('[BMA] Failed to get Duniter latest version', err);\n });\n }\n\n function addListeners() {\n // Watch some service events\n listeners = [\n csSettings.api.data.on.reset($rootScope, onSettingsReset, that)\n ];\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n // Define events\n that.api.registerEvent('node', 'start');\n that.api.registerEvent('node', 'stop');\n\n\n var exports = {\n getServer: csHttp.getServer,\n node: {\n summary: that.get('/node/summary'),\n moderators: that.get('/node/moderators'),\n parseEndPoint: parseEndPoint,\n same: isSameNode,\n sameAsSettings: isSameNodeAsSettings,\n isFallback: isFallbackNode\n },\n version: {\n latest: getLatestVersion\n },\n websocket: {\n changes: that.wsChanges,\n block: that.ws('/ws/block'),\n peer: that.ws('/ws/peer')\n },\n wot: {\n member: {\n uids : that.get('/wot/members')\n }\n },\n network: {\n peering: {\n self: that.get('/network/peering')\n },\n peers: that.get('/network/peers')\n },\n blockchain: {\n current: that.get('/blockchain/current?_source=number,hash,medianTime')\n },\n record: {\n post: postRecord,\n remove: removeRecord,\n count : countRecords\n },\n image: {\n fromAttachment: imageFromAttachment,\n toAttachment: imageToAttachment\n },\n hit: {\n empty: emptyHit\n },\n util: {\n parseTags: parseTagsFromText,\n parseAsHtml: parseAsHtml,\n findObjectInTree: findObjectInTree\n },\n constants: constants\n };\n exports.constants.regexp = regexp;\n angular.merge(that, exports);\n }\n\n\n var service = new EsHttp(undefined, undefined, undefined, true);\n\n service.instance = function(host, port, useSsl, enableCache) {\n return new EsHttp(host, port, useSsl, enableCache);\n };\n\n service.lightInstance = function(host, port, useSsl, timeout) {\n port = port || 80;\n useSsl = angular.isDefined(useSsl) ? useSsl : (+port === 443);\n\n function countHits(path, params) {\n return csHttp.get(host, port, path)(params)\n .then(function(res) {\n return res && res.hits && res.hits.total;\n });\n }\n\n function countRecords(index, type) {\n return countHits(\"/{0}/{1}/_search?size=0\".format(index, type));\n }\n\n function countSubscriptions(params) {\n var queryString = _.keys(params||{}).reduce(function(res, key) {\n return (res && (res + \" AND \") || \"\") + key + \":\" + params[key];\n }, '');\n return countHits(\"/subscription/record/_search?size=0&q=\" + queryString);\n }\n\n return {\n host: host,\n port: port,\n useSsl: useSsl,\n node: {\n summary: csHttp.getWithCache(host, port, '/node/summary', useSsl, csHttp.cache.LONG, false, timeout)\n },\n network: {\n peering: {\n self: csHttp.get(host, port, '/network/peering', useSsl, timeout)\n },\n peers: csHttp.get(host, port, '/network/peers', useSsl, timeout)\n },\n blockchain: {\n current: csHttp.get(host, port, '/blockchain/current?_source=number,hash,medianTime', useSsl, timeout)\n },\n record: {\n count: countRecords\n },\n subscription: {\n count: countSubscriptions\n }\n };\n };\n\n return service;\n}])\n;\n","angular.module('cesium.es.settings.services', ['cesium.services', 'cesium.es.http.services'])\n.config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Will force to load this service\n PluginServiceProvider.registerEagerLoadingService('esSettings');\n }\n\n }])\n\n.factory('esSettings', ['$rootScope', '$q', '$timeout', 'Api', 'esHttp', 'csConfig', 'csSettings', 'CryptoUtils', 'Device', 'UIUtils', 'csWallet', function($rootScope, $q, $timeout, Api, esHttp,\n csConfig, csSettings, CryptoUtils, Device, UIUtils, csWallet) {\n 'ngInject';\n\n var\n SETTINGS_SAVE_SPEC = {\n includes: ['locale', 'showUDHistory', 'useRelative', 'useLocalStorage', 'useLocalStorageEncryption', 'expertMode', 'logoutIdle', 'blockValidityWindow'],\n excludes: ['timeout', 'cacheTimeMs', 'version', 'build', 'minVersion', 'fallbackLanguage'],\n plugins: {\n es: {\n excludes: ['enable', 'host', 'port', 'useSsl', 'fallbackNodes', 'enableGoogleApi', 'googleApiKey', 'document', 'maxUploadBodySize', 'defaultCountry'],\n notifications: {\n }\n }\n },\n wallet: {\n includes: ['alertIfUnusedWallet'],\n excludes: ['notificationReadTime'] // deprecated - should be removed later\n },\n helptip: {\n excludes: ['installDocUrl']\n },\n notifications: {\n excludes: ['time', 'warnCount', 'unreadCount']\n }\n },\n defaultSettings = angular.merge({\n plugins: {\n es: {\n askEnable: false,\n useRemoteStorage: true,\n latestReleaseUrl: \"https://api.github.com/repos/duniter/cesium-plus-pod/releases/latest\",\n notifications: {\n txSent: true,\n txReceived: true,\n certSent: true,\n certReceived: true,\n emitHtml5: false\n },\n invitations: {\n readTime: true\n },\n defaultCountry: undefined,\n enableGoogleApi: false,\n googleApiKey: undefined,\n wot: {\n enableMixedSearch: true\n },\n document: {\n index: 'user,page,group',\n type: 'profile,record,comment'\n },\n registry: {\n defaultSearch: {\n location: null,\n geoPoint: null\n }\n },\n geoDistance: '20km'\n }\n }\n }, {plugins: {es: csConfig.plugins && csConfig.plugins.es || {}}}),\n that = this,\n api = new Api('esSettings'),\n previousRemoteData,\n listeners,\n ignoreSettingsChanged = false,\n failEnable = false\n ;\n\n that.api = api;\n that.get = esHttp.get('/user/settings/:id');\n that.add = esHttp.record.post('/user/settings');\n that.update = esHttp.record.post('/user/settings/:id/_update');\n\n that.isEnable = function() {\n return csSettings.data.plugins &&\n csSettings.data.plugins.es &&\n csSettings.data.plugins.es.enable &&\n !!csSettings.data.plugins.es.host;\n };\n\n that.notifications = {};\n that.notifications.isEmitHtml5Enable = function() {\n return that.isEnable() &&\n csSettings.data.plugins.es.notifications &&\n angular.isDefined(csSettings.data.plugins.es.notifications.emitHtml5) ? csSettings.data.plugins.es.notifications.emitHtml5 : false;\n };\n\n that.wot = {};\n that.wot.isMixedSearchEnable = function() {\n return that.isEnable() &&\n (angular.isDefined(csSettings.data.plugins.es.wot && csSettings.data.plugins.es.wot.enableMixedSearch) ?\n csSettings.data.plugins.es.wot.enableMixedSearch : true);\n };\n\n function copyUsingSpec(data, copySpec) {\n var result = {};\n\n // Add implicit includes\n if (copySpec.includes) {\n _.forEach(_.keys(copySpec), function(key) {\n if (key != \"includes\" && key != \"excludes\") {\n copySpec.includes.push(key);\n }\n });\n }\n\n _.forEach(_.keys(data), function(key) {\n if ((!copySpec.includes || _.contains(copySpec.includes, key)) &&\n (!copySpec.excludes || !_.contains(copySpec.excludes, key))) {\n if (data[key] && (typeof data[key] == 'object') &&\n copySpec[key] && (typeof copySpec[key] == 'object')) {\n result[key] = copyUsingSpec(data[key], copySpec[key]);\n }\n else {\n result[key] = data[key];\n }\n }\n });\n return result;\n }\n\n // Load settings\n function loadSettings(pubkey, boxKeypair) {\n var now = Date.now();\n return that.get({id: pubkey})\n .catch(function(err){\n if (err && err.ucode && err.ucode == 404) {\n return null; // not found\n }\n else {\n throw err;\n }\n })\n .then(function(res) {\n if (!res || !res._source) {\n return;\n }\n var record = res._source;\n // Do not apply if same version\n if (record.time === csSettings.data.time) {\n console.debug('[ES] [settings] Loaded in '+ (Date.now()-now) +'ms, but already up to date');\n return;\n }\n var nonce = CryptoUtils.util.decode_base58(record.nonce);\n // Decrypt settings content\n return CryptoUtils.box.open(record.content, nonce, boxKeypair.boxPk, boxKeypair.boxSk)\n .then(function(json) {\n var settings = JSON.parse(json || '{}');\n settings.time = record.time;\n console.debug('[ES] [settings] Loaded and decrypted in '+ (Date.now()-now) +'ms');\n return settings;\n })\n // if error: skip stored content\n .catch(function(err){\n console.error('[ES] [settings] Could not load remote settings: ' + (err && err.message || 'decryption error'));\n // make sure to remove time, to be able to save it again\n delete csSettings.data.time;\n return null;\n });\n });\n }\n\n function onSettingsReset(data, deferred) {\n deferred = deferred || $q.defer();\n angular.merge(data, defaultSettings);\n\n failEnable = false;\n deferred.resolve(data);\n return deferred.promise;\n }\n\n function onWalletAuth(data, deferred) {\n deferred = deferred || $q.defer();\n if (!data || !data.pubkey || !data.keypair || !data.keypair.signSk || !data.keypair.boxSk) {\n deferred.resolve();\n return deferred.promise;\n }\n\n console.debug('[ES] [settings] Loading user settings...');\n\n // Load settings\n loadSettings(data.pubkey, data.keypair)\n .then(function(settings) {\n if (!settings) return; // not found or up to date\n angular.merge(csSettings.data, settings);\n\n // Remember for comparison\n previousRemoteData = settings;\n\n console.debug('[ES] [settings] Applied');\n return storeSettingsLocally();\n })\n .then(function() {\n deferred.resolve(data);\n })\n .catch(function(err){\n deferred.reject(err);\n });\n\n return deferred.promise;\n }\n\n // Listen for settings changed\n function onSettingsChanged(data) {\n // avoid recursive call, because storeSettingsLocally() could emit event again\n if (ignoreSettingsChanged) return;\n\n var wasEnable = listeners && listeners.length > 0;\n\n // Force to stop & restart, if ES node has changed\n if (esHttp.isStarted() && !esHttp.node.isFallback() && !esHttp.node.sameAsSettings(data)) {\n stop();\n }\n\n refreshState();\n\n var isEnable = that.isEnable();\n if (isEnable && csWallet.isAuth()) {\n if (!wasEnable) {\n onWalletAuth(csWallet.data);\n }\n else {\n storeSettingsRemotely(data);\n }\n }\n }\n\n function storeSettingsLocally() {\n if (ignoreSettingsChanged) return $q.when();\n ignoreSettingsChanged = true;\n return csSettings.store()\n .then(function(){\n ignoreSettingsChanged = false;\n })\n .catch(function(err) {\n ignoreSettingsChanged = false;\n throw err;\n });\n }\n\n function storeSettingsRemotely(data) {\n var filteredData = copyUsingSpec(data, SETTINGS_SAVE_SPEC);\n if (previousRemoteData && angular.equals(filteredData, previousRemoteData)) {\n return $q.when();\n }\n\n // Skip remote saving, if remote storage disable\n if (!csSettings.data.plugins.es.useRemoteStorage) {\n return storeSettingsLocally();\n }\n\n var time = moment().utc().unix(); // always update time\n console.debug('[ES] [settings] Saving user settings remotely...');\n\n return $q.all([\n csWallet.getKeypair(), // same result as esWallet.box.getKeypair(), because box keypair computed on auth\n CryptoUtils.util.random_nonce()\n ])\n .then(function(res) {\n var boxKeypair = res[0];\n var nonce = res[1];\n\n // Make sure user has not disconnect\n // This can occur, when auth + disabling ES plugin in settings\n if (!boxKeypair.boxPk || !boxKeypair.boxSk) return;\n\n var record = {\n issuer: csWallet.data.pubkey,\n nonce: CryptoUtils.util.encode_base58(nonce),\n time: time\n };\n\n //console.debug(\"Will store settings remotely: \", filteredData);\n var json = JSON.stringify(filteredData);\n\n return CryptoUtils.box.pack(json, nonce, boxKeypair.boxPk, boxKeypair.boxSk)\n .then(function(cypherText) {\n record.content = cypherText;\n // create or update\n return angular.isUndefined(data.time) ?\n that.add(record) :\n that.update(record, {id: record.issuer})\n .catch(function(err) {\n // Workaround if update failed: try to add() instead\n // Can occur when changing the cesium+ pod\n if (err && err.ucode == 404) return that.add(record);\n throw err;\n });\n })\n .then(function() {\n return true;\n });\n })\n .then(function(saved) {\n if (!saved) return;\n // Update settings version, then store (on local store only)\n data.time = time;\n previousRemoteData = filteredData;\n console.debug('[ES] [settings] Saved user settings remotely in ' + (moment().utc().unix() - time) + 'ms');\n return storeSettingsLocally();\n })\n .catch(function(err) {\n console.error(err);\n throw err;\n })\n ;\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function addListeners() {\n // Extend csWallet.login()\n listeners = [\n csSettings.api.data.on.reset($rootScope, onSettingsReset, this),\n csWallet.api.data.on.auth($rootScope, onWalletAuth, this)\n ];\n }\n\n function stop() {\n removeListeners();\n esHttp.stop();\n }\n\n function refreshState() {\n var enable = that.isEnable();\n\n // Disable\n if (!enable && listeners && listeners.length > 0) {\n console.debug(\"[ES] [settings] Disable\");\n removeListeners();\n\n // Force ES node to stop\n return esHttp.stop()\n .then(function() {\n // Emit event\n api.state.raise.changed(enable);\n });\n }\n\n // Enable\n else if (enable && (!listeners || listeners.length === 0 || !esHttp.isStarted()) ) {\n return esHttp.start()\n .then(function(alive) {\n if (!alive) {\n csSettings.data.plugins.es.enable = false;\n // Will ask user to enable ES plugins (WARN: if config.js allow it)\n csSettings.data.plugins.es.askEnable = true;\n failEnable = true;\n\n api.state.raise.changed(false);\n console.error('[ES] [settings] Disable, has ES node could not be started');\n return;\n }\n console.debug(\"[ES] [settings] Enable\");\n addListeners();\n\n if (csWallet.isAuth()) {\n return onWalletAuth(csWallet.data)\n .then(function() {\n // Emit event\n api.state.raise.changed(enable);\n });\n }\n else {\n // Emit event\n api.state.raise.changed(enable);\n }\n });\n }\n }\n\n api.registerEvent('state', 'changed');\n\n csSettings.ready().then(function() {\n\n csSettings.api.data.on.changed($rootScope, onSettingsChanged, this);\n esHttp.api.node.on.stop($rootScope, function() {\n previousRemoteData = null;\n }, this);\n return refreshState();\n })\n\n .then(function() {\n // Ask (once) user to enable ES plugin\n if (!failEnable && // If NOT trying to start just before\n csConfig.plugins && csConfig.plugins.es && csConfig.plugins.es.askEnable && // AND if config ask enable\n !that.isEnable() && // AND user settings has disable plugin\n csSettings.data.plugins.es.askEnable // AND user has not yet answer 'NO'\n ) {\n\n return UIUtils.alert.confirm('ES_SETTINGS.CONFIRM.ASK_ENABLE', 'ES_SETTINGS.CONFIRM.ASK_ENABLE_TITLE',\n {\n cancelText: 'COMMON.BTN_NO',\n okText: 'COMMON.BTN_YES'\n })\n .then(function (confirm) {\n if (confirm) {\n csSettings.data.plugins.es.enable = true;\n }\n csSettings.data.plugins.es.askEnable = false;\n return csSettings.store();\n });\n }\n });\n\n return that;\n}]);\n","angular.module('cesium.es.registry.services', ['ngResource', 'cesium.services', 'cesium.es.http.services', 'cesium.es.like.services'])\n.config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Will force to load this service\n PluginServiceProvider.registerEagerLoadingService('esRegistry');\n }\n\n}])\n\n.factory('esRegistry', ['$rootScope', '$q', 'csPlatform', 'csSettings', 'csWallet', 'csWot', 'esHttp', 'esComment', 'esLike', 'esGeo', function($rootScope, $q, csPlatform, csSettings, csWallet, csWot, esHttp, esComment, esLike, esGeo) {\n 'ngInject';\n\n var\n fields = {\n commons: [\"title\", \"description\", \"issuer\", \"time\", \"address\", \"city\", \"creationTime\", \"avatar._content_type\",\n \"picturesCount\", \"type\", \"category\", \"socials\", \"pubkey\",\n \"geoPoint\"\n ]\n },\n that = this,\n listeners;\n\n that.raw = {\n count: esHttp.get('/page/record/_search?size=0&q=issuer::pubkey'),\n searchText: esHttp.get('/page/record/_search?q=:search'),\n search: esHttp.post('/page/record/_search'),\n get: esHttp.get('/page/record/:id'),\n getCommons: esHttp.get('/page/record/:id?_source=' + fields.commons.join(',')),\n category: {\n get: esHttp.get('/page/category/:id'),\n all: esHttp.get('/page/category/_search?sort=order&from=0&size=1000&_source=name,parent')\n }\n };\n\n function onWalletReset(data) {\n data.pages = null;\n }\n\n function onWalletLoad(data, deferred) {\n deferred = deferred || $q.defer();\n if (!data || !data.pubkey || !data.keypair) {\n deferred.resolve();\n return deferred.promise;\n }\n\n console.debug('[ES] [registry] Loading pages count...');\n\n // Load subscriptions count\n that.raw.count({pubkey: data.pubkey})\n .then(function(res) {\n data.pages = data.pages || {};\n data.pages.count = res && res.hits && res.hits.total;\n console.debug('[ES] [registry] Loaded pages count (' + data.pages.count + ')');\n deferred.resolve(data);\n })\n .catch(function(err) {\n console.error('[ES] [registry] Error while counting page: ' + (err.message ? err.message : err));\n deferred.resolve(data);\n });\n\n return deferred.promise;\n }\n\n function getCategories() {\n if (that.raw.categories && that.raw.categories.length) {\n var deferred = $q.defer();\n deferred.resolve(that.raw.categories);\n return deferred.promise;\n }\n return that.raw.category.all()\n .then(function(res) {\n if (res.hits.total === 0) {\n that.raw.categories = [];\n }\n else {\n var categories = res.hits.hits.reduce(function(result, hit) {\n var cat = hit._source;\n cat.id = hit._id;\n return result.concat(cat);\n }, []);\n // add as map also\n _.forEach(categories, function(cat) {\n categories[cat.id] = cat;\n });\n that.raw.categories = categories;\n }\n return that.raw.categories;\n });\n }\n\n function getCategory(params) {\n return that.raw.category.get(params)\n .then(function(hit) {\n var res = hit._source;\n res.id = hit._id;\n return res;\n });\n }\n\n function readRecordFromHit(hit, categories) {\n if (!hit) return;\n var record = hit._source;\n if (record.category && record.category.id) {\n record.category = categories[record.category.id];\n }\n if (hit.highlight) {\n if (hit.highlight.title) {\n record.title = hit.highlight.title[0];\n }\n if (hit.highlight.description) {\n record.description = hit.highlight.description[0];\n }\n if (hit.highlight.location) {\n record.location = hit.highlight.location[0];\n }\n if (hit.highlight.tags) {\n record.tags = hit.highlight.tags.reduce(function(res, tag){\n return res.concat(tag.replace('<em>', '').replace('</em>', ''));\n },[]);\n }\n }\n\n // avatar\n record.avatar = esHttp.image.fromHit(hit, 'avatar');\n\n // pictures\n if (hit._source.pictures && hit._source.pictures.reduce) {\n record.pictures = hit._source.pictures.reduce(function(res, pic) {\n return res.concat(esHttp.image.fromAttachment(pic.file));\n }, []);\n }\n\n return record;\n }\n\n\n function search(request) {\n request = request || {};\n request.from = request.from || 0;\n request.size = request.size || 20;\n request._source = request._source || fields.commons;\n request.highlight = request.highlight || {\n fields : {\n title : {},\n description : {}\n }\n };\n\n return $q.all([\n // load categories\n getCategories(),\n // Do search\n that.raw.search(request)\n ])\n .then(function(res) {\n var categories = res[0];\n res = res[1];\n\n if (!res || !res.hits || !res.hits.total) {\n return {\n total: 0,\n hits: []\n };\n }\n\n // Get geo_distance filter\n var geoDistanceObj = esHttp.util.findObjectInTree(request.query, 'geo_distance');\n var geoPoint = geoDistanceObj && geoDistanceObj.geoPoint;\n var geoDistanceUnit = geoDistanceObj && geoDistanceObj.distance && geoDistanceObj.distance.replace(new RegExp(\"[0-9 ]+\", \"gm\"), '');\n\n var hits = res.hits.hits.reduce(function(result, hit) {\n var record = readRecordFromHit(hit, categories);\n record.id = hit._id;\n\n // Add distance to point\n if (geoPoint && record.geoPoint && geoDistanceUnit) {\n record.distance = esGeo.point.distance(\n geoPoint.lat, geoPoint.lon,\n record.geoPoint.lat, record.geoPoint.lon,\n geoDistanceUnit\n );\n }\n return result.concat(record);\n }, []);\n\n return {\n total: res.hits.total,\n hits: hits\n };\n });\n }\n\n function loadData(id, options) {\n options = options || {};\n options.raw = angular.isDefined(options.raw) ? options.raw : false;\n options.fecthPictures = angular.isDefined(options.fetchPictures) ? options.fetchPictures : options.raw;\n\n return $q.all([\n\n // load categories\n getCategories(),\n\n // Do get source\n options.fecthPictures ?\n that.raw.get({id: id}) :\n that.raw.getCommons({id: id})\n ])\n .then(function(res) {\n var categories = res[0];\n var hit = res[1];\n var record = readRecordFromHit(hit, categories);\n\n // parse description as Html\n if (!options.raw) {\n record.description = esHttp.util.parseAsHtml(record.description, {\n tagState: 'app.wot_lookup.tab_registry'\n });\n }\n\n // Load issuer (avatar, name, uid, etc.)\n return csWot.extend({pubkey: record.issuer})\n .then(function(issuer) {\n return {\n id: hit._id,\n issuer: issuer,\n record: record\n };\n });\n });\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function addListeners() {\n // Extend\n listeners = [\n csWallet.api.data.on.load($rootScope, onWalletLoad, this),\n csWallet.api.data.on.init($rootScope, onWalletReset, this),\n csWallet.api.data.on.reset($rootScope, onWalletReset, this)\n ];\n }\n\n function refreshState() {\n var enable = esHttp.alive;\n if (!enable && listeners && listeners.length > 0) {\n console.debug(\"[ES] [subscription] Disable\");\n removeListeners();\n if (csWallet.isLogin()) {\n return onWalletReset(csWallet.data);\n }\n }\n else if (enable && (!listeners || listeners.length === 0)) {\n console.debug(\"[ES] [subscription] Enable\");\n addListeners();\n if (csWallet.isLogin()) {\n return onWalletLoad(csWallet.data);\n }\n }\n }\n\n // Default actions\n csPlatform.ready().then(function() {\n esHttp.api.node.on.start($rootScope, refreshState, this);\n esHttp.api.node.on.stop($rootScope, refreshState, this);\n return refreshState();\n });\n\n that.category = {\n all: getCategories,\n get: getCategory\n };\n that.record = {\n search: search,\n load: loadData,\n add: esHttp.record.post('/page/record', {tagFields: ['title', 'description'], creationTime: true}),\n update: esHttp.record.post('/page/record/:id/_update', {tagFields: ['title', 'description']}),\n remove: esHttp.record.remove('page', 'record'),\n fields: {\n commons: fields.commons\n },\n picture: {\n all: esHttp.get('/page/record/:id?_source=pictures')\n },\n like: esLike.instance('page', 'record'),\n comment: esComment.instance('page')\n };\n that.currency = {\n all: esHttp.get('/currency/record/_search?_source=currencyName,peers.host,peers.port'),\n get: esHttp.get('/currency/record/:id/_source')\n };\n return that;\n}])\n;\n","angular.module('cesium.es.social.services', ['cesium.es.crypto.services'])\n\n .factory('SocialUtils', ['$filter', '$q', 'CryptoUtils', 'BMA', 'csWallet', 'esCrypto', '$timeout', function($filter, $q, CryptoUtils, BMA, csWallet, esCrypto, $timeout) {\n 'ngInject';\n\n function SocialUtils() {\n\n var\n regexp = {\n URI: \"([a-zAZ0-9]+)://[ a-zA-Z0-9-_:/;*?!^\\\\+=@&~#|<>%.]+\",\n EMAIL: \"[a-z0-9!#$%&\\'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&\\'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$\",\n PHONE: \"[+]?[0-9. ]{9,15}\",\n socials: {\n facebook: \"https?://((fb.me)|((www.)?facebook.com))\",\n twitter: \"https?://(www.)?twitter.com\",\n googleplus: \"https?://plus.google.com(/u)?\",\n youtube: \"https?://(www.)?youtube.com\",\n github: \"https?://(www.)?github.com\",\n tumblr: \"https?://(www.)?tumblr.com\",\n snapchat: \"https?://(www.)?snapchat.com\",\n linkedin: \"https?://(www.)?linkedin.com\",\n vimeo: \"https?://(www.)?vimeo.com\",\n instagram: \"https?://(www.)?instagram.com\",\n wordpress: \"https?://([a-z]+)?wordpress.com\",\n diaspora: \"https?://(www.)?((diaspora[-a-z]+)|(framasphere)).org\",\n duniter: \"duniter://[a-zA-Z0-9-_:/;*?!^\\\\+=@&~#|<>%.]+\",\n bitcoin: \"bitcoin://[a-zA-Z0-9-_:/;*?!^\\\\+=@&~#|<>%.]+\",\n curve25519: \"curve25519://(\" + BMA.constants.regexp.PUBKEY + \"):([a-zA-Z0-9]+)@([a-zA-Z0-9-_:/;*?!^\\\\+=@&~#|<>%.]+)\"\n }\n }\n ;\n\n function exact(regexpContent) {\n return new RegExp(\"^\" + regexpContent + \"$\");\n }\n\n regexp.URI = exact(regexp.URI);\n regexp.EMAIL = exact(regexp.EMAIL);\n regexp.PHONE = exact(regexp.PHONE);\n _.keys(regexp.socials).forEach(function(key){\n regexp.socials[key] = exact(regexp.socials[key]);\n });\n\n function getTypeFromUrl(url){\n var type;\n if (regexp.URI.test(url)) {\n var protocol = regexp.URI.exec(url)[1];\n var urlToMatch = url;\n if (protocol == 'http' || protocol == 'https') {\n var slashPathIndex = url.indexOf('/', protocol.length + 3);\n if (slashPathIndex > 0) {\n urlToMatch = url.substring(0, slashPathIndex);\n }\n }\n //console.debug(\"match URI, try to match: \" + urlToMatch);\n _.keys(regexp.socials).forEach(function(key){\n if (regexp.socials[key].test(urlToMatch)) {\n type = key;\n return false; // stop\n }\n });\n if (!type) {\n type = 'web';\n }\n }\n else if (regexp.EMAIL.test(url)) {\n type = 'email';\n }\n else if (regexp.PHONE.test(url)) {\n type = 'phone';\n }\n if (!type) {\n console.warn(\"[ES] [social] Unable to detect type of social URL: \" + url);\n }\n return type;\n }\n\n function getFromUrl(url) {\n url = url ? url.trim() : url;\n if (url && url.length > 0) {\n if (url.startsWith('www.')) {\n url = 'http://' + url;\n }\n return {\n type: getTypeFromUrl(url),\n url: url\n };\n }\n return;\n }\n\n function reduceArray(socials) {\n if (!socials || !socials.length) return [];\n var map = {};\n socials.forEach(function(social) {\n if (social.type == 'curve25519') {\n delete social.issuer;\n if (social.valid) {\n angular.merge(social, getFromUrl(social.url));\n }\n }\n else {\n // Retrieve object from URL, to get the right type (e.g. if new regexp)\n social = getFromUrl(social.url);\n }\n if (social) {\n var id = $filter('formatSlug')(social.url);\n map[id] = social;\n }\n });\n return _.values(map);\n }\n\n function createSocialForEncryption(recipient, dataToEncrypt) {\n return {\n recipient: recipient,\n type: 'curve25519',\n url: dataToEncrypt\n };\n }\n\n function openArray(socials, issuer, recipient) {\n\n recipient = recipient || csWallet.data.pubkey;\n\n // Waiting to load crypto libs\n if (!CryptoUtils.isLoaded()) {\n console.debug('[socials] Waiting crypto lib loading...');\n return $timeout(function() {\n return openArray(socials, issuer, recipient);\n }, 100);\n }\n\n var socialsToDecrypt = _.filter(socials||[], function(social){\n var matches = social.url && social.type == 'curve25519' && regexp.socials.curve25519.exec(social.url);\n if (!matches) return false;\n social.recipient = matches[1];\n social.nonce = matches[2];\n social.url = matches[3];\n social.issuer = issuer;\n social.valid = (social.recipient === recipient);\n return social.valid;\n });\n if (!socialsToDecrypt.length) return $q.when(reduceArray(socials));\n\n return esCrypto.box.open(socialsToDecrypt, undefined/*=wallet keypair*/, 'issuer', 'url')\n .then(function() {\n // return all socials (encrypted or not)\n return reduceArray(socials);\n });\n }\n\n function packArray(socials) {\n // Waiting to load crypto libs\n if (!CryptoUtils.isLoaded()) {\n console.debug('[socials] Waiting crypto lib loading...');\n return $timeout(function() {\n return packArray(socials);\n }, 100);\n }\n\n var socialsToEncrypt = _.filter(socials||[], function(social){\n return social.type == 'curve25519' && social.url && social.recipient;\n });\n if (!socialsToEncrypt.length) return $q.when(socials);\n\n return CryptoUtils.util.random_nonce()\n .then(function(nonce) {\n return $q.all(socialsToEncrypt.reduce(function(res, social) {\n return res.concat(esCrypto.box.pack(social, undefined/*=wallet keypair*/, 'recipient', 'url', nonce));\n }, []));\n })\n .then(function(res){\n return res.reduce(function(res, social) {\n return res.concat({\n type: 'curve25519',\n url: 'curve25519://{0}:{1}@{2}'.format(social.recipient, social.nonce, social.url)\n });\n }, []);\n });\n }\n\n return {\n get: getFromUrl,\n reduce: reduceArray,\n // Encryption\n createForEncryption: createSocialForEncryption,\n open: openArray,\n pack: packArray\n };\n }\n\n var service = SocialUtils();\n service.instance = SocialUtils;\n\n return service;\n }])\n;\n","angular.module('cesium.es.crypto.services', ['ngResource', 'cesium.services'])\n\n.factory('esCrypto', ['$q', '$rootScope', 'CryptoUtils', function($q, $rootScope, CryptoUtils) {\n 'ngInject';\n\n\n function getBoxKeypair(keypair) {\n if (!keypair) {\n throw new Error('Missing keypair');\n }\n if (keypair.boxPk && keypair.boxSk) {\n return $q.when(keypair);\n }\n\n return $q.all([\n CryptoUtils.box.keypair.skFromSignSk(keypair.signSk),\n CryptoUtils.box.keypair.pkFromSignPk(keypair.signPk)\n ])\n .then(function(res) {\n return {\n boxSk: res[0],\n boxPk: res[1]\n };\n });\n }\n\n function packRecordFields(record, keypair, recipientFieldName, cypherFieldNames, nonce) {\n\n recipientFieldName = recipientFieldName || 'recipient';\n if (!record[recipientFieldName]) {\n return $q.reject({message:'ES_WALLET.ERROR.RECIPIENT_IS_MANDATORY'});\n }\n\n cypherFieldNames = cypherFieldNames || 'content';\n if (typeof cypherFieldNames == 'string') {\n cypherFieldNames = [cypherFieldNames];\n }\n\n // Work on a copy, to keep the original record (as it could be use again - fix #382)\n record = angular.copy(record);\n\n // Get recipient\n var recipientPk = CryptoUtils.util.decode_base58(record[recipientFieldName]);\n\n return $q.all([\n getBoxKeypair(keypair),\n CryptoUtils.box.keypair.pkFromSignPk(recipientPk),\n nonce ? $q.when(nonce) : CryptoUtils.util.random_nonce()\n ])\n .then(function(res) {\n //var senderSk = res[0];\n var boxKeypair = res[0];\n var senderSk = boxKeypair.boxSk;\n var boxRecipientPk = res[1];\n var nonce = res[2];\n\n return $q.all(\n cypherFieldNames.reduce(function(res, fieldName) {\n if (!record[fieldName]) return res; // skip undefined fields\n return res.concat(\n CryptoUtils.box.pack(record[fieldName], nonce, boxRecipientPk, senderSk)\n );\n }, []))\n\n .then(function(cypherTexts){\n // Replace field values with cypher texts\n var i = 0;\n _.forEach(cypherFieldNames, function(cypherFieldName) {\n if (!record[cypherFieldName]) {\n // Force undefined fields to be present in object\n // This is better for ES storage, that always works on lazy update mode\n record[cypherFieldName] = null;\n }\n else {\n record[cypherFieldName] = cypherTexts[i++];\n }\n });\n\n // Set nonce\n record.nonce = CryptoUtils.util.encode_base58(nonce);\n\n return record;\n });\n });\n }\n\n function openRecordFields(records, keypair, issuerFieldName, cypherFieldNames) {\n\n issuerFieldName = issuerFieldName || 'issuer';\n cypherFieldNames = cypherFieldNames || 'content';\n if (typeof cypherFieldNames == 'string') {\n cypherFieldNames = [cypherFieldNames];\n }\n\n var now = Date.now();\n var issuerBoxPks = {}; // a map used as cache\n\n var jobs = [getBoxKeypair(keypair)];\n return $q.all(records.reduce(function(jobs, message) {\n var issuer = message[issuerFieldName];\n if (!issuer) {throw 'Record has no ' + issuerFieldName;}\n if (issuerBoxPks[issuer]) return res;\n return jobs.concat(\n CryptoUtils.box.keypair.pkFromSignPk(CryptoUtils.util.decode_base58(issuer))\n .then(function(issuerBoxPk) {\n issuerBoxPks[issuer] = issuerBoxPk; // fill box pk cache\n }));\n }, jobs))\n .then(function(res){\n var boxKeypair = res[0];\n return $q.all(records.reduce(function(jobs, record) {\n var issuerBoxPk = issuerBoxPks[record[issuerFieldName]];\n var nonce = CryptoUtils.util.decode_base58(record.nonce);\n record.valid = true;\n\n return jobs.concat(\n cypherFieldNames.reduce(function(res, cypherFieldName) {\n if (!record[cypherFieldName]) return res;\n return res.concat(CryptoUtils.box.open(record[cypherFieldName], nonce, issuerBoxPk, boxKeypair.boxSk)\n .then(function(text) {\n record[cypherFieldName] = text;\n })\n .catch(function(err){\n console.error(err);\n console.warn('[ES] [crypto] a record may have invalid cypher ' + cypherFieldName);\n record.valid = false;\n }));\n }, []));\n }, []));\n })\n .then(function() {\n console.debug('[ES] [crypto] All record decrypted in ' + (Date.now() - now) + 'ms');\n return records;\n });\n\n }\n\n // exports\n return {\n box: {\n getKeypair: getBoxKeypair,\n pack: packRecordFields,\n open: openRecordFields\n }\n };\n}])\n;\n","angular.module('cesium.es.profile.services', ['cesium.services', 'cesium.es.http.services', 'cesium.es.like.services'])\n .config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Will force to load this service\n PluginServiceProvider.registerEagerLoadingService('esProfile');\n }\n\n }])\n\n .factory('esProfile', ['$rootScope', '$q', 'esHttp', 'SocialUtils', 'csWot', 'csWallet', 'csCache', 'csPlatform', 'esSettings', 'esLike', function($rootScope, $q, esHttp, SocialUtils, csWot, csWallet, csCache, csPlatform, esSettings, esLike) {\n 'ngInject';\n\n var\n that = this,\n listeners;\n\n that.raw = {\n getFields: esHttp.get('/user/profile/:id?&_source_exclude=avatar._content&_source=:fields'),\n get: esHttp.get('/user/profile/:id?&_source_exclude=avatar._content', csCache.constants.MEDIUM),\n getAll: esHttp.get('/user/profile/:id', csCache.constants.MEDIUM),\n search: esHttp.post('/user/profile/_search', csCache.constants.MEDIUM),\n mixedSearch: esHttp.post('/user,page,group/profile,record/_search', csCache.constants.MEDIUM),\n remove: esHttp.record.remove(\"user\",\"profile\")\n };\n\n function getAvatarAndName(pubkey) {\n return that.raw.getFields({id: pubkey, fields: 'title,avatar._content_type'})\n .then(function(res) {\n var profile;\n if (res && res._source) {\n // name\n profile = {name: res._source.title};\n // avatar\n profile.avatar = esHttp.image.fromHit(res, 'avatar');\n }\n return profile;\n })\n .catch(function(err){\n // no profile defined\n if (err && err.ucode && err.ucode == 404) {\n return null;\n }\n else {\n throw err;\n }\n });\n }\n\n function getProfile(pubkey, options) {\n options = options || {};\n\n var get = options.raw ? that.raw.getAll : that.raw.get;\n return get({id: pubkey})\n .then(function(res) {\n if (!res || !res.found || !res._source) return undefined;\n\n var profile = {\n name: res._source.title,\n source: res._source\n };\n\n // Avoid too long name (workaround for #308)\n if (profile.name && profile.name.length > 30) {\n profile.name = profile.name.substr(0, 27) + '...';\n }\n\n // avatar\n profile.avatar = esHttp.image.fromHit(res, 'avatar');\n\n // convert description into html\n if (!options.raw && profile.source.description) {\n profile.descriptionHtml = esHttp.util.parseAsHtml(profile.source.description);\n }\n\n // Social url must be unique in socials links - Workaround for issue #306:\n if (profile.source.socials && profile.source.socials.length) {\n profile.source.socials = _.uniq(profile.source.socials, false, function (social) {\n return social.url;\n });\n }\n\n if (!csWallet.isLogin()) {\n // Exclude encrypted socials items\n profile.source.socials = _.filter(profile.source.socials, function(social) {\n return social.type !== 'curve25519';\n });\n }\n else {\n // decrypt socials (if login)\n return SocialUtils.open(profile.source.socials, pubkey)\n .then(function(){\n // Exclude invalid decrypted socials\n //console.debug(profile.source.socials);\n //profile.source.socials = _.where(profile.source.socials, {valid: true});\n\n return profile;\n });\n }\n\n return profile;\n })\n .catch(function(err){\n // no profile defined\n if (err && err.ucode && err.ucode == 404) {\n return null;\n }\n else {\n throw err;\n }\n });\n }\n\n function fillAvatars(datas, pubkeyAtributeName) {\n return onWotSearch(null, datas, pubkeyAtributeName);\n }\n\n function _fillSearchResultFromHit(data, hit, avatarFieldName) {\n data.avatar = data.avatar || esHttp.image.fromHit(hit, avatarFieldName||'avatar');\n // name (basic or highlighted)\n data.name = hit._source.title;\n // Avoid too long name (workaround for #308)\n if (data.name && data.name.length > 30) {\n data.name = data.name.substr(0, 27) + '...';\n }\n data.description = hit._source.description || data.description;\n data.city = hit._source.city || data.city;\n\n if (hit.highlight) {\n if (hit.highlight.title) {\n data.name = hit.highlight.title[0];\n }\n if (hit.highlight.tags) {\n data.tags = hit.highlight.tags.reduce(function(res, tag){\n return res.concat(tag.replace('<em>', '').replace('</em>', ''));\n },[]);\n }\n }\n }\n\n function onWotSearch(text, datas, pubkeyAtributeName, deferred) {\n deferred = deferred || $q.defer();\n if (!text && (!datas || !datas.length)) {\n deferred.resolve(datas);\n return deferred.promise;\n }\n\n pubkeyAtributeName = pubkeyAtributeName || 'pubkey';\n text = text ? text.toLowerCase().trim() : text;\n var dataByPubkey;\n var tags = text ? esHttp.util.parseTags(text) : undefined;\n var request = {\n query: {},\n highlight: {fields : {title : {}, tags: {}}},\n from: 0,\n size: 100,\n _source: [\"title\", \"avatar._content_type\"]\n };\n\n var mixedSearch = text && esSettings.wot.isMixedSearchEnable();\n if (mixedSearch) {\n request._source = request._source.concat([\"description\", \"city\", \"creationTime\", \"membersCount\", \"type\"]);\n console.debug(\"[ES] [profile] Mixed search: enable\");\n }\n\n if (datas.length > 0) {\n // collect pubkeys and fill values map\n dataByPubkey = {};\n _.forEach(datas, function(data) {\n var pubkey = data[pubkeyAtributeName];\n if (pubkey) {\n var values = dataByPubkey[pubkey];\n if (!values) {\n values = [data];\n dataByPubkey[pubkey] = values;\n }\n else {\n values.push(data);\n }\n }\n });\n var pubkeys = _.keys(dataByPubkey);\n // Make sure all results will be return\n request.size = (pubkeys.length <= request.size) ? request.size : pubkeys.length;\n if (!text) {\n delete request.highlight; // highlight not need\n request.query.constant_score = {\n filter: {\n terms : {_id : pubkeys}\n }\n };\n }\n else {\n request.query.bool = {\n should: [\n {terms : {\"_id^4\" : pubkeys}},\n {match: {title: {query: text, boost: 2}}},\n {prefix: {title: text}}\n ]\n };\n\n if (tags) {\n request.query.bool.should.push({terms: {tags: tags}});\n }\n }\n }\n else if (text){\n request.query.bool = {\n should: [\n {match: {title: {\n query: text,\n boost: 2\n }}},\n {prefix: {title: text}}\n ]\n };\n if (tags) {\n request.query.bool.should.push({terms: {tags: tags}});\n }\n }\n else {\n // nothing to search: stop here\n deferred.resolve(datas);\n return deferred.promise;\n }\n\n if (text && mixedSearch) {\n request.indices_boost = {\n \"user\" : 100,\n \"page\" : 1,\n \"group\" : 0.01\n };\n }\n\n var hits;\n\n var search = mixedSearch ? that.raw.mixedSearch : that.raw.search;\n search(request)\n .then(function(res) {\n hits = res.hits;\n if (hits.total > 0) {\n var indices = {};\n var values;\n _.forEach(hits.hits, function(hit) {\n\n var avatarFieldName = 'avatar';\n // User profile\n if (hit._index == \"user\") {\n values = dataByPubkey && dataByPubkey[hit._id];\n if (!values) {\n var value = {};\n value[pubkeyAtributeName] = hit._id;\n values=[value];\n datas.push(value);\n }\n }\n\n // Page or group\n else if (hit._index != \"user\") {\n if (!indices[hit._index]) {\n indices[hit._index] = true;\n // add a separator\n datas.push({\n id: 'divider-' + hit._index,\n divider: true,\n index: hit._index\n });\n }\n var item = {\n id: hit._index + '-' + hit._id, // unique id in list\n index: hit._index,\n templateUrl: 'plugins/es/templates/wot/lookup_item_{0}.html'.format(hit._index),\n state: 'app.view_{0}'.format(hit._index),\n stateParams: {id: hit._id, title: hit._source.title},\n creationTime: hit._source.creationTime,\n memberCount: hit._source.memberCount,\n type: hit._source.type\n };\n values=[item];\n datas.push(item);\n avatarFieldName = 'avatar';\n }\n\n var avatar = esHttp.image.fromHit(hit, avatarFieldName);\n _.forEach(values, function(data) {\n data.avatar= avatar;\n _fillSearchResultFromHit(data, hit);\n });\n });\n\n // Add divider on top\n if (_.keys(indices).length) {\n datas.splice(0,0, {\n id: 'divider-identities',\n divider: true,\n index: 'profile'\n });\n }\n }\n deferred.resolve(datas);\n })\n .catch(function(err){\n if (err && err.ucode && err.ucode == 404) {\n deferred.resolve(datas);\n }\n else {\n deferred.reject(err);\n }\n });\n\n return deferred.promise;\n }\n\n function onWotLoad(data, deferred) {\n deferred = deferred || $q.defer();\n if (!data || !data.pubkey) {\n deferred.resolve();\n return deferred.promise;\n }\n\n console.debug(\"[ES] [profile] Extending identity {{0}} ...\".format(data.pubkey.substr(0,8)));\n\n $q.all([\n // Load full profile\n getProfile(data.pubkey)\n .then(function(profile) {\n if (profile) {\n data.name = profile.name;\n data.avatar = profile.avatar;\n data.profile = data.profile || {};\n angular.merge(data.profile, profile.source, {descriptionHtml: profile.descriptionHtml});\n }\n else {\n data.name = null;\n data.avatar = null;\n data.profile = null;\n }\n deferred.resolve(data);\n }),\n\n // Load avatar on certifications\n fillAvatars(\n (data.received_cert||[])\n .concat(data.received_cert_pending||[])\n .concat(data.given_cert||[])\n .concat(data.given_cert_pending||[])\n )\n ])\n .catch(function(err){\n deferred.reject(err);\n });\n return deferred.promise;\n }\n\n function removeProfile(pubkey, options) {\n return that.raw.remove(pubkey, options)\n .then(function(res) {\n csCache.clear('csWot-');\n csCache.clear('csWot-');\n return res;\n });\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function addListeners() {\n // Extend csWot events\n listeners = [\n csWot.api.data.on.load($rootScope, onWotLoad, this),\n csWot.api.data.on.search($rootScope, onWotSearch, this)\n ];\n }\n\n function refreshState() {\n var enable = esHttp.alive;\n if (!enable && listeners && listeners.length > 0) {\n console.debug(\"[ES] [profile] Disable\");\n removeListeners();\n }\n else if (enable && (!listeners || listeners.length === 0)) {\n console.debug(\"[ES] [profile] Enable\");\n addListeners();\n }\n }\n\n // Default actions\n csPlatform.ready().then(function() {\n esHttp.api.node.on.start($rootScope, refreshState, this);\n esHttp.api.node.on.stop($rootScope, refreshState, this);\n return refreshState();\n });\n\n return {\n getAvatarAndName: getAvatarAndName,\n get: getProfile,\n add: esHttp.record.post('/user/profile', {tagFields: ['title', 'description'], ignoreFields: ['enableGeoPoint', 'descriptionHtml', 'moderator']}),\n update: esHttp.record.post('/user/profile/:id/_update', {tagFields: ['title', 'description'], ignoreFields: ['enableGeoPoint', 'descriptionHtml', 'moderator']}),\n remove: removeProfile,\n avatar: esHttp.get('/user/profile/:id?_source=avatar'),\n fillAvatars: fillAvatars,\n like: esLike.instance('user', 'profile')\n };\n }])\n;\n","angular.module('cesium.es.notification.services', ['cesium.platform', 'cesium.es.http.services'])\n.config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Will force to load this service\n PluginServiceProvider.registerEagerLoadingService('esNotification');\n }\n\n }])\n\n.factory('esNotification', ['$rootScope', '$q', '$timeout', '$translate', '$state', 'csHttp', 'csConfig', 'csSettings', 'esHttp', 'esSettings', 'csWallet', 'csWot', 'UIUtils', 'filterTranslations', 'BMA', 'CryptoUtils', 'csPlatform', 'Api', function($rootScope, $q, $timeout, $translate, $state, csHttp,\n csConfig, csSettings, esHttp, esSettings, csWallet, csWot, UIUtils, filterTranslations,\n BMA, CryptoUtils, csPlatform, Api) {\n 'ngInject';\n\n var\n constants = {\n MESSAGE_CODES: ['MESSAGE_RECEIVED'],\n INVITATION_CODES: ['INVITATION_TO_CERTIFY'],\n DEFAULT_LOAD_SIZE: 20\n },\n\n fields = {\n commons: [\"type\", \"code\", \"params\", \"reference\", \"recipient\", \"time\", \"hash\", \"read_signature\"]\n },\n that = this,\n listeners,\n wsUserEventCloseFn,\n api = new Api(this, 'esNotification')\n ;\n\n constants.EXCLUDED_CODES = constants.MESSAGE_CODES.concat(constants.INVITATION_CODES);\n\n that.raw = {\n postCount: esHttp.post('/user/event/_count'),\n postSearch: esHttp.post('/user/event/_search'),\n postReadById: esHttp.post('/user/event/:id/_read'),\n ws: {\n getUserEvent: esHttp.ws('/ws/event/user/:pubkey/:locale'),\n getChanges: esHttp.ws('/ws/_changes')\n }\n };\n\n // Create the filter query\n function createFilterQuery(pubkey, options) {\n options = options || {};\n options.codes = options.codes || {};\n options.codes.excludes = options.codes.excludes || constants.EXCLUDED_CODES;\n var query = {\n bool: {\n must: [\n {term: {recipient: pubkey}}\n ]\n }\n };\n\n // Includes codes\n if (options.codes && options.codes.includes) {\n query.bool.must.push({terms: { code: options.codes.includes}});\n }\n else {\n // Excludes codes\n var excludesCodes = [];\n if (!csSettings.getByPath('plugins.es.notifications.txSent', false)) {\n excludesCodes.push('TX_SENT');\n }\n if (!csSettings.getByPath('plugins.es.notifications.txReceived', true)) {\n excludesCodes.push('TX_RECEIVED');\n }\n if (!csSettings.getByPath('plugins.es.notifications.certSent', false)) {\n excludesCodes.push('CERT_SENT');\n }\n if (!csSettings.getByPath('plugins.es.notifications.certReceived', true)) {\n excludesCodes.push('CERT_RECEIVED');\n }\n if (options.codes.excludes) {\n _.forEach(options.codes.excludes, function(code) {\n excludesCodes.push(code);\n });\n }\n if (excludesCodes.length) {\n query.bool.must_not = {terms: { code: excludesCodes}};\n }\n }\n\n // Filter on time\n if (options.readTime) {\n query.bool.must.push({range: {time: {gt: options.readTime}}});\n }\n return query;\n }\n\n // Load unread notifications count\n function loadUnreadNotificationsCount(pubkey, options) {\n if (!pubkey) {\n return $q.reject('[ES] [notification] Unable to load - missing pubkey');\n }\n var request = {\n query: createFilterQuery(pubkey, options)\n };\n // Filter unread only\n request.query.bool.must.push({missing: { field : \"read_signature\" }});\n return that.raw.postCount(request)\n .then(function(res) {\n return res.count;\n });\n }\n\n function getWalletNotifications(options) {\n options = options || {};\n var wallet = options.wallet || csWallet;\n\n return new Promise(function(resolve) {\n if (!wallet.data || !wallet.data.events ||!wallet.data.events.length) return resolve([]);\n\n // Add some wallet events as notifications\n var time = csHttp.date.now() - filterTranslations.MEDIAN_TIME_OFFSET;\n var result = (wallet.data.events || []).reduce(function(res, event) {\n if (event.type !== \"warn\" && event.type !== \"error\") return res; // Keep only warn and error events\n var notification = new EsNotification({}, function(self) {\n if (!self.read) {\n self.read = true;\n if (wallet.data.notifications && wallet.data.notifications.warnCount > 0) {\n wallet.data.notifications.warnCount--;\n }\n }\n });\n notification.id= event.code;\n notification.time= time;\n notification.read = false;\n notification.state = 'app.view_wallet';\n notification.avatarIcon = 'ion-alert-circled';\n notification.icon = 'ion-alert-circled assertive';\n notification.message = event.message;\n notification.messageParams = event.messageParams;\n return res.concat(notification);\n }, []);\n\n resolve(result);\n });\n\n }\n\n // Load user notifications\n function loadNotifications(options) {\n options = options || {};\n if (!options.pubkey) {\n return $q.reject('[ES] [notification] Unable to load - missing options.pubkey');\n }\n options.from = options.from || 0;\n options.size = options.size || constants.DEFAULT_LOAD_SIZE;\n var request = {\n query: createFilterQuery(options.pubkey, options),\n sort : [\n { \"time\" : {\"order\" : \"desc\"}}\n ],\n from: options.from,\n size: options.size,\n _source: fields.commons\n };\n\n return $q.all([\n // Get wallet events (as notifications)\n getWalletNotifications(options),\n\n // Load notification from ES node\n that.raw.postSearch(request)\n ]).then(function(res) {\n\n var walletNotifs = res[0] || [];\n res = res[1];\n\n if (!res.hits || !res.hits.total) return walletNotifs;\n\n var notifications = res.hits.hits.reduce(function(res, hit) {\n var item = new EsNotification(hit._source, markNotificationAsRead);\n item.id = hit._id;\n return res.concat(item);\n }, walletNotifs);\n\n return csWot.extendAll(notifications);\n });\n }\n\n function onNewUserEvent(event) {\n if (!event || !csWallet.isLogin()) return;\n\n // If notification is an invitation\n if (_.contains(constants.INVITATION_CODES, event.code)) {\n api.event.raise.newInvitation(event);\n return;\n }\n\n // If notification is a message\n if (_.contains(constants.MESSAGE_CODES, event.code)) {\n api.event.raise.newMessage(event);\n return;\n }\n\n var notification = new EsNotification(event, markNotificationAsRead);\n notification.id = event.id || notification.id;\n\n // Extend the notification entity\n return csWot.extendAll([notification])\n .then(function() {\n if (!$rootScope.$$phase) {\n $rootScope.$applyAsync(function() {\n addNewNotification(notification);\n });\n }\n else {\n addNewNotification(notification);\n }\n })\n .then(function() {\n if (esSettings.notifications.isEmitHtml5Enable()) return emitEsNotification(notification);\n });\n }\n\n function addNewNotification(notification) {\n csWallet.data.notifications = csWallet.data.notifications || {};\n csWallet.data.notifications.unreadCount++;\n api.data.raise.new(notification);\n\n return notification;\n }\n\n function htmlToPlaintext(text) {\n return text ? String(text).replace(/<[^>]*>/gm, '').replace(/&[^;]+;/gm, '') : '';\n }\n\n function emitEsNotification(notification, title) {\n\n // If it's okay let's create a notification\n $q.all([\n $translate(title||'COMMON.NOTIFICATION.TITLE'),\n $translate(notification.message, notification)\n ])\n .then(function(res) {\n var title = htmlToPlaintext(res[0]);\n var body = htmlToPlaintext(res[1]);\n var icon = notification.avatar && notification.avatar.src || './img/logo.png';\n emitHtml5Notification(title, {\n body: body,\n icon: icon,\n lang: $translate.use(),\n tag: notification.id,\n onclick: function() {\n $rootScope.$applyAsync(function() {\n if (typeof notification.markAsRead === \"function\") {\n notification.markAsRead();\n }\n if (notification.state) {\n $state.go(notification.state, notification.stateParams);\n }\n });\n }\n });\n });\n }\n\n function emitHtml5Notification(title, options) {\n\n // Let's check if the browser supports notifications\n if (!(\"Notification\" in window)) return;\n\n // Let's check whether notification permissions have already been granted\n if (Notification.permission === \"granted\") {\n\n // If it's okay let's create a notification\n var browserNotification = new Notification(title, options);\n browserNotification.onclick = options.onclick || browserNotification.onclick;\n }\n\n // Otherwise, we need to ask the user for permission\n else if (Notification.permission !== \"denied\") {\n Notification.requestPermission(function (permission) {\n // If the user accepts, let's create a notification\n if (permission === \"granted\") {\n emitHtml5Notification(title, options); // recursive call\n }\n });\n }\n }\n\n // Mark a notification as read\n function markNotificationAsRead(notification) {\n if (notification.read || !notification.id) return; // avoid multi call\n // Should never append (fix in Duniter4j issue #12)\n if (!notification.id) {\n console.error('[ES] [notification] Could not mark as read: no \\'id\\' found!', notification);\n return;\n }\n\n // user not auth: could not mark as read\n if (!csWallet.isAuth()) return;\n\n notification.read = true;\n return csWallet.getKeypair()\n .then(function(keypair) {\n return CryptoUtils.sign(notification.hash, keypair)\n .then(function(signature){\n return that.raw.postReadById(signature, {id:notification.id});\n })\n .catch(function(err) {\n console.error('[ES] [notification] Error while trying to mark event as read.', err);\n });\n\n });\n }\n\n function onWalletReset(data) {\n data.notifications = data.notifications || {};\n data.notifications.unreadCount = null;\n data.notifications.warnCount = null;\n data.notifications.time = null;\n // Stop listening notification\n if (wsUserEventCloseFn) {\n console.debug(\"[ES] [notification] Closing websocket...\");\n wsUserEventCloseFn();\n wsUserEventCloseFn = null;\n }\n }\n\n function onWalletLoad(data, deferred) {\n deferred = deferred || $q.defer();\n if (!data || !data.pubkey || !data.keypair) {\n $timeout(function() {\n deferred.resolve(data);\n });\n return deferred.promise;\n }\n\n var now = Date.now();\n var time = Math.trunc(now / 1000);\n\n // Skip if loaded less than 1 min ago\n // (This is need to avoid reload on login AND load phases)\n if (data.notifications && data.notifications.time && (time - data.notifications.time < 30 /*=30s*/)) {\n // update warn count\n data.notifications.warnCount = countWarnEvents(data);\n\n console.debug('[ES] [notification] Skipping load (loaded '+(time - data.notifications.time)+'s ago)');\n $timeout(function() {\n deferred.resolve(data);\n });\n return deferred.promise;\n }\n\n var isDefaultWallet = csWallet.isUserPubkey(data.pubkey);\n console.debug('[ES] [notification] Loading count...' + data.pubkey.substr(0,8));\n\n // Load unread notifications count\n loadUnreadNotificationsCount(\n data.pubkey, {\n readTime: data.notifications && data.notifications.time || 0,\n excludeCodes: constants.EXCLUDED_CODES\n })\n .then(function(unreadCount) {\n data.notifications = data.notifications || {};\n data.notifications.unreadCount = unreadCount;\n data.notifications.warnCount = countWarnEvents(data);\n\n // Emit HTML5 notification (only on main wallet)\n if (unreadCount > 0 && esSettings.notifications.isEmitHtml5Enable() && isDefaultWallet) {\n $timeout(function() {\n emitEsNotification({\n message: 'COMMON.NOTIFICATION.HAS_UNREAD',\n count: unreadCount,\n state: 'app.view_notifications'\n }, data.ui || data.name || data.pubkey && data.pubkey.substr(0,8));\n }, 500);\n }\n\n console.debug('[ES] [notification] Loaded count (' + unreadCount + ') in '+(Date.now()-now)+'ms');\n deferred.resolve(data);\n })\n .catch(function(err){\n console.error('Error while counting notification: ' + (err.message ? err.message : err));\n deferred.resolve(data);\n });\n\n return deferred.promise;\n }\n\n function onWalletLogin(data, deferred) {\n // Call load\n return onWalletLoad(data, deferred)\n\n // then start listening new events\n .then(function(){\n console.debug('[ES] [notification] Starting listen user event...');\n var wsUserEvent = that.raw.ws.getUserEvent();\n wsUserEvent.on(\n onNewUserEvent,\n {pubkey: data.pubkey, locale: csSettings.data.locale.id}\n )\n .catch(function(err) {\n console.error('[ES] [notification] Unable to listen user event', err);\n\n // TODO : send a event to csHttp instead ?\n // And display such connectivity errors in UI\n UIUtils.alert.error('ACCOUNT.ERROR.WS_CONNECTION_FAILED');\n });\n wsUserEventCloseFn = function() {wsUserEvent.close();};\n });\n }\n\n function countWarnEvents(data){\n if (!data.events) return 0;\n return data.events.reduce(function(counter, event) {\n return (event.type == \"warn\") ? counter+1 : counter;\n }, 0);\n }\n\n function addListeners() {\n // Listen some events\n listeners = [\n csWallet.api.data.on.login($rootScope, onWalletLogin, this),\n csWallet.api.data.on.load($rootScope, onWalletLoad, this),\n csWallet.api.data.on.init($rootScope, onWalletReset, this),\n csWallet.api.data.on.reset($rootScope, onWalletReset, this)\n ];\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function refreshState() {\n var enable = esHttp.alive;\n if (!enable && listeners && listeners.length > 0) {\n console.debug(\"[ES] [notification] Disable\");\n removeListeners();\n if (csWallet.isLogin()) {\n onWalletReset(csWallet.data);\n }\n }\n else if (enable && (!listeners || listeners.length === 0)) {\n console.debug(\"[ES] [notification] Enable\");\n addListeners();\n if (csWallet.isLogin()) {\n return onWalletLogin(csWallet.data);\n }\n }\n }\n\n // Register extension points\n api.registerEvent('data', 'new');\n api.registerEvent('event', 'newInvitation');\n api.registerEvent('event', 'newMessage');\n\n // Default actions\n csPlatform.ready().then(function() {\n esHttp.api.node.on.start($rootScope, refreshState, this);\n esHttp.api.node.on.stop($rootScope, refreshState, this);\n return refreshState();\n });\n\n // Exports\n that.load = loadNotifications;\n that.unreadCount = loadUnreadNotificationsCount;\n that.html5 = {\n emit: emitHtml5Notification\n };\n that.api = api;\n that.websocket = {\n event: that.raw.ws.getUserEvent,\n change: that.raw.ws.getChanges\n };\n that.constants = constants;\n\n return that;\n}])\n;\n","angular.module('cesium.es.message.services', ['ngResource', 'cesium.platform',\n 'cesium.es.http.services', 'cesium.es.wallet.services', 'cesium.es.notification.services'])\n .config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Will force to load this service\n PluginServiceProvider.registerEagerLoadingService('esMessage');\n }\n\n }])\n\n .factory('esMessage', ['$q', '$rootScope', '$timeout', 'UIUtils', 'Api', 'CryptoUtils', 'csPlatform', 'csConfig', 'csSettings', 'esHttp', 'csWallet', 'esWallet', 'csWot', 'esNotification', function($q, $rootScope, $timeout, UIUtils, Api, CryptoUtils,\n csPlatform, csConfig, csSettings, esHttp, csWallet, esWallet, csWot, esNotification) {\n 'ngInject';\n\n var\n constants = {\n DEFAULT_LOAD_SIZE: 10\n },\n fields = {\n commons: [\"issuer\", \"recipient\", \"title\", \"content\", \"time\", \"nonce\", \"read_signature\"],\n notifications: [\"issuer\", \"time\", \"hash\", \"read_signature\"]\n },\n raw = {\n postSearch: esHttp.post('/message/inbox/_search'),\n postSearchByType: esHttp.post('/message/:type/_search'),\n getByTypeAndId : esHttp.get('/message/:type/:id'),\n postReadById: esHttp.post('/message/inbox/:id/_read')\n },\n listeners,\n api = new Api(this, 'esMessage');\n\n function onWalletInit(data) {\n data.messages = data.messages || {};\n data.messages.unreadCount = null;\n data.messages.time = null;\n }\n\n function onWalletReset(data) {\n if (data.messages) {\n delete data.messages;\n }\n }\n\n function onWalletLoad(data, deferred) {\n deferred = deferred || $q.defer();\n\n if (!data || !data.pubkey) {\n $timeout(function() {\n deferred.resolve(data);\n });\n return deferred.promise;\n }\n\n var now = Date.now();\n var time = Math.trunc(now / 1000);\n\n // Skip if loaded less than 1 min ago\n // (This is need to avoid reload on login AND load phases)\n if (data.messages && data.messages.time && (time - data.messages.time < 30 /*=30s*/)) {\n console.debug('[ES] [message] Skipping load (loaded '+(time - data.messages.time)+'s ago)');\n $timeout(function() {\n deferred.resolve(data);\n });\n return deferred.promise;\n }\n\n console.debug('[ES] [message] Loading count...');\n\n // Count unread messages\n countUnreadMessages({pubkey: data.pubkey})\n .then(function(unreadCount) {\n data.messages = data.messages || {};\n data.messages.unreadCount = unreadCount;\n data.messages.time = time;\n console.debug('[ES] [message] Loaded count (' + unreadCount + ') in '+(Date.now()-now)+'ms');\n deferred.resolve(data);\n })\n .catch(function(err){\n console.error('Error while counting messages: ' + (err.message ? err.message : err));\n deferred.resolve(data);\n });\n return deferred.promise;\n }\n\n function countUnreadMessages(options) {\n options = options || {};\n var wallet = options.wallet ||\n (options.walletId && csWallet.children.get(options.walletId)) || csWallet;\n var pubkey = options.pubkey || (wallet && wallet.data && wallet.data.pubkey);\n if (!pubkey) {\n throw new Error('no pubkey or wallet found in options, and user not connected.');\n }\n\n var request = {\n query: {\n bool: {\n must: [\n {term: {recipient: pubkey}},\n {missing: { field : \"read_signature\" }}\n ]\n }\n }\n };\n\n return esHttp.post('/message/inbox/_count')(request)\n .then(function(res) {\n return res.count;\n });\n }\n\n // Listen message changes\n function onNewMessageEvent(event, wallet) {\n console.debug(\"[ES] [message] detected new message (from notification service)\");\n\n var notification = new EsNotification(event);\n notification.issuer = notification.pubkey;\n delete notification.pubkey;\n\n if (!notification.issuer) return; // Skip if invalid\n\n // Get the wallet\n wallet = wallet || (notification.issuer && csWallet.isUserPubkey(notification.issuer) && csWallet) ||\n (notification.issuer && csWallet.children.getByPubkey(notification.issuer));\n\n if (!wallet) {\n throw new Error(\"No wallet for pubkey: {0}\".format(notification.issuer.substring(0, 6)));\n }\n\n csWot.extend(notification, 'issuer')\n .then(function() {\n\n wallet.data.messages = wallet.data.messages || {};\n wallet.data.messages.unreadCount++;\n\n // Raise event\n api.data.raise.new(notification);\n });\n }\n\n function sendMessage(message, options) {\n options = options || {};\n var wallet = options.wallet || options.walletId && csWallet.children.get(options.walletId) || csWallet;\n delete options.wallet;\n message.issuer = message.issuer || wallet.data.pubkey;\n return wallet.getKeypair()\n .then(function(keypair) {\n\n // Send to recipient inbox\n return doSendMessage(message, keypair)\n .then(function (res) {\n\n // Check if outbox is enable (in settings)\n var outbox = (csSettings.data.plugins.es.message &&\n angular.isDefined(csSettings.data.plugins.es.message.outbox)) ?\n csSettings.data.plugins.es.message.outbox : true;\n if (!outbox) return res;\n\n // Send to outbox\n return doSendMessage(message, keypair, '/message/outbox', 'issuer')\n .catch(function (err) {\n console.error(\"Failed to store message to outbox: \" + err);\n return res; // the first result\n });\n })\n .then(function (res) {\n // Raise API event\n api.data.raise.sent(res);\n\n return res;\n });\n });\n }\n\n function doSendMessage(message, keypair, boxPath, recipientFieldName) {\n boxPath = boxPath || '/message/inbox';\n\n // Encrypt fields\n return esWallet.box.record.pack(message, keypair, recipientFieldName, ['title', 'content'])\n // Send message\n .then(function(message){\n return esHttp.record.post(boxPath)(message, {pubkey: message.issuer, keypair: keypair});\n });\n }\n\n function loadMessageNotifications(options) {\n options = options || {};\n options.from = options.from || 0;\n options.size = options.size || constants.DEFAULT_LOAD_SIZE;\n var wallet = options.wallet || options.walletId && csWallet.children.get(options.walletId) || csWallet;\n delete options.wallet;\n\n if (!wallet.isLogin()) {\n return $q.when([]); // Should never happen\n }\n var request = {\n sort: {\n \"time\" : \"desc\"\n },\n query: {bool: {filter: {term: {recipient: wallet.data.pubkey}}}},\n from: options.from,\n size: options.size,\n _source: fields.notifications\n };\n\n return raw.postSearch(request)\n .then(function(res) {\n if (!res || !res.hits || !res.hits.total) return [];\n var notifications = res.hits.hits.reduce(function(result, hit) {\n var msg = hit._source;\n msg.id = hit._id;\n msg.read = !!msg.read_signature;\n delete msg.read_signature; // not need anymore\n return result.concat(msg);\n }, []);\n return csWot.extendAll(notifications, 'issuer');\n });\n }\n\n\n function searchMessages(pubkey, options) {\n pubkey = pubkey || csWallet.data.pubkey;\n\n options = options || {};\n options.type = options.type || 'inbox';\n options.from = options.from || 0;\n options.size = options.size || 1000;\n options._source = options._source || fields.commons;\n var request = {\n sort: {\n \"time\" : \"desc\"\n },\n from: options.from,\n size: options.size,\n _source: options._source\n };\n\n if (options.type == 'inbox') {\n request.query = {bool: {filter: {term: {recipient: pubkey}}}};\n }\n else {\n request.query = {bool: {filter: {term: {issuer: pubkey}}}};\n }\n\n return raw.postSearchByType(request, {type: options.type})\n .then(function(res) {\n if (!res || !res.hits || !res.hits.total) {\n return [];\n }\n var messages = res.hits.hits.reduce(function(res, hit) {\n var msg = hit._source || {};\n msg.id = hit._id;\n msg.read = (options.type == 'outbox') || !!msg.read_signature;\n delete msg.read_signature; // not need anymore\n return res.concat(msg);\n }, []);\n\n console.debug('[ES] [message] Loading {0} {1} messages'.format(messages.length, options.type));\n\n return messages;\n });\n }\n\n function loadMessages(options) {\n options = options || {};\n options.type = options.type || 'inbox';\n options._source = fields.commons;\n options.summary = angular.isDefined(options.summary) ? options.summary : true;\n options.filter = angular.isDefined(options.filter) ? options.filter : undefined;\n options.from = options.from || 0;\n\n var wallet = options.wallet || options.walletId && csWallet.children.get(options.walletId) || csWallet;\n delete options.wallet; // avoid error in angular.copy()\n\n var promise = wallet.auth()\n .then(function(walletData) {\n\n // Get encrypted message (with common fields)\n return searchMessages(walletData.pubkey, options)\n\n // Decrypt content\n .then(function(messages) {\n return decryptMessages(messages, walletData.keypair, options.summary);\n });\n })\n\n // Add avatar\n .then(function(messages){\n var avatarField = (options.type == 'inbox') ? 'issuer' : 'recipient';\n return csWot.extendAll(messages, avatarField);\n })\n\n // Update message count\n .then(function(messages){\n if (messages.length && options.filter){\n var filteredMessages = filterMessages(messages, options.filter);\n\n // Need more messages: iterate again\n if (filteredMessages.length < messages.length) {\n options = angular.copy(options);\n options.from += options.size;\n options.size = messages.length - filteredMessages.length;\n // put the wallet again, because it has been removed before the angular.copy()\n // To avoid an error\n options.wallet = wallet;\n return loadMessages(options) // Loop\n .then(function(messages) {\n return filteredMessages.concat(messages);\n });\n }\n }\n\n if (options.from === 0 && !options.filter) {\n wallet.data.messages = wallet.data.messages || {};\n wallet.data.messages.count = messages.length;\n }\n\n return messages;\n });\n\n // If filter, apply sorting (only once)\n if (options.from === 0 && options.filter) {\n promise.then(sortFilteredMessages);\n }\n\n return promise;\n }\n\n function getAndDecrypt(id, type, options) {\n type = type || 'inbox';\n options = options || {};\n options.summary = angular.isDefined(options.summary) ? options.summary : false/*summary not need by default*/;\n var wallet = options.wallet || (options.walletId && csWallet.children.get(options.walletId)) || csWallet;\n\n return wallet.auth()\n .then(function(walletData) {\n return raw.getByTypeAndId({id: id, type: type})\n .then(function(hit) {\n if (!hit.found) return;\n var msg = hit._source;\n msg.id = hit._id;\n msg.read = (type == 'outbox') || !!msg.read_signature;\n delete msg.read_signature; // not need anymore\n\n // Decrypt message\n return decryptMessages([msg], walletData.keypair, options.summary)\n\n // Add avatar\n .then(function(){\n var avatarField = (type == 'inbox') ? 'issuer' : 'recipient';\n return csWot.extend(msg, avatarField);\n });\n });\n });\n }\n\n function decryptMessages(messages, keypair, withSummary) {\n\n var now = Date.now();\n var issuerBoxPks = {}; // a map used as cache\n\n var jobs = [esWallet.box.getKeypair(keypair)];\n return $q.all(messages.reduce(function(jobs, message) {\n if (issuerBoxPks[message.issuer]) return res;\n return jobs.concat(\n CryptoUtils.box.keypair.pkFromSignPk(CryptoUtils.util.decode_base58(message.issuer))\n .then(function(issuerBoxPk) {\n issuerBoxPks[message.issuer] = issuerBoxPk; // fill box pk cache\n }));\n }, jobs))\n .then(function(res){\n var boxKeypair = res[0];\n return $q.all(messages.reduce(function(jobs, message) {\n var issuerBoxPk = issuerBoxPks[message.issuer];\n var nonce = CryptoUtils.util.decode_base58(message.nonce);\n message.valid = true;\n\n return jobs.concat(\n // title\n CryptoUtils.box.open(message.title, nonce, issuerBoxPk, boxKeypair.boxSk)\n .then(function(title) {\n message.title = title;\n })\n .catch(function(err){\n console.error(err);\n console.warn('[ES] [message] may have invalid cypher title');\n message.valid = false;\n }),\n\n // content\n CryptoUtils.box.open(message.content, nonce, issuerBoxPk, boxKeypair.boxSk)\n .then(function(content) {\n message.content = content;\n if (withSummary) {\n fillSummary(message);\n }\n else if (content){\n message.html = esHttp.util.parseAsHtml(content);\n }\n })\n .catch(function(err){\n console.error(err);\n console.warn('[ES] [message] may have invalid cypher content');\n message.valid = false;\n })\n );\n }, []));\n })\n .then(function() {\n console.debug('[ES] [message] All messages decrypted in ' + (Date.now() - now) + 'ms');\n return messages;\n });\n\n }\n\n // Compute a summary (truncated to 140 characters), from the message content\n function fillSummary(message) {\n if (message.content) {\n message.summary = message.content.replace(/(^|[\\n\\r]+)\\s*>[^\\n\\r]*/g, '').trim();\n if (message.summary.length > 140) {\n message.summary = message.summary.substr(0, 137) + '...';\n }\n }\n }\n\n function removeMessage(id, type, options) {\n type = type || 'inbox';\n\n var wallet = options.wallet || (options.walletId && csWallet.children.get(options.walletId)) || csWallet;\n\n return esHttp.record.remove('message', type)(id, {wallet: wallet})\n .then(function(res) {\n // Update message count\n if (type === 'inbox') {\n wallet.data.messages = wallet.data.messages || {};\n wallet.data.messages.count = wallet.data.messages.count > 0 ? wallet.data.messages.count-1 : 0;\n }\n\n // Raise event\n if (wallet.isDefault()) {\n api.data.raise.delete(id);\n }\n\n return res;\n });\n }\n\n function removeAllMessages(type, options) {\n type = type || 'inbox';\n var wallet = options && options.walletId && csWallet.children.get(options.walletId) || csWallet;\n return wallet.auth()\n .then(function(walletData) {\n // Get all message id\n return searchMessages(walletData.pubkey, {type: type, from: 0, size: 1000, _source: false})\n .then(function (res) {\n if (!res || !res.length) return;\n\n var ids = _.pluck(res, 'id');\n\n // Remove each messages\n return $q.all(res.reduce(function (res, msg) {\n return res.concat(esHttp.record.remove('message', type)(msg.id, {wallet: wallet}));\n }, []))\n .then(function() {\n return ids;\n });\n })\n .then(function (ids) {\n // update message count\n if (type === 'inbox') {\n wallet.data.messages = wallet.data.messages || {};\n wallet.data.messages.count = 0;\n wallet.data.messages.unreadCount = 0;\n }\n\n // Raise events\n if (wallet.isDefault()) {\n _.forEach(ids, api.data.raise.delete);\n }\n });\n });\n }\n\n // Mark a message as read\n function markMessageAsRead(message, options) {\n options = options || {};\n var wallet = options.wallet || options.walletId && csWallet.children.get(options.walletId) || csWallet;\n var type = options && options.type || (!wallet.isUserPubkey(message.recipient) ? 'outbox' : 'inbox');\n if (message.read) {\n var deferred = $q.defer();\n deferred.resolve();\n return deferred.promise;\n }\n message.read = true;\n\n return wallet.getKeypair()\n\n // Prepare the read_signature to sent\n .then(function(keypair) {\n return CryptoUtils.sign(message.hash, keypair);\n })\n\n // Send read request\n .then(function(signature){\n return raw.postReadById(signature, {id:message.id});\n })\n\n // Update message count\n .then(function() {\n if (type === 'inbox') {\n wallet.data.messages = wallet.data.messages || {};\n wallet.data.messages.unreadCount = wallet.data.messages.unreadCount ? wallet.data.messages.unreadCount - 1 : 0;\n }\n });\n }\n\n // Mark all messages as read\n function markAllMessageAsRead(options) {\n options = options || {};\n var wallet = options.wallet || options.walletId && csWallet.children.get(options.walletId) || csWallet;\n return wallet.auth()\n .then(function(walletData) {\n\n // Get all messages hash\n return searchMessages(walletData.pubkey, {\n type: 'inbox',\n from: 0,\n size: 1000,\n _source: ['hash', 'read_signature']\n })\n\n .then(function (messages) {\n if (!messages || !messages.length) return;\n\n // Keep only unread message\n messages = _.filter(messages, {read: false});\n\n // Remove messages\n return $q.all(messages.reduce(function (res, message) {\n return res.concat(\n // Sign hash\n CryptoUtils.sign(message.hash, walletData.keypair)\n // then send read request\n .then(function (signature) {\n return raw.postReadById(signature, {id: message.id});\n }));\n }, []));\n })\n .then(function () {\n // update message count\n wallet.data.messages = wallet.data.messages || {};\n wallet.data.messages.unreadCount = 0;\n });\n });\n }\n\n // Filter messages (after decryption) searching on [title, content]\n function filterMessages(messages, filter) {\n if (filter && !filter.trim().length) return messages;\n\n // Init summary, removing reply content (lines starting with '>')\n messages.forEach(function(msg) {\n if (msg.content) {\n msg.summary = msg.content.replace(/(^|[\\n\\r]+)\\s*>[^\\n\\r]*/g, '').trim() || '';\n }\n });\n\n // For each search words\n var words = filter.trim().split(' ');\n words.forEach(function(word) {\n var regexp = new RegExp(word, 'gi');\n messages.forEach(function(msg) {\n\n // Search on title\n var matches = regexp.exec(msg.title);\n if (matches) {\n msg.title = msg.title.replace(regexp, '<b>$&</b>');\n msg.titleMatch = (msg.titleMatch || 0) + 1;\n while(true) {\n matches = regexp.exec(msg.title.substring(matches.index + word.length));\n if (!matches || msg.titleMatch >= 10) break;\n msg.titleMatch = msg.titleMatch + 1;\n }\n return;\n }\n\n // Search on summary\n matches = regexp.exec(msg.summary);\n if (matches) {\n if (matches.index > 140) {\n msg.summary = '...' + msg.summary.substring(matches.index - 20);\n }\n msg.summary = msg.summary.replace(regexp, '<b>$&</b>');\n msg.contentMatch = (msg.contentMatch || 0) + 1;\n while(true) {\n matches = regexp.exec(msg.summary.substring(matches.index + word.length));\n if (!matches || msg.contentMatch >= 10) break;\n msg.contentMatch++;\n }\n if (msg.summary.length > 140) {\n msg.summary = msg.summary.substr(0, 137) + '...';\n }\n }\n });\n });\n\n // Keep only matches\n messages = _.filter(messages, function(msg) {\n return msg.titleMatch || msg.contentMatch;\n });\n\n return messages;\n }\n\n // Sort filtered messages by matches\n function sortFilteredMessages(messages) {\n // Sort by matches\n return _.sortBy(messages, function(msg) {\n return -1 * (\n 1000 * (msg.titleMatch || 0) +\n 100 * (msg.contentMatch || 0) +\n (msg.time / 10000000000));\n });\n }\n\n // Send message to developers - need for issue #524\n function onSendError(message) {\n var developers = csConfig.developers || [{pubkey: '38MEAZN68Pz1DTvT3tqgxx4yQP6snJCQhPqEFxbDk4aE'/*kimamila*/}];\n if(!message || !message.content || !developers || !developers.length) return;\n\n console.info(\"[ES] [message] Sending logs to developers...\");\n message.issuer = csWallet.data.pubkey;\n message.title = message.title || 'Sending log';\n message.time = moment().utc().unix();\n\n csWallet.getKeypair()\n .then(function(keypair) {\n return $q.all(developers.reduce(function(res, developer){\n return !developer.pubkey ? res :\n res.concat(doSendMessage(angular.merge({recipient: developer.pubkey}, message), keypair));\n }, []));\n })\n .then(function(res) {\n console.info(\"[ES] [message] Logs sent to {0} developers\".format(res.length));\n });\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function addListeners() {\n // Extend csWallet events\n listeners = [\n csWallet.api.data.on.init($rootScope, onWalletInit, this),\n csWallet.api.data.on.login($rootScope, onWalletLoad, this),\n csWallet.api.data.on.load($rootScope, onWalletLoad, this), // need for secondary wallets\n csWallet.api.data.on.reset($rootScope, onWalletReset, this),\n esNotification.api.event.on.newMessage($rootScope, onNewMessageEvent, this),\n // for issue #524\n csWallet.api.error.on.send($rootScope, onSendError, this)\n ];\n }\n\n function refreshState() {\n var enable = esHttp.alive;\n if (!enable && listeners && listeners.length > 0) {\n console.debug(\"[ES] [message] Disable\");\n removeListeners();\n if (csWallet.isLogin()) {\n onWalletReset(csWallet.data);\n }\n }\n else if (enable && (!listeners || listeners.length === 0)) {\n console.debug(\"[ES] [message] Enable\");\n addListeners();\n if (csWallet.isLogin()) {\n onWalletLoad(csWallet.data);\n }\n }\n }\n\n // Register extension points\n api.registerEvent('data', 'new');\n api.registerEvent('data', 'delete');\n api.registerEvent('data', 'sent');\n\n // Default action\n csPlatform.ready().then(function() {\n esHttp.api.node.on.start($rootScope, refreshState, this);\n esHttp.api.node.on.stop($rootScope, refreshState, this);\n return refreshState();\n });\n\n return {\n api: api,\n search: raw.postSearch,\n notifications: {\n load: loadMessageNotifications\n },\n load: loadMessages,\n get: getAndDecrypt,\n send: sendMessage,\n remove: removeMessage,\n removeAll: removeAllMessages,\n markAsRead: markMessageAsRead,\n markAllAsRead: markAllMessageAsRead,\n fields: {\n commons: fields.commons\n }\n };\n }])\n;\n","angular.module('cesium.es.modal.services', ['cesium.modal.services', 'cesium.es.message.services'])\n\n .factory('esModals', ['$state', 'ModalUtils', 'UIUtils', 'csWallet', function($state, ModalUtils, UIUtils, csWallet) {\n 'ngInject';\n\n function showMessageCompose(parameters) {\n return ModalUtils.show('plugins/es/templates/message/modal_compose.html','ESMessageComposeModalCtrl',\n parameters, {focusFirstInput: true});\n }\n\n function updateNotificationCountAndReadTime() {\n csWallet.data.notifications.unreadCount = 0;\n if (csWallet.data.notifications && csWallet.data.notifications.history.length) {\n var lastNotification = csWallet.data.notifications.history[0];\n var readTime = lastNotification ? lastNotification.time : 0;\n csSettings.data.wallet = csSettings.data.wallet || {};\n if (readTime && csSettings.data.wallet.notificationReadTime != readTime) {\n csSettings.data.wallet.notificationReadTime = readTime;\n csSettings.store();\n }\n }\n }\n\n function showNotificationsPopover(scope, event) {\n return UIUtils.popover.show(event, {\n templateUrl :'plugins/es/templates/common/popover_notification.html',\n scope: scope,\n autoremove: false, // reuse popover\n afterHidden: updateNotificationCountAndReadTime\n })\n .then(function(notification) {\n if (!notification) return; // no selection\n if (notification.onRead && typeof notification.onRead == 'function') notification.onRead();\n if (notification.state) {\n $state.go(notification.state, notification.stateParams);\n }\n });\n }\n\n function showNewInvitation(parameters) {\n return csWallet.auth({minData: true})\n .then(function(walletData) {\n UIUtils.loading.hide();\n\n // Not allow for non-member - issue #561\n if (!walletData.isMember) {\n return UIUtils.alert.error('ERROR.ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION');\n }\n return ModalUtils.show('plugins/es/templates/invitation/modal_new_invitation.html', 'ESNewInvitationModalCtrl',\n parameters);\n });\n }\n\n function showNewPage(options) {\n var wallet = options && options.wallet || csWallet;\n return wallet.auth({minData: true})\n .then(function() {\n UIUtils.loading.hide();\n\n return ModalUtils.show('plugins/es/templates/registry/modal_record_type.html', undefined, {\n title: 'REGISTRY.EDIT.TITLE_NEW'\n })\n .then(function(type){\n if (type) {\n $state.go('app.registry_add_record', {type: type, wallet: wallet.id});\n }\n });\n });\n }\n\n function showNetworkLookup(parameters) {\n return ModalUtils.show('plugins/es/templates/network/modal_network.html', 'ESNetworkLookupModalCtrl',\n parameters, {focusFirstInput: false});\n }\n\n return {\n showMessageCompose: showMessageCompose,\n showNotifications: showNotificationsPopover,\n showNewInvitation: showNewInvitation,\n showNewPage: showNewPage,\n showNetworkLookup: showNetworkLookup\n };\n\n }]);\n","angular.module('cesium.es.blockchain.services', ['cesium.services', 'cesium.es.http.services'])\n\n.factory('esBlockchain', ['$rootScope', '$q', '$timeout', 'BMA', 'csCache', 'esHttp', function($rootScope, $q, $timeout, BMA, csCache, esHttp) {\n 'ngInject';\n\n function EsBlockchain() {\n\n var\n PUBKEY = BMA.constants.regexp.PUBKEY,\n CONSTANTS = {\n DEFAULT_SEARCH_SIZE: 40,\n ES_CORE_API_ENDPOINT: 'ES_CORE_API( ([a-z_][a-z0-9-_.]*))?( ([0-9.]+))?( ([0-9a-f:]+))?( ([0-9]+))'\n },\n REGEXPS = {\n /* WARNING: keep keys order for UI */\n SEARCH_FILTER: {\n TX_PUBKEY: new RegExp('\\\\(transactions\\\\.issuers:('+PUBKEY+') OR transactions\\\\.outputs:\\\\*('+PUBKEY+')\\\\)([ ]+AND)?'),\n ISSUER: new RegExp('issuer:('+PUBKEY+')([ ]+AND)?'),\n MEMBER_FLOWS: new RegExp('\\\\(_exists_:joiners OR _exists_:leavers OR _exists_:revoked OR _exists_:excluded\\\\)([ ]+AND)?'),\n EXISTING_TRANSACTION: new RegExp('_exists_:transactions([ ]+AND)?'),\n PERIOD: new RegExp('medianTime:>=?([0-9]+)[ ]+AND[ ]+medianTime:<=?([0-9]+)([ ]+AND)?')\n },\n LAST_AND: /[ ]+AND$/\n },\n FIELDS = {\n MINIMAL: ['number', 'hash', 'medianTime', 'issuer'],\n COMMONS: ['number', 'hash', 'medianTime', 'issuer', 'currency', 'version', 'powMin', 'dividend', 'membersCount', 'identities', 'joiners', 'actives', 'leavers', 'revoked', 'excluded', 'certifications', 'transactions']\n },\n exports = {\n node: {},\n block: {},\n raw: {\n block: {\n search: esHttp.post('/:currency/block/_search', csCache.constants.SHORT),\n searchText: esHttp.get('/:currency/block/_search?q=:text'),\n get: esHttp.get('/:currency/block/:number/_source', csCache.constants.SHORT)\n }\n },\n regexp: {\n ES_CORE_API_ENDPOINT: exact(CONSTANTS.ES_CORE_API_ENDPOINT)\n }\n };\n exports.regex = exports.regexp; // deprecated\n\n function exact(regexpContent) {\n return new RegExp('^' + regexpContent + '$');\n }\n\n exports.node.parseEndPoint = function(endpoint) {\n var matches = exports.regexp.ES_CORE_API_ENDPOINT.exec(endpoint);\n if (!matches) return;\n return {\n dns: matches[2] || '',\n ipv4: matches[4] || '',\n ipv6: matches[6] || '',\n port: matches[8] || 80\n };\n };\n\n\n exports.raw.block.processSearchResult = function(res, options) {\n options = options || {};\n options.excludeCurrent = angular.isDefined(options.excludeCurrent) ? options.excludeCurrent : true;\n options.fillAvatar = angular.isDefined(options.fillAvatar) ? options.fillAvatar : true;\n options.cleanData = angular.isDefined(options.cleanData) ? options.cleanData : true;\n\n var hasExcludedCurrent = false;\n var hits = (res && res.hits && res.hits.hits || []).reduce(function(res, hit) {\n if (hit._id == 'current' && options.excludeCurrent) {\n hasExcludedCurrent = true;\n return res;\n }\n if (!hit._source) return res;\n var block = new Block(hit._source);\n if (options.cleanData) {\n block.cleanData(); // release data's arrays\n }\n return res.concat(block);\n }, []);\n return {\n hits: hits,\n took: res.took,\n total: res && res.hits && res.hits.total ? (\n hasExcludedCurrent ? res.hits.total-1 : res.hits.total) : 0\n };\n };\n\n exports.block.search = function(currency, options) {\n var request = options ? angular.copy(options) : {};\n delete request.excludeCurrent;\n delete request.fillAvatar;\n delete request.skipData;\n request.from = request.from || 0;\n request.size = request.size || CONSTANTS.DEFAULT_SEARCH_SIZE;\n request._source = options._source || FIELDS.COMMONS;\n if (options._source && options._source == '*') {\n delete request._source;\n }\n\n return exports.raw.block.search(request, {currency: currency})\n .then(function(res) {\n return exports.raw.block.processSearchResult(res, options);\n });\n };\n\n exports.block.searchText = function(currency, text, options) {\n if (options && angular.isUndefined(options.excludeCurrent)) {\n options.excludeCurrent = true;\n }\n var request = options ? angular.copy(options) : {};\n delete request.excludeCurrent;\n delete request.fillAvatar;\n delete request.skipData;\n request.from = request.from || 0;\n request.size = request.size || CONSTANTS.DEFAULT_SEARCH_SIZE;\n request._source = options._source || FIELDS.COMMONS.join(',');\n if (options._source && options._source == '*') {\n delete request._source;\n }\n\n request.currency=currency;\n request.text=text||'';\n\n return exports.raw.block.searchText(request)\n .then(function(res) {\n return exports.raw.block.processSearchResult(res, options);\n });\n };\n\n exports.block.parseSearchText = function(text, filters) {\n\n var unparsedText = text;\n filters = _.keys(REGEXPS.SEARCH_FILTER).reduce(function(res, filterType){\n var matches = REGEXPS.SEARCH_FILTER[filterType].exec(unparsedText);\n if (matches) {\n var filterText = matches[0];\n\n // update rest\n unparsedText = unparsedText.replace(filterText, '');\n\n filterText = filterText.replace(REGEXPS.LAST_AND, '');\n\n var filter = {\n type: filterType,\n text: filterText,\n params: matches\n };\n return res.concat(filter);\n }\n return res;\n }, filters||[]);\n\n return {\n filters: filters,\n text: unparsedText.trim()\n };\n };\n\n return exports;\n }\n\n\n return EsBlockchain();\n}])\n;\n","angular.module('cesium.es.group.services', ['cesium.platform', 'cesium.es.http.services',\n 'cesium.es.profile.services', 'cesium.es.notification.services', 'cesium.es.comment.services'])\n .config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Will force to load this service\n PluginServiceProvider.registerEagerLoadingService('esGroup');\n }\n\n }])\n\n.factory('esGroup', ['$q', '$rootScope', 'csPlatform', 'BMA', 'csSettings', 'esHttp', 'CryptoUtils', 'csWot', 'csWallet', 'esNotification', 'esComment', function($q, $rootScope, csPlatform, BMA, csSettings, esHttp, CryptoUtils, csWot, csWallet, esNotification, esComment) {\n 'ngInject';\n\n var\n listeners,\n defaultLoadSize = 50,\n fields = {\n list: [\"issuer\", \"title\", \"description\", \"type\", \"creationTime\", \"avatar._content_type\"],\n commons: [\"issuer\", \"title\", \"description\", \"creationTime\", \"time\", \"signature\"],\n notifications: [\"issuer\", \"time\", \"hash\", \"read_signature\"]\n },\n exports = {\n _internal: {}\n };\n\n function onWalletInit(data) {\n data.groups = data.groups || {};\n data.groups.unreadCount = null;\n }\n\n function onWalletReset(data) {\n if (data.groups) {\n delete data.groups;\n }\n }\n\n function onWalletLogin(data, deferred) {\n deferred = deferred || $q.defer();\n if (!data || !data.pubkey) {\n deferred.resolve();\n return deferred.promise;\n }\n\n // Count unread notifications\n esNotification.unreadCount(data.pubkey, {codes: {\n includes: ['GROUP_INVITATION'],\n excludes: []\n }})\n .then(function(unreadCount){\n data.groups = data.groups || {};\n data.groups.unreadCount = unreadCount;\n console.debug('[ES] [group] Detecting ' + unreadCount + ' unread notifications');\n deferred.resolve(data);\n })\n .catch(function(err){\n console.error('Error while counting group notifications: ' + (err.message ? err.message : err));\n deferred.resolve(data);\n });\n return deferred.promise;\n }\n\n function readRecordFromHit(hit, html) {\n if (!hit) return;\n var record = hit._source;\n if (html && hit.highlight) {\n if (hit.highlight.title) {\n record.title = hit.highlight.title[0];\n }\n if (hit.highlight.description) {\n record.description = hit.highlight.description[0];\n }\n if (hit.highlight.location) {\n record.location = hit.highlight.location[0];\n }\n if (hit.highlight.tags) {\n data.tags = hit.highlight.tags.reduce(function(res, tag){\n return res.concat(tag.replace('<em>', '').replace('</em>', ''));\n },[]);\n }\n }\n\n // description\n if (html) {\n record.description = esHttp.util.parseAsHtml(record.description);\n }\n\n // avatar\n record.avatar = esHttp.image.fromHit(hit, 'avatar');\n\n // pictures\n if (hit._source.pictures && hit._source.pictures.reduce) {\n record.pictures = hit._source.pictures.reduce(function(res, pic) {\n return res.concat(esHttp.image.fromAttachment(pic.file));\n }, []);\n }\n\n return record;\n }\n\n exports._internal.search = esHttp.post('/group/record/_search');\n\n function _executeSearchRequest(request) {\n return exports._internal.search(request)\n .then(function(res) {\n if (!res || !res.hits || !res.hits.total) {\n return [];\n }\n var groups = res.hits.hits.reduce(function(res, hit) {\n var record = readRecordFromHit(hit, true/*html*/);\n record.id = hit._id;\n return record ? res.concat(record) : res;\n }, []);\n\n console.debug('[ES] [group] Loading {0} groups'.format(groups.length));\n\n return groups;\n });\n }\n\n function getLastGroups(options) {\n options = options || {};\n\n /*if (!csWallet.isLogin()) {\n return $q.when([]);\n }*/\n\n var request = {\n sort: {\n \"time\" : \"desc\"\n },\n from: options.from || 0,\n size: options.size || defaultLoadSize,\n _source: options._source || fields.list\n };\n\n return _executeSearchRequest(request);\n }\n\n function searchGroups(options) {\n options = options || {};\n\n var text = options.text && options.text.trim();\n if (!text) return getLastGroups(options);\n\n var request = {\n from: options.from || 0,\n size: options.size || defaultLoadSize,\n highlight: {fields : {title : {}, tags: {}}},\n _source: options._source || fields.list\n };\n\n\n var matches = [];\n var filters = [];\n // pubkey : use a special 'term', because of 'non indexed' field\n if (BMA.regexp.PUBKEY.test(text /*case sensitive*/)) {\n filters.push({term : { issuer: text}});\n filters.push({term : { pubkey: text}});\n }\n else {\n text = text.toLowerCase();\n var matchFields = [\"title\", \"description\"];\n matches.push({multi_match : { query: text,\n fields: matchFields,\n type: \"phrase_prefix\"\n }});\n matches.push({match : { title: text}});\n matches.push({match : { description: text}});\n }\n\n request.query = {bool: {}};\n if (matches.length > 0) {\n request.query.bool.should = matches;\n }\n if (filters.length > 0) {\n request.query.bool.filter = filters;\n }\n\n\n\n\n return _executeSearchRequest(request);\n }\n\n exports._internal.get = esHttp.get('/group/record/:id');\n exports._internal.getCommons = esHttp.get('/group/record/:id?_source=' + fields.commons.join(','));\n\n function loadData(id, options) {\n options = options || {};\n options.fecthPictures = angular.isDefined(options.fetchPictures) ? options.fetchPictures : false;\n options.html = angular.isDefined(options.html) ? options.html : true;\n\n // Do get source\n var promise = options.fecthPictures ?\n exports._internal.get({id: id}) :\n exports._internal.getCommons({id: id});\n\n return promise\n .then(function(hit) {\n var record = readRecordFromHit(hit, options.html);\n\n // Load issuer (avatar, name, uid, etc.)\n return csWot.extend({pubkey: record.issuer})\n .then(function(issuer) {\n return {\n id: hit._id,\n issuer: issuer,\n record: record\n };\n });\n });\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function addListeners() {\n // Extend csWallet.loadData()\n listeners = [\n csWallet.api.data.on.login($rootScope, onWalletLogin, this),\n csWallet.api.data.on.init($rootScope, onWalletInit, this),\n csWallet.api.data.on.reset($rootScope, onWalletReset, this)\n ];\n }\n\n function refreshState() {\n var enable = esHttp.alive;\n if (!enable && listeners && listeners.length > 0) {\n console.debug(\"[ES] [group] Disable\");\n removeListeners();\n if (csWallet.isLogin()) {\n onWalletReset(csWallet.data);\n }\n }\n else if (enable && (!listeners || listeners.length === 0)) {\n console.debug(\"[ES] [group] Enable\");\n addListeners();\n if (csWallet.isLogin()) {\n onWalletLogin(csWallet.data);\n }\n }\n }\n\n // Default actions\n csPlatform.ready().then(function() {\n esHttp.api.node.on.start($rootScope, refreshState, this);\n esHttp.api.node.on.stop($rootScope, refreshState, this);\n return refreshState();\n });\n\n return {\n record: {\n last: getLastGroups,\n search: searchGroups,\n load: loadData,\n add: esHttp.record.post('/group/record', {tagFields: ['title', 'description']}),\n update: esHttp.record.post('/group/record/:id/_update', {tagFields: ['title', 'description']}),\n remove: esHttp.record.remove('group', 'record'),\n fields: {\n commons: fields.commons\n },\n picture: {\n all: esHttp.get('/group/record/:id?_source=pictures')\n },\n comment: esComment.instance('group')\n }\n };\n}])\n;\n","angular.module('cesium.es.invitation.services', ['cesium.platform',\n 'cesium.es.http.services', 'cesium.es.wallet.services', 'cesium.es.notification.services'])\n\n .config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Will force to load this service\n PluginServiceProvider.registerEagerLoadingService('esInvitation');\n }\n\n }])\n\n.factory('esInvitation', ['$rootScope', '$q', '$timeout', 'CryptoUtils', 'csPlatform', 'Api', 'esHttp', 'csWallet', 'esWallet', 'csWot', 'esNotification', function($rootScope, $q, $timeout, CryptoUtils, csPlatform, Api, esHttp, csWallet, esWallet, csWot, esNotification) {\n 'ngInject';\n\n var\n that = this,\n constants = {\n DEFAULT_LOAD_SIZE: 20\n },\n fields = {\n commons: [\"issuer\", \"time\", \"hash\", \"content\", \"nonce\", \"comment\"]\n },\n api = new Api(this, 'esInvitation'),\n listeners;\n\n that.raw = {\n certification: {\n get: esHttp.get('/invitation/certification/:id?_source:fields'),\n add: esHttp.record.post('/invitation/certification'),\n postSearch: esHttp.post('/invitation/certification/_search'),\n remove: esHttp.record.remove('invitation', 'certification'),\n getIds: esHttp.get('/invitation/certification/_search?q=recipient::pubkey&_source=false&size=1000')\n }\n };\n\n function onWalletInit(data) {\n data.invitations = data.invitations || {};\n data.invitations.unreadCount = null;\n data.invitations.time = null;\n }\n\n function onWalletReset(data) {\n if (data.invitations) {\n delete data.invitations;\n }\n }\n\n function onWalletLoad(data, deferred) {\n deferred = deferred || $q.defer();\n if (!data || !data.pubkey) {\n $timeout(function() {\n deferred.resolve(data);\n });\n return deferred.promise;\n }\n\n var now = Date.now();\n var time = Math.trunc(now / 1000);\n\n // Skip if loaded less than 1 min ago\n // (This is need to avoid reload on login AND load phases)\n if (data.invitations && data.invitations.time && (time - data.invitations.time < 30 /*=30s*/)) {\n console.debug('[ES] [invitation] Skipping load (loaded {0}s ago)'.format(time - data.invitations.time));\n $timeout(function() {\n deferred.resolve(data);\n });\n return deferred.promise;\n }\n\n console.debug('[ES] [invitation] Loading count...');\n\n // Count unread invitations\n countUnreadInvitations(data.pubkey)\n .then(function(unreadCount){\n data.invitations = data.invitations || {};\n data.invitations.unreadCount = unreadCount;\n data.invitations.time = time;\n console.debug('[ES] [invitation] Loaded count (' + unreadCount + ') in '+(Date.now()-now)+'ms');\n deferred.resolve(data);\n })\n .catch(function(err){\n console.error('Error while counting invitation: ' + (err.message ? err.message : err));\n deferred.resolve(data);\n });\n return deferred.promise;\n }\n\n function onWalletCertify(cert) {\n if (!csWallet.data.invitations || !csWallet.data.invitations.list) return;\n\n // Search on invitations\n var invitationstoRemove = _.where(csWallet.data.invitations.list, {\n type: 'certification',\n pubkey: cert.pubkey\n });\n if (!invitationstoRemove || !invitationstoRemove.length) return;\n\n // Remove all invitations related to this pubkey\n return $q.all(\n invitationstoRemove.reduce(function(res, invitation) {\n return res.concat(\n deleteInvitation(invitation)\n );\n }, []));\n }\n\n function onNewInvitationEvent(event) {\n console.debug(\"[ES] [invitation] detected new invitation (from notification service)\");\n\n // If user not auth: simply increment counter\n if (!csWallet.isAuth()) {\n $rootScope.$applyAsync(function() {\n csWallet.data.invitations = csWallet.data.invitations || {};\n csWallet.data.invitations.unreadCount++;\n });\n return;\n }\n\n getInvitationById(event.reference.id, event.reference.type)\n .then(function(invitation){\n csWallet.data.invitations = csWallet.data.invitations || {};\n csWallet.data.invitations.unreadCount++;\n\n // Insert into the result list (if exists = already loaded)\n if (csWallet.data.invitations.list) {\n csWallet.data.invitations.list.splice(0,0,invitation);\n }\n\n // Raise event\n api.data.raise.new(invitation);\n });\n }\n\n function countUnreadInvitations(pubkey) {\n pubkey = pubkey || (csWallet.isLogin() ? csWallet.data.pubkey : pubkey);\n if (!pubkey) {\n throw new Error('User not connected or no pubkey');\n }\n\n var request = {\n query: {\n bool: {\n must: [\n {term: {recipient: pubkey}}\n ]\n }\n }\n };\n\n // TODO : count using size=0\n // and with 'group by' on type\n return esHttp.post('/invitation/certification/_count')(request)\n .then(function(res) {\n return res.count;\n });\n }\n\n function sendInvitation(record, options) {\n options = options || {};\n options.type = options.type || 'certification';\n var keypair = options.keypair || (options.wallet && options.wallet.data.keypair);\n return esWallet.box.record.pack(record, keypair, 'recipient', ['content', 'comment'])\n .then(function(record) {\n return that.raw[options.type].add(record, options);\n });\n }\n\n function getInvitationById(id, type) {\n type = type || 'certification';\n return $q.all([\n esWallet.box.getKeypair(),\n that.raw[type].get({id: id, fields: fields.commons.join(',')})\n ])\n .then(function(res) {\n var keypair = res[0];\n var hit = res[1];\n var json = hit._source;\n json.id = hit._id;\n json.type = hit._type;\n\n // Encrypt content\n return esWallet.box.record.open([json], keypair, 'issuer', ['content', 'comment']);\n })\n\n // Extend identity: add name, avatar...\n .then(function(jsons) {\n var json = jsons[0];\n if (!json || !json.valid) return; // skip invalid cypher content\n var invitation = new Invitation(json);\n\n return csWot.extendAll(invitation.issuer ? [invitation, invitation.issuer] : [invitation], 'pubkey')\n .then(function() {\n return invitation;\n });\n });\n }\n\n function loadInvitations(options, keypair) {\n if (!csWallet.isLogin()) return $q.when([]); // Should never happen\n options = options || {};\n options.from = options.from || 0;\n options.size = options.size || constants.DEFAULT_LOAD_SIZE;\n\n var issuer = options.issuer || csWallet.data.pubkey;\n var request = {\n sort: {\n \"time\" : \"desc\"\n },\n query: {bool: {filter: {term: {recipient: issuer}}}},\n from: options.from,\n size: options.size,\n _source: fields.commons\n };\n\n // Filter on time\n if (options.readTime) {\n query.bool.must = [{range: {time: {gt: options.readTime}}}];\n }\n\n return that.raw.certification.postSearch(request)\n .then(function(res) {\n if (!res || !res.hits || !res.hits.total) return [];\n\n var invitations = res.hits.hits.reduce(function (result, hit) {\n var msg = hit._source;\n msg.id = hit._id;\n msg.type = hit._type;\n msg.read = !!msg.read_signature;\n delete msg.read_signature; // not need anymore\n return result.concat(msg);\n }, []);\n\n // Encrypt content\n return esWallet.box.record.open(invitations, keypair, 'issuer', ['content', 'comment']);\n })\n\n // Extension identities entity\n .then(function(invitations) {\n\n var identitiesToExtend = [];\n invitations = invitations.reduce(function (res, json) {\n if (!json || !json.valid) return res; // skipping invalid cypher\n var invitation = new Invitation(json);\n identitiesToExtend.push(invitation);\n if (invitation.issuer) {\n identitiesToExtend.push(invitation.issuer);\n }\n return res.concat(invitation);\n }, []);\n\n // Extend all identities (issuer and invitation): add name, avatar...\n return csWot.extendAll(identitiesToExtend, 'pubkey')\n\n // Update invitations count\n .then(function(){\n\n csWallet.data.invitations = csWallet.data.invitations || {};\n\n // Update invitation list\n if (!csWallet.data.invitations.list) {\n csWallet.data.invitations.list = invitations;\n }\n else {\n // Reset previous existing invitation\n if (csWallet.data.invitations.list.length) {\n csWallet.data.invitations.list.splice(options.from, csWallet.data.invitations.list.length-options.from);\n }\n // Then insert new invitations\n _.forEach(invitations, function (invitation) {\n csWallet.data.invitations.list.push(invitation);\n });\n }\n\n return csWallet.data.invitations.list; // final result\n });\n });\n }\n\n function deleteInvitation(invitation, options) {\n if (!invitation || !invitation.id) throw 'Invalid invitation (empty or without id). Could not delete.';\n var type = invitation.type || 'certification';\n var wallet = options && options.walletId && csWallet.children.get(options.walletId) || csWallet;\n return that.raw[type].remove(invitation.id, {wallet: wallet})\n .then(function() {\n // Always reset unread count\n wallet.data.invitations.unreadCount = 0;\n\n if (!wallet.data.invitations || !wallet.data.invitations.list) return;\n\n // Remove form list\n wallet.data.invitations.list.splice(wallet.data.invitations.list.indexOf(invitation), 1);\n });\n }\n\n function deleteInvitationsByIds(ids, type, options) {\n if (!ids || !ids.length) return $q.when();\n type = type || 'certification';\n return $q.all(\n ids.reduce(function(res, id) {\n return res.concat(that.raw[type].remove(id, options));\n }, [])\n );\n }\n\n function deleteAllInvitationsByPubkey(type, options) {\n\n type = type || 'certification';\n\n var now = Date.now();\n console.debug('[ES] [invitation] Deleting all {0} invitations...'.format(type));\n\n var wallet = (options && options.pubkey && csWallet.children.getByPubkey(options.pubkey)) ||\n (options && options.walletId && csWallet.children.getByPubkey(options.walletId)) ||\n csWallet;\n var countBeforeDeletion = (wallet.data.invitations && wallet.data.invitations.count) || 0;\n var unreadCountBeforeDeletion = (wallet.data.invitations && wallet.data.invitations.unreadCount) || 0;\n\n // Get invitation ids\n return that.raw[type].getIds({pubkey: wallet.data.pubkey})\n .then(function(res) {\n if (!res || !res.hits || !res.hits.total) return;\n var ids = res.hits.hits.reduce(function (res, hit) {\n return res.concat(hit._id);\n }, []);\n\n // Do deletion by ids\n return deleteInvitationsByIds(ids, type, {walletId: wallet.id})\n .then(function() {\n // Update wallet count\n wallet.data.invitations = wallet.data.invitations || {};\n // Decrement count (warning: could have received new invitations during deletion execution)\n if (wallet.data.invitations.count >= countBeforeDeletion) {\n wallet.data.invitations.count -= countBeforeDeletion || 0;\n }\n else {\n wallet.data.invitations.count = 0;\n }\n // Decrement count (warning: could have received new invitations during deletion execution)\n if (wallet.data.invitations.unreadCount >= unreadCountBeforeDeletion) {\n wallet.data.invitations.unreadCount -= unreadCountBeforeDeletion || 0;\n }\n else {\n wallet.data.invitations.unreadCount = 0;\n }\n\n console.debug('[ES] [invitation] All {0} invitations deleted in {1}ms'.format(type, Date.now()-now));\n });\n });\n }\n\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function addListeners() {\n // Extend csWallet events\n listeners = [\n csWallet.api.data.on.init($rootScope, onWalletInit, this),\n csWallet.api.data.on.login($rootScope, onWalletLoad, this),\n csWallet.api.data.on.load($rootScope, onWalletLoad, this),\n csWallet.api.data.on.reset($rootScope, onWalletReset, this),\n csWallet.api.action.on.certify($rootScope, onWalletCertify, this),\n esNotification.api.event.on.newInvitation($rootScope, onNewInvitationEvent, this)\n ];\n }\n\n function refreshState() {\n var enable = esHttp.alive;\n if (!enable && listeners && listeners.length > 0) {\n console.debug(\"[ES] [invitations] Disable\");\n removeListeners();\n if (csWallet.isLogin()) {\n onWalletReset(csWallet.data);\n }\n }\n else if (enable && (!listeners || listeners.length === 0)) {\n console.debug(\"[ES] [invitations] Enable\");\n addListeners();\n if (csWallet.isLogin()) {\n onWalletLoad(csWallet.data);\n }\n }\n }\n\n // Register extension points\n api.registerEvent('data', 'new');\n\n // Default action\n csPlatform.ready().then(function() {\n esHttp.api.node.on.start($rootScope, refreshState, this);\n esHttp.api.node.on.stop($rootScope, refreshState, this);\n return refreshState();\n });\n\n // Exports\n that.api = api;\n that.load = loadInvitations;\n that.get = getInvitationById;\n that.send = sendInvitation;\n that.delete = deleteInvitation;\n that.deleteByIds = deleteInvitationsByIds;\n that.deleteAll = deleteAllInvitationsByPubkey;\n\n that.constants = constants;\n\n return that;\n}])\n;\n","angular.module('cesium.es.subscription.services', ['cesium.platform', 'cesium.es.http.services'])\n.config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Will force to load this service\n PluginServiceProvider.registerEagerLoadingService('esSubscription');\n }\n\n }])\n\n.factory('esSubscription', ['$rootScope', '$q', '$timeout', 'esHttp', '$state', '$sce', '$sanitize', 'esSettings', 'CryptoUtils', 'UIUtils', 'csWallet', 'csWot', 'BMA', 'csPlatform', 'esWallet', function($rootScope, $q, $timeout, esHttp, $state, $sce, $sanitize,\n esSettings, CryptoUtils, UIUtils, csWallet, csWot, BMA, csPlatform, esWallet) {\n 'ngInject';\n var\n constants = {\n },\n that = this,\n listeners;\n\n that.raw = {\n getAll: esHttp.get('/subscription/record/_search?_source_excludes=recipientContent&q=issuer::issuer'),\n count: esHttp.get('/subscription/record/_search?size=0&q=issuer::pubkey'),\n add: esHttp.record.post('/subscription/record'),\n update: esHttp.record.post('/subscription/record/:id/_update'),\n category: {\n get: esHttp.get('/subscription/category/:id'),\n all: esHttp.get('/subscription/category/_search?sort=order&from=0&size=1000&_source=name,parent,key')\n }\n };\n\n function onWalletReset(data) {\n data.subscriptions = null;\n }\n\n function onWalletLoad(data, deferred) {\n deferred = deferred || $q.defer();\n if (!data || !data.pubkey || !data.keypair) {\n deferred.resolve();\n return deferred.promise;\n }\n\n console.debug('[ES] [subscription] Loading subscriptions count...');\n\n // Load subscriptions count\n that.raw.count({pubkey: data.pubkey})\n .then(function(res) {\n data.subscriptions = data.subscriptions || {};\n data.subscriptions.count = res && res.hits && res.hits.total;\n console.debug('[ES] [subscription] Loaded count (' + data.subscriptions.count + ')');\n deferred.resolve(data);\n })\n .catch(function(err) {\n console.error('[ES] [subscription] Error while counting subscription: ' + (err.message ? err.message : err));\n deferred.resolve(data);\n });\n\n return deferred.promise;\n }\n\n function loadRecordsByPubkey(issuer, keypair) {\n return that.raw.getAll({issuer: issuer})\n .then(function(res) {\n var records = res && res.hits && res.hits.total &&\n res.hits.hits.reduce(function(res, hit) {\n var record = hit._source;\n record.id = hit._id;\n return res.concat(record);\n }, []) || [];\n\n return esWallet.box.record.open(records, keypair, 'issuer', 'issuerContent')\n .then(function(records) {\n _.forEach(records, function(record) {\n record.content = JSON.parse(record.issuerContent || '{}');\n delete record.issuerContent;\n delete record.recipientContent;\n });\n return records;\n });\n });\n }\n\n function addRecord(record, options) {\n if (!record || !record.type || !record.content || !record.recipient) {\n return $q.reject(\"Missing arguments 'record' or 'record.type' or 'record.content' or 'record.recipient'\");\n }\n\n var wallet = options && options.wallet || (options && options.walletId && csWallet.children.get(options.walletId)) || csWallet;\n var issuer = wallet.data.pubkey;\n\n var contentStr = JSON.stringify(record.content);\n\n // Get a unique nonce\n return CryptoUtils.util.random_nonce()\n // Encrypt contents\n .then(function(nonce) {\n return $q.all([\n esWallet.box.record.pack({issuer: issuer, issuerContent: contentStr}, wallet.data.keypair, 'issuer', 'issuerContent', nonce),\n esWallet.box.record.pack({recipient: record.recipient, recipientContent: contentStr}, wallet.data.keypair, 'recipient', 'recipientContent', nonce)\n ]);\n })\n // Merge encrypted record\n .then(function(res){\n var encryptedRecord = angular.merge(res[0], res[1]);\n encryptedRecord.type = record.type;\n\n // Post subscription\n return that.raw.add(encryptedRecord, {wallet: wallet})\n .then(function(id) {\n record.id = id;\n return record;\n });\n })\n ;\n }\n\n function updateRecord(record, options) {\n if (!record || !record.content || !record.recipient) {\n return $q.reject(\"Missing arguments 'record' or 'record.content', or 'record.recipient'\");\n }\n\n var wallet = options && options.wallet || (options && options.walletId && csWallet.children.get(options.walletId)) || csWallet;\n var issuer = wallet.data.pubkey;\n var contentStr = JSON.stringify(record.content);\n\n // Get a unique nonce\n return CryptoUtils.util.random_nonce()\n // Encrypt contents\n .then(function(nonce) {\n return $q.all([\n esWallet.box.record.pack({issuer: issuer, issuerContent: contentStr}, wallet.data.keypair, 'issuer', 'issuerContent', nonce),\n esWallet.box.record.pack({recipient: record.recipient, recipientContent: contentStr}, wallet.data.keypair, 'recipient', 'recipientContent', nonce)\n ]);\n })\n // Merge encrypted record\n .then(function(res){\n var encryptedRecord = angular.merge(res[0], res[1]);\n encryptedRecord.type = record.type;\n\n // Post subscription\n return that.raw.update(encryptedRecord, {id:record.id, wallet: wallet})\n .then(function() {\n return record; // return original record\n });\n })\n ;\n }\n\n function getCategories() {\n if (that.raw.categories && that.raw.categories.length) {\n var deferred = $q.defer();\n deferred.resolve(that.raw.categories);\n return deferred.promise;\n }\n\n return that.raw.category.all()\n .then(function(res) {\n if (res.hits.total === 0) {\n that.raw.categories = [];\n }\n else {\n var categories = res.hits.hits.reduce(function(result, hit) {\n var cat = hit._source;\n cat.id = hit._id;\n return result.concat(cat);\n }, []);\n // add as map also\n _.forEach(categories, function(cat) {\n categories[cat.id] = cat;\n });\n that.raw.categories = categories;\n }\n return that.raw.categories;\n });\n }\n\n function getCategory(params) {\n return that.raw.category.get(params)\n .then(function(hit) {\n var res = hit._source;\n res.id = hit._id;\n return res;\n });\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function addListeners() {\n // Extend\n listeners = [\n csWallet.api.data.on.load($rootScope, onWalletLoad, this),\n csWallet.api.data.on.init($rootScope, onWalletReset, this),\n csWallet.api.data.on.reset($rootScope, onWalletReset, this)\n ];\n }\n\n function refreshState() {\n var enable = esHttp.alive;\n if (!enable && listeners && listeners.length > 0) {\n console.debug(\"[ES] [subscription] Disable\");\n removeListeners();\n if (csWallet.isLogin()) {\n return onWalletReset(csWallet.data);\n }\n }\n else if (enable && (!listeners || listeners.length === 0)) {\n console.debug(\"[ES] [subscription] Enable\");\n addListeners();\n if (csWallet.isLogin()) {\n return onWalletLoad(csWallet.data);\n }\n }\n }\n\n // Default actions\n csPlatform.ready().then(function() {\n esHttp.api.node.on.start($rootScope, refreshState, this);\n esHttp.api.node.on.stop($rootScope, refreshState, this);\n return refreshState();\n });\n\n // Exports\n that.record = {\n load: loadRecordsByPubkey,\n add: addRecord,\n update: updateRecord,\n remove: esHttp.record.remove('subscription', 'record')\n };\n that.category = {\n all: getCategories,\n get: getCategory\n };\n that.constants = constants;\n\n return that;\n}])\n;\n","angular.module('cesium.es.wallet.services', ['ngResource', 'cesium.platform', 'cesium.es.http.services', 'cesium.es.crypto.services'])\n\n .factory('esWallet', ['$q', '$rootScope', '$timeout', 'CryptoUtils', 'csPlatform', 'csWallet', 'csSettings', 'esCrypto', 'esProfile', 'esHttp', function($q, $rootScope, $timeout, CryptoUtils, csPlatform, csWallet, csSettings, esCrypto, esProfile, esHttp) {\n 'ngInject';\n\n var\n listeners,\n that = this;\n\n function onWalletReset(data) {\n data.name = null;\n data.avatar = null;\n data.profile = null;\n data.moderator = null;\n csWallet.events.cleanByContext('esWallet');\n if (data.keypair) {\n delete data.keypair.boxSk;\n delete data.keypair.boxPk;\n }\n }\n\n function onWalletAuth(data, deferred) {\n deferred = deferred || $q.defer();\n\n // Generate box keypair\n esCrypto.box.getKeypair(data.keypair)\n .then(function(res) {\n data.keypair.boxSk = res.boxSk;\n data.keypair.boxPk = res.boxPk;\n console.debug(\"[ES] [wallet] Box keypair successfully computed\");\n deferred.resolve();\n })\n .catch(deferred.reject);\n return deferred.promise;\n }\n\n function onWalletUnauth(data) {\n data = data || csWallet.data;\n if (data.keypair) {\n delete data.keypair.boxSk;\n delete data.keypair.boxPk;\n }\n }\n\n function onWalletLogin(data, deferred) {\n deferred = deferred || $q.defer();\n if (!data || !data.pubkey || !data.keypair) {\n deferred.resolve();\n return deferred.promise;\n }\n\n // Waiting to load crypto libs\n if (!CryptoUtils.isLoaded()) {\n console.debug('[ES] [wallet] Waiting crypto lib loading...');\n return $timeout(function() {\n return onWalletLogin(data, deferred);\n }, 50);\n }\n\n console.debug('[ES] [wallet] Loading user avatar+name...');\n var now = Date.now();\n\n var jobs = [\n esProfile.getAvatarAndName(data.pubkey)\n .then(function(profile) {\n if (profile) {\n data.name = profile.name;\n data.avatarStyle = profile.avatarStyle;\n data.avatar = profile.avatar;\n console.debug('[ES] [wallet] Loaded user avatar+name in '+ (Date.now()-now) +'ms');\n }\n else {\n console.debug('[ES] [wallet] No user avatar+name found');\n }\n deferred.resolve(data);\n })\n ];\n\n // Check if user is a moderators (only if expert mode)\n if (csSettings.data.expertMode) {\n jobs.push(esHttp.node.moderators()\n .then(function(res) {\n data.moderator = _.contains(res && res.moderators, data.pubkey);\n })\n .catch(function(err) {\n console.error(\"[ES] [wallet] Cannot check is user is moderator: \", (err && err.message || err));\n // Continue\n })\n );\n }\n\n $q.all(jobs)\n .then(function() {\n deferred.resolve(data);\n })\n .catch(deferred.reject);\n\n return deferred.promise;\n }\n\n function onWalletLoad(data, deferred) {\n deferred = deferred || $q.defer();\n\n // Reset events\n csWallet.events.cleanByContext('esWallet');\n\n // If membership pending and not revocated, but not enough certifications: suggest to fill user profile\n if (!data.name && !data.requirements.revoked && data.requirements.pendingMembership && data.requirements.needCertificationCount > 0) {\n csWallet.events.add({type:'info', message: 'ACCOUNT.EVENT.MEMBER_WITHOUT_PROFILE', context: 'esWallet'});\n }\n\n console.debug('[ES] [wallet] Loading full user profile...');\n var now = Date.now();\n\n // Load full profile\n esProfile.get(data.pubkey)\n .then(function(profile) {\n if (profile) {\n data.name = profile.name;\n data.avatar = profile.avatar;\n data.profile = data.profile || {};\n angular.merge(data.profile, profile.source, {descriptionHtml: profile.descriptionHtml});\n console.debug('[ES] [wallet] Loaded full user profile in {0}ms'.format(Date.now()-now));\n }\n deferred.resolve(data);\n })\n .catch(deferred.reject);\n\n return deferred.promise;\n }\n\n function getBoxKeypair(keypair) {\n if (!keypair && !csWallet.isAuth()) {\n throw new Error('Unable to get box keypair: user not authenticated !');\n }\n\n return (keypair ? $q.when(keypair) : csWallet.getKeypair({silent: true}))\n .then(function(keypair) {\n // box keypair already computed: use it\n if (keypair && keypair.boxPk && keypair.boxSk) {\n return $q.when(keypair);\n }\n // Compute box keypair\n return esCrypto.box.getKeypair(keypair)\n .then(function(res) {\n // Store in the wallet keypair\n keypair.boxSk = res.boxSk;\n keypair.boxPk = res.boxPk;\n console.debug(\"[ES] [wallet] Box keypair successfully computed\");\n return keypair;\n });\n });\n }\n\n function addListeners() {\n // Extend API events\n listeners = [\n csWallet.api.data.on.login($rootScope, onWalletLogin, this),\n csWallet.api.data.on.load($rootScope, onWalletLoad, this),\n csWallet.api.data.on.init($rootScope, onWalletReset, this),\n csWallet.api.data.on.reset($rootScope, onWalletReset, this),\n csWallet.api.data.on.unauth($rootScope, onWalletUnauth, this),\n csWallet.api.data.on.auth($rootScope, onWalletAuth, this)\n ];\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function refreshState() {\n var enable = esHttp.alive;\n if (!enable && listeners && listeners.length > 0) {\n console.debug(\"[ES] [wallet] Disable\");\n removeListeners();\n if (csWallet.isLogin()) {\n return onWalletReset(csWallet.data);\n }\n }\n else if (enable && (!listeners || listeners.length === 0)) {\n console.debug(\"[ES] [wallet] Enable\");\n addListeners();\n if (csWallet.isLogin()) {\n return onWalletLogin(csWallet.data);\n }\n }\n }\n\n // Default action\n csPlatform.ready().then(function() {\n esHttp.api.node.on.start($rootScope, refreshState, this);\n esHttp.api.node.on.stop($rootScope, refreshState, this);\n return refreshState();\n });\n\n // exports\n that.box = {\n getKeypair: getBoxKeypair,\n record: {\n pack: function(record, keypair, recipientFieldName, cypherFieldNames, nonce) {\n return getBoxKeypair(keypair)\n .then(function(fullKeypair) {\n return esCrypto.box.pack(record, fullKeypair, recipientFieldName, cypherFieldNames, nonce);\n });\n },\n open: function(records, keypair, issuerFieldName, cypherFieldNames) {\n return getBoxKeypair(keypair)\n .then(function(fullKeypair) {\n return esCrypto.box.open(records, fullKeypair, issuerFieldName, cypherFieldNames);\n });\n }\n }\n };\n\n return that;\n }])\n;\n","angular.module('cesium.es.wot.services', ['ngResource', 'cesium.es.http.services'])\n\n .factory('esWot', ['$rootScope', '$q', 'esHttp', 'csCache', function($rootScope, $q, esHttp, csCache) {\n 'ngInject';\n\n var\n cachePrefix = 'esWot-',\n membershipsCache = csCache.get(cachePrefix + 'memberships-', csCache.constants.MEDIUM),\n raw = {\n user: {\n event: esHttp.post('/user/event/_search')\n }\n };\n\n function loadMemberships(pubkey, options) {\n options = options || {};\n\n var result = (options.cache !== false) ? membershipsCache.get(pubkey) : null;\n if (result) return $q.when(result);\n\n // Get user events on membership state\n var request = {\n \"size\": 1000,\n \"query\": {\n \"bool\": {\n \"filter\": [\n {\"term\": {\"recipient\" : pubkey }},\n {\"terms\": {\"code\" : [\"MEMBER_JOIN\",\"MEMBER_ACTIVE\",\"MEMBER_LEAVE\",\"MEMBER_EXCLUDE\",\"MEMBER_REVOKE\"] }}\n ]\n }\n },\n \"sort\" : [\n { \"time\" : {\"order\" : \"asc\"}}\n ],\n _source: [\"code\", \"time\"]\n };\n\n return raw.user.event(request)\n\n .then(function(res) {\n if (!res.hits || !res.hits.total) return;\n\n // Compute member periods\n var lastJoinTime;\n var result = res.hits.hits.reduce(function(res, hit){\n var isMember = hit._source.code === 'MEMBER_JOIN' || hit._source.code === 'MEMBER_ACTIVE';\n // If join\n if (isMember && !lastJoinTime) {\n lastJoinTime = hit._source.time;\n }\n // If leave\n else if (!isMember && lastJoinTime) {\n // Add an entry\n res = res.concat({\n joinTime: lastJoinTime,\n leaveTime: hit._source.time\n });\n lastJoinTime = 0; // reset\n }\n return res;\n }, []);\n\n if (lastJoinTime) {\n // Add last entry if need\n result.push({\n joinTime: lastJoinTime,\n leaveTime: moment().utc().unix()\n });\n }\n\n // Put in the cache\n membershipsCache.put(pubkey, result);\n\n return result;\n });\n }\n\n function cleanAllCache() {\n console.debug(\"[ES] [wot] Cleaning cache {prefix: '{0}'}...\".format(cachePrefix));\n csCache.clear(cachePrefix);\n }\n\n // Listen if node changed\n esHttp.api.node.on.stop($rootScope, cleanAllCache, this);\n\n return {\n memberships: loadMemberships,\n cache: {\n clearAll: cleanAllCache\n }\n };\n }]);\n","angular.module('cesium.es.tx.services', ['ngResource', 'cesium.services', 'cesium.es.http.services', 'cesium.es.wot.services'])\n\n .config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Will force to load this service\n PluginServiceProvider.registerEagerLoadingService('esTx');\n }\n\n }])\n\n .factory('esTx', ['$q', '$rootScope', 'csPlatform', 'csCurrency', 'csTx', 'esHttp', 'esWot', function($q, $rootScope, csPlatform, csCurrency, csTx, esHttp, esWot) {\n 'ngInject';\n\n var\n listeners,\n raw = {\n block: {\n search: esHttp.post('/:currency/block/_search')\n }\n };\n\n function _powBase(amount, base) {\n return base <= 0 ? amount : amount * Math.pow(10, base);\n }\n\n function onLoadUDs(options, deferred) {\n deferred = deferred || $q.defer();\n\n options = options || {};\n if (!options.pubkey) deferred.reject('Missing [pubkey] when calling [loadUDs] extension point');\n\n $q.all([\n // Get currency\n csCurrency.get(),\n\n // Get user memberships\n esWot.memberships(options.pubkey)\n ])\n .then(function(res) {\n var currency = res[0] && res[0].name;\n var memberships = res[1];\n if (!currency || !memberships || !memberships.length) return;\n\n // Filter memberships using options.fromTime\n if (options.fromTime !== -1) {\n memberships = memberships.reduce(function(res, membership) {\n if (membership.leaveTime < options.fromTime) return res;\n membership.joinTime = Math.max(membership.joinTime, options.fromTime);\n return res.concat(membership);\n }, []);\n }\n\n return $q.all(memberships.reduce(function(res, membership) {\n var request = {\n query: {\n filtered: {\n filter: {\n bool: {\n must: [\n {\n exists: {\n field: 'dividend'\n }\n },\n {\n range: {\n medianTime: {\n // Fix #736: Add 1 second, because when membership begins in a block with DU, the DU is not received\n from: membership.joinTime+1,\n to: membership.leaveTime\n }\n }\n }\n ]\n }\n }\n }\n },\n size: options.size || 10000, // TODO: use scroll ?\n from: options.from || 0,\n sort: {\"medianTime\" : \"desc\"},\n _source: [\"medianTime\", \"number\", \"dividend\", \"unitbase\"]\n };\n return res.concat(raw.block.search(request, {currency: currency}));\n }, []));\n })\n .then(function(res){\n if (!res || !res.length) return;\n return res.reduce(function(uds, res){\n\n if (!res.hits.total || !res.hits.hits.length) return res;\n\n return uds.concat(res.hits.hits.reduce(function(res, hit){\n var block = hit._source;\n return res.concat({\n time: block.medianTime,\n amount: _powBase(block.dividend, block.unitbase),\n isUD: true,\n block_number: block.number\n });\n }, []));\n\n }, []);\n\n })\n .then(function(res){\n deferred.resolve(res);\n })\n .catch(function(err) {\n deferred.reject(err);\n });\n\n return deferred.promise;\n }\n\n function addListeners() {\n // Extend API events\n listeners = [\n csTx.api.data.on.loadUDs($rootScope, onLoadUDs, this)\n ];\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function refreshState() {\n var enable = esHttp.alive;\n if (!enable && listeners && listeners.length > 0) {\n console.debug(\"[ES] [tx] Disable\");\n removeListeners();\n }\n else if (enable && (!listeners || listeners.length === 0)) {\n console.debug(\"[ES] [tx] Enable\");\n addListeners();\n }\n }\n\n // Default action\n csPlatform.ready().then(function() {\n esHttp.api.node.on.start($rootScope, refreshState, this);\n esHttp.api.node.on.stop($rootScope, refreshState, this);\n return refreshState();\n });\n\n // Exports\n return {};\n }]);\n","angular.module('cesium.es.geo.services', ['cesium.services', 'cesium.es.http.services'])\n .config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Will force to load this service\n PluginServiceProvider.registerEagerLoadingService('esGeo');\n }\n\n }])\n\n .factory('esGeo', ['$rootScope', '$q', 'csConfig', 'csSettings', 'csHttp', function($rootScope, $q, csConfig, csSettings, csHttp) {\n 'ngInject';\n\n var\n that = this;\n\n that.raw = {\n osm: {\n search: csHttp.get('nominatim.openstreetmap.org', 443, '/search.php?format=json'),\n license: {\n name: 'OpenStreetMap',\n url: 'https://www.openstreetmap.org/copyright'\n }\n },\n google: {\n apiKey: undefined,\n search: csHttp.get('maps.google.com', 443, '/maps/api/geocode/json')\n },\n freegeoip: {\n //search: csHttp.get('localhost', 8080, '/json/:ip'),\n search: csHttp.get('freegeoip.net', 443, '/json/:ip'),\n license: {\n name: 'freegeoip',\n url: 'https://freegeoip.net'\n }\n }\n };\n\n function _normalizeAddressString(text) {\n // Remove line break\n var searchText = text.trim().replace(/\\n/g, ',');\n // Remove zip code\n searchText = searchText.replace(/(?:^|[\\t\\n\\r\\s ])([AZ09-]+)(?:$|[\\t\\n\\r\\s ])/g, '');\n // Remove redundant comma\n searchText = searchText.replace(/,[ ,]+/g, ', ');\n return searchText;\n }\n\n function googleSearchPositionByString(address) {\n\n return that.raw.google.search({address: address, key: that.raw.google.apiKey})\n .then(function(res) {\n if (!res || !res.results || !res.results.length) return;\n return res.results.reduce(function(res, hit) {\n return res.concat({\n display_name: hit.address_components && hit.address_components.reduce(function(res, address){\n return address.long_name ? res.concat(address.long_name) : res;\n }, []).join(', '),\n lat: hit.geometry && hit.geometry.location && hit.geometry.location.lat,\n lon: hit.geometry && hit.geometry.location && hit.geometry.location.lng\n });\n }, []);\n });\n }\n\n function _fallbackSearchPositionByString(osmErr, address) {\n\n console.debug('[ES] [geo] Search position failed on [OSM]. Trying [google] service');\n\n return googleSearchPositionByString(address)\n .catch(function(googleErr) {\n console.debug('[ES] [geo] Search position failed on [google] service');\n throw osmErr || googleErr; // throw first OMS error if exists\n });\n }\n\n function searchPositionByAddress(query) {\n\n if (typeof query == 'string') {\n query = {q: query};\n }\n\n // Normalize query string\n if (query.q) {\n query.q = _normalizeAddressString(query.q);\n }\n\n query.addressdetails = 1; // need address field\n\n var now = Date.now();\n //console.debug('[ES] [geo] Searching position...', query);\n\n return that.raw.osm.search(query)\n .then(function(res) {\n //console.debug('[ES] [geo] Received {0} results from OSM'.format(res && res.length || 0), res);\n if (!res) return; // no result\n\n // Filter on city/town/village\n res = res.reduce(function(res, hit){\n if (hit.class == 'waterway' || hit.class == 'railway' ||!hit.address) return res;\n hit.address.city = hit.address.city || hit.address.village || hit.address.town || hit.address.postcode;\n hit.address.road = hit.address.road || hit.address.suburb || hit.address.hamlet;\n if (hit.address.postcode && hit.address.city == hit.address.postcode) {\n delete hit.address.postcode;\n }\n if (!hit.address.city) return res;\n return res.concat({\n id: hit.place_id,\n name: hit.display_name,\n address: hit.address,\n lat: hit.lat,\n lon: hit.lon,\n class: hit.class,\n license: that.raw.osm.license\n });\n }, []);\n\n console.debug('[ES] [geo] Found {0} address position(s)'.format(res && res.length || 0, Date.now() - now), res);\n\n return res.length ? res : undefined;\n })\n\n // Fallback service\n .catch(function(err) {\n var address = query.q ? query.q : ((query.street ? query.street +', ' : '') + query.city + (query.country ? ', '+ query.country : ''));\n return _fallbackSearchPositionByString(err, address);\n });\n }\n\n function getCurrentPosition() {\n var defer = $q.defer();\n if (navigator.geolocation) {\n navigator.geolocation.getCurrentPosition(function(position) {\n if (!position || !position.coords) {\n console.error('[ES] [geo] navigator geolocation > Unknown format:', position);\n return;\n }\n defer.resolve({\n lat: position.coords.latitude,\n lon: position.coords.longitude\n });\n }, function(error) {\n defer.reject(error);\n },{timeout:5000});\n }else{\n defer.reject();\n }\n return defer.promise;\n }\n\n function searchPositionByIP(ip) {\n\n //var now = new Date();\n //console.debug('[ES] [geo] Searching IP position [{0}]...'.format(ip));\n\n return that.raw.freegeoip.search({ip: ip})\n .then(function(res) {\n //console.debug('[ES] [geo] Found IP {0} position in {0}ms'.format(res ? 1 : 0, Date.now() - now.getTime()));\n return res ? {\n lat: res.latitude,\n lng: res.longitude\n } : undefined;\n });\n }\n\n // Source: http://www.geodatasource.com/developers/javascript\n // Unit: 'M' is statute miles (default), 'Km' is kilometers, 'N' is nautical miles\n function getDistance(lat1, lon1, lat2, lon2, unit) {\n var radlat1 = Math.PI * lat1/180;\n var radlat2 = Math.PI * lat2/180;\n var theta = lon1-lon2;\n var radtheta = Math.PI * theta/180;\n var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);\n dist = Math.acos(dist);\n dist = dist * 180/Math.PI;\n dist = dist * 60 * 1.1515;\n // nautical miles\n if (unit == \"km\") { return dist * 1.609344; }\n // nautical miles\n if (unit == \"N\") return dist * 0.8684;\n // statute miles\n return dist;\n }\n\n that.raw.google.apiKey = csConfig.plugins && csConfig.plugins.es && csConfig.plugins.es.googleApiKey;\n var hasConfigApiKey = !!that.raw.google.apiKey;\n csSettings.ready()\n .then(function() {\n\n // Listen settings changed\n function onSettingsChanged(data){\n if (!hasConfigApiKey) {\n // If no google api key in config, use in settings\n that.raw.google.apiKey = data.plugins.es.googleApiKey;\n }\n that.raw.google.enable = that.raw.google.apiKey && data.plugins && data.plugins.es && data.plugins.es.enableGoogleApi;\n }\n csSettings.api.data.on.changed($rootScope, onSettingsChanged, this);\n\n onSettingsChanged(csSettings.data);\n });\n\n return {\n point: {\n current: getCurrentPosition,\n searchByAddress: searchPositionByAddress,\n distance: getDistance,\n ip: {\n search: searchPositionByIP,\n license: that.raw.freegeoip.license\n }\n },\n google: {\n isEnable: function() {\n return that.raw.google.enable && that.raw.google.apiKey;\n },\n searchByAddress: googleSearchPositionByString\n }\n };\n }]);\n","angular.module('cesium.es.document.services', ['ngResource', 'cesium.platform', 'cesium.es.http.services'])\n .config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Will force to load this service\n PluginServiceProvider.registerEagerLoadingService('esDocument');\n }\n\n }])\n\n .factory('esDocument', ['$q', '$rootScope', '$timeout', 'UIUtils', 'Api', 'CryptoUtils', 'csPlatform', 'csConfig', 'csSettings', 'csWot', 'csWallet', 'esHttp', function($q, $rootScope, $timeout, UIUtils, Api, CryptoUtils,\n csPlatform, csConfig, csSettings, csWot, csWallet, esHttp) {\n 'ngInject';\n\n var\n constants = {\n DEFAULT_LOAD_SIZE: 40\n },\n fields = {\n commons: [\"issuer\", \"pubkey\", \"hash\", \"time\", \"recipient\", \"nonce\", \"read_signature\"],\n peer: [\"*\"],\n movement: [\"*\"]\n },\n raw = {\n search: esHttp.post('/:index/:type/_search'),\n searchText: esHttp.get('/:index/:type/_search?q=:text&_source=:source')\n };\n\n function _initOptions(options) {\n if (!options || !options.index || !options.type) throw new Error('Missing mandatory options [index, type]');\n\n var side = 'desc';\n if (options.type === 'peer') {\n if (!options.sort || options.sort.time) {\n side = options.sort && options.sort.time || side;\n options.sort = {\n 'stats.medianTime': {\n nested_path: 'stats',\n order: side\n }\n };\n }\n options._source = fields.peer;\n options.getTimeFunction = function(doc) {\n doc.time = doc.stats && doc.stats.medianTime;\n return doc.time;\n };\n }\n else if (options.type === 'movement') {\n if (!options.sort || options.sort.time) {\n side = options.sort && options.sort.time || side;\n options.sort = {'medianTime': side};\n }\n options._source = options._source || fields.movement;\n options.getTimeFunction = function(doc) {\n doc.time = doc.medianTime;\n return doc.time;\n };\n }\n\n return options;\n }\n\n function _readSearchHits(res, options) {\n options.issuerField = options.issuerField || 'pubkey';\n\n var hits = (res && res.hits && res.hits.hits || []).reduce(function(res, hit) {\n var doc = hit._source || {};\n doc.docType = doc.type; // Save source.type, before replacement\n doc.index = hit._index;\n doc.type = hit._type;\n doc.id = hit._id;\n doc.pubkey = doc.issuer || options.issuerField && doc[options.issuerField] || doc.pubkey; // need to call csWot.extendAll()\n doc.time = options.getTimeFunction && options.getTimeFunction(doc) || doc.time;\n doc.thumbnail = esHttp.image.fromHit(hit, 'avatar') || esHttp.image.fromHit(hit, 'thumbnail');\n return res.concat(doc);\n }, []);\n\n\n var recipients = hits.reduce(function(res, doc) {\n if (doc.recipient) {\n doc.recipient = {\n pubkey: doc.recipient\n };\n return res.concat(doc.recipient);\n }\n return res;\n }, []);\n\n return csWot.extendAll(hits.concat(recipients))\n .then(function() {\n return {\n hits: hits,\n took: res.took,\n total: res && res.hits && res.hits.total || 0\n };\n });\n }\n\n function readSearchHit(hit) {\n var options = _initOptions({\n index: hit._index,\n type: hit._type\n });\n\n return _readSearchHits({\n hits: {\n hits: [hit]\n }\n }, options)\n .then(function(res) {\n return res.hits[0];\n });\n }\n\n function search(options) {\n options = _initOptions(options);\n\n var request = {\n from: options.from || 0,\n size: options.size || constants.DEFAULT_LOAD_SIZE,\n sort: options.sort || {time:'desc'},\n _source: options._source || fields.commons\n };\n if (options.query) {\n request.query = options.query;\n }\n\n return raw.search(request, {\n index: options.index,\n type: options.type\n })\n .then(function(res) {\n return _readSearchHits(res, options);\n });\n }\n\n function searchText(queryString, options) {\n\n options = options || {};\n\n var request = {\n text: queryString,\n index: options.index || 'user',\n type: options.type || 'profiles',\n from: options.from || 0,\n size: options.size || constants.DEFAULT_LOAD_SIZE,\n sort: options.sort || 'time:desc',\n source: options._source && options._source.join(',') || fields.commons.join(',')\n };\n\n console.debug('[ES] [wallet] [document] [{0}/{1}] Loading documents...'.format(\n options.index,\n options.type\n ));\n var now = Date.now();\n\n return raw.searchText(request)\n .then(function(res) {\n return _readSearchHits(res, options);\n })\n .then(function(res) {\n console.debug('[ES] [document] [{0}/{1}] Loading {2} documents in {3}ms'.format(\n options.index,\n options.type,\n res && res.hits && res.hits.length || 0,\n Date.now() - now\n ));\n return res;\n });\n }\n\n function remove(document, options) {\n if (!document || !document.index || !document.type || !document.id) return $q.reject('Could not remove document: missing mandatory fields');\n\n return esHttp.record.remove(document.index, document.type)(document.id, options);\n }\n\n function removeAll(documents, options) {\n if (!documents || !documents.length) return;\n\n var wallet = options && options.walletId && csWallet.children.get(options.walletId) || csWallet;\n\n return wallet.auth() // Auth once\n .then(function() {\n // Remove each doc\n return $q.all(documents.reduce(function (res, doc) {\n return res.concat(esHttp.record.remove(doc.index, doc.type)(doc.id, {wallet: wallet}));\n }, []));\n });\n }\n\n return {\n search: search,\n searchText: searchText,\n remove: remove,\n removeAll: removeAll,\n fields: {\n commons: fields.commons\n },\n fromHit: readSearchHit\n };\n }])\n;\n","\nangular.module('cesium.es.network.services', ['ngApi', 'cesium.es.http.services'])\n\n.factory('esNetwork', ['$rootScope', '$q', '$interval', '$timeout', '$window', 'csSettings', 'csConfig', 'esHttp', 'Api', 'BMA', function($rootScope, $q, $interval, $timeout, $window, csSettings, csConfig, esHttp, Api, BMA) {\n 'ngInject';\n\n function EsNetwork(id) {\n\n var\n interval,\n constants = {\n UNKNOWN_BUID: -1\n },\n isHttpsMode = $window.location.protocol === 'https:',\n api = new Api(this, \"csNetwork-\" + id),\n\n data = {\n pod: null,\n listeners: [],\n loading: true,\n peers: [],\n filter: {\n endpointFilter: null,\n online: true,\n ssl: undefined,\n tor: undefined\n },\n sort:{\n type: null,\n asc: true,\n compact: true\n },\n groupBy: 'pubkey',\n expertMode: false,\n knownBlocks: [],\n mainBlock: null,\n searchingPeersOnNetwork: false,\n timeout: csConfig.timeout\n },\n\n // Return the block uid\n buid = function(block) {\n return block && [block.number, block.hash].join('-');\n },\n\n resetData = function() {\n data.pod = null;\n data.listeners = [];\n data.peers.splice(0);\n data.filter = {\n endpointFilter: null,\n online: true\n };\n data.sort = {\n type: null,\n asc: true\n };\n data.groupBy = 'pubkey';\n data.expertMode = false;\n data.knownBlocks = [];\n data.mainBlock = null;\n data.loading = true;\n data.searchingPeersOnNetwork = false;\n data.timeout = csConfig.timeout;\n\n data.document = {\n index : csSettings.data.plugins.es && csSettings.data.plugins.es.document && csSettings.data.plugins.es.document.index || 'user',\n type: csSettings.data.plugins.es && csSettings.data.plugins.es.document && csSettings.data.plugins.es.document.type || 'profile'\n };\n },\n\n hasPeers = function() {\n return data.peers && data.peers.length > 0;\n },\n\n getPeers = function() {\n return data.peers;\n },\n\n isBusy = function() {\n return data.loading;\n },\n\n getKnownBlocks = function() {\n return data.knownBlocks;\n },\n\n loadPeers = function() {\n data.peers = [];\n data.searchingPeersOnNetwork = true;\n data.loading = true;\n data.pod = data.pod || esHttp;\n var newPeers = [];\n\n if (interval) {\n $interval.cancel(interval);\n }\n\n interval = $interval(function() {\n // not same job instance\n if (newPeers.length) {\n flushNewPeersAndSort(newPeers);\n }\n else if (data.loading && !data.searchingPeersOnNetwork) {\n data.loading = false;\n $interval.cancel(interval);\n // The peer lookup end, we can make a clean final report\n sortPeers(true/*update main buid*/);\n\n console.debug('[network] Finish: {0} peers found.'.format(data.peers.length));\n }\n }, 1000);\n\n return $q.when()\n .then(function(){\n // online nodes\n if (data.filter.online) {\n return data.pod.network.peers()\n .then(function(res){\n var jobs = [];\n _.forEach(res.peers, function(json) {\n if (json.status !== 'UP') return;\n jobs.push(addOrRefreshPeerFromJson(json, newPeers));\n });\n\n if (jobs.length) return $q.all(jobs);\n })\n .catch(function(err) {\n // Log and continue\n console.error(err);\n });\n }\n\n // offline nodes\n return data.pod.network.peers()\n .then(function(res){\n var jobs = [];\n _.forEach(res.peers, function(json) {\n if (json.status === 'UP') return;\n jobs.push(addOrRefreshPeerFromJson(json, newPeers));\n });\n if (jobs.length) return $q.all(jobs);\n });\n })\n .then(function(){\n data.searchingPeersOnNetwork = false;\n })\n .catch(function(err){\n console.error(err);\n data.searchingPeersOnNetwork = false;\n });\n },\n\n /**\n * Apply filter on a peer. (peer uid should have been filled BEFORE)\n */\n applyPeerFilter = function(peer) {\n // no filter\n if (!data.filter) return true;\n\n // Filter on endpoints\n if (data.filter.endpointFilter &&\n (peer.ep && peer.ep.api && peer.ep.api !== data.filter.endpointFilter || !peer.hasEndpoint(data.filter.endpointFilter))) {\n return false;\n }\n\n // Filter on status\n if (!data.filter.online && peer.status === 'UP') {\n return false;\n }\n\n // Filter on ssl\n if (angular.isDefined(data.filter.ssl) && peer.isSsl() != data.filter.ssl) {\n return false;\n }\n\n // Filter on tor\n if (angular.isDefined(data.filter.tor) && peer.isTor() != data.filter.tor) {\n return false;\n }\n\n return true;\n },\n\n addOrRefreshPeerFromJson = function(json, list) {\n list = list || data.newPeers;\n\n var peers = createPeerEntities(json);\n var hasUpdates = false;\n\n var jobs = peers.reduce(function(jobs, peer) {\n var existingPeer = _.findWhere(data.peers, {id: peer.id});\n var existingMainBuid = existingPeer ? existingPeer.buid : null;\n var existingOnline = existingPeer ? existingPeer.online : false;\n\n return jobs.concat(\n refreshPeer(peer)\n .then(function (refreshedPeer) {\n if (existingPeer) {\n // remove existing peers, when reject or offline\n if (!refreshedPeer || (refreshedPeer.online !== data.filter.online && data.filter.online !== 'all')) {\n var existingIndex = data.peers.indexOf(existingPeer);\n if (existingIndex !== -1) {\n console.debug('[network] Peer [{0}] removed (cause: {1})'.format(peer.server, !refreshedPeer ? 'filtered' : (refreshedPeer.online ? 'UP': 'DOWN')));\n data.peers.splice(existingIndex, 1);\n hasUpdates = true;\n }\n }\n else if (refreshedPeer.buid !== existingMainBuid){\n console.debug('[network] {0} endpoint [{1}] new current block'.format(\n refreshedPeer.ep && refreshedPeer.ep.api || '',\n refreshedPeer.server));\n hasUpdates = true;\n }\n else if (existingOnline !== refreshedPeer.online){\n console.debug('[network] {0} endpoint [{1}] is now {2}'.format(\n refreshedPeer.ep && refreshedPeer.ep.api || '',\n refreshedPeer.server,\n refreshedPeer.online ? 'UP' : 'DOWN'));\n hasUpdates = true;\n }\n else {\n console.debug(\"[ES] [network] {0} endpoint [{1}] unchanged\".format(\n refreshedPeer.ep && refreshedPeer.ep.api || '',\n refreshedPeer.server));\n }\n }\n else if (refreshedPeer && (refreshedPeer.online === data.filter.online || data.filter.online === 'all')) {\n console.debug(\"[ES] [network] {0} endpoint [{1}] is {2}\".format(\n refreshedPeer.ep && refreshedPeer.ep.api || '',\n refreshedPeer.server,\n refreshedPeer.online ? 'UP' : 'DOWN'\n ));\n list.push(refreshedPeer);\n hasUpdates = true;\n }\n })\n );\n }, []);\n return (jobs.length === 1 ? jobs[0] : $q.all(jobs))\n .then(function() {\n return hasUpdates;\n });\n },\n\n createPeerEntities = function(json, ep) {\n if (!json) return [];\n var peer = new EsPeer(json);\n\n // Read endpoints\n if (!ep) {\n var endpointsAsString = peer.getEndpoints();\n if (!endpointsAsString) return []; // no BMA\n\n var endpoints = endpointsAsString.reduce(function (res, epStr) {\n var ep = esHttp.node.parseEndPoint(epStr);\n return ep ? res.concat(ep) : res;\n }, []);\n\n // recursive call, on each endpoint\n if (endpoints.length > 1) {\n return endpoints.reduce(function (res, ep) {\n return res.concat(createPeerEntities(json, ep));\n }, []);\n }\n else {\n // if only one endpoint: use it and continue\n ep = endpoints[0];\n }\n }\n peer.ep = ep;\n peer.server = peer.getServer();\n peer.dns = peer.getDns();\n peer.blockNumber = peer.block && peer.block.replace(/-.+$/, '');\n peer.id = peer.keyID();\n return [peer];\n },\n\n refreshPeer = function(peer) {\n\n // Apply filter\n if (!applyPeerFilter(peer)) return $q.when();\n\n if (!data.filter.online || (!data.filter.online && peer.status === 'DOWN') || !peer.getHost() /*fix #537*/) {\n peer.online = false;\n return $q.when(peer);\n }\n\n // App running in SSL: Do not try to access not SSL node,\n if (isHttpsMode && !peer.isSsl()) {\n peer.online = (peer.status === 'UP');\n peer.buid = constants.UNKNOWN_BUID;\n delete peer.version;\n\n return $q.when(peer);\n }\n\n // Do not try to access TOR or WS2P endpoints\n if (peer.ep.useTor) {\n peer.online = (peer.status == 'UP');\n peer.buid = constants.UNKNOWN_BUID;\n delete peer.software;\n delete peer.version;\n return $q.when(peer);\n }\n\n peer.api = peer.api || esHttp.lightInstance(peer.getHost(), peer.getPort(), peer.isSsl(), data.timeout);\n\n // Get current block\n return peer.api.blockchain.current()\n .then(function(block) {\n peer.currentNumber = block.number;\n peer.online = true;\n peer.buid = buid(block);\n peer.medianTime = block.medianTime;\n if (data.knownBlocks.indexOf(peer.buid) === -1) {\n data.knownBlocks.push(peer.buid);\n }\n return peer;\n })\n .catch(function(err) {\n // Special case for currency init (root block not exists): use fixed values\n if (err && err.ucode == BMA.errorCodes.NO_CURRENT_BLOCK) {\n peer.online = true;\n peer.buid = buid({number:0, hash: BMA.constants.ROOT_BLOCK_HASH});\n peer.difficulty = 0;\n return peer;\n }\n if (!peer.secondTry) {\n var ep = peer.ep || peer.getEP();\n if (ep.dns && peer.server.indexOf(ep.dns) === -1) {\n // try again, using DNS instead of IPv4 / IPV6\n peer.secondTry = true;\n peer.api = esHttp.lightInstance(ep.dns, peer.getPort(), peer.isSsl(), data.timeout);\n return refreshPeer(peer); // recursive call\n }\n }\n\n peer.online=false;\n peer.currentNumber = null;\n peer.buid = null;\n return peer;\n })\n .then(function(peer) {\n // Exit if offline\n if (!data.filter.online || !peer || !peer.online) return peer;\n\n peer.docCount = {};\n\n return $q.all([\n // Get summary (software and version) - expert mode only\n !data.expertMode ? $q.when() : peer.api.node.summary()\n .then(function(res){\n peer.software = res && res.duniter && res.duniter.software || undefined;\n peer.version = res && res.duniter && res.duniter.version || '?';\n })\n .catch(function() {\n peer.software = undefined;\n peer.version = '?';\n }),\n\n // Count documents\n peer.api.record.count(data.document.index,data.document.type)\n .then(function(count){\n peer.docCount.record = count;\n })\n .catch(function() {\n peer.docCount.record = undefined;\n }),\n\n // Count email subscription\n peer.api.subscription.count({recipient: peer.pubkey, type: 'email'})\n .then(function(res){\n peer.docCount.emailSubscription = res;\n })\n .catch(function() {\n peer.docCount.emailSubscription = undefined; // continue\n })\n ]);\n\n })\n .then(function() {\n // Clean the instance\n delete peer.api;\n return peer;\n });\n },\n\n flushNewPeersAndSort = function(newPeers, updateMainBuid) {\n newPeers = newPeers || data.newPeers;\n if (!newPeers.length) return;\n var ids = _.map(data.peers, function(peer){\n return peer.id;\n });\n var hasUpdates = false;\n var newPeersAdded = 0;\n _.forEach(newPeers.splice(0), function(peer) {\n if (!ids[peer.id]) {\n data.peers.push(peer);\n ids[peer.id] = peer;\n hasUpdates = true;\n newPeersAdded++;\n }\n });\n if (hasUpdates) {\n console.debug('[network] Flushing {0} new peers...'.format(newPeersAdded));\n sortPeers(updateMainBuid);\n }\n },\n\n computeScoreAlphaValue = function(value, nbChars, asc) {\n if (!value) return 0;\n var score = 0;\n value = value.toLowerCase();\n if (nbChars > value.length) {\n nbChars = value.length;\n }\n score += value.charCodeAt(0);\n for (var i=1; i < nbChars; i++) {\n score += Math.pow(0.001, i) * value.charCodeAt(i);\n }\n return asc ? (1000 - score) : score;\n },\n\n sortPeers = function(updateMainBuid) {\n // Construct a map of buid, with peer count and medianTime\n var buids = {};\n _.forEach(data.peers, function(peer){\n if (peer.buid) {\n var buid = buids[peer.buid];\n if (!buid || !buid.medianTime) {\n buid = {\n buid: peer.buid,\n medianTime: peer.medianTime,\n count: 0\n };\n buids[peer.buid] = buid;\n }\n // If not already done, try to fill medianTime (need to compute consensusBlockDelta)\n else if (!buid.medianTime && peer.medianTime) {\n buid.medianTime = peer.medianTime;\n }\n if (buid.buid !== constants.UNKNOWN_BUID) {\n buid.count++;\n }\n }\n });\n // Compute pct of use, per buid\n _.forEach(_.values(buids), function(buid) {\n buid.pct = buid.count * 100 / data.peers.length;\n });\n var mainBlock = _.max(buids, function(obj) {\n return obj.count;\n });\n _.forEach(data.peers, function(peer){\n peer.hasMainConsensusBlock = peer.buid == mainBlock.buid;\n peer.hasConsensusBlock = peer.buid && !peer.hasMainConsensusBlock && buids[peer.buid].count > 1;\n if (peer.hasConsensusBlock) {\n peer.consensusBlockDelta = buids[peer.buid].medianTime - mainBlock.medianTime;\n }\n });\n data.peers = _.uniq(data.peers, false, function(peer) {\n return peer.id;\n });\n data.peers = _.sortBy(data.peers, function(peer) {\n var score = 0;\n if (data.sort.type) {\n var sortScore = 0;\n sortScore += (data.sort.type == 'name' ? computeScoreAlphaValue(peer.name, 10, data.sort.asc) : 0);\n sortScore += (data.sort.type == 'software' ? computeScoreAlphaValue(peer.software, 10, data.sort.asc) : 0);\n sortScore += (data.sort.type == 'api') &&\n ((peer.hasEndpoint('ES_SUBSCRIPTION_API') && (data.sort.asc ? 1 : -1) || 0) +\n (peer.hasEndpoint('ES_USER_API') && (data.sort.asc ? 0.01 : -0.01) || 0) +\n (peer.isSsl() && (data.sort.asc ? 0.75 : -0.75) || 0)) || 0;\n sortScore += (data.sort.type == 'doc_count' ? (peer.docCount ? (data.sort.asc ? (1000000000 - peer.docCount) : peer.docCount) : 0) : 0);\n score += (10000000000 * sortScore);\n }\n score += (1000000000 * (peer.online ? 1 : 0));\n score += (100000000 * (peer.hasMainConsensusBlock ? 1 : 0));\n score += (1000000 * (peer.hasConsensusBlock ? buids[peer.buid].pct : 0));\n if (data.expertMode) {\n score += (100 * (peer.difficulty ? (10000-peer.difficulty) : 0));\n score += (1 * (peer.uid ? computeScoreAlphaValue(peer.uid, 2, true) : 0));\n }\n else {\n score += (100 * (peer.uid ? computeScoreAlphaValue(peer.uid, 2, true) : 0));\n score += (1 * (!peer.uid ? computeScoreAlphaValue(peer.pubkey, 2, true) : 0));\n }\n return -score;\n });\n\n if (data.groupBy) {\n var previousPeer;\n data.peers.forEach(function(peer) {\n peer.compacted = (previousPeer && peer[data.groupBy] && peer[data.groupBy] === previousPeer[data.groupBy]);\n previousPeer = peer;\n });\n }\n\n // Raise event on new main block\n if (updateMainBuid && mainBlock && mainBlock.buid && (!data.mainBlock || data.mainBlock.buid !== mainBlock.buid)) {\n data.mainBlock = mainBlock;\n api.data.raise.mainBlockChanged(mainBlock);\n }\n\n // Raise event when changed\n api.data.raise.changed(data); // raise event\n },\n\n removeListeners = function() {\n _.forEach(data.listeners, function(remove){\n remove();\n });\n data.listeners = [];\n },\n\n addListeners = function() {\n data.listeners = [\n\n // Listen for new block\n data.pod.websocket.block().onListener(function(block) {\n if (!block || data.loading) return;\n var buid = [block.number, block.hash].join('-');\n if (data.knownBlocks.indexOf(buid) === -1) {\n console.debug('[network] Receiving block: ' + buid.substring(0, 20));\n data.knownBlocks.push(buid);\n // If first block: do NOT refresh peers (will be done in start() method)\n var skipRefreshPeers = data.knownBlocks.length === 1;\n if (!skipRefreshPeers) {\n data.loading = true;\n // We wait 2s when a new block is received, just to wait for network propagation\n $timeout(function() {\n console.debug('[network] new block received by WS: will refresh peers');\n loadPeers();\n }, 2000, false /*invokeApply*/);\n }\n }\n }),\n\n // Listen for new peer\n data.pod.websocket.peer().onListener(function(json) {\n if (!json || data.loading) return;\n var newPeers = [];\n addOrRefreshPeerFromJson(json, newPeers)\n .then(function(hasUpdates) {\n if (!hasUpdates) return;\n if (newPeers.length>0) {\n flushNewPeersAndSort(newPeers, true);\n }\n else {\n console.debug('[network] [ws] Peers updated received');\n sortPeers(true);\n }\n });\n })\n ];\n },\n\n sort = function(options) {\n options = options || {};\n data.filter = options.filter ? angular.merge(data.filter, options.filter) : data.filter;\n data.sort = options.sort ? angular.merge(data.sort, options.sort) : data.sort;\n sortPeers(false);\n },\n\n start = function(pod, options) {\n options = options || {};\n return esHttp.ready()\n .then(function() {\n close();\n resetData();\n data.pod = pod || esHttp;\n data.filter = options.filter ? angular.merge(data.filter, options.filter) : data.filter;\n data.sort = options.sort ? angular.merge(data.sort, options.sort) : data.sort;\n data.expertMode = angular.isDefined(options.expertMode) ? options.expertMode : data.expertMode;\n data.timeout = angular.isDefined(options.timeout) ? options.timeout : csConfig.timeout;\n console.info('[ES] [network] Starting network from [{0}]'.format(data.pod.server));\n var now = Date.now();\n\n addListeners();\n\n return loadPeers()\n .then(function(peers){\n console.debug('[ES] [network] Started in '+(Date.now() - now)+'ms');\n return peers;\n });\n });\n },\n\n close = function() {\n if (data.pod) {\n console.info('[ES] [network-service] Stopping...');\n removeListeners();\n resetData();\n }\n },\n\n isStarted = function() {\n return !data.pod;\n },\n\n $q_started = function(callback) {\n if (!isStarted()) { // start first\n return start()\n .then(function() {\n return $q(callback);\n });\n }\n else {\n return $q(callback);\n }\n },\n\n getMainBlockUid = function() {\n return $q_started(function(resolve, reject){\n resolve (data.mainBuid);\n });\n },\n\n // Get peers on the main consensus blocks\n getTrustedPeers = function() {\n return $q_started(function(resolve, reject){\n resolve(data.peers.reduce(function(res, peer){\n return (peer.hasMainConsensusBlock && peer.uid) ? res.concat(peer) : res;\n }, []));\n });\n }\n ;\n\n // Register extension points\n api.registerEvent('data', 'changed');\n api.registerEvent('data', 'mainBlockChanged');\n api.registerEvent('data', 'rollback');\n\n return {\n id: id,\n data: data,\n start: start,\n close: close,\n hasPeers: hasPeers,\n getPeers: getPeers,\n sort: sort,\n getTrustedPeers: getTrustedPeers,\n getKnownBlocks: getKnownBlocks,\n getMainBlockUid: getMainBlockUid,\n loadPeers: loadPeers,\n isBusy: isBusy,\n // api extension\n api: api\n };\n }\n\n var service = new EsNetwork('default');\n\n service.instance = function(id) {\n return new EsNetwork(id);\n };\n\n return service;\n}]);\n","angular.module('cesium.es.like.services', ['ngResource', 'cesium.services',\n 'cesium.es.http.services'])\n\n .factory('esLike', ['$q', 'csWallet', 'esHttp', function($q, csWallet, esHttp) {\n 'ngInject';\n\n\n var constants = {\n KINDS: ['LIKE', 'ABUSE']\n };\n\n function EsLike(index, type) {\n\n var that = this;\n that.raw = {\n getSearch: esHttp.get('/like/record/_search?_source=false&q=:q'),\n searchBaseQueryString: 'index:{0} AND type:{1} AND id:'.format(index, type),\n postSearch: esHttp.post(\"/like/record/_search\"),\n postRecord: esHttp.record.post('/{0}/{1}/:id/_like'.format(index, type)),\n removeRecord: esHttp.record.remove('like', 'record')\n };\n\n function getLikeIds(id, options) {\n options = options || {};\n options.kind = options.kind || 'LIKE';\n var queryString = that.raw.searchBaseQueryString + id;\n if (options.kind) queryString += ' AND kind:' + options.kind.toUpperCase();\n if (options.issuer) queryString += ' AND issuer:' + options.issuer;\n\n return that.raw.getSearch({q: queryString})\n .then(function(res) {\n return (res && res.hits && res.hits.hits || []).map(function(hit) {\n return hit._id;\n });\n });\n }\n\n function addLike(id, options) {\n options = options || {};\n options.kind = options.kind && options.kind.toUpperCase() || 'LIKE';\n if (!csWallet.isLogin()) return $q.reject('Wallet must be login before sending record to ES node');\n var record = {\n version: 2,\n index: index,\n type: type,\n id: id,\n kind: options.kind\n };\n if (options.comment) record.comment = options.comment;\n if (angular.isDefined(options.level)) record.level = options.level;\n\n return that.raw.postRecord(record, options);\n }\n\n function toggleLike(id, options) {\n options = options || {};\n options.kind = options.kind || 'LIKE';\n var pubkey = options.pubkey || options.wallet && options.wallet.data.pubkey || (csWallet.isLogin() && csWallet.data.pubkey);\n if (!pubkey) return $q.reject('User not log in!');\n options.wallet = options.wallet || csWallet.getByPubkey(pubkey);\n return getLikeIds(id, {kind: options.kind, issuer: pubkey})\n .then(function(existingLikeIds) {\n // User already like: so remove it\n if (existingLikeIds && existingLikeIds.length) {\n return $q.all(_.map(existingLikeIds, function(likeId) {\n return removeLike(likeId, options);\n }))\n // Return the deletion, as a delta\n .then(function() {\n return -1 * existingLikeIds.length;\n });\n }\n // User not like, so add it\n else {\n return addLike(id, options)\n // Return the insertion, as a delta\n .then(function() {\n return +1;\n });\n }\n });\n }\n\n function removeLike(id, options) {\n if (!id) throw new Error(\"Missing 'id' argument\");\n return that.raw.removeRecord(id, options);\n }\n\n function countLike(id, options) {\n options = options || {};\n options.kind = options.kind || 'LIKE';\n\n var request = {\n query: {\n bool: {\n filter: [\n {term: {index: index}},\n {term: {type: type}},\n {term: {id: id}},\n {term: {kind: options.kind.toUpperCase()}}\n ]\n }\n },\n size: 0\n };\n\n // To known if the user already like, add 'should' on issuers\n var issuers = options.issuer ? [options.issuer] : options.issuers;\n if (issuers && issuers.length) {\n request.query.bool.should = {terms: {issuer: issuers}};\n request.size = issuers.length;\n request._source = [\"issuer\"];\n }\n\n return that.raw.postSearch(request)\n .then(function(res) {\n var hits = res && res.hits;\n var result = {\n total: hits && hits.total || 0,\n wasHitByPubkey: {},\n wasHitCount: 0\n };\n\n // Check is issuer is return (because of size=1 and should filter)\n _.forEach(issuers, function(issuer) {\n var issuerHitIndex = hits ? _.findIndex(hits.hits || [], function(hit) {\n return hit._source.issuer === issuer;\n }) : -1;\n\n result.wasHitByPubkey[issuer] = issuerHitIndex !== -1 || false;\n result.wasHitCount += issuerHitIndex !== -1 ? 1 : 0;\n });\n\n return result;\n });\n }\n\n // Expose functions\n return {\n index: index,\n type: type,\n toggle: toggleLike,\n add: addLike,\n remove: removeLike,\n count: countLike\n };\n }\n\n return {\n constants: constants,\n instance: EsLike\n };\n }])\n;\n","angular.module('cesium.es.currency.controllers', ['ngResource', 'cesium.es.services'])\n\n .config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n PluginServiceProvider.extendState('app.currency.tab_blocks', {\n points: {\n 'nav-buttons': {\n templateUrl: \"plugins/es/templates/currency/tab_blocks_extend.html\",\n controller: 'ESExtensionCtrl'\n }\n }\n })\n ;\n }\n }])\n;\n\n","\nangular.module('cesium.graph.plugin', [\n // Services\n 'cesium.graph.services',\n // Controllers\n 'cesium.graph.common.controllers',\n 'cesium.graph.blockchain.controllers',\n 'cesium.graph.network.controllers',\n 'cesium.graph.currency.controllers',\n 'cesium.graph.account.controllers',\n 'cesium.graph.docstats.controllers',\n 'cesium.graph.synchro.controllers'\n ])\n;\n","\nangular.module('cesium.graph.services', [\n // Services\n 'cesium.graph.color.services',\n 'cesium.graph.data.services'\n ])\n;\n","angular.module('cesium.graph.data.services', ['cesium.wot.services', 'cesium.es.http.services', 'cesium.es.wot.services'])\n\n .factory('gpData', ['$rootScope', '$q', '$timeout', 'csHttp', 'esHttp', 'BMA', 'csWot', 'csCache', 'esWot', function($rootScope, $q, $timeout, csHttp, esHttp, BMA, csWot, csCache, esWot) {\n 'ngInject';\n\n var\n cachePrefix = 'gpData-',\n currencyCache = csCache.get(cachePrefix + 'currency-', csCache.constants.SHORT),\n exports = {\n node: {},\n wot: {},\n blockchain: {},\n docstat: {},\n synchro: {\n execution: {}\n },\n raw: {\n block: {\n search: esHttp.post('/:currency/block/_search')\n },\n blockstat: {\n search: esHttp.post('/:currency/blockstat/_search')\n },\n movement: {\n search: esHttp.post('/:currency/movement/_search')\n },\n user: {\n event: esHttp.post('/user/event/_search?pretty')\n },\n docstat: {\n search: esHttp.post('/document/stats/_search')\n },\n synchro: {\n search: esHttp.post('/:currency/synchro/_search')\n }\n\n },\n regex: {\n }\n };\n\n function _powBase(amount, base) {\n return base <= 0 ? amount : amount * Math.pow(10, base);\n }\n\n function rawLightInstance(host, port, useSsl, timeout) {\n port = port || 80;\n useSsl = angular.isDefined(useSsl) ? useSsl : (port == 443);\n\n return {\n docstat: {\n search: csHttp.post(host, port, '/document/stats/_search', useSsl, timeout)\n },\n synchro: {\n search: csHttp.post(host, port, '/:currency/synchro/_search', useSsl, timeout)\n }\n };\n }\n\n function _initRangeOptions(options) {\n options = options || {};\n options.maxRangeSize = options.maxRangeSize || 30;\n options.defaultTotalRangeCount = options.defaultTotalRangeCount || options.maxRangeSize*2;\n\n options.rangeDuration = options.rangeDuration || 'day';\n options.endTime = options.endTime || moment().utc().add(1, options.rangeDuration).unix();\n options.startTime = options.startTime ||\n moment.unix(options.endTime).utc().subtract(options.defaultTotalRangeCount, options.rangeDuration).unix();\n // Make to sure startTime is never before the currency starts - fix #483\n if (options.firstBlockTime && options.startTime < options.firstBlockTime) {\n options.startTime = options.firstBlockTime;\n }\n return options;\n }\n\n /**\n * Graph: \"blocks count by issuer\"\n * @param currency\n * @returns {*}\n */\n exports.blockchain.countByIssuer = function(currency) {\n\n var request = {\n size: 0,\n aggs: {\n blocksByIssuer: {\n terms: {\n field: 'issuer',\n size: 0\n }\n }\n }\n };\n\n return exports.raw.block.search(request, {currency: currency})\n .then(function(res) {\n var aggs = res.aggregations;\n if (!aggs.blocksByIssuer || !aggs.blocksByIssuer.buckets || !aggs.blocksByIssuer.buckets.length) return;\n\n var result = {\n blockCount: res.hits.total\n };\n result.data = (aggs.blocksByIssuer.buckets || []).reduce(function(res, agg) {\n return res.concat(agg.doc_count);\n }, []);\n result.issuers = (aggs.blocksByIssuer.buckets || []).reduce(function(res, agg) {\n return res.concat({pubkey: agg.key});\n }, []);\n\n return csWot.extendAll(result.issuers)\n .then(function() {\n // Set labels, using name, uid or pubkey\n result.labels = result.issuers.reduce(function(res, issuer) {\n return res.concat(issuer.name || issuer.uid || issuer.pubkey.substr(0,8));\n }, []);\n return result;\n });\n });\n };\n\n /**\n * All block with dividend\n * @param currency\n * @returns {*}\n */\n exports.blockchain.withDividend = function(currency, options) {\n options = options || {};\n var withCache = angular.isDefined(options.withCache) ? options.withCache : true; // enable by default\n\n var cacheKey = [currency, JSON.stringify(options)].join('-');\n if (withCache) {\n var result = currencyCache.get(cacheKey);\n if (result) {\n // should be already a promise (previous call still running)\n if (!result.blocks) {\n var deferred = $q.defer();\n result.then(function(res) {\n //console.debug(\"[graph] Detected a duplicated request on monetaryMass [\" + currency + \"]: will use same request result\");\n deferred.resolve(res);\n return res;\n });\n return deferred.promise;\n }\n console.debug(\"[graph] monetaryMass for [\" + currency + \"] found in cache\");\n return $q.when(result);\n }\n }\n\n var request = {\n query: {\n filtered: {\n filter: {\n bool: {\n must: [\n {\n exists: {\n field: 'dividend'\n }\n }\n ]\n }\n }\n }\n },\n size: options.size || 10000,\n from: options.from || 0,\n _source: [\"medianTime\", \"number\", \"dividend\", \"monetaryMass\", \"membersCount\", \"unitbase\"],\n sort: {\n \"medianTime\" : \"asc\"\n }\n };\n\n var promise = $q.all([\n // Get the current block (if need)\n options.withCurrent ?\n BMA.blockchain.current()\n .catch(function(err) {\n // Special case when currency not started\n if (err && err.ucode == BMA.errorCodes.NO_CURRENT_BLOCK) return undefined;\n throw err;\n }) : $q.when(),\n // Send search request to the ES node\n exports.raw.block.search(request, {currency: currency})\n ])\n .then(function(res) {\n var currentBlock = res[0];\n res = res[1];\n if (!res.hits.total || !res.hits.hits.length) return;\n\n var result = {};\n result.blocks = res.hits.hits.reduce(function(res, hit){\n var block = hit._source;\n\n // Apply unitbase on dividend\n block.dividend = _powBase(block.dividend, block.unitbase);\n delete block.unitbase;\n\n return res.concat(block);\n }, []);\n\n // Add current block\n if (currentBlock) {\n var deltaWithLastDividend = result.blocks.length && (currentBlock.medianTime - result.blocks[result.blocks.length-1].medianTime);\n if (deltaWithLastDividend && deltaWithLastDividend >= 60*60) {\n // Apply unitbase on dividend\n currentBlock.dividend = _powBase(currentBlock.dividend, currentBlock.unitbase);\n delete currentBlock.unitbase;\n result.blocks.push(currentBlock);\n }\n }\n\n result.times = result.blocks.reduce(function(res, block){\n return res.concat(block.medianTime);\n }, []);\n\n // replace promise in cache, with data\n currencyCache.put(cacheKey, result);\n return result;\n });\n currencyCache.put(cacheKey, promise);\n\n return promise;\n };\n\n /**\n * Graph: \"tx count\"\n * @param currency\n * @returns {*}\n */\n exports.blockchain.txCount = function(currency, options) {\n\n options = _initRangeOptions(options);\n\n var jobs = [];\n\n var from = moment.unix(options.startTime).utc().startOf(options.rangeDuration);\n var to = moment.unix(options.endTime).utc().startOf(options.rangeDuration);\n var ranges = [];\n while(from.isBefore(to)) {\n\n ranges.push({\n from: from.unix(),\n to: from.add(1, options.rangeDuration).unix()\n });\n\n // Flush if max range count, or just before loop condition end (fix #483)\n var flush = (ranges.length === options.maxRangeSize) || !from.isBefore(to);\n if (flush) {\n var request = {\n size: 0,\n aggs: {\n tx: {\n range: {\n field: \"medianTime\",\n ranges: ranges\n },\n aggs: {\n txCount : {\n stats: {\n field : \"txCount\"\n }\n },\n txAmount : {\n stats: {\n field : \"txAmount\"\n }\n }\n }\n\n }\n }\n\n };\n\n if (options.issuer) {\n request.query = {bool: {filter: {term: {issuer: options.issuer}}}};\n }\n // prepare next loop\n ranges = [];\n\n if (jobs.length === 10) {\n console.error('Too many parallel jobs!');\n from = moment.unix(options.endTime).utc(); // stop while\n }\n else {\n jobs.push(\n exports.raw.blockstat.search(request, {currency: currency})\n .then(function (res) {\n var aggs = res.aggregations;\n if (!aggs.tx || !aggs.tx.buckets || !aggs.tx.buckets.length) return;\n return (aggs.tx.buckets || []).reduce(function (res, agg) {\n return res.concat({\n from: agg.from,\n to: agg.to,\n count: agg.txCount.sum||0,\n amount: agg.txAmount.sum || 0,\n avgByBlock: Math.round(agg.txCount.avg * 100) / 100,\n maxByBlock: agg.txCount.max\n });\n }, []);\n })\n );\n }\n }\n } // loop\n\n return $q.all(jobs)\n .then(function(res) {\n res = res.reduce(function(res, hits){\n if (!hits || !hits.length) return res;\n return res.concat(hits);\n }, []);\n\n res = _.sortBy(res, 'from');\n\n return {\n count: _.pluck(res, 'count'),\n avgByBlock: _.pluck(res, 'avgByBlock'),\n maxByBlock: _.pluck(res, 'maxByBlock'),\n amount: res.reduce(function(res, hit){\n return res.concat(hit.amount/100);\n }, []),\n times: _.pluck(res, 'from')\n };\n });\n };\n\n /**\n * Graph: \"block count\"\n * @param currency\n * @returns {*}\n */\n exports.node.blockCount = function(currency, pubkey) {\n\n var request = {\n size: 0,\n query: {bool: {filter: {term: {issuer: pubkey}}}}\n };\n\n return exports.raw.block.search(request, {currency: currency})\n .then(function (res) {\n return res.hits.total;\n });\n };\n\n\n exports.raw.movement.getByRange = function(currency, pubkey, ranges) {\n if (!pubkey) {\n throw new Error('Missing \\'pubkey\\' argument!');\n }\n var request = {\n size: 0,\n query: {\n bool: {\n should: [\n {term: {recipient: pubkey}},\n {term: {issuer: pubkey}}\n ]\n }\n },\n aggs: {\n tx: {\n range: {\n field: \"medianTime\",\n ranges: ranges\n },\n aggs: {\n received: {\n filter: {term: {recipient: pubkey}},\n aggs: {\n received_stats: {\n stats: {\n field: \"amount\"\n }\n }\n }\n },\n sent: {\n filter: {term: {issuer: pubkey}},\n aggs: {\n sent_stats: {\n stats: {\n field: \"amount\"\n }\n }\n }\n }\n }\n\n }\n }\n };\n\n return exports.raw.movement.search(request, {currency: currency})\n .then(function(res) {\n var aggs = res.aggregations;\n if (!aggs.tx || !aggs.tx.buckets || !aggs.tx.buckets.length) return;\n return (aggs.tx.buckets || []).reduce(function (res, agg) {\n var sent = agg.sent.sent_stats;\n var received = agg.received.received_stats;\n return res.concat({\n from: agg.from,\n to: agg.to,\n sent: sent.sum ? (-sent.sum / 100) : 0,\n received: received.sum ? (received.sum / 100) : 0\n });\n }, []);\n });\n };\n\n exports.raw.movement.getUds = function(currency, ranges, fromMapping) {\n var request = {\n size: 0,\n query: {\n bool: {\n should: [\n {exists: {field: 'dividend'}}\n ]\n }\n },\n aggs: {\n ud: {\n range: {\n field: 'medianTime',\n ranges: ranges\n },\n aggs: {\n ud_stats: {\n stats: {\n field: 'dividend'\n }\n },\n unitbase_stats: {\n stats: {\n field: 'unitbase'\n }\n }\n }\n }\n }\n };\n\n return exports.raw.block.search(request, {currency: currency})\n .then(function(res) {\n var aggs = res.aggregations;\n if (!aggs.ud || !aggs.ud.buckets || !aggs.ud.buckets.length) return;\n return (aggs.ud.buckets || []).reduce(function (res, agg) {\n var from = fromMapping[agg.from];\n res[from] = _powBase(agg.ud_stats.sum, agg.unitbase_stats.min) / 100;\n return res;\n }, {});\n });\n };\n\n /**\n * Graph: \"tx amount\"\n * @param currency\n * @returns {*}\n */\n exports.blockchain.movement = function(currency, options) {\n\n options = _initRangeOptions(options);\n options.withUD = angular.isDefined(options.withUD) ? options.withUD : true;\n\n var jobs = [];\n\n // If need and missing: load membership periods\n if (options.withUD && !options.memberships) {\n return esWot.memberships(options.pubkey)\n .then(function(res) {\n options.memberships = res || [];\n // loop, with membership filled\n return exports.blockchain.movement(currency, options);\n });\n }\n\n var from = moment.unix(options.startTime).utc().startOf(options.rangeDuration);\n var to = moment.unix(options.endTime).utc().startOf(options.rangeDuration);\n\n var ranges = [];\n var udRanges = [];\n var udFromMapping = {};\n var memberships = angular.copy(options.memberships).reverse();\n var membership = memberships.pop();\n\n function addRange(range) {\n ranges.push(range);\n var member = membership && membership.joinTime < range.to;\n if (member) {\n var udRange = {\n from: Math.max(membership.joinTime, range.from),\n to: Math.min(membership.leaveTime, range.to)\n };\n udRanges.push(udRange);\n udFromMapping[udRange.from] = range.from;\n while (membership && (membership.leaveTime && membership.leaveTime < range.to)) {\n membership = memberships.pop();\n }\n }\n }\n\n // Add a range to get TX before startTime\n addRange({\n from: 0,\n to: from.unix()\n });\n\n while(from.isBefore(to)) {\n\n addRange({\n from: from.unix(),\n to: from.add(1, options.rangeDuration).unix()\n });\n\n // Flush if max range count, or just before loop condition end (fix #483)\n var flush = (!jobs.length && ranges.length == options.maxRangeSize+1) ||\n (jobs.length && ranges.length == options.maxRangeSize) ||\n !from.isBefore(to);\n if (flush) {\n if (udRanges.length) {\n jobs.push($q.all([\n exports.raw.movement.getUds(currency, udRanges, udFromMapping),\n exports.raw.movement.getByRange(currency, options.pubkey, ranges)\n ])\n .then(function(res){\n var udsMap = res[0];\n res = res[1];\n // fill UD\n res.forEach(function(hit){\n hit.ud = (udsMap[hit.from]) || 0;\n });\n return res;\n }));\n }\n else {\n jobs.push(exports.raw.movement.getByRange(currency, options.pubkey, ranges)\n .then(function(res){\n // fill UD\n res.forEach(function(hit){\n hit.ud = 0;\n });\n return res;\n }));\n }\n\n // reset ranges for the next loop\n ranges = [];\n }\n } // loop\n\n return $q.all(jobs)\n .then(function(res) {\n // concat all results\n res = res.reduce(function(res, hits){\n if (!hits || !hits.length) return res;\n return res.concat(hits);\n }, []);\n\n if (!res.length) return;\n\n // Sort by 'from' field\n res = _.sortBy(res, 'from');\n\n // First item should be history (tx before startTime)\n var history = res.splice(0,1)[0];\n var balance = history.received + history.sent + history.ud;\n\n return {\n times: _.pluck(res, 'from'),\n ud: _.pluck(res, 'ud'),\n sent: _.pluck(res, 'sent'),\n received: _.pluck(res, 'received'),\n balance: res.reduce(function(res, hit){\n balance += hit.received + hit.sent + hit.ud;\n return res.concat(balance);\n }, [])\n };\n });\n };\n\n\n /**\n * Graph: \"tx count\"\n * @param currency\n * @returns {*}\n */\n exports.wot.certifications = function(options) {\n\n options = _initRangeOptions(options);\n\n return csWot.load(options.pubkey)\n .then(function(idty) {\n if (!idty) return;\n var res = {};\n _.forEach(idty.given_cert||[], function(cert){\n var truncTime = moment.unix(cert.time).utc().startOf(options.rangeDuration).unix();\n res[truncTime] = res[truncTime] || {time:truncTime,given:0,received:0};\n res[truncTime].given++;\n });\n _.forEach(idty.received_cert||[], function(cert){\n var truncTime = moment.unix(cert.time).utc().startOf(options.rangeDuration).unix();\n res[truncTime] = res[truncTime] || {time:truncTime,given:0,received:0};\n res[truncTime].received++;\n });\n\n // Sort by time\n res = _.sortBy(_.values(res), 'time');\n\n // create final result\n var result = {\n times: _.pluck(res, 'time'),\n deltaGiven: _.pluck(res, 'given'),\n deltaReceived: _.pluck(res, 'received')\n };\n var sum = 0;\n result.given = result.deltaGiven.reduce(function(res, delta) {\n sum += delta;\n return res.concat(sum);\n }, []);\n sum = 0;\n result.received = result.deltaReceived.reduce(function(res, delta) {\n sum += delta;\n return res.concat(sum);\n }, []);\n return result;\n\n });\n };\n\n\n exports.wot.memberships = function(options) {\n\n options = options || {};\n\n // Get user events on membership state\n var request = {\n \"size\": 1000,\n \"query\": {\n \"bool\": {\n \"filter\": [\n {\"term\": {\"recipient\" : options.pubkey }},\n {\"terms\": {\"code\" : [\"MEMBER_JOIN\",\"MEMBER_ACTIVE\",\"MEMBER_LEAVE\",\"MEMBER_EXCLUDE\",\"MEMBER_REVOKE\"] }}\n ]\n }\n },\n \"sort\" : [\n { \"time\" : {\"order\" : \"asc\"}}\n ],\n _source: [\"code\", \"time\"]\n };\n\n return exports.raw.user.event(request)\n\n .then(function(res) {\n if (!res.hits || !res.hits.total) return;\n\n // Compute member periods\n var lastJoinTime;\n var result = res.hits.hits.reduce(function(res, hit){\n var isMember = hit._source.code == 'MEMBER_JOIN' || hit._source.code == 'MEMBER_ACTIVE';\n // If join\n if (isMember && !lastJoinTime) {\n lastJoinTime = hit._source.time;\n }\n // If leave\n else if (!isMember && lastJoinTime) {\n // Add an entry\n res = res.concat({\n joinTime: lastJoinTime,\n leaveTime: hit._source.time\n });\n lastJoinTime = 0; // reset\n }\n return res;\n }, []);\n\n if (lastJoinTime) {\n // Add last entry if need\n result.push({\n joinTime: lastJoinTime,\n leaveTime: moment().utc().unix()\n });\n }\n\n return result;\n });\n };\n\n /**\n * Graph: \"statictics on ES documents\"\n * @param currency\n * @returns {*}\n */\n exports.docstat.get = function(options) {\n\n options = _initRangeOptions(options);\n\n var searchRequest = exports.raw.docstat.search;\n if (options.server) {\n var serverParts = options.server.split(':');\n var host = serverParts[0];\n var port = serverParts[1] || 80;\n searchRequest = rawLightInstance(host, port, options.useSsl).docstat.search;\n }\n\n var jobs = [];\n\n var from = moment.unix(options.startTime).utc().startOf(options.rangeDuration);\n var to = moment.unix(options.endTime).utc().startOf(options.rangeDuration);\n var ranges = [];\n\n var processSearchResult = function (res) {\n var aggs = res.aggregations;\n return (aggs.range && aggs.range.buckets || []).reduce(function (res, agg) {\n var item = {\n from: agg.from,\n to: agg.to\n };\n _.forEach(agg.index && agg.index.buckets || [], function (agg) {\n var index = agg.key;\n _.forEach(agg.type && agg.type.buckets || [], function (agg) {\n var key = (index + '_' + agg.key);\n item[key] = agg.max.value;\n if (!indices[key]) indices[key] = true;\n });\n });\n return res.concat(item);\n }, []);\n };\n\n while(from.isBefore(to)) {\n\n ranges.push({\n from: from.unix(),\n to: from.add(1, options.rangeDuration).unix()\n });\n\n // Flush if max range count, or just before loop condition end (fix #483)\n var flush = (ranges.length === options.maxRangeSize) || !from.isBefore(to);\n if (flush) {\n var request = {\n size: 0,\n aggs: {\n range: {\n range: {\n field: \"time\",\n ranges: ranges\n },\n aggs: {\n index : {\n terms: {\n field: \"index\",\n size: 0\n },\n aggs: {\n type: {\n terms: {\n field: \"type\",\n size: 0\n },\n aggs: {\n max: {\n max: {\n field : \"count\"\n }\n }\n }\n }\n }\n }\n }\n }\n }\n\n };\n\n // prepare next loop\n ranges = [];\n var indices = {};\n var params = {\n request_cache: angular.isDefined(options.cache) ? options.cache : true // enable by default\n };\n\n if (jobs.length === 10) {\n console.error('Too many parallel jobs!');\n from = moment.unix(options.endTime).utc(); // stop while\n }\n else {\n jobs.push(\n searchRequest(request, params)\n .then(processSearchResult)\n );\n }\n }\n } // loop\n\n return $q.all(jobs)\n .then(function(res) {\n res = res.reduce(function(res, hits){\n if (!hits || !hits.length) return res;\n return res.concat(hits);\n }, []);\n\n res = _.sortBy(res, 'from');\n\n return _.keys(indices).reduce(function(series, index) {\n series[index] = _.pluck(res, index);\n return series;\n }, {\n times: _.pluck(res, 'from')\n });\n });\n };\n\n\n /**\n * Graph: \"statictics on ES documents\"\n * @param currency\n * @returns {*}\n */\n exports.synchro.execution.get = function(options) {\n\n options = _initRangeOptions(options);\n\n var searchRequest = exports.raw.synchro.search;\n if (options.server) {\n var serverParts = options.server.split(':');\n var host = serverParts[0];\n var port = serverParts[1] || 80;\n searchRequest = rawLightInstance(host, port, options.useSsl).synchro.search;\n }\n\n var jobs = [];\n\n var from = moment.unix(options.startTime).utc().startOf(options.rangeDuration);\n var to = moment.unix(options.endTime).utc().startOf(options.rangeDuration);\n var ranges = [];\n var processSearchResult = function (res) {\n var aggs = res.aggregations;\n\n return (aggs.range && aggs.range.buckets || []).reduce(function (res, agg) {\n var item = {\n from: agg.from,\n to: agg.to,\n inserts: agg.result.inserts.value,\n updates: agg.result.inserts.value,\n deletes: agg.result.deletes.value,\n duration: agg.duration.value\n };\n _.forEach(agg.api && agg.api.buckets || [], function (api) {\n item[api.key] = api.peer_count && api.peer_count.value || 0;\n if (!apis[api.key]) apis[api.key] = true;\n });\n\n return res.concat(item);\n }, []);\n };\n\n while(from.isBefore(to)) {\n\n ranges.push({\n from: from.unix(),\n to: from.add(1, options.rangeDuration).unix()\n });\n\n // Flush if max range count, or just before loop condition end (fix #483)\n var flush = (ranges.length === options.maxRangeSize) || !from.isBefore(to);\n if (flush) {\n var request = {\n size: 0,\n aggs: {\n range: {\n range: {\n field: \"time\",\n ranges: ranges\n },\n aggs: {\n api: {\n terms: {\n field: \"api\",\n size: 0\n },\n aggs: {\n peer_count: {\n cardinality: {\n field: \"peer\"\n }\n }\n }\n },\n duration: {\n sum: {\n field: \"executionTime\"\n }\n },\n result: {\n nested: {\n path: \"result\"\n },\n aggs: {\n inserts : {\n sum: {\n field : \"result.inserts\"\n }\n },\n updates : {\n sum: {\n field : \"result.updates\"\n }\n },\n deletes : {\n sum: {\n field : \"result.deletes\"\n }\n }\n }\n }\n }\n }\n }\n\n };\n\n // prepare next loop\n ranges = [];\n var apis = {};\n\n if (jobs.length === 10) {\n console.error('Too many parallel jobs!');\n from = moment.unix(options.endTime).utc(); // stop while\n }\n else {\n jobs.push(\n searchRequest(request, {currency: options.currency})\n .then(processSearchResult)\n );\n }\n }\n } // loop\n\n return $q.all(jobs)\n .then(function(res) {\n res = res.reduce(function(res, hits){\n if (!hits || !hits.length) return res;\n return res.concat(hits);\n }, []);\n\n res = _.sortBy(res, 'from');\n\n var series = {\n times: _.pluck(res, 'from'),\n inserts: _.pluck(res, 'inserts'),\n updates: _.pluck(res, 'updates'),\n deletes: _.pluck(res, 'deletes'),\n duration: _.pluck(res, 'duration')\n };\n\n _.keys(apis).forEach(function(api) {\n series[api] = _.pluck(res, api);\n });\n\n return series;\n });\n };\n\n function cleanAllCache() {\n console.debug(\"[graph] Cleaning cache {prefix: '{0}'}...\".format(cachePrefix));\n csCache.clear(cachePrefix);\n }\n\n // Listen if node changed\n esHttp.api.node.on.stop($rootScope, cleanAllCache, this);\n\n return exports;\n }])\n\n;\n","angular.module('cesium.graph.color.services', [])\n\n .factory('gpColor', function() {\n 'ngInject';\n\n var\n constants = {\n css2Rgb: {\n 'white': [255, 255, 255],\n 'assertive': [239, 71, 58], // ok\n 'calm': [17, 193, 243], // ok\n 'positive': [56, 126, 245], // ok\n 'balanced': [51, 205, 95], // ok\n 'energized': [255, 201, 0], // ok\n 'royal': [136, 106, 234], // ok\n 'gray': [150, 150, 150], // ok\n 'stable': [248, 248, 248] // ok\n }\n },\n exports = {\n scale: {}\n };\n\n\n /**\n * Compute colors scale\n * @param count\n * @param opacity\n * @param startColor\n * @param startState\n * @returns {Array}\n */\n exports.scale.custom = function (count, opacity, startColor, startState) {\n\n function _state2side(state) {\n switch (state) {\n case 0:\n return 0;\n case 1:\n return -1;\n case 2:\n return 0;\n case 3:\n return 1;\n }\n }\n\n // From [0,1]\n opacity = opacity>0 && opacity|| 0.55;\n\n var defaultStateSize = Math.round(count / 2.5/*=4 states max*/);\n\n // Start color [r,v,b]\n var color = startColor && startColor.length == 3 ? angular.copy(startColor) : [255, 0, 0]; // Red\n\n // Colors state: 0=keep, 1=decrease, 2=keep, 3=increase\n var states = startState && startState.length == 3 ? angular.copy(startState) : [0, 2, 3]; // R=keep, V=keep, B=increase\n\n var steps = startColor ? [\n Math.round(255 / defaultStateSize),\n Math.round(255 / defaultStateSize),\n Math.round(255 / defaultStateSize)\n ] : [\n Math.round((color[0] - 50) / defaultStateSize),\n Math.round((255 - color[1]) / defaultStateSize),\n Math.round((255 - color[2]) / defaultStateSize)\n ];\n\n\n // Compute start sides (1=increase, 0=flat, -1=decrease)\n var sides = [\n _state2side(states[0]),\n _state2side(states[1]),\n _state2side(states[2])];\n\n // Use to detect when need to change a 'flat' state (when state = 0 or 2)\n var stateCounters = [0, 0, 0];\n\n var result = [];\n for (var i = 0; i < count; i++) {\n for (var j = 0; j < 3; j++) {\n color[j] += sides[j] * steps[j];\n stateCounters[j]++;\n // color has reach a limit\n if (((color[j] <= 0 || color[j] >= 255) && sides[j] !== 0) ||\n (sides[j] === 0 && stateCounters[j] == defaultStateSize)) {\n // Max sure not overflow limit\n if (color[j] <= 0) {\n color[j] = 0;\n }\n else if (color[j] >= 255) {\n color[j] = 255;\n }\n // Go to the next state, in [0..3]\n states[j] = (states[j] + 1) % 4;\n\n // Update side from this new state\n sides[j] = _state2side(states[j]);\n\n // Reset state counter\n stateCounters[j] = 0;\n }\n }\n\n // Add the color to result\n result.push('rgba(' + color[0] + ',' + color[1] + ',' + color[2] + ',' + opacity + ')');\n\n }\n return result;\n };\n\n exports.scale.default = function () {\n return exports.scale.custom(25);\n };\n\n /**\n * Create a array with the given color\n **/\n exports.scale.fix = function (length, color) {\n return Array.apply(null, Array(length||25))\n .map(String.prototype.valueOf, color||exports.rgba.calm(0.5));\n };\n\n // Create a function to generate a rgba string, from\n exports.rgba = _.mapObject(constants.css2Rgb, function(rgbArray){\n var prefix = 'rgba(' + rgbArray.join(',') + ',';\n return function(opacity){\n if (!opacity || opacity < 0) {\n return 'rgb(' + rgbArray.join(',') + ')';\n }\n return prefix + opacity + ')';\n };\n });\n\n exports.rgba.translucent = function() {\n return 'rgb(0,0,0,0)';\n };\n\n exports.constants = constants;\n\n return exports;\n })\n\n;\n","\nangular.module('cesium.map.plugin', [\n 'ui-leaflet',\n // Services\n 'cesium.map.services',\n // Controllers\n 'cesium.map.common.controllers',\n 'cesium.map.wot.controllers',\n 'cesium.map.registry.controllers',\n 'cesium.map.network.controllers',\n 'cesium.map.user.controllers',\n 'cesium.map.settings.controllers',\n 'cesium.map.help.controllers'\n ])\n\n // Configure plugin\n .config(function() {\n 'ngInject';\n\n // Define icon prefix for AwesomeMarker (a Leaflet plugin)\n L.AwesomeMarkers.Icon.prototype.options.prefix = 'ion';\n });\n\n\n","\nangular.module('cesium.map.services', [\n // Services\n 'cesium.map.wot.services',\n 'cesium.map.registry.services',\n 'cesium.map.utils.services'\n ])\n;\n","\nangular.module('cesium.map.wot.services', ['cesium.services'])\n\n.factory('mapWot', ['$q', 'csHttp', 'esHttp', 'esSettings', 'csWot', 'BMA', 'esGeo', function($q, csHttp, esHttp, esSettings, csWot, BMA, esGeo) {\n 'ngInject';\n\n var\n that = this,\n constants = {\n DEFAULT_LOAD_SIZE: 1000\n },\n fields = {\n min: [\"title\", \"geoPoint\"],\n profile: [\"title\", \"geoPoint\", \"avatar._content_type\", \"address\", \"city\"]\n };\n\n that.raw = {\n profile: {\n search: esHttp.post('/user/profile/_search'),\n mixedSearch: esHttp.post('/user,page,group/profile,record/_search')\n //FOR DEV ONLY mixedSearch: esHttp.post('/page/record/_search')\n }\n };\n\n function createFilterQuery(options) {\n options = options || {};\n var query = {\n bool: {}\n };\n\n // Limit to profile with geo point\n if (options.searchAddress) {\n query.bool.should = [\n {exists: {field: \"geoPoint\"}},\n {exists: {field: \"city\"}}\n ];\n }\n else {\n query.bool.must= [\n {exists: {field: \"geoPoint\"}}\n ];\n }\n\n // Filter on bounding box\n // see https://www.elastic.co/guide/en/elasticsearch/reference/2.4/geo-point.html\n if (options.bounds && options.bounds.northEast && options.bounds.southWest) {\n var boundingBox = {\n \"geoPoint\" : {\n \"top_left\" : {\n \"lat\" : Math.max(Math.min(options.bounds.northEast.lat, 90), -90),\n \"lon\" : Math.max(Math.min(options.bounds.southWest.lng, 180), -180)\n },\n \"bottom_right\" : {\n \"lat\" : Math.max(Math.min(options.bounds.southWest.lat, 90), -90),\n \"lon\" : Math.max(Math.min(options.bounds.northEast.lng, 180), -180)\n }\n }\n };\n console.debug(\"[map] [wot] Filtering on bounds: \", options.bounds);\n query.bool.must = query.bool.must || [];\n query.bool.must.push({geo_bounding_box: boundingBox});\n }\n return query;\n }\n\n function load(options) {\n options = options || {};\n options.from = options.from || 0;\n options.size = options.size || constants.DEFAULT_LOAD_SIZE;\n options.searchAddress = esGeo.google.isEnable() && (angular.isDefined(options.searchAddress) ? options.searchAddress : true);\n\n options.fields = options.fields || {};\n options.fields.description = angular.isDefined(options.fields.description) ? options.fields.description : false;\n\n var request = {\n query: createFilterQuery(options),\n from: 0,\n size: options.size,\n _source: options.fields.description ? fields.profile.concat(\"description\") : fields.profile\n };\n\n var mixedSearch = false;\n /*var mixedSearch = esSettings.wot.isMixedSearchEnable();\n if (mixedSearch) {\n // add special fields for page and group\n request._source = request._source.concat([\"type\", \"pubkey\", \"issuer\", \"category\"]);\n console.debug(\"[ES] [map] Mixed search: enable\");\n }*/\n\n var search = mixedSearch ? that.raw.profile.mixedSearch : that.raw.profile.search;\n\n return $q.all([\n search(request),\n BMA.wot.member.uids(),\n BMA.wot.member.pending()\n .then(function(res) {\n return (res.memberships && res.memberships.length) ? res.memberships : [];\n })\n ])\n .then(function(res) {\n var uids = res[1];\n var memberships = res[2];\n res = res[0];\n if (!res.hits || !res.hits.total) return [];\n\n // Transform pending MS into a map by pubkey\n memberships = memberships.reduce(function(res, ms){\n if (ms.membership == 'IN' && !uids[ms.pubkey]) {\n var idty = {\n uid: ms.uid,\n pubkey: ms.pubkey,\n block: ms.blockNumber,\n blockHash: ms.blockHash,\n pending: true\n };\n var otherIdtySamePubkey = res[ms.pubkey];\n if (otherIdtySamePubkey && idty.block > otherIdtySamePubkey.block) {\n return res; // skip\n }\n res[idty.pubkey] = idty;\n }\n return res;\n }, {});\n\n var jobs = [\n processLoadHits(options, uids, memberships, res)\n ];\n\n // Additional slice requests\n request.from += request.size;\n var processRequestResultFn = function(subRes) {\n if (!subRes.hits || !subRes.hits.hits.length) return [];\n return processLoadHits(options, uids, memberships, subRes);\n };\n while (request.from < res.hits.total) {\n var searchRequest = search(angular.copy(request)).then(processRequestResultFn);\n jobs.push(searchRequest);\n request.from += request.size;\n }\n return $q.all(jobs)\n .then(function(res){\n return res.reduce(function(res, items) {\n return res.concat(items);\n }, []);\n });\n });\n }\n\n function processLoadHits(options, uids, memberships, res) {\n\n // Transform profile hits\n var commaRegexp = new RegExp('[,]');\n var searchAddressItems = [];\n var items = res.hits.hits.reduce(function(res, hit) {\n var pubkey = hit._id;\n var uid = uids[pubkey];\n var item = uid && {uid: uid} || memberships[pubkey] || {};\n item.pubkey = pubkey;\n item.index = hit._index;\n\n // City & address\n item.city = hit._source.city;\n item.address = hit._source.address;\n\n // Set geo point\n item.geoPoint = hit._source.geoPoint;\n if (!item.geoPoint || !item.geoPoint.lat || !item.geoPoint.lon) {\n if (!options.searchAddress || !item.city) return res; // no city: exclude this item\n item.searchAddress = item.city && ((hit._source.address ? hit._source.address+ ', ' : '') + item.city);\n searchAddressItems.push(item);\n }\n else {\n // Convert lat/lon to float (if need)\n if (item.geoPoint.lat && typeof item.geoPoint.lat === 'string') {\n item.geoPoint.lat = parseFloat(item.geoPoint.lat.replace(commaRegexp, '.'));\n }\n if (item.geoPoint.lon && typeof item.geoPoint.lon === 'string') {\n item.geoPoint.lon = parseFloat(item.geoPoint.lon.replace(commaRegexp, '.'));\n }\n }\n\n // Avatar\n item.avatar = esHttp.image.fromHit(hit, 'avatar');\n\n // Name\n item.name = hit._source.title;\n // Avoid too long name (workaround for #308)\n if (item.name && item.name.length > 30) {\n item.name = item.name.substr(0, 27) + '...';\n }\n\n // Description\n item.description = hit._source.description && esHttp.util.parseAsHtml(hit._source.description);\n\n return item.geoPoint ? res.concat(item) : res;\n }, []);\n\n // Resolve missing positions by addresses (only if google API enable)\n if (searchAddressItems.length) {\n var now = Date.now();\n console.debug('[map] [wot] Search positions of {0} addresses...'.format(searchAddressItems.length));\n var counter = 0;\n\n return $q.all(searchAddressItems.reduce(function(res, item) {\n return !item.city ? res : res.concat(esGeo.google.searchByAddress(item.searchAddress)\n .then(function(res) {\n if (!res || !res.length) return;\n item.geoPoint = res[0];\n // If search on city, add a randomized delta to avoid superposition\n if (item.city == item.searchAddress) {\n item.geoPoint.lon += Math.random() / 1000;\n item.geoPoint.lat += Math.random() / 1000;\n }\n delete item.searchAddress; // not need anymore\n items.push(item);\n counter++;\n })\n .catch(function() {/*silent*/}));\n }, []))\n .then(function(){\n console.debug('[map] [wot] Resolved {0}/{1} addresses in {2}ms'.format(counter, searchAddressItems.length, Date.now()-now));\n return items;\n });\n }\n\n return $q.when(items);\n }\n\n return {\n load: load\n };\n\n}]);\n","\nangular.module('cesium.map.registry.services', ['cesium.services'])\n\n.factory('mapRegistry', ['$q', 'csHttp', 'esHttp', 'esSettings', 'csWot', 'BMA', 'esGeo', function($q, csHttp, esHttp, esSettings, csWot, BMA, esGeo) {\n 'ngInject';\n\n var\n that = this,\n constants = {\n DEFAULT_LOAD_SIZE: 1000\n },\n fields = {\n record: [\"title\", \"geoPoint\", \"avatar._content_type\", \"address\", \"city\", \"type\", \"pubkey\", \"issuer\", \"category\"]\n };\n\n that.raw = {\n profile: {\n search: esHttp.post('/page/record/_search'),\n mixedSearch: esHttp.post('/user,page,group/profile,record/_search')\n }\n };\n\n function createFilterQuery(options) {\n options = options || {};\n var query = {\n bool: {}\n };\n\n // Limit to profile with geo point\n if (options.searchAddress) {\n query.bool.should = [\n {exists: {field: \"geoPoint\"}},\n {exists: {field: \"city\"}}\n ];\n }\n else {\n query.bool.must= [\n {exists: {field: \"geoPoint\"}}\n ];\n }\n\n // Filter on bounding box\n // see https://www.elastic.co/guide/en/elasticsearch/reference/2.4/geo-point.html\n if (options.bounds && options.bounds.northEast && options.bounds.southWest) {\n query.bool.should = query.bool.should || {};\n query.bool.should.geo_bounding_box = {\n \"geoPoint\" : {\n \"top_left\" : {\n \"lat\" : Math.max(Math.min(options.bounds.northEast.lat, 90), -90),\n \"lon\" : Math.max(Math.min(options.bounds.southWest.lng, 180), -180)\n },\n \"bottom_right\" : {\n \"lat\" : Math.max(Math.min(options.bounds.southWest.lat, 90), -90),\n \"lon\" : Math.max(Math.min(options.bounds.northEast.lng, 180), -180)\n }\n }\n };\n }\n return query;\n }\n\n function load(options) {\n options = options || {};\n options.from = options.from || 0;\n options.size = options.size || constants.DEFAULT_LOAD_SIZE;\n options.searchAddress = esGeo.google.isEnable() && (angular.isDefined(options.searchAddress) ? options.searchAddress : true);\n\n options.fields = options.fields || {};\n options.fields.description = angular.isDefined(options.fields.description) ? options.fields.description : true;\n\n var request = {\n query: createFilterQuery(options),\n from: 0,\n size: options.size,\n _source: options.fields.description ? fields.record.concat(\"description\") : fields.record\n };\n\n // Search on profiles ?\n var mixedSearch = false;\n /*var mixedSearch = esSettings.registry.isMixedSearchEnable();\n if (mixedSearch) {\n console.debug(\"[ES] [map] Mixed search: enable\");\n }*/\n\n var search = mixedSearch ? that.raw.profile.mixedSearch : that.raw.profile.search;\n var processSearchResult = function(res) {\n if (!res.hits || !res.hits.hits.length) return $q.when([]);\n return processLoadHits(options, res);\n };\n return search(request)\n .then(function(res) {\n if (!res.hits || !res.hits.total) return [];\n\n var jobs = [\n processLoadHits(options, res)\n ];\n\n // Additional slice requests\n request.from += request.size;\n while (request.from < res.hits.total) {\n jobs.push(\n search(angular.copy(request)).then(processSearchResult)\n );\n request.from += request.size;\n }\n return $q.all(jobs)\n .then(function(res){\n return res.reduce(function(res, items) {\n return res.concat(items);\n }, []);\n });\n });\n }\n\n function processLoadHits(options, res) {\n // Transform hits\n var commaRegexp = new RegExp('[,]');\n var searchAddressItems = [];\n var items = res.hits.hits.reduce(function(res, hit) {\n var pubkey = hit._source.issuer;\n var item = {};\n item.issuer = pubkey;\n item.pubkey = hit._source.pubkey||item.issuer;\n item.id = hit._id;\n item.index = hit._index;\n item.type = hit._source.type;\n item.category = hit._source.category;\n if (item.category) {\n delete item.category.parent; // parent not need\n }\n\n // City & address\n item.city = hit._source.city;\n item.address = hit._source.address;\n\n // Set geo point\n item.geoPoint = hit._source.geoPoint;\n if (!item.geoPoint || !item.geoPoint.lat || !item.geoPoint.lon) {\n if (!options.searchAddress || !item.city) return res; // no city: exclude this item\n item.searchAddress = item.city && ((hit._source.address ? hit._source.address+ ', ' : '') + item.city);\n searchAddressItems.push(item);\n }\n else {\n // Convert lat/lon to float (if need)\n if (item.geoPoint.lat && typeof item.geoPoint.lat === 'string') {\n item.geoPoint.lat = parseFloat(item.geoPoint.lat.replace(commaRegexp, '.'));\n }\n if (item.geoPoint.lon && typeof item.geoPoint.lon === 'string') {\n item.geoPoint.lon = parseFloat(item.geoPoint.lon.replace(commaRegexp, '.'));\n }\n }\n\n // Avatar\n item.avatar = esHttp.image.fromHit(hit, 'avatar');\n\n // Name\n item.name = hit._source.title;\n // Avoid too long name (workaround for #308)\n if (item.name && item.name.length > 30) {\n item.name = item.name.substr(0, 27) + '...';\n }\n\n // Description\n item.description = hit._source.description && esHttp.util.parseAsHtml(hit._source.description);\n\n return item.geoPoint ? res.concat(item) : res;\n }, []);\n\n // Resolve missing positions by addresses (only if google API enable)\n if (searchAddressItems.length) {\n var now = Date.now();\n console.debug('[map] [registry] Search positions of {0} addresses...'.format(searchAddressItems.length));\n var counter = 0;\n\n return $q.all(searchAddressItems.reduce(function(res, item) {\n return !item.city ? res : res.concat(esGeo.google.searchByAddress(item.searchAddress)\n .then(function(res) {\n if (!res || !res.length) return;\n item.geoPoint = res[0];\n // If search on city, add a randomized delta to avoid superposition\n if (item.city == item.searchAddress) {\n item.geoPoint.lon += Math.random() / 1000;\n item.geoPoint.lat += Math.random() / 1000;\n }\n delete item.searchAddress; // not need anymore\n items.push(item);\n counter++;\n })\n .catch(function() {/*silent*/}));\n }, []))\n .then(function(){\n console.debug('[map] [registry] Resolved {0}/{1} addresses in {2}ms'.format(counter, searchAddressItems.length, Date.now()-now));\n return items;\n });\n }\n\n return $q.when(items);\n }\n\n return {\n load: load\n };\n\n}]);\n","\nangular.module('cesium.map.utils.services', ['cesium.services', 'ui-leaflet'])\n\n.factory('MapUtils', ['$timeout', '$q', '$translate', '$window', 'leafletData', 'csConfig', 'csSettings', 'esGeo', 'UIUtils', 'leafletHelpers', function($timeout, $q, $translate, $window, leafletData, csConfig, csSettings, esGeo, UIUtils, leafletHelpers) {\n 'ngInject';\n\n\n var\n googleApiKey = csConfig.plugins && csConfig.plugins.es && csConfig.plugins.es.googleApiKey,\n constants = {\n locations: {\n FRANCE: {\n lat: 46.5588603, lng: 4.229736328124999, zoom: 6\n }\n },\n LOCALIZE_ZOOM: 15\n },\n data = {\n cache: {}\n };\n constants.DEFAULT_CENTER = csSettings.data && csSettings.data.plugins && csSettings.data.plugins.map && csSettings.data.plugins.map.center || constants.locations.FRANCE;\n\n function initMap(options){\n options = angular.merge({\n center: angular.copy(constants.DEFAULT_CENTER),\n cache: false,\n defaults: {\n scrollWheelZoom: true,\n tileLayerOptions: {\n attribution: '© <a target=\\\"_blank\\\" href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a>'\n }\n },\n layers: {\n baselayers: {\n osm: {\n name: 'OpenStreetMap',\n type: 'xyz',\n url: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',\n layerOptions: {\n subdomains: [\"a\", \"b\", \"c\"],\n attribution: \"&copy; <a target=\\\"_blank\\\" href=\\\"https://www.openstreetmap.org/copyright\\\">OpenStreetMap</a>\",\n continuousWorld: true\n }\n },\n google: {\n name: \"Google map\",\n type: \"xyz\",\n url: ('https://{s}.google.com/vt/lyrs=m&x={x}&y={y}&z={z}&key='+googleApiKey),\n layerOptions: {\n subdomains: ['mt0','mt1','mt2','mt3'],\n attribution: \"&copy; <a target=\\\"_blank\\\" href=\\\"https://www.google.com/intl/fr_fr/help/terms_maps.html\\\">Google</a>\",\n continuousWorld: true\n }\n }\n }\n },\n controls: {\n custom: []\n }\n }, options || {});\n\n // Restore existing map options\n if (options.cache && data.cache[options.cache]) {\n console.debug(\"[map] Restoring map from cache :\", data.cache[options.cache]);\n options = angular.merge(options, data.cache[options.cache]);\n }\n\n // Translate overlays name, if any\n var overlaysNames;\n if (options.layers.overlays) {\n overlaysNames = _.keys(options.layers.overlays).reduce(function (res, key) {\n return res.concat(options.layers.overlays[key].name);\n }, []);\n\n $translate(overlaysNames).then(function (translations) {\n // Translate overlay names\n _.keys(options.layers.overlays || {}).forEach(function (key) {\n options.layers.overlays[key].name = translations[options.layers.overlays[key].name];\n });\n });\n }\n\n return options;\n }\n\n function updateMapCenter(map, center) {\n if (isSameCenter(center, map)) return $q.when();\n\n return $timeout(function () {\n map.invalidateSize();\n map._resetView(center, center.zoom, true);\n }, 300);\n }\n\n function bindMapOptions(scope, mapId, options) {\n options = options || {};\n if (!mapId || !options.layers || !scope) throw 'Illegal arguments';\n if (!options.cache) return; // no cache, so bind not need\n\n // Bind overlays visibility\n if (options.layers.overlays) {\n var overlayNames = _.keys(options.layers.overlays);\n\n // Init the cache if need\n if (!data.cache[options.cache]) {\n data.cache[options.cache] = {\n center: options.center,\n bounds: options.bounds,\n layers: angular.copy(options.layers)\n };\n }\n\n // Listen for changes\n leafletData.getMap(mapId)\n .then(function() {\n _($window.document.querySelectorAll('#{0} .leaflet-control-layers-overlays input[type=checkbox]'.format(mapId)))\n .forEach(function (element, index) {\n var overlayName = overlayNames[index];\n var state = options.layers.overlays[overlayName].visible;\n element.addEventListener('change', function (e) {\n state = !state; // update state\n // update cache\n data.cache[options.cache].layers.overlays[overlayName].visible = state;\n });\n });\n });\n }\n\n // Refresh center and bound, when leaving the view\n scope.$on('$ionicView.leave', function() {\n // update center and bounds\n data.cache[options.cache].center = options.center;\n data.cache[options.cache].bounds = options.bounds;\n });\n\n }\n\n\n function getCenter(options) {\n if (!options) return;\n var center;\n if (options.lat) {\n center = {};\n center.lat = parseFloat(options.lat);\n }\n if (options.lng || options.lon) {\n center = center || {};\n center.lng = parseFloat(options.lng || options.lon);\n }\n if (options.zoom) {\n center = center || {};\n center.zoom = parseFloat(options.zoom);\n }\n if (!center) return;\n\n // If missing some properties, complete with defaults\n if (!leafletHelpers.isValidCenter(center)) {\n center = angular.merge({}, constants.DEFAULT_CENTER, center);\n }\n return center;\n }\n\n function isSameCenter(center, map) {\n return leafletHelpers.isSameCenterOnMap(center, map);\n }\n\n function isDefaultCenter(centerModel) {\n var mapCenter = constants.DEFAULT_CENTER;\n if (centerModel.lat && centerModel.lng && mapCenter.lat.toFixed(4) === centerModel.lat.toFixed(4) && mapCenter.lng.toFixed(4) === centerModel.lng.toFixed(4) && mapCenter.zoom === centerModel.zoom) {\n return true;\n }\n return false;\n }\n\n // Set the id of a control (set the attribute 'id' of the HTML container)\n function setControlId(control, id) {\n if (!control || !id) throw 'Illegal arguments';\n\n // Control already added to map\n if (control._container) {\n control._container.id = id;\n }\n // Control not already added to the map (HTML element not exists yet)\n else {\n // Override onAdd() function\n var superOnAdd = control.onAdd;\n control.onAdd = function (map) {\n var container = superOnAdd.call(this, map);\n container.id = id;\n return container;\n };\n }\n }\n\n // Create a default serach control, with default options\n function initSearchControl(options) {\n\n options = options || {};\n options.initial = angular.isDefined(options.initial) ? options.initial : false;\n options.marker = angular.isDefined(options.marker) ? options.marker : false;\n options.propertyName = angular.isDefined(options.propertyName) ? options.propertyName : 'title';\n options.position = angular.isDefined(options.position) ? options.position : 'topleft';\n options.zoom = angular.isDefined(options.zoom) ? options.zoom : constants.LOCALIZE_ZOOM;\n options.markerLocation = angular.isDefined(options.markerLocation) ? options.markerLocation : true;\n\n var translatePromise = $translate(['MAP.COMMON.SEARCH_DOTS', 'COMMON.SEARCH_NO_RESULT']);\n\n return {\n // Simulate an addTo function, but wait for end of translations job\n addTo: function (map) {\n translatePromise.then(function (translations) {\n var control = L.control.search(angular.merge(options, {\n textPlaceholder: translations['MAP.COMMON.SEARCH_DOTS'],\n textErr: translations['COMMON.SEARCH_NO_RESULT']\n }));\n\n // Set the HTML element id\n if (options.id) {\n setControlId(control, options.id);\n }\n control.addTo(map);\n });\n }\n };\n }\n\n function initLocalizeMeControl(options) {\n options = options || {};\n return L.easyButton({\n position: 'topleft', // inherited from L.Control -- the corner it goes in\n type: 'replace', // set to animate when you're comfy with css\n leafletClasses: true, // use leaflet classes to style the button?\n states:[{ // specify different icons and responses for your button\n stateName: 'locate-me',\n onClick: function(btn, map){\n esGeo.point.current()\n .then(function(res) {\n map.setView({\n lat: res.lat,\n lng: res.lon\n }, constants.LOCALIZE_ZOOM);\n })\n .catch(function(err) {\n console.error(err);\n UIUtils.alert.error('MAP.ERROR.LOCALIZE_ME_FAILED');\n });\n },\n title: options.title,\n icon: 'icon ion-android-locate'\n }]\n });\n }\n\n return {\n map: initMap,\n updateCenter: updateMapCenter,\n center: {\n get: getCenter,\n isSame: isSameCenter,\n isDefault: isDefaultCenter\n },\n control: {\n search: initSearchControl,\n localizeMe: initLocalizeMeControl,\n setId: setControlId\n },\n cache: {\n bind: bindMapOptions\n },\n constants: constants\n };\n\n}]);\n","\nangular.module('cesium.map.network.controllers', ['cesium.services', 'cesium.map.services'])\n\n .config(['$stateProvider', 'PluginServiceProvider', 'csConfig', function($stateProvider, PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n\n PluginServiceProvider\n\n .extendState('app.network', {\n points: {\n 'filter-buttons': {\n templateUrl: \"plugins/map/templates/network/lookup_extend.html\",\n controller: \"ESExtensionCtrl\"\n }\n }\n });\n\n $stateProvider\n .state('app.view_network_map', {\n url: \"/network/map?c\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/map/templates/network/view_map.html\",\n controller: 'MapNetworkViewCtrl'\n }\n },\n data: {\n silentLocationChange: true\n }\n });\n }\n }])\n\n // [NEW] Manage events from the page #/app/wot/map\n .controller('MapNetworkViewCtrl', ['$scope', '$controller', '$q', '$interpolate', '$translate', '$filter', '$templateCache', '$timeout', '$location', 'esGeo', 'UIUtils', 'csNetwork', 'MapUtils', 'leafletData', function($scope, $controller, $q, $interpolate, $translate, $filter, $templateCache, $timeout, $location,\n esGeo, UIUtils, csNetwork, MapUtils, leafletData) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('NetworkLookupCtrl', {$scope: $scope}));\n\n var\n formatPubkey = $filter('formatPubkey'),\n markerMessageTemplate,\n markersSearchLayer,\n icons= {\n member: {\n type: 'awesomeMarker',\n icon: 'person',\n markerColor: 'green',\n iconColor: 'white'\n },\n mirror: {\n type: 'awesomeMarker',\n icon: 'radio-waves',\n markerColor: 'green',\n iconColor: 'white'\n },\n offline: {\n type: 'awesomeMarker',\n icon: 'ion-close-circled',\n markerColor: 'red',\n iconColor: 'white'\n }\n },\n markerIdByPeerId = {},\n markerCounter = 0\n ;\n\n // Init the template for marker popup\n markerMessageTemplate = '<div class=\"item item-peer item-icon-left no-border\" ng-click=\"selectPeer(peer)\">';\n markerMessageTemplate += $templateCache.get('templates/network/item_content_peer.html');\n markerMessageTemplate += '</div>';\n markerMessageTemplate = markerMessageTemplate.replace(/[:]rebind[:]|[:][:]/g, ''); // remove binding limitation\n\n $scope.loading = true;\n $scope.mapId = 'map-network-' + $scope.$id;\n $scope.helptipPrefix = 'helptip-' + $scope.mapId; //Override value from super controller (avoid error during help tour)\n\n $scope.map = MapUtils.map({\n cache: 'map-network',\n layers: {\n overlays: {\n member: {\n type: 'featureGroup',\n name: 'MAP.NETWORK.VIEW.LAYER.MEMBER',\n visible: true\n },\n mirror: {\n type: 'featureGroup',\n name: 'MAP.NETWORK.VIEW.LAYER.MIRROR',\n visible: true\n },\n offline: {\n type: 'featureGroup',\n name: 'MAP.NETWORK.VIEW.LAYER.OFFLINE',\n visible: false\n }\n }\n },\n bounds: {},\n loading: true,\n markers: {}\n });\n\n var inheritedEnter = $scope.enter;\n $scope.enter = function(e, state) {\n if ($scope.loading) {\n if (state.stateParams && state.stateParams.c) {\n var cPart = state.stateParams.c.split(':');\n $scope.map.center.lat = parseFloat(cPart[0]);\n $scope.map.center.lng = parseFloat(cPart[1]);\n $scope.map.center.zoom = parseInt(cPart[2]);\n }\n\n $scope.$watch(\"map.center\", function() {\n if (!$scope.map.loading) {\n return $timeout(function() {\n $scope.updateLocationHref();\n }, 300);\n }\n }, true);\n\n // Load the map (and init if need)\n $scope.loadMap()\n .then(function(map){\n\n // Load indicator\n map.fire('dataloading');\n\n // inherited\n return inheritedEnter(e, state); // will call inherited load()\n });\n }\n\n else {\n // Make sur to have previous center coordinate defined in the location URL\n $scope.updateLocationHref();\n\n // inherited\n return inheritedEnter(e, state);\n }\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n var inheritedComputeOptions = $scope.computeOptions;\n $scope.computeOptions = function() {\n var options = inheritedComputeOptions();\n options.filter.online = 'all';\n return options;\n };\n\n $scope.loadMap = function() {\n return leafletData.getMap($scope.mapId).then(function(map) {\n if (!$scope.map.loading) return map; // already loaded\n\n // Add loading control\n L.Control.loading({\n position: 'topright',\n separate: true\n }).addTo(map);\n\n // Add search control\n // Create a hidden layer, to hold search markers\n markersSearchLayer = L.layerGroup({visible: false});\n var searchTip = $interpolate($templateCache.get('plugins/map/templates/network/item_search_tooltip.html'));\n MapUtils.control.search({\n layer: markersSearchLayer,\n propertyName: 'title',\n buildTip: function (text, val) {\n return searchTip(val.layer.options);\n },\n moveToLocation: function(lnglat, title, map) {\n if(this.options.zoom)\n this._map.setView(lnglat, this.options.zoom);\n else\n this._map.panTo(lnglat);\n var popupMarkerId = lnglat.layer && lnglat.layer.options && lnglat.layer.options.popupMarkerId;\n if (popupMarkerId) {\n $timeout(function(){\n var popupMarker = _.find(map._layers, function(layer) {\n return (layer.options && layer.options.id === popupMarkerId);\n });\n if (popupMarker) popupMarker.openPopup();\n }, 400);\n }\n },\n firstTipSubmit: true,\n tooltipLimit: 50\n })\n .addTo(map);\n\n // Add marker cluster layer\n var _getMarkerColor = function(marker) {\n return marker.options && marker.options.icon.options.markerColor;\n };\n var markerClusterLayer = L.markerClusterGroup({\n disableClusteringAtZoom: MapUtils.constants.LOCALIZE_ZOOM,\n maxClusterRadius: 65,\n showCoverageOnHover: false,\n iconCreateFunction: function (cluster) {\n var countByColor = _.countBy(cluster.getAllChildMarkers(), _getMarkerColor);\n var markerColor = countByColor.green ? 'green' :\n (countByColor.lightgreen ? 'lightgreen' : (countByColor.lightgray ? 'lightgray' : 'red'));\n var childCount = cluster.getChildCount();\n var className = 'marker-cluster ' + markerColor + ' marker-cluster-';\n if (childCount < 10) {\n className += 'small';\n } else if (childCount < 100) {\n className += 'medium';\n } else {\n className += 'large';\n }\n return L.divIcon({ html: '<div><span>' + childCount + '</span></div>', className: className, iconSize: new L.Point(40, 40) });\n }\n });\n map.eachLayer(function(layer) {\n // Add capabilities of 'featureGroup.subgroup', if layer is a group\n if (layer.addLayer){\n angular.extend(layer, L.featureGroup.subGroup(markerClusterLayer));\n }\n });\n if (esGeo.point.ip.license) {\n markerClusterLayer.getAttribution = function() {\n return '<a target=\\\"_blank\\\" href=\"{0}\">{1}</a>'.format(\n esGeo.point.ip.license.url,\n esGeo.point.ip.license.name);\n };\n }\n markerClusterLayer.addTo(map);\n\n //$scope.map.layers.overlays['offline'].visible=false;\n\n $scope.map.loading = false;\n return map;\n });\n };\n\n $scope.updateView = function(data) {\n console.debug(\"[map] [peers] Updating UI\");\n\n // Always tru if network not started (e.g. after leave+renter the view)\n $scope.search.loading = !$scope.networkStarted || csNetwork.isBusy();\n\n // Store marker id, to be able to apply deletion\n var markerIdByPeerIdToRemove = angular.copy(markerIdByPeerId);\n\n _.forEach(data.peers||[], function(peer){\n // skip TOR peer\n if (peer.isTor()) return; // already define\n // get marker id\n var markerId = markerIdByPeerId[peer.id];\n\n // if already exists\n if (markerId && $scope.map.markers[markerId]) {\n $scope.updateMarker($scope.map.markers[markerId], peer);\n delete markerIdByPeerIdToRemove[peer.id];\n return;\n }\n\n // Get position by IP\n var bma = peer.bma;\n var address = peer.hasValid4(bma) ? bma.ipv4 : (bma.dns || bma.ipv6);\n esGeo.point.ip.search(address)\n\n // Create the marker\n .then(function(position){// Add marker to list\n markerId = '' + markerCounter++;\n var marker = $scope.updateMarker({\n position: position,\n getMessageScope: function() {\n var scope = $scope.$new();\n scope.peer = peer;\n return scope;\n },\n draggable: false,\n focus: false,\n message: markerMessageTemplate,\n id: markerId\n }, peer);\n\n\n $scope.map.markers[markerId] = marker;\n markerIdByPeerId[peer.id] = markerId;\n\n // Create a search marker (will be hide)\n var searchServer = peer.dns || peer.server;\n var searchText = searchServer +\n (peer.uid ? (' | ' + (peer.name||peer.uid)) : '') +\n ' | ' + formatPubkey(peer.pubkey);\n var searchIp;\n if (bma.ipv4 && !(peer.dns || peer.server).startsWith(bma.ipv4)) {\n searchIp = bma.ipv4;\n searchText += ' | ' + bma.ipv4;\n }\n markersSearchLayer.addLayer(new L.Marker({\n lat: position.lat,\n lng: position.lng\n },\n {\n opacity: 0,\n icon: L.divIcon({\n className: 'ng-hide',\n iconSize: L.point(0, 0)\n }),\n title: searchText,\n peer: angular.extend({ipv4: searchIp}, peer),\n popupMarkerId: markerId\n }));\n })\n .catch(function(err) {\n console.debug('No position found for address ['+address+']', err);\n });\n });\n\n // Remove old markers not found in the new result\n _.forEach(_.keys(markerIdByPeerIdToRemove), function(peerId) {\n delete markerIdByPeerId[peerId];\n });\n _.forEach(_.values(markerIdByPeerIdToRemove), function(markerId) {\n delete $scope.map.markers[markerId];\n });\n\n // Hide loading indicator, when finished\n if (!$scope.search.loading) {\n leafletData.getMap($scope.mapId)\n .then(function (map) {\n $scope.loading = false;\n map.fire('dataload');\n });\n }\n };\n\n $scope.updateMarker = function(marker, peer) {\n marker.layer = !peer.online ? 'offline' : (peer.uid ? 'member' : 'mirror');\n marker.icon = angular.copy(icons[marker.layer]);\n marker.opacity = peer.online ? 1 : 1;\n marker.title = peer.dns || peer.server;\n if (peer.online && !peer.hasMainConsensusBlock) {\n marker.icon.markerColor = peer.hasConsensusBlock ? 'lightgreen' : 'lightgray';\n marker.opacity = peer.hasConsensusBlock ? 0.9 : 0.8;\n }\n if (!marker.lng) {\n marker.lng = marker.position.lng + Math.random() / 1000;\n marker.lat = marker.position.lat + Math.random() / 1000;\n }\n\n return marker;\n };\n\n\n // Update the browser location, to be able to refresh the page\n $scope.updateLocationHref = function(centerHash) {\n // removeIf(device)\n var params = $location.search() || {};\n if (!params.c || !MapUtils.center.isDefault($scope.map.center)) {\n centerHash = centerHash || '{0}:{1}:{2}'.format($scope.map.center.lat.toFixed(4), $scope.map.center.lng.toFixed(4), $scope.map.center.zoom);\n $location.search({ c: centerHash}).replace();\n }\n // endRemoveIf(device)\n };\n\n // removeIf(device)\n // Update the browser location, to be able to refresh the page\n // FIXME: not need, should be removed\n $scope.$on(\"centerUrlHash\", function(event, centerHash) {\n if (!$scope.loading) {\n return $timeout(function() {\n $scope.updateLocationHref(centerHash);\n }, 300);\n }\n });\n // endRemoveIf(device)\n\n /* -- help tip -- */\n\n $scope.showHelpTip = function() {\n // override subclass\n };\n }]);\n","angular.module('cesium.map.settings.controllers', ['cesium.services'])\n\n // Configure menu items\n .config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Extend settings via extension points\n PluginServiceProvider.extendState('app.es_settings', {\n points: {\n 'common': {\n templateUrl: \"plugins/map/templates/settings/es_settings_extend.html\"\n }\n }\n });\n }\n }])\n\n;\n\n\n","// Ionic Starter App\n\n// angular.module is a global place for creating, registering and retrieving Angular modules\n// 'starter' is the name of this angular module example (also set in a <body> attribute in index.html)\n// the 2nd parameter is an array of 'requires'\n// 'starter.controllers' is found in controllers.js\nangular.module('cesium', ['ionic', 'ionic-material', 'ngMessages', 'ngSanitize', 'pascalprecht.translate',\n 'ngApi', 'angular-cache', 'angular.screenmatch', 'angular.bind.notifier', 'ImageCropper', 'ion-digit-keyboard', 'angular-fullscreen-toggle',\n // removeIf(no-plugin)\n 'cesium.plugins',\n // endRemoveIf(no-plugin)\n 'cesium.filters', 'cesium.config', 'cesium.platform', 'cesium.controllers', 'cesium.templates', 'cesium.translations', 'cesium.components', 'cesium.directives'\n ])\n\n // Override the automatic sync between location URL and state\n // (see watch event $locationChangeSuccess in the run() function bellow)\n .config(['$urlRouterProvider', function ($urlRouterProvider) {\n 'ngInject';\n\n $urlRouterProvider.deferIntercept();\n }])\n\n .run(['$rootScope', '$translate', '$state', '$window', '$urlRouter', 'ionicReady', 'Device', 'UIUtils', '$ionicConfig', 'PluginService', 'csPlatform', 'csWallet', function($rootScope, $translate, $state, $window, $urlRouter, ionicReady,\n Device, UIUtils, $ionicConfig, PluginService, csPlatform, csWallet) {\n 'ngInject';\n\n // Must be done before any other $stateChangeStart listeners\n csPlatform.disableChangeState();\n\n var preventStateChange = false; // usefull to avoid duplicate login, when a first page with auth\n $rootScope.$on('$stateChangeStart', function (event, next, nextParams, fromState) {\n if (event.defaultPrevented) return;\n\n var skip = !next.data || $rootScope.tour || event.currentScope.tour; // disabled for help tour\n if (skip) return;\n\n if (preventStateChange) {\n event.preventDefault();\n return;\n }\n\n var options;\n\n // removeIf(android)\n // removeIf(ios)\n // removeIf(firefoxos)\n // -- Automatic redirection to large state (if define) (keep this code for platforms web and ubuntu build)\n if (next.data.large && !UIUtils.screen.isSmall()) {\n event.preventDefault();\n $state.go(next.data.large, nextParams);\n return;\n }\n // endRemoveIf(firefoxos)\n // endRemoveIf(ios)\n // endRemoveIf(android)\n\n var wallet = nextParams.wallet && nextParams.wallet != \"default\" ? csWallet.children.get(nextParams.wallet) : csWallet;\n if (nextParams.wallet && !wallet) {\n console.warn(\"[app] Unable to find the children wallet: \" + nextParams.wallet);\n }\n // If state need auth\n if (next.data.auth && !wallet.isAuth()) {\n event.preventDefault();\n options = next.data.minData ? {minData: true} : undefined;\n preventStateChange = true;\n return csWallet.auth(options)\n .then(function() {\n preventStateChange = false;\n return $state.go(next.name, nextParams);\n })\n .catch(function(err) {\n preventStateChange = false;\n // If cancel, redirect to home, if no current state\n if (err === 'CANCELLED' && !$state.current.name) {\n return $state.go('app.home');\n }\n });\n }\n\n // If state need login\n else if (next.data.login && !csWallet.isLogin()) {\n event.preventDefault();\n options = next.data.minData ? {minData: true} : undefined;\n preventStateChange = true;\n return csWallet.login(options)\n .then(function() {\n preventStateChange = false;\n return $state.go(next.name, nextParams);\n })\n .catch(function(err) {\n preventStateChange = false;\n // If cancel, redirect to home, if no current state\n if (err === 'CANCELLED' && !$state.current.name) {\n return $state.go('app.home');\n }\n });\n }\n\n // If state need login or auth, make sure to load wallet data\n else if (next.data.login || next.data.auth) {\n options = next.data.minData ? {minData: true} : undefined;\n if (!wallet.isDataLoaded(options)) {\n event.preventDefault();\n // Show loading message, when full load\n if (!options || !options.minData) UIUtils.loading.show();\n return wallet.loadData(options)\n .then(function() {\n preventStateChange = false;\n return $state.go(next.name, nextParams);\n });\n }\n }\n });\n\n // Leave the current page, if auth was required to access it\n csWallet.api.data.on.unauth($rootScope, function() {\n if ($state.current && $state.current.data && $state.current.data.auth) {\n $state.go('app.home');\n }\n });\n\n // Prevent $urlRouter's default handler from firing (don't sync ui router)\n $rootScope.$on('$locationChangeSuccess', function(event, newUrl, oldUrl) {\n if ($state.current.data && $state.current.data.silentLocationChange === true) {\n // Skipping propagation, because same URL, and state configured with 'silentLocationChange' options\n var sameUrl = oldUrl && (oldUrl.split('?')[0] === newUrl.split('?')[0]);\n if (sameUrl) event.preventDefault();\n }\n });\n\n // Configures $urlRouter's listener *after* the previous listener\n $urlRouter.listen();\n\n // Start plugins eager services\n PluginService.start();\n\n ionicReady().then(function() {\n if (ionic.Platform.isIOS()) {\n if(window.StatusBar) {\n // fix font color not white on iOS 11+\n StatusBar.styleLightContent();\n }\n }\n });\n }])\n;\n\nwindow.ionic.Platform.ready(function() {\n angular.bootstrap(document, ['cesium']);\n});\n","angular.module('cesium.components', [])\n\n .component('csBadgeCertification', {\n bindings: {\n requirements: '=',\n parameters: '<',\n csId: '@'\n },\n templateUrl: 'templates/common/badge_certification_count.html'\n })\n\n .component('csBadgeGivenCertification', {\n bindings: {\n identity: '=',\n parameters: '<',\n csId: '@'\n },\n templateUrl: 'templates/common/badge_given_certification_count.html'\n })\n\n .component('csSortIcon', {\n bindings: {\n asc: '=',\n sort: '=',\n toggle: '<'\n },\n template:\n '<i class=\"ion-chevron-up\" ng-class=\"{gray: !$ctrl.asc || $ctrl.sort != $ctrl.toggle}\" style=\"position: relative; left: 5px; top:-5px; font-size: 9px;\"></i>' +\n '<i class=\"ion-chevron-down\" ng-class=\"{gray : $ctrl.asc || $ctrl.sort != $ctrl.toggle}\" style=\"position: relative; left: -2.6px; top: 3px; font-size: 9px;\"></i>'\n })\n\n;\n","angular.module('cesium.directives', [])\n\n // Add new compare-to directive (need for form validation)\n .directive(\"compareTo\", function() {\n return {\n require: \"?ngModel\",\n link: function(scope, element, attributes, ngModel) {\n if (ngModel && attributes.compareTo) {\n ngModel.$validators.compareTo = function(modelValue) {\n return modelValue == scope.$eval(attributes.compareTo);\n };\n\n scope.$watch(attributes.compareTo, function() {\n ngModel.$validate();\n });\n }\n }\n };\n })\n\n // Add new different-to directive (need for form validation)\n .directive(\"differentTo\", function() {\n return {\n require: \"?ngModel\",\n link: function(scope, element, attributes, ngModel) {\n if (ngModel && attributes.differentTo) {\n ngModel.$validators.differentTo = function(modelValue) {\n return modelValue != scope.$eval(attributes.differentTo);\n };\n\n scope.$watch(attributes.differentTo, function() {\n ngModel.$validate();\n });\n }\n }\n };\n })\n\n .directive('numberFloat', function() {\n var NUMBER_REGEXP = new RegExp('^[0-9]+([.,][0-9]+)?$');\n\n return {\n require: '?ngModel',\n link: function(scope, element, attributes, ngModel) {\n if (ngModel) {\n ngModel.$validators.numberFloat = function(value) {\n return ngModel.$isEmpty(value) || NUMBER_REGEXP.test(value);\n };\n }\n }\n };\n })\n\n .directive('numberInt', function() {\n var INT_REGEXP = new RegExp('^[0-9]+$');\n return {\n require: 'ngModel',\n link: function(scope, element, attrs, ngModel) {\n if (ngModel) {\n ngModel.$validators.numberInt = function (value) {\n return ngModel.$isEmpty(value) || INT_REGEXP.test(value);\n };\n }\n }\n };\n })\n\n .directive('email', function() {\n var EMAIL_REGEXP = new RegExp('^[a-z0-9!#$%&\\'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&\\'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$');\n return {\n require: 'ngModel',\n link: function(scope, element, attrs, ngModel) {\n if (ngModel) {\n ngModel.$validators.email = function (value) {\n return ngModel.$isEmpty(value) || EMAIL_REGEXP.test(value);\n };\n }\n }\n };\n })\n\n .directive('requiredIf', function() {\n return {\n require: '?ngModel',\n link: function(scope, element, attributes, ngModel) {\n if (ngModel && attributes.requiredIf) {\n ngModel.$validators.required = function(value) {\n return !(scope.$eval(attributes.requiredIf)) || !ngModel.$isEmpty(value);\n };\n\n scope.$watch(attributes.requiredIf, function() {\n ngModel.$validate();\n });\n }\n }\n };\n })\n\n .directive('geoPoint', function() {\n return {\n require: '?ngModel',\n link: function(scope, element, attributes, ngModel) {\n if (ngModel) {\n ngModel.$validators.geoPoint = function(value) {\n return ngModel.$isEmpty(value) ||\n // twice are defined\n (angular.isDefined(value.lat) && angular.isDefined(value.lon)) ||\n // or twice are NOT defined (=empty object - can be useful to override data in ES node)\n (angular.isUndefined(value.lat) && angular.isUndefined(value.lon));\n };\n }\n }\n };\n })\n\n // Add a copy-on-click directive\n .directive('copyOnClick', ['$window', 'Device', 'UIUtils', function ($window, Device, UIUtils) {\n 'ngInject';\n return {\n restrict: 'A',\n link: function (scope, element, attrs) {\n var showCopyPopover = function (event) {\n var value = attrs.copyOnClick;\n if (value && Device.clipboard.enable) {\n // copy to clipboard\n Device.clipboard.copy(value)\n .then(function(){\n UIUtils.toast.show('INFO.COPY_TO_CLIPBOARD_DONE');\n })\n .catch(UIUtils.onError('ERROR.COPY_CLIPBOARD'));\n }\n else if (value) {\n var rows = value && value.indexOf('\\n') >= 0 ? value.split('\\n').length : 1;\n UIUtils.popover.show(event, {\n scope: scope,\n templateUrl: 'templates/common/popover_copy.html',\n bindings: {\n value: attrs.copyOnClick,\n rows: rows\n },\n autoselect: '.popover-copy ' + (rows <= 1 ? 'input' : 'textarea')\n });\n }\n };\n element.bind('click', showCopyPopover);\n element.bind('hold', showCopyPopover);\n }\n };\n }])\n\n // Add a select-on-click directive\n .directive('selectOnClick', ['$window', function ($window) {\n 'ngInject';\n return {\n restrict: 'A',\n link: function (scope, element, attrs) {\n element.bind('click', function () {\n if ($window.getSelection && !$window.getSelection().toString() && this.value) {\n this.setSelectionRange(0, this.value.length);\n }\n });\n }\n };\n }])\n\n .directive('activeLink', ['$location', function ($location) {\n 'ngInject';\n return {\n restrict: 'A',\n link: function(scope, element, attrs, controller) {\n var clazz = attrs.activeLink;\n var path;\n if (attrs.activeLinkPathPrefix) {\n path = attrs.activeLinkPathPrefix.substring(1); //hack because path does not return including hashbang\n scope.location = $location;\n scope.$watch('location.path()', function (newPath) {\n if (newPath && newPath.indexOf(path) === 0) {\n element.addClass(clazz);\n } else {\n element.removeClass(clazz);\n }\n });\n }\n else if (attrs.href) {\n path = attrs.href.substring(1); //hack because path does not return including hashbang\n scope.location = $location;\n scope.$watch('location.path()', function (newPath) {\n if (newPath && newPath == path) {\n element.addClass(clazz);\n } else {\n element.removeClass(clazz);\n }\n });\n }\n }\n };\n }])\n\n // All this does is allow the message\n // to be sent when you tap return\n .directive('input', ['$timeout', function($timeout) {\n return {\n restrict: 'E',\n scope: {\n 'returnClose': '=',\n 'onReturn': '&',\n 'onFocus': '&',\n 'onBlur': '&'\n },\n link: function(scope, element, attr) {\n element.bind('focus', function(e) {\n if (scope.onFocus) {\n $timeout(function() {\n scope.onFocus();\n });\n }\n });\n element.bind('blur', function(e) {\n if (scope.onBlur) {\n $timeout(function() {\n scope.onBlur();\n });\n }\n });\n element.bind('keydown', function(e) {\n if (e.which == 13) {\n if (scope.returnClose) element[0].blur();\n if (scope.onReturn) {\n $timeout(function() {\n scope.onReturn();\n });\n }\n }\n });\n }\n };\n }])\n\n .directive('trustAsHtml', ['$sce', '$compile', '$parse', function($sce, $compile, $parse){\n return {\n restrict: 'A',\n compile: function (tElement, tAttrs) {\n var ngBindHtmlGetter = $parse(tAttrs.trustAsHtml);\n var ngBindHtmlWatch = $parse(tAttrs.trustAsHtml, function getStringValue(value) {\n return (value || '').toString();\n });\n $compile.$$addBindingClass(tElement);\n\n return function ngBindHtmlLink(scope, element, attr) {\n $compile.$$addBindingInfo(element, attr.trustAsHtml);\n\n scope.$watch(ngBindHtmlWatch, function ngBindHtmlWatchAction() {\n // we re-evaluate the expr because we want a TrustedValueHolderType\n // for $sce, not a string\n element.html($sce.getTrustedHtml($sce.trustAsHtml(ngBindHtmlGetter(scope))) || '');\n $compile(element.contents())(scope);\n });\n };\n }\n };\n }])\n\n /**\n * Close the current modal\n */\n .directive('modalClose', ['$ionicHistory', '$timeout', function($ionicHistory, $timeout) {\n return {\n restrict: 'AC',\n link: function($scope, $element) {\n $element.bind('click', function() {\n if ($scope.closeModal) {\n $ionicHistory.nextViewOptions({\n historyRoot: true,\n disableAnimate: true,\n expire: 300\n });\n // if no transition in 300ms, reset nextViewOptions\n // the expire should take care of it, but will be cancelled in some\n // cases. This directive is an exception to the rules of history.js\n $timeout( function() {\n $ionicHistory.nextViewOptions({\n historyRoot: false,\n disableAnimate: false\n });\n }, 300);\n $scope.closeModal();\n }\n });\n }\n };\n }])\n\n /**\n * Plugin extension point (see services/plugin-services.js)\n */\n .directive('csExtensionPoint', ['$state', '$compile', '$controller', '$templateCache', 'PluginService', function ($state, $compile, $controller, $templateCache, PluginService) {\n var getTemplate = function(extensionPoint) {\n var template = extensionPoint.templateUrl ? $templateCache.get(extensionPoint.templateUrl) : extensionPoint.template;\n if (!template) {\n console.error('[plugin] Could not found template for extension :' + (extensionPoint.templateUrl ? extensionPoint.templateUrl : extensionPoint.template));\n return '';\n }\n if (extensionPoint.controller) {\n template = '<ng-controller ng-controller=\"'+extensionPoint.controller+'\">' + template + '</div>';\n }\n return template;\n };\n\n var compiler = function(tElement, tAttributes) {\n\n if (angular.isDefined(tAttributes.name)) {\n var extensionPoints = PluginService.extensions.points.getActivesByName(tAttributes.name);\n if (extensionPoints.length > 0) {\n tElement.html(\"\");\n _.forEach(extensionPoints, function(extensionPoint){\n tElement.append(getTemplate(extensionPoint));\n });\n }\n }\n\n return {\n pre: function(scope, iElement, iAttrs){\n PluginService.extensions.points.current.set(iAttrs.name);\n },\n post: function(){\n PluginService.extensions.points.current.set();\n }\n };\n };\n\n\n return {\n restrict: \"E\",\n compile: compiler,\n scope: {\n content:'='\n }\n };\n }])\n\n .directive('onReadFile', ['$parse', function ($parse) {\n return {\n restrict: 'A',\n scope: false,\n link: function(scope, element, attrs) {\n var fn = $parse(attrs.onReadFile);\n\n element.on('change', function(onChangeEvent) {\n var reader = new FileReader();\n var fileData = {\n name: this.files[0].name,\n size: this.files[0].size,\n type: this.files[0].type\n };\n\n reader.onload = function(onLoadEvent) {\n scope.$applyAsync(function() {\n fn(scope, {\n file: {\n fileContent: onLoadEvent.target.result,\n fileData : fileData}\n });\n });\n };\n reader.readAsText((onChangeEvent.srcElement || onChangeEvent.target).files[0]);\n });\n }\n };\n }])\n\n.directive(\"dropZone\", ['$parse', function($parse) {\n return {\n restrict: 'A',\n scope: false,\n link: function(scope, elem, attrs) {\n var fn = $parse(attrs.dropZone);\n elem.bind('dragover', function (e) {\n e.stopPropagation();\n e.preventDefault();\n });\n elem.bind('dragenter', function(e) {\n e.stopPropagation();\n e.preventDefault();\n });\n elem.bind('dragleave', function(e) {\n e.stopPropagation();\n e.preventDefault();\n });\n elem.bind('drop', function(e) {\n e.stopPropagation();\n e.preventDefault();\n var file = e.dataTransfer.files[0];\n var fileData = {\n name: file.name,\n size: file.size,\n type: file.type\n };\n\n var reader = new FileReader();\n reader.onload = function(onLoadEvent) {\n scope.$apply(function () {\n fn(scope, {\n file: {\n file: file,\n fileContent: onLoadEvent.target.result,\n fileData : fileData}\n });\n });\n };\n reader.readAsText(e.dataTransfer.files[0]);\n });\n }\n };\n }])\n\n\n // See http://embed.plnkr.co/2vgnFe/\n .directive('fileSelect', ['$parse', function ($parse) {\n 'use strict';\n\n return {\n restrict: 'A',\n scope: false,\n template: '<input type=\"file\" style=\"display: none;\" />' +\n '<ng-transclude></ng-transclude>',\n transclude: true,\n link: function (scope, element, attrs) {\n var fn = $parse(attrs.fileSelect);\n\n var fileInput = element.children('input[file]');\n\n if (attrs.accept) {\n fileInput[0].accept = attrs.accept;\n }\n\n fileInput.on('change', function (onChangeEvent) {\n var reader = new FileReader();\n var file = this.files[0];\n var fileData = {\n name: file.name,\n size: file.size,\n type: file.type\n };\n\n reader.onload = function(onLoadEvent) {\n scope.$applyAsync(function() {\n fn(scope, {\n file: {\n file: file,\n fileContent: onLoadEvent.target.result,\n fileData : fileData}\n });\n });\n };\n reader.readAsText((onChangeEvent.srcElement || onChangeEvent.target).files[0]);\n });\n\n element.on('click', function () {\n fileInput[0].click();\n });\n }\n };\n }])\n\n\n // Un-authenticate when window closed\n // see: https://stackoverflow.com/questions/28197316/javascript-or-angularjs-defer-browser-close-or-tab-close-between-refresh\n .directive('windowExitUnauth', ['$window', 'csSettings', 'csWallet', function($window, csSettings, csWallet) {\n return {\n restrict: 'AE',\n link: function(element, attrs){\n var myEvent = $window.attachEvent || $window.addEventListener,\n chkevent = $window.attachEvent ? 'onunload' : 'unload'; /// make IE7, IE8 compatible\n\n myEvent(chkevent, function (e) { // For >=IE7, Chrome, Firefox\n if (csSettings.data && csSettings.data.keepAuthIdle != csSettings.constants.KEEP_AUTH_IDLE_SESSION) {\n return csWallet.unauth();\n }\n });\n }\n };\n }]);\n","// Cesium filters\nangular.module('cesium.filters', ['cesium.config', 'cesium.platform', 'pascalprecht.translate', 'cesium.translations'\n])\n\n .factory('filterTranslations', ['$rootScope', '$q', 'csPlatform', 'csSettings', 'csCurrency', '$translate', '$timeout', function($rootScope, $q, csPlatform, csSettings, csCurrency, $translate, $timeout) {\n 'ngInject';\n\n var\n started = false,\n startPromise,\n that = this;\n\n that.MEDIAN_TIME_OFFSET = 3600 /*G1 default value*/;\n\n // Update some translations, when locale changed\n function onLocaleChange() {\n console.debug('[filter] Loading translations for locale [{0}]'.format($translate.use()));\n return $translate(['COMMON.DATE_PATTERN', 'COMMON.DATE_SHORT_PATTERN', 'COMMON.UD', 'COMMON.DAYS'])\n .then(function(translations) {\n that.DATE_PATTERN = translations['COMMON.DATE_PATTERN'];\n if (that.DATE_PATTERN === 'COMMON.DATE_PATTERN') {\n that.DATE_PATTERN = 'YYYY-MM-DD HH:mm';\n }\n that.DATE_SHORT_PATTERN = translations['COMMON.DATE_SHORT_PATTERN'];\n if (that.DATE_SHORT_PATTERN === 'COMMON.DATE_SHORT_PATTERN') {\n that.DATE_SHORT_PATTERN = 'YYYY-MM-DD';\n }\n that.DATE_MONTH_YEAR_PATTERN = translations['COMMON.DATE_MONTH_YEAR_PATTERN'];\n if (that.DATE_MONTH_YEAR_PATTERN === 'COMMON.DATE_MONTH_YEAR_PATTERN') {\n that.DATE_MONTH_YEAR_PATTERN = 'MMM YY';\n }\n that.DAYS = translations['COMMON.DAYS'];\n if (that.DAYS === 'COMMON.DAYS') {\n that.DAYS = 'days';\n }\n that.UD = translations['COMMON.UD'];\n if (that.UD === 'COMMON.UD') {\n that.UD = 'UD';\n }\n });\n }\n\n // Update some translations, when locale changed\n function onCurrencyChange() {\n console.debug('[filter] Computing constants from currency parameters');\n that.MEDIAN_TIME_OFFSET = csCurrency.data.medianTimeOffset || that.MEDIAN_TIME_OFFSET;\n }\n\n that.ready = function() {\n if (started) return $q.when();\n return startPromise || that.start();\n };\n\n that.start = function() {\n startPromise = csPlatform.ready()\n .then(onLocaleChange)\n .then(function() {\n onCurrencyChange();\n started = true;\n\n csSettings.api.locale.on.changed($rootScope, onLocaleChange, this);\n csCurrency.api.data.on.ready($rootScope, onCurrencyChange, this);\n });\n return startPromise;\n };\n\n // Default action\n // Must be started with a delay, to allow settings override, before starting platform (need by Cesium API)\n $timeout(function() {\n that.start();\n });\n\n return that;\n }])\n\n .filter('formatInteger', function() {\n return function(input) {\n return !input ? '0' : (input < 10000000 ? numeral(input).format('0,0') : numeral(input).format('0,0.000 a'));\n };\n })\n\n .filter('formatAmount', ['csConfig', 'csSettings', 'csCurrency', '$filter', function(csConfig, csSettings, csCurrency, $filter) {\n var pattern = '0,0.0' + Array(csConfig.decimalCount || 4).join('0');\n var patternBigNumber = '0,0.000 a';\n var currencySymbol = $filter('currencySymbol');\n\n // Always add one decimal for relative unit\n var patternRelative = pattern + '0';\n var minValueRelative = 1 / Math.pow(10, (csConfig.decimalCount || 4) + 1 /*add one decimal in relative*/);\n\n function formatRelative(input, options) {\n var currentUD = options && options.currentUD ? options.currentUD : csCurrency.data.currentUD;\n if (!currentUD) {\n console.warn(\"formatAmount: currentUD not defined\");\n return;\n }\n var amount = input / currentUD;\n if (Math.abs(input) < minValueRelative && input !== 0) {\n amount = '~ 0';\n }\n else {\n amount = numeral(amount).format(patternRelative);\n }\n if (options && options.currency) {\n return amount + ' ' + currencySymbol(options.currency, true);\n }\n return amount;\n }\n\n function formatQuantitative(input, options) {\n var amount = numeral(input/100).format((input < -1000000000 || input > 1000000000) ? patternBigNumber : pattern);\n if (options && options.currency) {\n return amount + ' ' + currencySymbol(options.currency, false);\n }\n return amount;\n }\n\n return function(input, options) {\n if (input === undefined) return;\n return (options && angular.isDefined(options.useRelative) ? options.useRelative : csSettings.data.useRelative) ?\n formatRelative(input, options) :\n formatQuantitative(input, options);\n };\n }])\n\n .filter('formatAmountNoHtml', ['csConfig', 'csSettings', 'csCurrency', '$filter', function(csConfig, csSettings, csCurrency, $filter) {\n var minValue = 1 / Math.pow(10, csConfig.decimalCount || 4);\n var format = '0,0.0' + Array(csConfig.decimalCount || 4).join('0');\n var currencySymbol = $filter('currencySymbolNoHtml');\n\n function formatRelative(input, options) {\n var currentUD = options && options.currentUD ? options.currentUD : csCurrency.data.currentUD;\n if (!currentUD) {\n console.warn(\"formatAmount: currentUD not defined\");\n return;\n }\n var amount = input / currentUD;\n if (Math.abs(amount) < minValue && input !== 0) {\n amount = '~ 0';\n }\n else {\n amount = numeral(amount).format(format);\n }\n if (options && options.currency) {\n return amount + ' ' + currencySymbol(options.currency, true);\n }\n return amount;\n }\n\n function formatQuantitative(input, options) {\n var amount = numeral(input/100).format((input > -1000000000 && input < 1000000000) ? '0,0.00' : '0,0.000 a');\n if (options && options.currency) {\n return amount + ' ' + currencySymbol(options.currency, false);\n }\n return amount;\n }\n\n return function(input, options) {\n if (input === undefined) return;\n return (options && angular.isDefined(options.useRelative) ? options.useRelative : csSettings.data.useRelative) ?\n formatRelative(input, options) :\n formatQuantitative(input, options);\n };\n }])\n\n .filter('currencySymbol', ['filterTranslations', '$filter', 'csSettings', function(filterTranslations, $filter, csSettings) {\n return function(input, useRelative) {\n if (!input) return '';\n return (angular.isDefined(useRelative) ? useRelative : csSettings.data.useRelative) ?\n (filterTranslations.UD + '<sub>' + $filter('abbreviate')(input) + '</sub>') :\n $filter('abbreviate')(input);\n };\n }])\n\n .filter('currencySymbolNoHtml', ['filterTranslations', '$filter', 'csSettings', function(filterTranslations, $filter, csSettings) {\n return function(input, useRelative) {\n if (!input) return '';\n return (angular.isDefined(useRelative) ? useRelative : csSettings.data.useRelative) ?\n (filterTranslations.UD + ' ' + $filter('abbreviate')(input)) :\n $filter('abbreviate')(input);\n };\n }])\n\n .filter('formatDecimal', ['csConfig', 'csCurrency', function(csConfig, csCurrency) {\n var minValue = 1 / Math.pow(10, csConfig.decimalCount || 4);\n var format = '0,0.0' + Array(csConfig.decimalCount || 4).join('0');\n\n return function(input) {\n if (input === undefined) return '0';\n if (input === Infinity || input === -Infinity) {\n console.warn(\"formatDecimal: division by zero ? (is currentUD defined ?) = \" + csCurrency.data.currentUD);\n return 'error';\n }\n if (Math.abs(input) < minValue) return '~ 0';\n return numeral(input/*-0.00005*/).format(format);\n };\n }])\n\n .filter('formatNumeral', function() {\n return function(input, pattern) {\n if (input === undefined) return '0';\n // for DEBUG only\n //if (isNaN(input)) {\n // return 'NaN';\n //}\n if (Math.abs(input) < 0.0001) return '~ 0';\n return numeral(input).format(pattern);\n };\n })\n\n .filter('formatDate', ['filterTranslations', function(filterTranslations) {\n return function(input) {\n return input ? moment.unix(parseInt(input)).local().format(filterTranslations.DATE_PATTERN || 'YYYY-MM-DD HH:mm') : '';\n };\n }])\n\n .filter('formatDateShort', ['filterTranslations', function(filterTranslations) {\n return function(input) {\n return input ? moment.unix(parseInt(input)).local().format(filterTranslations.DATE_SHORT_PATTERN || 'YYYY-MM-DD') : '';\n };\n }])\n\n .filter('formatDateMonth', ['filterTranslations', function(filterTranslations) {\n return function(input) {\n return input ? moment.unix(parseInt(input)).local().format(filterTranslations.DATE_MONTH_YEAR_PATTERN || 'MMM YY') : '';\n };\n }])\n\n .filter('formatDateForFile', ['filterTranslations', function(filterTranslations) {\n return function(input) {\n return input ? moment.unix(parseInt(input)).local().format(filterTranslations.DATE_FILE_PATTERN || 'YYYY-MM-DD') : '';\n };\n }])\n\n .filter('formatTime', function() {\n return function(input) {\n return input ? moment.unix(parseInt(input)).local().format('HH:mm') : '';\n };\n })\n\n .filter('formatFromNow', function() {\n return function(input) {\n return input ? moment.unix(parseInt(input)).fromNow() : '';\n };\n })\n\n .filter('formatFromNowAndDate', ['filterTranslations', function(filterTranslations) {\n return function(input, options) {\n var m = input && moment.unix(parseInt(input));\n return m && (m.fromNow() + (options && options.separator || ' | ') + m.local().format(filterTranslations.DATE_PATTERN || 'YYYY-MM-DD HH:mm')) || '';\n };\n }])\n\n .filter('formatDurationTo', function() {\n return function(input) {\n return input ? moment.unix(moment().utc().unix() + parseInt(input)).fromNow() : '';\n };\n })\n\n .filter('formatDuration', function() {\n return function(input) {\n return input ? moment(0).from(moment.unix(parseInt(input)), true) : '';\n };\n })\n\n\n .filter('formatDurationTime', ['filterTranslations', function(filterTranslations) {\n return function(input) {\n if (!input) return '';\n var sign = input && input < 0 ? '-' : '+';\n input = Math.abs(input);\n var day = Math.trunc(input/3600/24);\n var hour = Math.trunc(input/3600 - day*24);\n var min = Math.trunc(input/60 - day*24*60 - hour*60);\n return day > 0 ? (sign + day + ' ' + filterTranslations.DAYS + ' ' + hour + 'h ' + min + 'm') :\n (hour > 0 ? (sign + hour + 'h ' + min + 'm') : (sign + min + 'm')) ;\n };\n }])\n\n // Display time in ms or seconds (see i18n label 'COMMON.EXECUTION_TIME')\n .filter('formatDurationMs', function() {\n return function(input) {\n return input ? (\n (input < 1000) ?\n (input + 'ms') :\n (input/1000 + 's')\n ) : '';\n };\n })\n\n .filter('formatPeriod', function() {\n return function(input) {\n if (!input) {return null;}\n var duration = moment(0).from(moment.unix(parseInt(input)), true);\n return duration.split(' ').slice(-1)[0]; // keep only last words (e.g. remove \"un\" \"a\"...)\n };\n })\n\n .filter('formatFromNowShort', function() {\n return function(input) {\n return input ? moment.unix(parseInt(input)+offset).fromNow(true) : '';\n };\n })\n\n /* -- median time (apply currency offset)-- */\n\n .filter('medianDate', ['filterTranslations', function(filterTranslations) {\n return function(input) {\n return input ? moment.unix(parseInt(input) + filterTranslations.MEDIAN_TIME_OFFSET).local().format(filterTranslations.DATE_PATTERN || 'YYYY-MM-DD HH:mm') : '';\n };\n }])\n\n .filter('medianDateShort', ['filterTranslations', function(filterTranslations) {\n return function(input) {\n return input ? moment.unix(parseInt(input) + filterTranslations.MEDIAN_TIME_OFFSET).local().format(filterTranslations.DATE_SHORT_PATTERN || 'YYYY-MM-DD') : '';\n };\n }])\n\n\n .filter('medianTime', ['filterTranslations', function(filterTranslations) {\n return function(input) {\n return input ? moment.unix(parseInt(input)+filterTranslations.MEDIAN_TIME_OFFSET).local().format('HH:mm') : '';\n };\n }])\n\n .filter('medianFromNow', ['filterTranslations', function(filterTranslations) {\n return function(input) {\n return input ? moment.unix(parseInt(input) + filterTranslations.MEDIAN_TIME_OFFSET).fromNow() : '';\n };\n }])\n\n .filter('medianFromNowShort', ['filterTranslations', function(filterTranslations) {\n return function(input) {\n return input ? moment.unix(parseInt(input)+filterTranslations.MEDIAN_TIME_OFFSET).fromNow(true) : '';\n };\n }])\n\n .filter('medianFromNowAndDate', ['filterTranslations', function(filterTranslations) {\n return function(input, options) {\n var m = input && moment.unix(parseInt(input)+filterTranslations.MEDIAN_TIME_OFFSET);\n return m && (m.fromNow() + (options && options.separator || ' | ') + m.local().format(filterTranslations.DATE_PATTERN || 'YYYY-MM-DD HH:mm')) || '';\n };\n }])\n\n\n /* -- text filter -- */\n\n .filter('capitalize', function() {\n return function(input) {\n if (!input) return '';\n input = input.toLowerCase();\n return input.length > 1 ? (input.substring(0,1).toUpperCase()+input.substring(1)) : input;\n };\n })\n\n .filter('abbreviate', function() {\n var _cache = {};\n return function(input) {\n var currency = input || '';\n if (_cache[currency]) return _cache[currency];\n if (currency.length > 3) {\n var unit = '', sepChars = ['-', '_', ' '];\n for (var i = 0; i < currency.length; i++) {\n var c = currency[i];\n if (i === 0) {\n unit = (c === 'g' || c === 'G') ? 'Ğ' : c ;\n }\n else if (i > 0 && sepChars.indexOf(currency[i-1]) != -1) {\n unit += c;\n }\n }\n currency = unit.toUpperCase();\n }\n else {\n currency = currency.toUpperCase();\n if (currency.charAt(0) === 'G') {\n currency = 'Ğ' + (currency.length > 1 ? currency.substr(1) : '');\n }\n }\n\n _cache[input] = currency;\n return currency;\n };\n })\n\n .filter('upper', function() {\n return function(input) {\n if (!input) return '';\n return input.toUpperCase();\n };\n })\n\n .filter('formatPubkey', function() {\n return function(input) {\n return input ? input.substr(0,8) : '';\n };\n })\n\n .filter('formatHash', function() {\n return function(input) {\n return input ? input.substr(0,4) + input.substr(input.length-4) : '';\n };\n })\n\n .filter('formatCategory', function() {\n return function(input) {\n return input && input.length > 28 ? input.substr(0,25)+'...' : input;\n };\n })\n\n // Convert to user friendly URL (e.g. \"Like - This\" -> \"like-this\")\n .filter('formatSlug', function() {\n return function(input) {\n return input ? encodeURIComponent(input\n .toLowerCase()\n .replace(/<[^>]+>/g,'') // Remove tag (like HTML tag)\n .replace(/[^\\w ]+/g,'')\n .replace(/ +/g,'-'))\n : '';\n };\n })\n\n // Convert a URI into parameter (e.g. \"http://hos/path\" -> \"http%3A%2F%2Fhost%2Fpath\")\n .filter('formatEncodeURI', function() {\n return function(input) {\n return input ? encodeURIComponent(input): '';\n };\n })\n\n .filter('truncText', function() {\n return function(input, size) {\n size = size || 500;\n return !input || input.length <= size ? input : (input.substr(0, size) + '...');\n };\n })\n\n .filter('truncUrl', function() {\n return function(input, size) {\n size = size || 25;\n var startIndex = input.startsWith('http://') ? 7 : (input.startsWith('https://') ? 8 : 0);\n startIndex = input.startsWith('www.', startIndex) ? startIndex + 4 : startIndex; // Remove sequence 'www.'\n return !input || (input.length-startIndex) <= size ? input.substr(startIndex) : (input.substr(startIndex, size) + '...');\n };\n })\n\n .filter('trustAsHtml', ['$sce', function($sce) {\n return function(html) {\n return $sce.trustAsHtml(html);\n };\n }])\n;\n"]}