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

1 line
1.6 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/login-controllers.js","../dist/dist_js/app/controllers/help-controllers.js","../dist/dist_js/app/platform.js","../dist/dist_js/app/services/settings-services.js","../dist/dist_js/app/services/network-services.js","../dist/dist_js/app/services/desktop-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/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/api/api-demo-services.js","../dist/dist_js/app/templates.js","../dist/dist_js/app/translations.js","../dist/dist_js/app/api/app.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","LoginController","$scope","$timeout","$controller","csWallet","angular","extend","showLoginModal","loading","isLogin","error","login","$on","LoginModalController","$q","$ionicPopover","$window","CryptoUtils","csCrypto","ionicReady","UIUtils","BMA","Modals","csConfig","csSettings","Device","parameters","demo","method","computing","formData","showPubkey","showComputePubkeyButton","autoComputePubkey","pubkeyPattern","format","constants","PUBKEY","PUBKEY_WITH_CHECKSUM","isAuth","auth","okText","title","showMethods","isDefined","showNewAccountLink","expectedPubkey","expectedUid","uid","scryptParamsValues","SCRYPT_PARAMS","reduce","res","concat","label","params","init","then","ionic","Platform","grade","toLowerCase","screen","isSmall","rememberMe","data","keepAuthIdle","keepAuth","KEEP_AUTH_IDLE_SESSION","changeMethod","enter","hide","ink","selector","leave","methods","doLogin","skipForm","form","$valid","promise","username","password","scryptPrams","scrypt","show","scryptKeypair","keypair","util","encode_base58","signPk","pubkeyError","undefined","catch","onError","file","valid","readKeyFile","withSecret","trim","showWotLookupModal","pkChecksum","$error","checksum","rememberMeChanged","equals","keepAuthIdleChanged","methodChanged","paramsChanged","useLocalStorage","store","success","silent","closeModal","console","warn","onScryptFormChanged","computePubkey","$watch","salt","pwd","scryptSignPk","err","showJoinModal","showJoin","showAccountSecurityModal","showAccountSecurity","showHelpModal","showHelp","doScan","barcode","scan","when","uri","parse","debug","keyfile","parseData","signSk","base58","encode","hideMethodsPopover","alert","$submitted","find","item","findWhere","changeScrypt","copy","options","showPassword","subTitle","scope","read","ucode","errorCodes","BAD_PASSWORD","onFileChanged","fileData","name","size","content","fileContent","validatingFile","removeKeyFile","searchText","showWotLookup","q","showMethodsPopover","event","defaultPrevented","popover","templateUrl","autoremove","afterShow","methodsPopover","AuthController","config","readonly","setForm","HelpController","$state","$anchorScroll","e","locale","stateParams","anchor","HelpModalController","itemsClass","listClass","HelpTipController","$ionicSideMenuDelegate","csCurrency","csHelpConstants","tour","continue","executeStep","partName","steps","index","step","next","isUndefined","showHelpTip","bindings","value","hasNext","timeout","enable","backdropClickToClose","helptip","helpAnchor","startHelpTour","startWalletNoLoginTour","startWalletTour","endIndex","wallet","startWalletCertTour","walletCerts","startTxTour","tx","startWalletsTour","wallets","startHeaderTour","startSettingsTour","startWotLookupTour","cancelled","wotLookup","startWotTour","wot","startWotCertTour","wotCerts","startCurrencyTour","currency","startNetworkTour","network","finishTour","startIndex","contentParams","toggleLeft","icon","position","isOpen","go","useRelative","glyph","is","retry","get","showNetworkTabIfNeed","tabs","document","querySelectorAll","element","triggerHandler","installDocUrl","getElementById","currentUD","hasCertificationsItem","isMember","requirements","pendingMembership","stepCount","skipAll","_getProfilBtnElement","elements","el","offsetWidth","style","closeProfilePopover","all","showHome","HelpTourController","state","module","factory","$rootScope","Api","localStorage","$translate","locales","flag","fallbackLocale","fallbackLanguage","fixLocale","localeParts","similarLocale","l","String","prototype","call","previousData","startPromise","fixedLocale","STORAGE_KEY","fixedSettings","cacheTimeMs","timeWarningExpireMembership","timeWarningExpire","minVersion","sourceUrl","sourceLicenseUrl","newIssueUrl","userForumUrl","latestReleaseUrl","duniterLatestReleaseUrl","httpsMode","defaultSettings","merge","useLocalStorageEncryption","persistCache","walletHistoryTimeSecond","walletHistorySliceSecond","walletHistoryAutoRefresh","showUDHistory","expertMode","decimalCount","uiEffects","blockValidityWindow","header","settings","allRules","allWotRules","alertIfUnusedWallet","defaultLanguage","use","license","en","fr-FR","es-ES","started","api","emitChangedEvent","raise","changed","node","temporary","getObject","previousSettings","savedData","setObject","raisePromise","start","applyData","newData","localeChanged","localeId","restore","now","Date","storedData","ready","moment","substr","numeral","language","registerEvent","isStarted","apply","getByPath","path","defaultValue","obj","each","reset","getLicenseUrl","getFeedUrl","feed","jsonFeed","$interval","csHttp","interval","isHttpsMode","location","protocol","bma","listeners","peers","filter","member","mirror","endpoint","online","ssl","tor","sort","type","asc","compact","groupBy","knownBlocks","mainBlock","minOnlineBlockNumber","uidsByPubkeys","searchingPeersOnNetwork","difficulties","ws2pHeads","block","loadW2spHeads","ws2p","heads","hit","sig","head","HTTP_LIMITATION","loadDifficulties","blockchain","stats","levels","level","loadPeers","newPeers","cancel","flushNewPeersAndSort","sortPeers","initJobs","uids","push","addOrRefreshPeerFromJson","jobs","status","blockNumber","parseInt","ep","hasEndpoint","privateWs2pHeads","values","privateEPCount","hasEndPoint","currentNumber","peer","useWs2p","keyID","difficulty","applyPeerFilter","oldBlock","isBma","isWs2p","isSsl","isTor","list","createPeerEntities","hasUpdates","existingPeer","existingMainBuid","existingOnline","refreshPeer","refreshedPeer","existingIndex","indexOf","server","splice","useBma","endpointsAsString","getEndpoints","epStr","parseEndPoint","getServer","dns","getDns","getHost","ws2pHeadKey","useSsl","lightInstance","getPort","current","medianTime","NO_CURRENT_BLOCK","ROOT_BLOCK_HASH","secondTry","getBMA","port","hardship","summary","duniter","updateMainBuid","ids","map","newPeersAdded","computeScoreAlphaValue","nbChars","score","charCodeAt","i","Math","pow","buids","memberPeersCount","count","previousPeer","pct","max","hasMainConsensusBlock","hasConsensusBlock","consensusBlockDelta","uniq","sortBy","compacted","mainBlockChanged","close","info","websocket","onListener","remove","$q_started","callback","hasPeers","getPeers","getTrustedPeers","resolve","reject","getKnownBlocks","getMainBlockUid","mainBuid","isBusy","isDesktop","CryptoAbstractService","loaded","source","isLoaded","array_to_string","buf","bb","Blob","Uint8Array","f","FileReader","onload","target","result","readAsText","crypto_sign_BYTES","crypto_secretbox_NONCEBYTES","crypto_box_MACBYTES","SEED_LENGTH","SIMPLE","N","r","p","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","window","msCrypto","Crypto","FullJSServiceFactory","nacl","base64","check","function_name","check_injectBytes","what","thing","expected_length","leftPadding","check_length","bs","address","MALLOC","nacl_raw","HEAPU8","set","injectBytes","nbytes","_malloc","FREE","pointer","_free","Target","decode_utf8","s","d","unescape","encodeURIComponent","b","encode_utf8","a","decode_base58","decode","decode_base64","encode_base64","hash_sha256","msg","to_hex","crypto_hash_sha256","toUpperCase","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","box","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","pub","sm","crypto_sign_open","sign","m","sk","signedMsg","crypto_sign","load","deferred","defer","naclOptions","scryptOptions","requested_total_memory","loadedLib","checkAllLibLoaded","lib","fromSignKeypair","skFromSignSk","pkFromSignPk","pack","open","offset","subarray","service","serviceImpl","test","regexpContent","RegExp","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","getKeypair","record","recipientFieldName","cypherFieldNames","boxRecipientPk","fieldName","cypherTexts","cypherFieldName","records","issuerFieldName","issuerBoxPks","issuer","issuerBoxPk","text","$ionicPlatform","readyPromise","$ionicLoading","$ionicPopup","$ionicConfig","$ionicHistory","ionicMaterialInk","ionicMaterialMotion","Fullscreen","screenmatch","exports","loadingTextCache","smallscreen","bind","raw","alertError","subtitle","translations","template","buttons","onTap","alertInfo","cssClass","hideLoading","showLoading","translation","isSmallScreen","active","imageOnLoadResize","thumbnail","ctx","width","height","maxWidth","maxHeight","canvas","createElement","getContext","xoffset","trunc","yoffset","drawImage","dataurl","toDataURL","showPopover","popovers","autoselect","focusFirstInput","_show","isResolved","getSelection","toString","setSelectionRange","focus","autofocus","$parent","$emit","_cleanup","removeClass","fromTemplateUrl","closePopover","afterHidden","motionDelegate","delegate","ionListClass","motionTimeout","defaultSelector","startVelocity","createQRCodeObj","typeNumber","errorCorrectionLevel","mb","qrcode","stringToBytes","stringToBytesFuncs","qr","addData","make","toggleOn","classList","toggle","toggleOff","motion","default","ripple","blinds","fadeSlideIn","fadeSlideInRight","panInLeft","pushDown","slideUp","fadeIn","confirm","cancelText","cancelType","okType","notImplemented","update","_getLoader","loader","isShown","toast","duration","noBackdrop","fullMsg","fullscreen","displayEffect","setEffects","views","transition","nothing","class","clearCache","svg","createSvgTag","img","createImgTag","fab","fabs","getElementsByClassName","rows","share","url","href","absolute","postUrl","postMessage","titleKey","showHelptip","querySelector","preAction","postAction","retryTimeout","selection","select","selectElementText","childNodes","range","createRange","selectNodeContents","removeAllRanges","addRange","selectedText","image","resizeFile","src","readAsDataURL","resizeSrc","imageSrc","rotateSrc","angle","PI","rotate","imageOnLoadRotate","$http","CacheFactory","VERY_LONG","LONG","MEDIUM","SHORT","storageMode","getSettingsStorageMode","cacheNames","getCacheOptions","deleteOnExpire","onExpire","cacheFlushInterval","onSettingsChanged","newStorageMode","cacheName","cache","setOptions","on","addListeners","maxAge","counter","createCache","clear","cachePrefix","removeAll","clearAll","controller","filterTranslations","openLink","buildDate","build","DATE_PATTERN","$ionicModal","$injector","DefaultModalController","resolved","openModal","modal","hideModal","body","propName","getParameters","hideDelay","ctrlName","fragments","animation","$new","locals","ctrlEval","isControllerAs","controllerName","ctrlInstance","ModalUtils","showJoinMember","showJoinWallet","showTransfer","useDigitKeyboard","showLogin","showNetworkLookup","showAbout","accountType","showLicense","showSelectPubkeyIdentity","showSelectWallet","submit","preventDefault","popup","afterShowSaved","$destroy","csCache","sockets","allCachePrefixes","host","getUrl","processError","prepare","pkeys","queryParams","newUri","pkey","replace","parseUri","parser","pathname","hostname","search","compareVersionNumbers","v1","v2","v1parts","v2parts","validateParts","x","NaN","forcedTimeout","responseType","headers","getWithCache","autoRefresh","done","put","post","Content-Type","ws","getWsUrl","_waitOpen","self","readyState","waitDuration","waitRetryDelay","min","round","_open","callbacks","WebSocket","onerror","onmessage","JSON","onopen","openTime","onclose","closeEvent","findIndex","socket","closing","code","_close","_remove","send","isClosed","closeAllWs","sock","nw","Shell","openExternal","openOptions","openTarget","win","moveTo","date","utc","unix","compare","isCompatible","actualVersion","storage","sessionStorage","stringify","$log","standard","secure","removeItem","n","cordova","plugins","barcodeScanner","clipboard","$cordovaClipboard","camera","getPicture","sourceType","navigator","PictureSourceType","PHOTOLIBRARY","CAMERA","quality","destinationType","DestinationType","DATA_URL","encodingType","EncodingType","PNG","targetWidth","targetHeight","$cordovaCamera","keyboard","Keyboard","digit","bindModel","modelScope","modelPath","getModelValue","setModelValue","paths","property","action","decimal","decimalSeparator","leftButton","html","rightButton","isIOS","userAgent","match","isOSX","process","isWeb","InAppBrowser","WELL_KNOWN_CURRENCIES","g1","firstBlockTime","medianTimeOffset","resetData","membersCount","loadData","avgGenTime","medianTimeBlocks","currencyName","BLOCK_NOT_FOUND","initPhase","ud","blocks","_safeLoadCurrentUD","blockIndex","ud0","lastBlockWithUD","amount","base","dividend","unitbase","getData","getDataField","field","onBlock","cleanData","currentBlock","receivedAt","newBlock","stop","restart","bmaAlive","alive","currentBlockField","getCurrent","lastValid","useCache","SIG","OUTPUT_OBJ","REGEX_ENDPOINT_PARAMS","BMAS","WS2P","BMATOR","WS2PTOR","USER_ID","CURRENCY","COMMENT","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","forceUseSsl","exact","closeWs","wsByPath","cacheTime","requestKey","getRequestFn","_startPromise","request","execCount","postRequest","postByPath","isAlive","REVOCATION_ALREADY_REGISTERED","IDENTITY_SANDBOX_FULL","NO_MATCHING_IDENTITY","UID_ALREADY_USED","NO_MATCHING_MEMBER","NO_IDTY_MATCHING_PUB_OR_UID","WRONG_SIGNATURE_MEMBERSHIP","MEMBERSHIP_ALREADY_SEND","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","same","node2","port2","peering","lookup","certifiedBy","certifiersOf","pending","requirementsWithCache","add","certify","revoke","blocksSlice","currentWithCache","membership","newcomers","sources","history","sending","pendings","times","timesWithCache","parseUnlockCondition","unlockCondition","treeItem","treeItemId","childrenContent","childrenMatches","convertedOutput","treeItems","functions","loop","children","unlockFunctions","unlockTree","output","epPrefix","ipv4","ipv6","otherNode","wasStarted","results","memberUidsByPubkey","getByUid","blockNumbers","getHttpRecursive","peersByLeaves","leaves","httpGetRequest","paramName","paramValues","paramValue","requestParams","getHttpWithRetryIfLimitation","lastUd","pathCount","getLatestRelease","latest","html_url","tag_name","instance","identityCache","requirementsCache","_addUniqueIds","idties","idtyKeys","idty","_sortAndSliceIdentities","_resetRequirements","meta","hasSelf","needSelf","needMembership","canMembershipOut","needRenew","wasMember","certificationCount","needCertifications","needCertificationCount","willNeedCertificationCount","alternatives","blockUid","sigDate","_fillRequirements","currencyParameters","timestamp","invalid","membershipExpiresIn","membershipPendingExpiresIn","expired","willExpireCertificationCount","cert","expiresIn","willExpire","pendingRevocation","revocation_sig","pendingCertificationCount","pendingCerts","certifiers","union","pluck","sigQty","_fillIdentitiesMeta","identity","time","loadRequirements","inputData","withCache","cacheKey","outdistanced","certCount","loadIdentityByLookup","revoked_on","certPubkeys","certsMap","idtyFullKey","others","certs","certFullKey","cert_time","block_number","block_hash","givenCertifications","signed","loadCertifications","getFunction","lookupCertifications","_certId","lookupHasCertTime","lookupCerticationsByCertId","certId","written","certTime","sigWindow","sigValidity","pendingCertifications","pendingCertByBlocks","validBuid","writtenCertByPubkey","_sortCertifications","errorCertifications","force","dataByLookup","received_cert","received_cert_pending","received_cert_error","given_cert","given_cert_pending","given_cert_error","addEvent","messageParams","revocationTime","addEvents","safeText","addUniqueId","allowExtension","excludeRevoked","blocUid","lookupResultCount","getNewcomersRecursive","maxResultSize","joiner","idtyKey","memberDate","getAllRecursive","letters","pubkeys","letter","extendAll","pubkeyAttributeName","skipAddUid","uidsByPubkey","events","total","hits","memberships","idtiesByBlock","idtiesByPubkey","ms","blockHash","otherIdtySamePubkey","aidty","$filter","FileSaver","csWot","reduceTxAndPush","txArray","processedTxMap","allowPendings","outputBase","lockedOutputs","walletIsIssuer","otherIssuers","issuers","otherRecipients","outputs","sum","noffset","outputArray","conditions","outputAmount","powBase","outputCondition","sigMatches","outputPubkey","identifier","consumed","contains","lockedOutput","txPubkeys","blockstampTime","txKey","newTx","comment","isUD","locktime","inputs","loadTx","fromTime","nowInSec","validating","errors","reduceTxFn","sent","received","sliceTime","from","to","loadUDs","tx1","tx2","firstValidatedTxIndex","toTime","addSources","sourcesIndexByKey","srcKey","addSource","loadSourcesAndBalance","balance","txPendings","txErrors","balanceFromSource","balanceWithPending","_processPendingTx","consumedSources","input","inputKey","srcIndex","txs","allTx","loadSources","downloadHistoryFile","currentTime","filename","formatDecimal","medianDate","formatSymbol","saveAs","Idle","csTx","defaultBMA","CsWallet","loadPromise","enableAuthIdle","localName","isNew","sigStock","encryptedData","resetKeypair","resetTxAndSources","isDefault","hasEncryptedData","needLogin","needAuth","forceAuth","isDataLoaded","authData","loginCheck","restoreData","openEncryptedData","checkAuthIdle","loadOptions","minData","logout","wasAuth","resetStore","unauth","isNeverUsed","avatar","storeData","secureContent","useEncryption","storageKey","notifications","invitations","childrenCount","contentStr","cypherContent","seckey","sessionStorageData","localStorageData","applyRestoredData","oldChildrenCount","oldChildren","removeAllChildrenWallets","child","newChildInstance","addChildWallet","cleanEventsByContext","loadTxAndSources","context","loadSigStock","loadQrCode","refreshData","loadMinData","loadFullData","unused","setSelf","skipData","truncBase","getInputs","filterBase","sourcesAmount","minBase","maxBase","lowerInputs","transfer","destPub","comments","restPub","floor","logs","amountBase","UD","unit","subUnit","rest","isBase","truncBaseOrMinBase","createAndSendTx","pendingTx","unshift","balanceChanged","es","firstSlice","secondSlice","outputOffset","newSources","signedTx","transaction","txHash","getIdentityDocument","sideIn","signedMembership","insertAtFirst","getkeypairSaveId","nbCharSalt","answer","getRevocationDocument","identityLines","idtySignature","revocation","setParent","removedChildren","getChildWalletByPubkey","isUserPubkey","walletId","getAllChildrenWallet","isAuthResult","newEnableAuthIdle","setIdle","watch","unwatch","getIdle","getWalletSettings","allSettings","newSettings","useEncryptionChanged","useStorageChanged","removeListeners","internal","addListener","listener","transferAll","needToLoadRequirements","revokeWithFile","signedCert","downloadSaveId","saveId","questions","getSaveIDDocument","saveIdFile","getCryptedId","recoverId","recover","cypherNonce","cypherSalt","cypherPwd","downloadRevocation","revocationFile","fileName","downloadKeyFile","getByPubkey","inside","out","cleanByContext","create","childIndex","parentWallet","hasPubkey","downloadFile","constant","startWalletHelpTip","isTour","helptipScope","helpController","createHelptipScope","provider","eagerLoadingServices","extensionByStates","registerEagerLoadingService","serviceName","extendState","stateName","extension","extendStates","stateNames","$get","currentExtensionPointName","extensions","points","getActivesByName","extensionPointName","includes","demoPubkey","BMA_REGEXP","BMAS_REGEXP","WS2P_REGEXP","LOCAL_IP_ADDRESS","regex","copyValues","copyValuesFrom","getRaw","bmaRegex","bmasRegex","regExp","getIPv4","getIPv6","hasValid4","getURL","isReachable","hasBma","parseArrayValues","parseTransactions","array","itemObjProperties","arrayProperty","toHimself","$inject","$stateProvider","menuContent","run","$templateCache","$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","ES_USER_API","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","$urlRouterProvider","abstract","otherwise","showAboutModal","changeLanguage","langKey","hideLocalesPopover","showLocalesPopover","localesPopover","$sce","transferData","preferred_node","redirect_url","cancel_url","transferButton","showParameters","icons","bgColor","fontColor","transferDemoUrl","rootPath","buttonText","computeTransferButtonHtml","$broadcast","csPlatform","csDemoWallet","normalizeAmount","amountStr","parseFloat","toFixed","amounts","errorState","preferredNode","fallbackNodes","starting","unsubscribe","askTransferConfirm","walletData","onSuccess","txRes","encodeURI","redirectToUrl","onCancel","top","parent","assign","directive","require","link","ngModel","compareTo","$validators","modelValue","$eval","$validate","differentTo","NUMBER_REGEXP","numberFloat","$isEmpty","INT_REGEXP","attrs","numberInt","EMAIL_REGEXP","email","requiredIf","required","geoPoint","lat","lon","restrict","showCopyPopover","copyOnClick","$location","clazz","activeLink","activeLinkPathPrefix","newPath","addClass","returnClose","onReturn","onFocus","onBlur","attr","which","blur","$compile","$parse","compile","tElement","tAttrs","ngBindHtmlGetter","trustAsHtml","ngBindHtmlWatch","$$addBindingClass","$$addBindingInfo","getTrustedHtml","contents","$element","nextViewOptions","historyRoot","disableAnimate","expire","PluginService","tAttributes","extensionPoints","extensionPoint","append","getTemplate","pre","iElement","iAttrs","fn","onReadFile","onChangeEvent","files","onLoadEvent","$applyAsync","srcElement","elem","dropZone","stopPropagation","dataTransfer","$apply","transclude","fileSelect","fileInput","accept","click","attachEvent","addEventListener","onLocaleChange","onCurrencyChange","MEDIAN_TIME_OFFSET","pattern","Array","currencySymbol","patternRelative","minValueRelative","abs","formatRelative","formatQuantitative","minValue","Infinity","local","fromNow","separator","day","hour","_cache","sepChars","c","charAt","uniformLanguageTag","determinePreferredLanguage","useSanitizeValueStrategy","useLoaderCache","$httpProvider","defaults","useXDomain","common","$compileProvider","debugInfoEnabled","imgSrcSanitizationWhitelist","$animateProvider","classNameFilter","CacheFactoryProvider","recycleFreq","storagePrefix","capacity","screenmatchConfigProvider","rules","$ionicConfigProvider","enableJsScrolling","scrolling","jsScrolling","maxCache","IdleProvider","idle","logoutIdle","logoutTimeout","exception","cause","defaultSettingsNode","removeChangeStateListener","fallbackNodeIndex","disableChangeState","nextParams","fromState","enableChangeState","checkBmaNodeAlive","fallbackNode","newServer","messageParam","old","new","latestRelease","isNewer","$urlRouter","device","hashIndex","httpsModeDebug","hideKeyboardAccessoryBar","disableScroll","StatusBar","release","newRelease","registerBackButtonAction","backView","goBack","exitApp","rtrim","args","arguments"],"mappings":";AAEA,SAAAA,EAAAC,GAEA,IAAAC,EAAAC,KAEAC,OAAAC,KAAAJ,GAAAK,SAAA,SAAAC,GACAL,EAAAK,GAAAN,EAAAM,MAGAL,EAAAM,UAAAN,EAAAM,WAAA,GCPA,SAAAC,EAAAR,EAAAS,GACA,aAEA,IAAAR,EAAAC,KAGAO,GAAAA,EAAAC,OAQAC,EAAAN,QAAAI,GAAA,SAAAH,GACAL,EAAAK,GAAAN,EAAAM,MARA,CAAA,WAAA,SAAA,aAAA,SAAA,UAAA,SAAA,WAAA,eAAA,OAAA,aAAA,UAAA,UAAA,UAAA,UAAA,WAAA,iBAAA,eAAA,YACAD,SAAA,SAAAC,GACAL,EAAAK,GAAAN,EAAAM,MAWAL,EAAAW,gBAAAX,EAAAY,WAAAZ,EAAAY,WAAAH,OAAA,EACAT,EAAAa,aAAAb,EAAAc,QAAAd,EAAAc,QAAAL,OAAA,EACAT,EAAAe,aAAAf,EAAAgB,QAAAhB,EAAAgB,QAAAP,OAAA,EACAT,EAAAiB,aAAAjB,EAAAkB,QAAAlB,EAAAkB,QAAAT,OAAA,EACAT,EAAAmB,aAAAnB,EAAAoB,QAAApB,EAAAoB,QAAAX,OAAA,EACAT,EAAAqB,cAAArB,EAAAsB,SAAAtB,EAAAsB,SAAAb,OAAA,EACAT,EAAAuB,oBAAAvB,EAAAwB,eAAAxB,EAAAwB,eAAAf,OAAA,EACAT,EAAAyB,kBAAAzB,EAAA0B,aAAA1B,EAAA0B,aAAAjB,OAAA,EAEAT,EAAA2B,MAAA3B,EAAA4B,UAEA5B,EAAA6B,GAAA,CAAA7B,EAAA8B,OAAA9B,EAAA+B,MAAAC,KAAA,KChCA,SAAAC,EAAAC,GAEA,IAEAC,EAAAD,EAAAE,MAAA,KACA,GAAAD,EAAA1B,OAAA,IAAA0B,EAAA,GAAAE,WAAA,QACA,MAAAC,MAAA,mBAAAJ,GAGA,GAAA,QAAAC,EAAA,GAAA,CACA,GAAAA,EAAA1B,OAAA,EACA,MAAA6B,MAAA,mBAAAJ,GAGA,GAAA,GAAAC,EAAA1B,OAZAR,KAaAsC,OAAAJ,EAAA,GAbAlC,KAcAuC,KAAAL,EAAA,QAIA,GADAA,EAAA,IACA,EAAA,CACA,IAAAM,EAAAN,EAAA,GAGA,GAAAM,EAAAhC,OAAA,EAAA,CACA,IAAAiC,EAAAzC,KAAA0C,OAAAC,YAAAC,KAAAJ,GACA,IAAAC,EACA,MAAAJ,MAAA,mBAAAJ,GAIA,IAAAY,EAAAJ,EAAA,GACA,GAAAI,EAAA,CA9BA7C,KA+BA8C,QAAA,CACAC,OAAAF,EAAAT,WAAA,MAEA,IAAAY,EAAAH,EAAAI,UAAA,GACA,KAAAD,EAnCAhD,KAoCA8C,QAAAE,KAAA,MAEA,KAAAA,EAtCAhD,KAuCA8C,QAAAE,KAAA,QAEA,KAAAA,IAzCAhD,KA0CA8C,QAAAE,KAAA,UAKA,IAAAE,EAAAT,EAAA,GACAS,IAhDAlD,KAiDAmD,OAAA,CACAJ,OAAAG,EAAAd,WAAA,KACAY,KAAA,QAnDAhD,KA+DAsC,OAAAJ,EAAA,GA/DAlC,KAgEAuC,KAAAL,EAAA,GAhEAlC,KAiEAoD,OAAAlB,EAAA,GAjEAlC,KAkEAqD,SAAAnB,EAAA,GAlEAlC,KAmEAsD,QAAApB,EAAA,GAnEAlC,KAoEAuD,UAAArB,EAAA,KCzCA,SAAAsB,EAAAC,EAAAC,EAAAC,EAAAC,GAIAC,QAAAC,OAAA9D,KAAA2D,EAAA,WAAA,CAAAF,OAAAA,KAEAA,EAAAM,eAAA,WACA,OAAAN,EAAAO,QAAAN,EAAAD,EAAAM,eAAA,KAEAH,EAAAK,WAAAR,EAAAS,WAAA,EACAR,EAAAE,EAAAO,MAAA,MAGAV,EAAAW,IAAA,mBAAAX,EAAAM,gBAIA,SAAAM,EAAAZ,EAAAC,EAAAY,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EACAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,GAGAA,EAAAA,GAAA,GAGAH,EAAAI,OACAD,EAAAE,OAAA,UAGA3B,EAAA4B,WAAA,EACA5B,EAAAnB,OAAA,KACAmB,EAAA6B,SAAA,GACA7B,EAAA8B,YAAA,EACA9B,EAAA+B,yBAAA,EACA/B,EAAAgC,mBAAA,EACAhC,EAAAiC,cAAA,gBAAAC,OAAAd,EAAAe,UAAAlD,OAAAmD,OAAAhB,EAAAe,UAAAlD,OAAAoD,sBAEArC,EAAAsC,OAAAb,EAAAc,KACAvC,EAAAwC,OAAAf,EAAAe,OACAxC,EAAAyC,MAAAhB,EAAAgB,QAAAzC,EAAAsC,OAAA,aAAA,eACAtC,EAAA0C,aAAAtC,QAAAuC,UAAAlB,EAAAiB,cAAAjB,EAAAiB,YACA1C,EAAA4C,oBAAAxC,QAAAuC,UAAAlB,EAAAmB,qBAAAnB,EAAAmB,mBACA5C,EAAA6C,eAAApB,EAAAoB,eACA7C,EAAA8C,YAAArB,EAAAsB,IAEA/C,EAAAgD,mBAAAhG,EAAAP,KAAAuE,EAAAmB,UAAAc,eACAC,QAAA,SAAAC,EAAAxG,GACA,OAAAwG,EAAAC,OAAA,CAAAjF,GAAAxB,EAAA0G,MAAA,gBAAA1G,EAAA2G,OAAAtC,EAAAmB,UAAAc,cAAAtG,OACA,CAAA,CAAAwB,GAAA,OAAAkF,MAAA,oBAAAC,OAAA,MAGAtD,EAAAuD,KAAA,WAEArC,IAAAsC,MAAA,WAEAxD,EAAAgC,kBAAA,MAAAyB,MAAAC,SAAAC,MAAAC,gBACAzC,EAAA0C,OAAAC,aAIA9D,EAAA6B,SAAAkC,WAAAxC,EAAAyC,KAAAD,WAGA/D,EAAA6B,SAAAoC,aAAA1C,EAAAyC,KAAAC,aACAjE,EAAA6B,SAAAqC,SAAAlE,EAAA6B,SAAAoC,cAAA1C,EAAAY,UAAAgC,uBAGA,IAAAxC,EAAAF,EAAAE,QAAAJ,EAAAyC,KAAAtD,OAAAa,EAAAyC,KAAAtD,MAAAiB,QAAA,iBACA2B,EAAA/B,EAAAyC,KAAAtD,OAAAa,EAAAyC,KAAAtD,MAAA4C,QAEAtD,EAAAsC,QAAA,WAAAX,GAAA,SAAAA,GAAA,YAAAA,KACAA,EAAA,kBAEA3B,EAAAoE,aAAAzC,EAAA2B,IAIAtD,EAAAqE,MAAA,WACAlD,EAAAZ,QAAA+D,OAEAnD,EAAAoD,IAAA,CAAAC,SAAA,uBAEAxE,EAAAW,IAAA,cAAAX,EAAAqE,OAGArE,EAAAyE,MAAA,WACAzE,EAAA6B,SAAA,GACA7B,EAAA4B,WAAA,EACA5B,EAAAnB,OAAA,KACAmB,EAAA0E,QAAA,IAEA1E,EAAAW,IAAA,aAAAX,EAAAyE,OAGAzE,EAAA2E,QAAA,SAAAC,GACA,IAAAjD,EAAA3B,EAAA6B,SAAAF,OAEA,GAAA3B,EAAA6E,KAAAC,QAAA,SAAAnD,EAAA,CAEA,IACAoD,EADAd,EAAAjE,EAAA6B,SAAAoC,aAIA,GAAA,mBAAAtC,GAAA,oBAAAA,EAAA,CACA,IAAA3B,EAAA6B,SAAAmD,WAAAhF,EAAA6B,SAAAoD,SAAA,OACA,IAAAC,EAAAlF,EAAA6B,SAAAsD,QAAAnF,EAAA6B,SAAAsD,OAAA7B,OACAnC,EAAAZ,QAAA6E,OACAL,EAAA/D,EAAAqE,cAAArF,EAAA6B,SAAAmD,SAAAhF,EAAA6B,SAAAoD,SAAAC,GACA1B,MAAA,SAAA8B,GACA,IAAAA,EAAA,OAAAnE,EAAAZ,QAAA+D,KAAA,IACA,IAAAzF,EAAAmC,EAAAuE,KAAAC,cAAAF,EAAAG,QAEA,OAAAhE,EAAAoB,gBAAApB,EAAAoB,gBAAAhE,GACAmB,EAAAnB,OAAAA,EACAmB,EAAA8B,YAAA,EACA9B,EAAA0F,aAAA,EACAvE,EAAAZ,QAAA+D,KAAA,MAGAtE,EAAA0F,aAAA,EAEA,CACA7G,OAAAA,EACAyG,QAAAA,EACAhC,OAAAtD,EAAA6B,SAAAsD,QAAA,kBAAAnF,EAAA6B,SAAAsD,OAAAhH,GAAA+G,OAAAS,OAGAC,MAAAzE,EAAA0E,QAAA,oCAIA,GAAA,SAAAlE,EAAA,CACA,IAAA3B,EAAA6B,SAAAiE,OAAA9F,EAAA6B,SAAAiE,KAAAC,QAAA/F,EAAA6B,SAAAiE,KAAAjH,OAAA,OAGAoF,EAAAjE,EAAA6B,SAAAqC,UAAA3C,EAAAY,UAAAgC,wBAAAF,EAEAc,EACA5D,EAAAZ,QAAA6E,OACA5B,MAAA,WACA,OAAAxD,EAAAgG,YAAAhG,EAAA6B,SAAAiE,KAAA,CACAG,WAAAjG,EAAAsC,QAAAtC,EAAA6B,SAAAqC,cAGAV,MAAA,SAAA8B,GACA,IAAAA,EAAA,OAAAnE,EAAAZ,QAAA+D,KAAA,IACA,IAAAzF,EAAAmC,EAAAuE,KAAAC,cAAAF,EAAAG,QAGA,OAAAhE,EAAAoB,gBAAApB,EAAAoB,gBAAAhE,GACAmB,EAAA6B,SAAAiE,KAAAC,OAAA,EACA5E,EAAAZ,QAAA+D,KAAA,MAGAtE,EAAA0F,aAAA,EAEA,CACA7G,OAAAA,EACAyG,QAAAA,OAGAM,MAAAzE,EAAA0E,QAAA,+BAIA,GAAA,WAAAlE,EAAA,CACA,IAAA9C,EAAAmB,EAAA6B,SAAAhD,QAAAmB,EAAA6B,SAAAhD,OAAAqH,OACAnD,EAAA/C,EAAA6B,SAAAkB,KAAA/C,EAAA6B,SAAAkB,IAAAmD,aAAAP,EACA,IAAA9G,EAAA,OACA,IAAAG,EAAAoC,EAAAnC,OAAAmD,OAAAjD,KAAAN,GAEA,GAAAG,EACA+F,EAAA5D,EAAAZ,QAAA6E,OACA5B,MAAA,WACA,MAAA,CACA3E,OAAAA,EACAkE,IAAAA,UAMA,CAGA,KADA/D,EAAAoC,EAAAnC,OAAAoD,qBAAAlD,KAAAN,IAqBA,OAAAmB,EAAAmG,mBAAAtH,GAlBAA,EAAAG,EAAA,GACAA,EAAA,IACAiC,EAAAsE,KAAAa,WAAAvH,GAEAmB,EAAA6E,KAAAhG,OAAAwH,OAAA,CAAAC,UAAA,GAGAvB,EAAA5D,EAAAZ,QAAA6E,OACA5B,MAAA,WACA,MAAA,CACA3E,OAAAA,EACAkE,IAAAA,YAaA,GAAA,SAAApB,EAAA,CAEA,IADA3B,EAAA6B,SAAAhD,QAAAmB,EAAAsC,SAAAtC,EAAA6B,SAAAyD,QACA,OAEAP,EAAA5D,EAAAZ,QAAA6E,OACA5B,MAAA,WACA,MAAA,CACA3E,OAAAmB,EAAA6B,SAAAhD,OACAyG,QAAAtF,EAAA6B,SAAAyD,YAKA,GAAAP,EAKA,OAAAA,EAAAvB,MAAA,SAAAL,GACA,GAAAA,EAAA,CAGA,IAAAoD,GAAAnG,QAAAoG,OAAAjF,EAAAyC,KAAAD,WAAA/D,EAAA6B,SAAAkC,YACA0C,GAAArG,QAAAoG,OAAAjF,EAAAyC,KAAAC,aAAAA,GACAyC,GAAAtG,QAAAoG,OAAAjF,EAAAyC,KAAAtD,OAAAa,EAAAyC,KAAAtD,MAAAiB,OAAAA,GACAgF,GAAAvG,QAAAoG,OAAAjF,EAAAyC,KAAAtD,OAAAa,EAAAyC,KAAAtD,MAAA4C,OAAAH,EAAAG,QAqBA,OApBAiD,GAAAE,GAAAC,GAAAC,KACApF,EAAAyC,KAAAD,WAAA/D,EAAA6B,SAAAkC,WACAxC,EAAAyC,KAAAC,aAAAA,EACA1C,EAAAyC,KAAA4C,kBAAArF,EAAAyC,KAAAD,YAAAxC,EAAAyC,KAAA4C,gBACArF,EAAAyC,KAAAtD,MAAAa,EAAAyC,KAAAtD,OAAA,GACAa,EAAAyC,KAAAtD,MAAAiB,OAAAA,EACAJ,EAAAyC,KAAAtD,MAAA4C,OAAAH,EAAAG,OACArD,EAAAsB,EAAAsF,MAAA,MAGApF,EAAAqF,SACArF,EAAAqF,QAAA9G,EAAA6B,UAIAJ,EAAAsF,QACA5F,EAAAZ,QAAA+D,OAIAtE,EAAAgH,WAAA7D,OAhCA8D,QAAAC,KAAA,2BAAAvF,KAoCA3B,EAAAmH,oBAAA,WACAnH,EAAA4B,YACA5B,EAAAnB,OAAA,KACAmB,EAAA0F,aAAA,EACA1F,EAAA8B,aAAA9B,EAAA6B,SAAAmD,YAAAhF,EAAA6B,SAAAoD,SACAjF,EAAAgC,mBAAAhC,EAAA8B,YACA9B,EAAAoH,gBACApH,EAAA+B,yBAAA,GAGA/B,EAAA+B,yBAAA/B,EAAAgC,mBAAAhC,EAAA8B,aAGA9B,EAAAqH,OAAA,wCAAArH,EAAAmH,qBAAA,GAEAnH,EAAAoH,cAAA,WAIA,OAHApH,EAAA+B,yBAAA,EACA/B,EAAA4B,WAAA,EACA5B,EAAAnB,OAAA,KACAoB,GAAA,WACA,IAAAqH,EAAAtH,EAAA6B,SAAAmD,SACAuC,EAAAvH,EAAA6B,SAAAoD,SACAC,EAAAlF,EAAA6B,SAAAsD,QAAAnF,EAAA6B,SAAAsD,OAAA7B,OACA,OAAAtC,EAAAwG,aAAAF,EAAAC,EAAArC,GACA1B,MAAA,SAAAiC,GAGA,GAAA6B,IAAAtH,EAAA6B,SAAAmD,UAAAuC,IAAAvH,EAAA6B,SAAAoD,SACA,OAAAjF,EAAAoH,gBAGApH,EAAAnB,OAAAmC,EAAAuE,KAAAC,cAAAC,GACAzF,EAAA6C,gBAAA7C,EAAA6C,gBAAA7C,EAAAnB,SACAmB,EAAA0F,aAAA,GAGA1F,EAAA4B,WAAA,KAGAgE,OAAA,SAAA6B,GACAtG,EAAA0E,QAAA,6BAAA1E,CAAAsG,GACAzH,EAAA4B,WAAA,EACA5B,EAAAgC,mBAAA,EACAhC,EAAAmH,2BAEA,MAGAnH,EAAA0H,cAAA,WACA1H,EAAAgH,aACA/G,GAAA,WACAoB,EAAAsG,aACA,MAGA3H,EAAA4H,yBAAA,WACA5H,EAAAgH,aACA/G,GAAA,WACAoB,EAAAwG,wBACA,MAGA7H,EAAA8H,cAAA,SAAArG,GACA,OAAAJ,EAAA0G,SAAAtG,IAGAzB,EAAAgI,OAAA,WACA,IAAAhI,EAAA4B,UAOA,OALA5B,EAAA4B,WAAA,EACA5B,EAAA6B,SAAAhD,OAAA,KACAmB,EAAA6B,SAAAyD,QAAA,KAGA9D,EAAAyG,QAAAC,OACA1E,MAAA,SAAAQ,GACA,GAAAA,EAGA,OAAAhE,EAAAsC,OAAAzB,EAAAsH,KAAAnE,GAGA5C,EAAAgH,IAAAC,MAAArE,GACAR,MAAA,SAAAL,GACA,IAAAA,IAAAA,EAAAtE,OAAA,KAAA,CAAAL,QAAA,6BAEA,OAAA2E,KAEAyC,OAAA,SAAA6B,GAEA,OADAR,QAAAqB,MAAA,wCAAAb,GAAAA,EAAAjJ,SAAAiJ,IACAzD,QAGAR,MAAA,SAAAQ,GACA,GAAAA,EAEA,OAAAA,GAAAA,EAAAnF,OAAAmF,EAGA/C,EAAAsH,QAAAC,UAAAxE,EAAA,CAAA+C,QAAA,IACAvD,MAAA,SAAA8B,GACA,IAAAA,IAAAA,EAAAG,SAAAH,EAAAmD,OAAA,KAAA,CAAAjK,QAAA,6BAKA,MAAA,CACAK,OAJAmC,EAAA0H,OAAAC,OAAArD,EAAAG,QAKAH,QAAAA,MAIAM,MAAAzE,EAAA0E,QAAA,iCAEArC,MAAA,SAAAL,GACAA,GAAAA,EAAAtE,SAEAmB,EAAA0F,YAAA1F,EAAA6C,gBAAA7C,EAAA6C,gBAAAM,EAAAtE,OACAmB,EAAA6B,SAAAhD,OAAAsE,EAAAtE,OACAmB,EAAA6B,SAAAyD,QAAAnC,EAAAmC,YAEA9B,MAAA,WACAxD,EAAA4B,WAAA,EACAT,EAAAZ,QAAA+D,KAAA,OAEAsB,OAAA,SAAA6B,GACAzH,EAAA4B,WAAA,EACAT,EAAA0E,QAAA,oBAAA1E,CAAAsG,OAIAzH,EAAAoE,aAAA,SAAAzC,EAAA2B,GAGA,GAFAtD,EAAA4I,qBAEA,WAAAjH,GAAAL,EAAAI,KACA,OAAAP,EAAA0H,MAAAnH,OAGA,GAAAC,GAAAA,IAAA3B,EAAA6B,SAAAF,OAYA,GAVAsF,QAAAqB,MAAA,sBAAA3G,GACA3B,EAAA6B,SAAAF,OAAAA,EACA3B,EAAA6B,SAAAkB,IAAA,KAEA/C,EAAA6E,aAEA7E,EAAA6E,KAAAiE,WAIA,mBAAAnH,GAAA,oBAAAA,EAAA,CAKA,IAAAwD,EAJAnF,EAAAnB,OAAA,KAKAyE,GACA6B,EAAAnI,EAAA+L,KAAA/I,EAAAgD,oBAAA,SAAAgG,GACA,OAAAA,EAAA1F,QAAAlD,QAAAoG,OAAAwC,EAAA1F,OAAAA,UAGA6B,EAAAnI,EAAAiM,UAAAjJ,EAAAgD,mBAAA,CAAA7E,GAAA,UAAA,IACAmF,OAAAA,GAIA6B,EAAAnI,EAAAiM,UAAAjJ,EAAAgD,mBAAA,CAAA7E,GAAA,YAEA6B,EAAAkJ,aAAA/D,GAEAnF,EAAAgC,kBAAAhC,EAAAgC,mBAAA,mBAAAL,MAEA,CAAA,GAAA,SAAAA,EACA,OAAA3B,EAAAgI,SAGAhI,EAAA6B,SAAAmD,SAAA,KACAhF,EAAA6B,SAAAoD,SAAA,KACAjF,EAAA6B,SAAAhD,OAAA,KACAmB,EAAAnB,OAAA,KACAmB,EAAA4B,WAAA,IAIA5B,EAAAkJ,aAAA,SAAA/D,GAEAnF,EAAA6B,SAAAsD,OAAA/E,QAAA+I,KAAAhE,GAAA,IACAnF,EAAAmH,uBAGAnH,EAAAgG,YAAA,SAAAF,EAAAsD,GAqBA,OApBAA,EAAAA,GAAA,IAEAnE,SAAAmE,EAAAnE,UAAAjF,EAAA6B,SAAAiE,KAAAb,UAAA,WAEA,OADAjF,EAAA6B,SAAAiE,KAAAb,cAAAU,EACAtE,EAAAgI,aAAA,CACA5G,MAAA,gDACA6G,SAAA,+CACA7I,MAAA2I,EAAA3I,MACA8I,MAAAvJ,IAEAwD,MAAA,SAAAyB,GAIA,OAFAjF,EAAA6B,SAAAiE,KAAAb,SAAAA,EAEAhF,GAAA,WACA,OAAAgF,IACA,SAIAhE,EAAAsH,QAAAiB,KAAAxJ,EAAA6B,SAAAiE,KAAAsD,GACAxD,OAAA,SAAA6B,GAKA,GAJAzH,EAAA6B,SAAAiE,KAAAb,cAAAU,EACA,cAAA8B,GACAtG,EAAAZ,QAAA+D,KAAA,IAEAmD,GAAAA,EAAAgC,OAAAxI,EAAAyI,WAAAC,aAEA,OAAA3J,EAAAgG,YAAAhG,EAAA6B,SAAAiE,KAAA,CAAAG,WAAAmD,EAAAnD,WAAAxF,MAAA,gDAEA,MAAAgH,MAIAzH,EAAA4J,cAAA,SAAA9D,GACAA,GAAAA,EAAA+D,UAIA7J,EAAA6B,SAAAiE,KAAA,CACAgE,KAAAhE,EAAA+D,SAAAC,KACAC,KAAAjE,EAAA+D,SAAAE,KACAC,QAAAlE,EAAAmE,aAEAjK,EAAAkK,gBAAA,EACAjK,GAAA,WAIA,OAHAgH,QAAAqB,MAAA,6BAAAtI,EAAA6B,SAAAiE,MACA9F,EAAAkK,gBAAA,EAEAlK,EAAAgG,YAAAhG,EAAA6B,SAAAiE,KAAA,CAAAG,YAAA,EAAAhB,SAAAjF,EAAA6B,SAAAiE,KAAAb,WACAzB,MAAA,SAAA8B,GACAA,GAAAA,EAAAG,QAKAzF,EAAA6B,SAAAiE,KAAAjH,OAAAmC,EAAAuE,KAAAC,cAAAF,EAAAG,QACAzF,EAAA6B,SAAAiE,KAAAC,OAAA/F,EAAA6C,gBAAA7C,EAAA6C,iBAAA7C,EAAA6B,SAAAiE,KAAAjH,OACAmB,EAAAkK,gBAAA,IANAlK,EAAA6B,SAAAiE,KAAAC,OAAA,EACA/F,EAAA6B,SAAAiE,KAAAjH,YAAA8G,MASAC,OAAA,SAAA6B,GACAA,GAAA,cAAAA,EACAzH,EAAAmK,iBAGAnK,EAAAkK,gBAAA,EACAlK,EAAA6B,SAAAiE,KAAAC,OAAA,EACA/F,EAAA6B,SAAAiE,KAAAjH,YAAA8G,EACAxE,EAAA0E,QAAA,wBAAA1E,CAAAsG,WAlCAzH,EAAAkK,gBAAA,GAuCAlK,EAAAmK,cAAA,WACAnK,EAAA6B,SAAAiE,UAAAH,GAKA3F,EAAAmG,mBAAA,SAAAiE,GACA,OAAA/I,EAAAgJ,cAAA,CAAAC,EAAAF,IACA5G,MAAA,SAAAL,GACA,GAAAA,GAAAA,EAAAtE,OAGA,OAFAmB,EAAA6B,SAAAhD,OAAAsE,EAAAtE,OACAmB,EAAA6B,SAAAkB,IAAAI,EAAAJ,UAAA4C,EACA1F,EAAAD,EAAA2E,QAAA,SAMA3E,EAAAuK,mBAAA,SAAAC,GACAA,EAAAC,kBACAtJ,EAAAuJ,QAAAtF,KAAAoF,EAAA,CACAG,YAAA,uCACApB,MAAAvJ,EACA4K,YAAA,EACAC,UAAA,SAAAH,GACA1K,EAAA8K,eAAAJ,EACAvJ,EAAAoD,IAAA,CAAAC,SAAA,qCAKAxE,EAAA4I,mBAAA,WACA5I,EAAA8K,iBACA9K,EAAA8K,eAAAxG,OACAtE,EAAA8K,eAAA,OAKA9K,EAAAuD,OAiBA,SAAAwH,EAAA/K,EAAAE,EAAAoB,GAEA,IAAA0J,EAAA5K,QAAA+I,KAAA7H,GACA0J,EAAAtJ,MAAA,EACAsJ,EAAAC,UAAA,EAGA7K,QAAAC,OAAA9D,KAAA2D,EAAA,iBAAA,CAAAF,OAAAA,EAAAyB,WAAA,CAAAc,MAAA,GAAAjB,SAAA0J,KAEAhL,EAAAkL,QAAA,SAAArG,GACA7E,EAAA6E,KAAAA,GCnjBA,SAAAsG,EAAAnL,EAAAoL,EAAAnL,EAAAoL,EAAA9J,GAGAvB,EAAAW,IAAA,oBAAA,SAAA2K,GACAtL,EAAAuL,OAAAhK,EAAAyC,KAAAuH,OAAApN,GACAiN,EAAAI,aAAAJ,EAAAI,YAAAC,SACAzL,EAAAyL,OAAAL,EAAAI,YAAAC,OACAxL,GAAA,WACAoL,EAAAD,EAAAI,YAAAC,UACA,SAKA,SAAAC,EAAA1L,EAAAC,EAAAoL,EAAA9J,EAAAE,GAGAzB,EAAA2L,WAAA,GACA3L,EAAAuL,OAAAhK,EAAAyC,KAAAuH,OAAApN,IAEAsD,EAAAA,GAAA,KACA,iBAAAA,IACAA,EAAA,CAAAgK,OAAAhK,IAGAA,EAAAgK,SAEAxL,GAAA,WACAoL,EAAA5J,EAAAgK,UACA,KAGAzL,EAAA2L,WAAA,GACA3L,EAAA2L,WAAAlK,EAAAgK,QAAA,WACAzL,EAAA4L,UAAA,aASA,SAAAC,EAAA7L,EAAAoL,EAAArK,EAAA+K,EAAA7L,EAAAY,EAAAwK,EACAlK,EAAAG,EAAAC,EAAAwK,EAAAC,EAAAxK,EAAArB,GAEAH,EAAAiM,MAAA,EACAjM,EAAAkM,UAAA,EAEAlM,EAAAmM,YAAA,SAAAC,EAAAC,EAAAC,GAGA,IAFAA,EAAAlM,QAAAuC,UAAA2J,GAAAA,EAAA,IAEAD,EAAAtP,OACA,OAAA8D,EAAAsH,MAAA,GAGA,IAAAoE,EAAAF,EAAAC,GACA,GAAA,mBAAAC,EACA,MAAA,IAAA3N,MAAA,6EAAAsD,OAAAoK,EAAAF,IAEA,IAAArH,EAAAwH,IAIA,MAHA,kBAAAxH,IACAA,EAAAlE,EAAAsH,KAAApD,IAEAA,EACAvB,MAAA,SAAAgJ,GACA,OAAApM,QAAAqM,YAAAD,IACAxM,EAAAkM,UAAA,EACAI,GAEAE,GAAAF,IAAAD,EAAAtP,OAAA,EAGAiD,EAAAmM,YAAAC,EAAAC,EAAAC,EAAA,GAFAE,GAAA,EAAAF,EAAA,KAIA1G,OAAA,SAAA6B,GAQA,OAPAA,GAAA,yBAAAA,EAAAjJ,QACAyI,QAAAxG,MAAA,2GAAAyB,OAAAkK,EAAAE,IAGArF,QAAAxG,MAAA,kDAAAyB,OAAAkK,EAAAE,EAAA7E,IAEAzH,EAAAkM,UAAA,EACAI,MAIAtM,EAAA0M,YAAA,SAAAvO,EAAAiL,GASA,OARAA,EAAAA,GAAA,IACAuD,SAAAvD,EAAAuD,UAAA,GACAvD,EAAAuD,SAAAC,MAAAxD,EAAAuD,SAAAC,OAAA,GACAxD,EAAAuD,SAAAE,SAAAzM,QAAAuC,UAAAyG,EAAAuD,SAAAE,UAAAzD,EAAAuD,SAAAE,QACAzD,EAAA0D,QAAA1D,EAAA0D,UAAAtL,EAAAuL,OAAA,IAAA,KACA3D,EAAAwB,YAAA,EACAxB,EAAAuD,SAAAV,KAAAjM,EAAAiM,KACA7C,EAAA4D,sBAAAhN,EAAAiM,KACA9K,EAAAuJ,QAAAuC,QAAA9O,EAAAiL,IAGApJ,EAAA8H,cAAA,SAAAoF,GACA7L,OAAA0G,SAAA,CAAA0D,OAAAyB,KAGAlN,EAAAmN,cAAA,WAQA,OAPAnN,EAAAiM,MAAA,EACAjM,EAAAkM,UAAA,EAEAjF,QAAAqB,MAAA,wEAAApG,OACAZ,EAAAI,KAAAJ,EAAA2J,SAAA9K,EAAAK,cAGAc,EAAA2J,UAAA9K,EAAAK,UAAAR,EAAAoN,uBAAA,GAAA,GAAAvM,EAAAsH,MAAA,IAGA3E,MAAA,SAAAgJ,GACA,QAAAA,OACAlL,EAAA2J,UAAA9K,EAAAK,YACAR,EAAAqN,gBAAA,GAAA,GACA7J,MAAA,SAAA8J,GACA,QAAAA,IACA/L,EAAAyC,KAAAiJ,QAAAM,OAAAD,EACA/L,EAAAsF,QACA7G,EAAAkM,iBAKA1I,MAAA,SAAAgJ,GACA,QAAAA,OACAlL,EAAA2J,UAAA9K,EAAAK,YACAR,EAAAwN,oBAAA,GAAA,GACAhK,MAAA,SAAA8J,GACA,QAAAA,IACA/L,EAAAyC,KAAAiJ,QAAAQ,YAAAH,EACA/L,EAAAsF,QACA7G,EAAAkM,iBAKA1I,MAAA,SAAAgJ,GACA,QAAAA,OACAlL,EAAA2J,UAAA9K,EAAAK,YACAR,EAAA0N,YAAA,GAAA,GACAlK,MAAA,SAAA8J,GACA,QAAAA,IACA/L,EAAAyC,KAAAiJ,QAAAU,GAAAL,EACA/L,EAAAsF,QACA7G,EAAAkM,iBAKA1I,MAAA,SAAAgJ,GACA,QAAAA,OACAlL,EAAA2J,UAAA9K,EAAAK,YACAR,EAAA4N,iBAAA,GAAA,GACApK,MAAA,SAAA8J,GACA,QAAAA,IACA/L,EAAAyC,KAAAiJ,QAAAY,QAAAP,EACA/L,EAAAsF,QACA7G,EAAAkM,iBAKA1I,MAAA,SAAAgJ,GACA,QAAAA,MACAlL,EAAA2J,UACAjL,EAAA8N,gBAAA,GAAA,OAIAtK,MAAA,SAAAgJ,GACA,QAAAA,MACAlL,EAAA2J,UACAjL,EAAA+N,kBAAA,GAAA,OAIAvK,MAAA,SAAAgJ,GACA,QAAAA,GACAxM,EAAAgO,mBAAA,GAAA,GACAxK,MAAA,SAAA8J,GACA,SAAAA,GAAAtN,EAAAiO,aACA1M,EAAAyC,KAAAiJ,QAAAiB,UAAAZ,EACA/L,EAAAsF,QACA7G,EAAAkM,gBAKA1I,MAAA,SAAAgJ,GACA,QAAAA,GACAxM,EAAAmO,aAAA,GAAA,GACA3K,MAAA,SAAA8J,GACA,SAAAA,GAAAtN,EAAAiO,aACA1M,EAAAyC,KAAAiJ,QAAAmB,IAAAd,EACA/L,EAAAsF,QACA7G,EAAAkM,gBAKA1I,MAAA,SAAAgJ,GACA,QAAAA,GACAxM,EAAAqO,iBAAA,GAAA,GACA7K,MAAA,SAAA8J,GACA,QAAAA,IACA/L,EAAAyC,KAAAiJ,QAAAqB,SAAAhB,EACA/L,EAAAsF,QACA7G,EAAAkM,gBAKA1I,MAAA,SAAAgJ,GACA,QAAAA,GAEAxM,EAAAuO,kBAAA,GAAA,GACA/K,MAAA,SAAA8J,GACA,SAAAA,GAAAtN,EAAAiO,aACA1M,EAAAyC,KAAAiJ,QAAAuB,SAAAlB,EACA/L,EAAAsF,QACA7G,EAAAkM,gBAKA1I,MAAA,SAAAgJ,GACA,QAAAA,GACAxM,EAAAyO,iBAAA,GAAA,GACAjL,MAAA,SAAA8J,GACA,SAAAA,GAAAtN,EAAAiO,aACA1M,EAAAyC,KAAAiJ,QAAAyB,QAAApB,EACA/L,EAAAsF,QACA7G,EAAAkM,gBAKA1I,MAAA,SAAAgJ,GACA,QAAAA,KACAlL,EAAA2J,UACAjL,EAAA+N,kBAAA,GAAA,OAIAvK,MAAA,SAAAgJ,GACA,QAAAA,GACAxM,EAAA2O,iBAQA3O,EAAAuO,kBAAA,SAAAK,EAAA/B,GAEA,IAMAgC,EAEAxC,EAAA,CAEA,WAEA,OADAP,EAAAgD,YAAA,GACA9O,EAAA0M,YAAA,4BAAA,CACAC,SAAA,CACA3C,QAAA,6BACA+E,KAAA,CACAC,SAAA7N,EAAA0C,OAAAC,WAAAxC,EAAA2J,SAAA,OAAA,mBAMA,WAIA,OAHAa,EAAAmD,UACAnD,EAAAgD,YAAA,GAEA1D,EAAA8D,GAAA/N,EAAA0C,OAAAC,UAAA,eAAA,mBACAN,MAAA,WACA,OAAAxD,EAAA0M,YAAA,+BAAA,CACAC,SAAA,CACA3C,QAAA,yBACA+E,KAAA,CACAC,SAAA,iBAOA,WACA,OAAAzN,EAAAyC,KAAAmL,aACAnP,EAAA0M,YAAA,oCAAA,CACAC,SAAA,CACA3C,QAAA,kCACA6E,cAAAA,EACAE,KAAA,CACAC,SAAA7N,EAAA0C,OAAAC,UAAA,QAAA,cAkCA,WAEA,OADAuH,EAAA,iCACArL,EAAA0M,YAAA,yBAAA,CACAC,SAAA,CACA3C,QAAA,0BACA+E,KAAA,CACAC,SAAA,SACAI,MAAA,+BAMA,WAGA,OA/FAhE,EAAAiE,GAAA,gCACAjE,EAAA8D,GAAA,wBA6FA7D,EAAA,qCACArL,EAAA0M,YAAA,6BAAA,CACAC,SAAA,CACA3C,QAAA,wBACA+E,KAAA,CACAC,SAAA,UAEAnC,QAAAA,GAEAC,QAAA,KACAwC,MAAA,MAMA,OAAAvD,EAAAwD,MAAA/L,MAAA,SAAAgL,GAGA,OAFAK,EAAAL,EAAA/M,WAEAzB,EAAAmM,YAAA,WAAAE,EAAAuC,OAQA5O,EAAAyO,iBAAA,SAAAG,EAAA/B,GAEA,IAAA2C,EAAA,WACApE,EAAAiE,GAAA,iBAEApP,GAAA,WACA,IAAAwP,EAAA1O,EAAA2O,SAAAC,iBAAA,oBACAF,GAAA,IAAAA,EAAA1S,QACAqD,QAAAwP,QAAAH,EAAA,IAAAI,eAAA,WAEA,MAMAxD,EAAA,CAEA,WACA,QAAAlL,EAAA0C,OAAAC,YACAgI,EAAAgD,YAAA,GACA9O,EAAA0M,YAAA,2BAAA,CACAC,SAAA,CACA3C,QAAA,4BACA+E,KAAA,CACAC,SAAA7N,EAAA0C,OAAAC,WAAAxC,EAAA2J,SAAA,OAAA,oBAMA,WAIA,OAHAa,EAAAmD,UACAnD,EAAAgD,YAAA,GAEA1D,EAAA8D,GAAA/N,EAAA0C,OAAAC,UAAA,2BAAA,eACAN,MAAA,WAEA,OADAgM,IACAxP,EAAA0M,YAAA,wBAAA,CACAC,SAAA,CACA3C,QAAA,8BACA+E,KAAA,CACAC,SAAA,SACAI,MAAA,4BAGAtC,QAAA,WAKA,WAEA,OADA0C,IACAxP,EAAA0M,YAAA,yBAAA,CACAC,SAAA,CACA3C,QAAA,yBACA+E,KAAA,CACAC,SAAA7N,EAAA0C,OAAAC,eAAA6B,EAAA,WAGAmH,QAAA,IACAwC,MAAA,MAKA,WAEA,OADAE,IACAxP,EAAA0M,YAAA,+BAAA,CACAC,SAAA,CACA3C,QAAA,sCACA+E,KAAA,CACAC,SAAA7N,EAAA0C,OAAAC,eAAA6B,EAAA,cAMA,WACA6J,IACA,IAAAjE,EAAAhK,EAAAyC,KAAAuH,OAAApN,GACA,OAAA6B,EAAA0M,YAAA,wBAAA,CACAC,SAAA,CACA3C,QAAA,qCACA6E,cAAA,CACAiB,cAAAxO,EAAA2L,SAAA3L,EAAA2L,QAAA6C,cACAxO,EAAA2L,QAAA6C,cAAAvE,GAAAjK,EAAA2L,QAAA6C,cAAAvE,GAAAjK,EAAA2L,QAAA6C,cACA,sBAEAf,KAAA,CACAC,SAAA,SACAI,MAAA,2BAEAvC,QAAAA,OAOA,OAAAd,EAAAtK,aAAA+B,MAAA,SAAA/B,GAGA,OAAAzB,EAAAmM,YAAA,UAAAE,EAAAuC,OAQA5O,EAAAgO,mBAAA,SAAAY,EAAA/B,GAEA,IAAAR,EAAA,CACA,WAEA,OADAP,EAAAgD,YAAA,GACA9O,EAAA0M,YAAA,uBAAA,CACAC,SAAA,CACA3C,QAAA,wBACA+E,KAAA,CACAC,SAAA7N,EAAA0C,OAAAC,WAAAxC,EAAA2J,SAAA,OAAA,gBAGApF,QAAA,cAIA,WAIA,OAHAiG,EAAAmD,UACAnD,EAAAgD,YAAA,GAEA1D,EAAA8D,GAAA/N,EAAA0C,OAAAC,UAAA,4BAAA,qBACAN,MAAA,WACA,OAAAxD,EAAA0M,YAAA,0BAAA,CACAC,SAAA,CACA3C,QAAA7I,EAAA0C,OAAAC,UAAA,8BAAA,2BACAiL,KAAA,CACAC,SAAA,iBAOA,WACA,OAAAhP,EAAA0M,YAAA,8BAAA,CACAC,SAAA,CACA3C,QAAA,6BACA+E,KAAA,CACAC,SAAA,WAGAlC,QAAA,IACAwC,MAAA,MAIA,WACA,IAAAM,EAAA7O,EAAA2O,SAAAK,eAAA,+BACA,OAAAH,IACA3P,GAAA,WACAG,QAAAwP,QAAAA,GAAAC,eAAA,YAEA7P,EAAA0M,YAAA,kCAAA,CACAC,SAAA,CACA3C,QAAA,mCACA6C,QAAAA,GAEAC,QAAA,UAMA,OAAA9M,EAAAmM,YAAA,YAAAE,EAAAuC,IAOA5O,EAAAmO,aAAA,SAAAS,EAAA/B,GACA,IAAAgC,EAEAxC,EAAA,CACA,WACA,OAAArM,EAAA0M,YAAA,kCAAA,CACAC,SAAA,CACA3C,QAAA,yCACA6E,cAAAA,EACAE,KAAA,CACAC,SAAA,SACAI,MAAA,+BAMA,WACA,OAAApP,EAAA0M,YAAA,wCAAA,CACAC,SAAA,CACA3C,QAAA,yCACA+E,KAAA,CACAC,SAAA,UAEAnC,QAAAA,OAOA,OAAAd,EAAAwD,MAAA/L,MAAA,SAAAgL,GAIA,OAHAK,EAAAL,EAAA/M,YACAuO,UAAAxB,EAAAwB,UAEAhQ,EAAAmM,YAAA,MAAAE,EAAAuC,OAQA5O,EAAAqO,iBAAA,SAAAO,EAAA/B,GACA,GAAAvL,EAAA2J,SAAA,OAAApK,EAAAsH,MAAA,GAEA,IAAAkE,EAAA,CAEA,WAEA,GAAAjB,EAAAiE,GAAA,oBAAA,CACA,IAAAO,EAAA7O,EAAA2O,SAAAK,eAAA,mCACA,IAAAH,EAAA,OAAA,EACA3P,GAAA,WACAG,QAAAwP,QAAAA,GAAAC,eAAA,YAGA,OAAA7P,EAAA0M,YAAAvL,EAAA0C,OAAAC,UAAA,cAAA,wBAAA,CACA6I,SAAA,CACA3C,QAAA,4BACA+E,KAAA,CACAC,SAAA7N,EAAA0C,OAAAC,UAAA,eAAA,WAGAgJ,QAAA3L,EAAA0C,OAAAC,UAAA,IAAA,IACAwL,MAAA,MAIA,WACA,OAAAtP,EAAA0M,YAAAvL,EAAA0C,OAAAC,UAAA,cAAA,wBAAA,CACA6I,SAAA,CACA3C,QAAA,yBACA+E,KAAA,CACAC,SAAA,SACAI,MAAA,qBAEAvC,QAAAA,OAMA,OAAA7M,EAAAmM,YAAA,QAAAE,EAAAuC,IAOA5O,EAAAoN,uBAAA,SAAAwB,EAAA/B,GACA,GAAA1M,EAAAK,UAAA,OAAAK,EAAAsH,MAAA,GAEA,IAAAkE,EAAA,CACA,WAEA,OADAP,EAAAgD,YAAA,GACA9O,EAAA0M,YAAA,2BAAA,CACAC,SAAA,CACA3C,QAAA,4BACA+E,KAAA,CACAC,SAAA,QAEAnC,QAAAA,MAKA,WAEA,OADAf,EAAAgD,YAAA,GACA9O,EAAA0M,YAAA,sBAAA,CACAC,SAAA,CACA3C,QAAA,uBACA+E,KAAA,CACAC,SAAA,QAEAnC,QAAAA,MAKA,WAEA,OADAf,EAAAgD,YAAA,GACA9O,EAAA0M,YAAA,2BAAA,CACAC,SAAA,CACA3C,QAAA,4BACA+E,KAAA,CACAC,SAAA,QAEAnC,QAAAA,OAMA,OAAA7M,EAAAmM,YAAA,kBAAAE,EAAAuC,IAOA5O,EAAAqN,gBAAA,SAAAuB,EAAA/B,GACA,IAAA1M,EAAAK,UAAA,OAAAK,EAAAsH,MAAA,GAEA,IAAA8H,EAAA9P,EAAA6D,KAAAkM,UAAA/P,EAAA6D,KAAAmM,cAAAhQ,EAAA6D,KAAAmM,aAAAC,kBAGA/D,EAAA,CACA,WAEA,OADAP,EAAAgD,YAAA,GACA9O,EAAA0M,YAAA,2BAAA,CACAC,SAAA,CACA3C,QAAA7J,EAAA6D,KAAAkM,SAAA,mCAAA,4BACAnB,KAAA,CACAC,SAAA,YAMA,WAMA,OALAlD,EAAAmD,UACAnD,EAAAgD,YAAA,GAIA1D,EAAA8D,GAAA,mBACA1L,MAAA,WACA,OAAAxD,EAAA0M,YAAAvL,EAAA0C,OAAAC,UAAA,4BAAA,yBAAA,CACA6I,SAAA,CACA3C,QAAA,0BACA+E,KAAA,CACAC,SAAA7N,EAAA0C,OAAAC,UAAA,QAAA,WAGAgJ,QAAA3L,EAAA0C,OAAAC,UAAA,IAAA,IACAwL,MAAA,SAMA,WAEA,OADAjE,EAAA,yBACArL,EAAA0M,YAAA,wBAAA,CACAC,SAAA,CACA3C,QAAA,yBACA+E,KAAA,CACAC,SAAA,UAEAnC,SAAAoD,GAAApD,GAEAC,QAAA3L,EAAA0C,OAAAC,UAAA,IAAA,IACAwL,MAAA,MAIA,WACA,OAAAW,GACA5E,EAAA,iCACArL,EAAA0M,YAAA,gCAAA,CACAC,SAAA,CACA3C,QAAA7I,EAAA0C,OAAAC,UAAA,0CAAA,iCACAiL,KAAA,CACAC,SAAA,UAEAnC,QAAAA,GAEAC,QAAA,IACAjH,QAAA,cAXAgH,IAsBA,OALAR,EAAAtP,QAAAiP,EAAAuB,OAAA8C,WACApJ,QAAAxG,MAAA,mFAAAyB,OAAAmK,EAAAtP,SAIAgP,EAAAwD,MACA/L,MAAA,SAAAgL,GAIA,OAHAA,EAAA/M,WACAuO,UAAAxB,EAAAwB,UAEAhQ,EAAAmM,YAAA,SAAAE,EAAAuC,OAQA5O,EAAAwN,oBAAA,SAAAoB,EAAA/B,GACA,IAAA1M,EAAAK,UAAA,OAAAK,EAAAsH,MAAA,GAEA,IACAmI,GAAA,EAEAjE,EAAA,CAEA,WAEA,GAAAjB,EAAAiE,GAAA,mBAAA,CACA,IAAAO,EAAA7O,EAAA2O,SAAAK,eAAA,iCACA,IAAAH,EAEA,OADAU,GAAA,GACA,EAEArQ,GAAA,WACAG,QAAAwP,QAAAA,GAAAC,eAAA,YAGA,OAAA1O,EAAA0C,OAAAC,WACA9D,EAAA0M,YAAA,yBAAA,CACAC,SAAA,CACA3C,QAAA,qCAKA,WACA,SAAAsG,GAAAnP,EAAA0C,OAAAC,YACAsH,EAAA8D,GAAA,mBACA1L,MAAA,WACA,OAAAxD,EAAA0M,YAAA,sCAAA,CACAC,SAAA,CACA3C,QAAA,uCACA+E,KAAA,CACAC,SAAA,WAGAlC,QAAA,UAKA,WACA,GAAAwD,EAAA,OAAA,EAGA,GAAAlF,EAAAiE,GAAA,mBAAA,CACA,IAAAO,EAAA7O,EAAA2O,SAAAK,eAAA,uCACA,IAAAH,EAEA,OADAU,GAAA,GACA,EAEArQ,GAAA,WACAG,QAAAwP,QAAAA,GAAAC,eAAA,WACA,KAEA,OAAA7P,EAAA0M,YAAAvL,EAAA0C,OAAAC,UAAA,qBAAA,+BAAA,CACA6I,SAAA,CACA3C,QAAA,0BACA+E,KAAA,CACAC,SAAA7N,EAAA0C,OAAAC,UAAA,eAAA,WAGAgJ,QAAA3L,EAAA0C,OAAAC,UAAA,IAAA,IACAwL,MAAA,MAIA,WACA,OAAAtP,EAAAiM,MAAAqE,EAAAzD,EACA7M,EAAA0M,YAAA,sBAAA,CACAC,SAAA,CACA3C,QAAA,yBACA+E,KAAA,CACAC,SAAA,SACAI,MAAA,qBAEAvC,QAAAA,OAoBA,OAAAd,EAAAtK,aAAA+B,MAAA,SAAA/B,GAEA,OAAAzB,EAAAmM,YAAA,QAAAE,EAAAuC,OAQA5O,EAAA0N,YAAA,SAAAkB,EAAA/B,GACA,IAAA1M,EAAAK,UAAA,OAAAK,EAAAsH,MAAA,GAEA,IAAA0G,EAEAxC,EAAA,CACA,WAEA,OADAP,EAAAgD,YAAA,GACA9O,EAAA0M,YAAA,sBAAA,CACAC,SAAA,CACA3C,QAAA,uBACA+E,KAAA,CACAC,SAAA,YAMA,WAMA,OALAlD,EAAAmD,UACAnD,EAAAgD,YAAA,GAIA1D,EAAA8D,GAAA,sBACA1L,MAAA,WACA,OAAAxD,EAAA0M,YAAA,yBAAA,CACAC,SAAA,CACA3C,QAAAzI,EAAAyC,KAAAmL,YAAA,mCAAA,0BACAN,cAAAA,EACAE,KAAA,CACAC,SAAA,WAGAM,MAAA,SAKA,WACA,OAAAtP,EAAA0M,YAAA,yBAAA,CACAC,SAAA,CACA3C,QAAA,sCACA6E,cAAAA,EACAE,KAAA,CACAC,SAAA,SACAI,MAAA,gCAQA,OAAArD,EAAAwD,MACA/L,MAAA,SAAAgL,GAIA,OAHAK,EAAAL,EAAA/M,YACAuO,UAAAxB,EAAAwB,UAEAhQ,EAAAmM,YAAA,KAAAE,EAAAuC,OAQA5O,EAAA4N,iBAAA,SAAAgB,EAAA/B,GAEA,IAAAR,EAAA,CACA,WAEA,OADAP,EAAAgD,YAAA,GACA9O,EAAA0M,YAAA,2BAAA,CACAC,SAAA,CACA3C,QAAA,4BACA+E,KAAA,CACAC,SAAA,QAEAnC,QAAAA,OAMA,OAAA7M,EAAAmM,YAAA,aAAAE,EAAAuC,IAOA5O,EAAA8N,gBAAA,SAAAc,EAAA/B,GACA,GAAA1L,EAAA0C,OAAAC,WAAAxC,EAAA2J,SAAA,OAAApK,EAAAsH,MAAA,GAEA,SAAAoI,IACA,IAAAC,EAAAzP,EAAA2O,SAAAC,iBAAA,mCACA,OAAAa,GAAAA,EAAAzT,OACAC,EAAA+L,KAAAyH,GAAA,SAAAC,GAAA,OAAAA,EAAAC,YAAA,KADA,KAIA,IAAArE,EAAA,CACA,WAEA,GAAAlL,EAAA0C,OAAAC,UAAA,OAAA,EACA,IAAA8L,EAAAW,IACA,OAAAX,GAEA5P,EAAA0M,YAAAkD,EAAA,CACAjD,SAAA,CACA3C,QAAA,kCACA+E,KAAA,CACAC,SAAA,QAEA2B,MAAAvF,EAAAiE,GAAA,YAAA,0BAAA1J,OAMA,WAEA,GAAAxE,EAAA0C,OAAAC,UAEA,OADAgI,EAAAgD,YAAA,GACA9O,EAAA0M,YAAA,4BAAA,CACAC,SAAA,CACA3C,QAAA,6BACA+E,KAAA,CACAC,SAAA,QAEAnC,QAAAA,GAEAC,QAAA,MAKA,IAAA8C,EAAAW,IACA,OAAAX,IACA3P,GAAA,WACAG,QAAAwP,QAAAA,GAAAC,eAAA,YAEA7P,EAAA0M,YAAA,uCAAA,CACAC,SAAA,CACA3C,QAAA,6BACA+E,KAAA,CACAC,SAAA,UAEAnC,QAAAA,GAEAC,QAAA,MAEAtJ,MAAA,SAAAL,GAGA,OADAnD,EAAA4Q,sBACAzN,QAMA,OAAAnD,EAAAmM,YAAA,SAAAE,EAAAuC,IAOA5O,EAAA+N,kBAAA,SAAAa,EAAA/B,GACA,IAAAgC,EACAxC,EAAA,CAEA,WACA,OAAAlL,EAAA0C,OAAAC,YAAAxC,EAAA2J,WACAa,EAAAgD,YAAA,GACA9O,EAAA0M,YAAAvL,EAAA0C,OAAAC,UAAA,4BAAA,oBAAA,CACA6I,SAAA,CACA3C,QAAA,6BACA+E,KAAA,CACAC,SAAA7N,EAAA0C,OAAAC,UAAA,OAAA,gBAGAgJ,QAAA,QAIA,WAMA,OALAhB,EAAAmD,UACAnD,EAAAgD,YAAA,GAIA1D,EAAA8D,GAAA,gBACA1L,MAAA,WACA,OAAAxD,EAAA0M,YAAA,qCAAA,CACAC,SAAA,CACA3C,QAAA,gCACA6E,cAAAA,EACAE,KAAA5N,EAAA0C,OAAAC,UAAA,CACAkL,SAAA,QACA2B,MAAA,sBACA,CAAA3B,SAAA,UACAnC,QAAAA,GAEAC,QAAA,WAMA,OAAAf,EAAAtK,aACA+B,MAAA,SAAA/B,GAEA,OADAoN,EAAApN,EACAzB,EAAAmM,YAAA,WAAAE,EAAAuC,OASA5O,EAAA2O,WAAA,WAMA,OALA7C,EAAAmD,UACAnD,EAAAgD,YAAA,GAIA3O,EAAAK,UACA4K,EAAA8D,GAAA,mBACA1L,MAAA,WACA,OAAAxD,EAAA0M,YAAA,wBAAA,CACAC,SAAA,CACA3C,QAAA,qBACA6C,SAAA,GAEAC,QAAA,UAQAjM,EAAAgQ,IAAA,CACA7Q,EAAA8Q,WAEA/E,EAAAtK,aACA+B,MAAA,SAAA/B,GACAoN,EAAApN,OAGA+B,MAAA,WACA,OAAAxD,EAAA0M,YAAA,oBAAA,CACAC,SAAA,CACA3C,QAAA1I,EAAA2J,SAAA,wBAAA,yBACA4D,cAAAA,EACAhC,SAAA,QAdA,IAAAgC,GAyBA,SAAAkC,EAAA/Q,GAEAA,EAAAW,IAAA,oBAAA,SAAA2K,EAAA0F,GACAhR,EAAAmN,mBCvyBA,GC3aA/M,QAAA6Q,OAAA,2BAAA,CAAA,QAAA,kBAEAC,QAAA,aAAA,CAAA,aAAA,KAAA,UAAA,MAAA,eAAA,aAAA,WAAA,SAAAC,EAAAtQ,EAAAE,EAAAqQ,EAAAC,EAAAC,EAAAhQ,GAIA,IAAAiQ,EAAA,CACA,CAAApT,GAAA,KAAAkF,MAAA,UAAAmO,KAAA,MACA,CAAArT,GAAA,QAAAkF,MAAA,eAAAmO,KAAA,MACA,CAAArT,GAAA,QAAAkF,MAAA,YAAAmO,KAAA,MACA,CAAArT,GAAA,QAAAkF,MAAA,WAAAmO,KAAA,MACA,CAAArT,GAAA,QAAAkF,MAAA,aAAAmO,KAAA,MACA,CAAArT,GAAA,QAAAkF,MAAA,UAAAmO,KAAA,MACA,CAAArT,GAAA,QAAAkF,MAAA,WAAAmO,KAAA,OAEAC,EAAAnQ,EAAAoQ,iBAAAC,EAAArQ,EAAAoQ,kBAAA,KAGA,SAAAC,EAAApG,GACA,IAAAA,EAAA,OAAAkG,EAGA,GAAAzU,EAAAiM,UAAAsI,EAAA,CAAApT,GAAAoN,IAAA,OAAAA,EAGA,IAAAqG,EAAArG,EAAA7M,MAAA,KACA,GAAAkT,EAAA7U,OAAA,EACA,OAAA4U,EAAAC,EAAA,IAIA,IAAAC,EAAA7U,EAAA+L,KAAAwI,GAAA,SAAAO,GACA,OAAAC,OAAAC,UAAArT,WAAAsT,KAAAH,EAAA3T,GAAAoN,MAEA,OAAAsG,EAAAA,EAAA1T,GAEAsT,EAYA,IAsEAS,EAEAC,EAhFA5G,EACA6G,EAQAjQ,EAAA,CACAkQ,YAAA,WACAlO,uBAAA,MAGAmO,EAAA,CACAxF,QAAA,IACAyF,YAAA,IACAC,4BAAA,OACAC,kBAAA,OACAC,WAAA,QACAC,UAAA,oDACAC,iBAAA,yEACAC,YAAA,+DACAC,aAAA,iCACAC,iBAAA,8DACAC,wBAAA,+DACAC,WAAA,GAEAC,EAAA9S,QAAA+S,MAAA,CACAhE,aAAA,EACAvI,kBAAA7F,EAAAsQ,aACA+B,2BAAA,EACAC,cAAA,EACAC,wBAAA,OACAC,yBAAA,MACAC,0BAAA,EACAzP,YAAA,EACAE,aAAA,IACAwP,eAAA,EACAC,YAAA,EACAC,aAAA,EACAC,WAAA,EACAC,oBAAA,EACA5G,QAAA,CACAF,QAAA,EACA+C,cAAA,+CACAtB,SAAA,EACAE,QAAA,EACAR,UAAA,EACAE,IAAA,EACAE,SAAA,EACAf,OAAA,EACAE,YAAA,EACAI,QAAA,EACAiG,OAAA,EACAC,SAAA,GAEAvF,SAAA,CACAwF,UAAA,EACAC,aAAA,GAEA1G,OAAA,CACAzL,YAAA,EACAoS,qBAAA,GAEA3I,OAAA,CACApN,IAlEAoN,EAkEAjK,EAAA6S,iBAAA7C,EAAA8C,MAjEAhC,EAAAT,EAAApG,GACAA,IAAA6G,GACAnL,QAAAqB,MAAA,uCAAApG,OAAAqJ,EAAA6G,IAEAA,IA+DAiC,QAAA,CACAC,GAAA,wBACAC,QAAA,2BACAC,QAAA,6BAGAlC,EACAhR,GAEA0C,EAAA,GAEAyQ,GAAA,EAEAC,EAAA,IAAAtD,EAAA7U,KAAA,cA2BAoY,EAAA,WAEA,GADAvU,QAAAqM,YAAAyF,KAAA9R,QAAAoG,OAAA0L,EAAAlO,GAGA,OADAkO,EAAA9R,QAAA+I,KAAAnF,GACA0Q,EAAA1Q,KAAA4Q,MAAAC,QAAA7Q,IAIA6C,EAAA,WACA,OAAA4N,GAMAzQ,EAAA4C,iBAEA,IAAA5C,EAAA8Q,KAAAC,UACA1D,EAAA2D,UAAA7S,EAAAkQ,aACA7O,MAAA,SAAAyR,GACA,IAAAC,EAAA9U,QAAA+I,KAAAnF,GAGA,OAFAkR,EAAAJ,KAAAG,GAAAA,EAAAH,MAAA,UACAI,EAAAH,UACA1D,EAAA8D,UAAAhT,EAAAkQ,YAAA6C,MAIA7D,EAAA8D,UAAAhT,EAAAkQ,YAAArO,GAIAqN,EAAA8D,UAAAhT,EAAAkQ,YAAA,OAIA7O,MAAA,WAMA,OALAQ,EAAA4C,iBACAK,QAAAqB,MAAA,2BAIAoM,EAAA1Q,KAAAoR,aAAAvO,MAAA7C,MAIAR,KAAAmR,IAnCA1N,QAAAqB,MAAA,wCACA6J,GAAAkD,KAAA7R,KAAAqD,KAyCAyO,EAAA,SAAAC,GACA,GAAAA,EAAA,CAEA,IAAAC,GAAA,EACA,GAAAD,EAAAhK,QAAAgK,EAAAhK,OAAApN,GAAA,CAEA,IAAAsX,EAAA9D,EAAA4D,EAAAhK,OAAApN,IACAoX,EAAAhK,OAAAvO,EAAAiM,UAAAsI,EAAA,CAAApT,GAAAsX,IACAD,GAAAxR,EAAAuH,QAAAgK,EAAAhK,OAAApN,KAAA6F,EAAAuH,OAAApN,IAAAoX,EAAAhK,OAAApN,KAAAmT,EAAA8C,MAIApX,EAAAP,KAAA6V,GAAA5V,SAAA,SAAAC,GACA4Y,EAAA5Y,GAAAuW,EAAAvW,MAIAyD,QAAA+S,MAAAnP,EAAAuR,IAGAA,GAAAA,EAAAT,OAAAS,EAAAT,KAAAC,YAAA/Q,EAAA8Q,KAAAC,mBAAA/Q,EAAA8Q,KAAAC,UAIAS,GACAlE,EAAA8C,IAAApQ,EAAAuH,OAAApN,MAKAuX,EAAA,WACA,IAAAC,EAAAC,KAAAD,MAEA,OAAAtE,EAAA2D,UAAA7S,EAAAkQ,aACA7O,MAAA,SAAAqS,GAEA,IAAAA,EAIA,OAHA5O,QAAAqB,MAAA,4DACAgN,EAAApC,QACAyB,IAKAW,EAAAO,GAEA5O,QAAAqB,MAAA,4CAAAsN,KAAAD,MAAAA,GAAA,MACAhB,QA8DAU,EAAA,WAiBA,OAhBApO,QAAAqB,MAAA,0BAEA6J,EAAAd,EAAAyE,QAGAtS,KAAAkS,GAGAlS,MAAA,WACAyD,QAAAqB,MAAA,sBACAmM,GAAA,EACAtC,EAAA,KAEAuC,EAAA1Q,KAAA4Q,MAAAkB,MAAA9R,OAoBA,OAdAmN,EAAAxQ,IAAA,2BAjEA,WACA,IAAA4K,EAAA+F,EAAA8C,MACAnN,QAAAqB,MAAA,sBAAAiD,EAAA,KAGA,IACAwK,OAAAxK,OAAAA,EAAA3H,eAEA,MAAA6D,GACA,IACAsO,OAAAxK,OAAAA,EAAAyK,OAAA,EAAA,IAEA,MAAAvO,GACAsO,OAAAxK,OAAA,SACAtE,QAAAC,KAAA,gEAKA,IACA+O,QAAAC,SAAA3K,EAAA3H,eAEA,MAAA6D,GACA,IACAwO,QAAAC,SAAA3K,EAAA/L,UAAA,EAAA,IAEA,MAAAiI,GACAwO,QAAAC,SAAA,SACAjP,QAAAC,KAAA,iEAKAwN,EAAAnJ,OAAAqJ,MAAAC,QAAAtJ,MAkCAmJ,EAAAyB,cAAA,OAAA,SACAzB,EAAAyB,cAAA,OAAA,WACAzB,EAAAyB,cAAA,OAAA,SACAzB,EAAAyB,cAAA,OAAA,SACAzB,EAAAyB,cAAA,SAAA,WAGAb,EAAApC,GAKA,CACAkD,UA5CA,WACA,OAAA3B,GA4CAqB,MAzCA,WACA,OAAArB,EAAA5T,EAAAsH,OACAgK,GAAAkD,KAwCAA,MAAAA,EACArR,KAAAA,EACAqS,MAAAf,EACAgB,UAtNA,SAAAC,EAAAC,GACA,IAAAC,EAAAzS,EASA,OARAhH,EAAA0Z,KAAAH,EAAA7X,MAAA,MAAA,SAAA/B,GACA8Z,EAAAA,EAAA9Z,GACAyD,QAAAqM,YAAAgK,KACAA,EAAAD,MAKAC,GA6MAE,MAlOA,WAOA,OANA3Z,EAAAP,KAAAuH,GAAAtH,SAAA,SAAAC,UACAqH,EAAArH,MAGA2Y,EAAApC,GAEAwB,EAAA1Q,KAAAoR,aAAAuB,MAAA3S,GACAR,KAAAqD,IA2NAA,MAAAA,EACA6O,QAAAA,EACAkB,cAtGA,WACA,IAAArL,EAAAvH,EAAAuH,QAAAvH,EAAAuH,OAAApN,IAAAmD,EAAA6S,iBAAA,KACA,OAAA7S,EAAA,QACAA,EAAA+S,QAAA9I,GAAAjK,EAAA+S,QAAA9I,GAAA2H,EAAAmB,QAAA/S,EAAA6S,iBAAA,OAAA7S,EAAA+S,aAAA1O,GAoGAkR,WAjGA,WACA,IAAAtL,EAAAvH,EAAAuH,QAAAvH,EAAAuH,OAAApN,IAAAmD,EAAA6S,iBAAA,KACA,OAAA7S,EAAAwV,MAAAxV,EAAAwV,KAAAC,SACAzV,EAAAwV,KAAAC,SAAAxL,GAAAjK,EAAAwV,KAAAC,SAAAxL,GAAA2H,EAAA4D,KAAAC,SAAAzV,EAAA6S,iBAAA,OAAA7S,EAAAwV,UAAAnR,GA+FAuN,gBAAAA,EAEAwB,IAAAA,EACAnD,QAAAA,EACApP,UAAAA,MCvWA/B,QAAA6Q,OAAA,0BAAA,CAAA,QAAA,2BAAA,yBAEAC,QAAA,YAAA,CAAA,aAAA,KAAA,YAAA,WAAA,UAAA,WAAA,MAAA,SAAA,aAAA,MAAA,SAAAC,EAAAtQ,EAAAmW,EAAA/W,EAAAc,EAAAO,EAAAF,EAAA6V,EAAAlL,EAAAqF,GAGA,IACA8F,EAKAC,EAAA,WAAApW,EAAAqW,SAAAC,SACA3C,EAAA,IAAAtD,EAAA7U,KAAA,aAEAyH,EAAA,CACAsT,IAAA,KACAC,UAAA,GACAhX,SAAA,EACAiX,MAAA,GACAC,OAAA,CACAC,QAAA,EACAC,QAAA,EACAC,SAAA,KACAC,QAAA,EACAP,KAAA,EACAQ,SAAAnS,EACAoS,SAAApS,GAEAqS,KAAA,CACAC,KAAA,KACAC,KAAA,EACAC,SAAA,GAEAC,QAAA,SACA1E,YAAA,EACA2E,YAAA,GACAC,UAAA,KACAC,qBAAA,EACAC,cAAA,KACAC,yBAAA,EACAC,aAAA,KACAC,UAAA,KACA7L,QAAAxL,EAAAwL,SAIAhO,EAAA,SAAA8Z,GACA,OAAAA,GAAA,CAAAA,EAAAxa,OAAAwa,EAAAva,MAAAC,KAAA,MAmDAua,EAAA,WACA,OAAA7U,EAAAsT,IAAA5I,QAAAoK,KAAAC,QACAvV,MAAA,SAAAL,GACAa,EAAA2U,UAAAxV,EAAA4V,MAAA5V,EAAA4V,MAAA7V,QAAA,SAAAC,EAAA6V,GACA,GAAAA,EAAAxa,SAAAwa,EAAAC,IACA,IACA,IAAAC,EAAA,IAAA3a,EAAAya,EAAAxa,SACA2E,EAAA,CAAA+V,EAAAra,OAAAqa,EAAAvZ,QAAArB,KAAA,MAAA4a,EAEA,MAAAzR,GAEAR,QAAAxG,MAAA,gCAAAgH,GAAAA,EAAAjJ,SAAAiJ,GAGA,OAAAtE,IACA,IAAA,MAEAyC,OAAA,SAAA6B,GAEA,GAAAA,GAAAA,EAAAgC,OAAArI,EAAAsI,WAAAyP,gBACA,OAAAlZ,GAAA,WACA,OAAA4Y,MACA,KAEA5R,QAAAxG,MAAAgH,GACAzD,EAAA2U,UAAA,OAKAS,EAAA,WACA,OAAApV,EAAAsT,IAAA+B,WAAAC,MAAAZ,eACAlV,MAAA,SAAAL,GACAa,EAAA0U,aAAAvV,EAAAoW,OAAApW,EAAAoW,OAAArW,QAAA,SAAAC,EAAA6V,GAEA,OADAA,EAAAjW,KAAAiW,EAAAQ,QAAArW,EAAA6V,EAAAjW,KAAAiW,EAAAQ,OACArW,IACA,IAAA,MAEAyC,OAAA,SAAA6B,GAEA,GAAAA,GAAAA,EAAAgC,OAAArI,EAAAsI,WAAAyP,gBACA,OAAAlZ,GAAA,WACA,OAAAmZ,MACA,KAEAnS,QAAAxG,MAAAgH,GACAzD,EAAA0U,aAAA,OAIAe,EAAA,WACAzV,EAAAwT,MAAA,GACAxT,EAAAyU,yBAAA,EACAzU,EAAAzD,SAAA,EACAyD,EAAAsT,IAAAtT,EAAAsT,KAAAlW,EACA,IAAAsY,EAAA,GAEAxC,GACAF,EAAA2C,OAAAzC,GAGAA,EAAAF,GAAA,WAEA0C,EAAA3c,OACA6c,EAAAF,GAEA1V,EAAAzD,UAAAyD,EAAAyU,0BACAzU,EAAAzD,SAAA,EACAyW,EAAA2C,OAAAzC,GAEA2C,GAAA,GAEA5S,QAAAqB,MAAA,qCAAApG,OAAA8B,EAAAwT,MAAAza,YAEA,KAEA,IAAA+c,EAAA,CAEA9V,EAAAsT,IAAAlJ,IAAAsJ,OAAAqC,OACAvW,MAAA,SAAAuW,GACA/V,EAAAwU,cAAAuB,KAEAnU,OAAA,SAAA6B,GACAR,QAAAxG,MAAAgH,GACAzD,EAAAwU,cAAA,MAIAK,KAQA,OAJA7U,EAAA0P,YACAoG,EAAAE,KAAAZ,KAGAvY,EAAAgQ,IAAAiJ,GACAtW,MAAA,WACA,OAAAQ,EAAAsT,KAAAtT,EAAAsT,IAAA5I,QAAA8I,WAEAhU,MAAA,SAAAL,GACA,GAAAA,GAAAA,EAAAqU,OAAArU,EAAAqU,MAAAza,OAAA,CAGA,IAAAiH,EAAAyT,OAAAI,OA8EA,OAAAhX,EAAAgQ,IAAA7T,EAAAmG,GAAAA,EAAAqU,OAAA,IAAAtU,QAAA,SAAAC,EAAA9G,GACA,OAAA8G,EAAAC,OAAA6W,EAAA5d,EAAAqd,MACA,KA/EA,IAAAQ,EAAA,GACAld,EAAAN,QAAAyG,EAAAqU,OAAA,SAAAnb,GAEA,OAAAA,EAAA8d,SACA9d,EAAA+d,YAAA/d,EAAAuc,OAAAyB,SAAAhe,EAAAuc,MAAAla,MAAA,KAAA,IACArC,EAAA+d,aAAA/d,EAAA+d,YAAApW,EAAAuU,qBACAtR,QAAAqB,MAAA,2DAAApG,OAAA7F,EAAAwC,OAAAW,UAAA,EAAA,MAIA0a,EAAAF,KAAAC,EAAA5d,EAAAqd,IAGA1c,EAAAN,QAAAL,EAAAO,WAAA,IAAA,SAAA0d,GACA,GAAAA,EAAA3b,WAAA,QAAA,CACA,IAAAhC,EAAAN,EAAAwC,OAAA,IAAAyb,EAAA5b,MAAA,KAAA,GACAsF,EAAA2U,UAAAhc,KACAqH,EAAA2U,UAAAhc,GAAA4d,aAAA,YAOA,IAAAC,EAAAxd,EAAAyd,OAAAzW,EAAA2U,WACA,GAAA6B,GAAAA,EAAAzd,OAAA,CACA,IAAA2d,EAAA,EAEA1d,EAAAN,QAAA8d,GAAA,SAAAtB,GAEA,IAAAA,EAAAyB,YAAA,CACA,IAAAC,EAAA1B,EAAApa,MAAAub,SAAAnB,EAAApa,KAAAJ,MAAA,KAAA,IAEA,GAAAkc,GAAAA,EAAA5W,EAAAuU,qBAEA,YADAtR,QAAAqB,MAAA,0DAAApG,OAAAgX,EAAAra,OAAAW,UAAA,EAAA,KAIA,IAAAqb,EAAA,IAAAze,EAAA,CACA0C,KAAAoa,EAAApa,KACA8b,cAAAA,EACA/b,OAAAqa,EAAAra,OACAgB,QAAAqZ,EAAArZ,QACAC,UAAAoZ,EAAApZ,UACA+X,QAAA,EACA9U,IAAAiB,EAAAwU,cAAAU,EAAAra,QACAyY,IAAA,CACAwD,SAAA,EACAzb,SAAA,EACAM,OAAAuZ,EAAAvZ,QAEA/C,UAAA,CAEA,QAAAsc,EAAAvZ,UAGAkb,EAAA1c,GAAA0c,EAAAE,QACAF,EAAA9X,KAAAiB,EAAA0P,YAAA1P,EAAA0U,eACAmC,EAAAG,WAAAhX,EAAA0U,aAAAmC,EAAA9X,MAEAkY,EAAAJ,KACAnB,EAAAM,KAAAa,GACAH,SAKAA,GACAzT,QAAAqB,MAAA,+DAAApG,OAAAwY,IAIA,OAAAR,EAAAnd,OAAA8D,EAAAgQ,IAAAqJ,QAAA,MAUA1W,MAAA,WACAQ,EAAAyU,yBAAA,KAEA7S,OAAA,SAAA6B,GACAR,QAAAxG,MAAAgH,GACAzD,EAAAyU,yBAAA,MAOAwC,EAAA,SAAAJ,GAEA,QAAA7W,EAAAyT,SAGAzT,EAAAyT,OAAAC,SAAA1T,EAAAyT,OAAAE,SAAAkD,EAAA9X,KACAiB,EAAAyT,OAAAE,SAAA3T,EAAAyT,OAAAC,QAAAmD,EAAA9X,KAKAiB,EAAAyT,OAAAG,WAAAiD,EAAAN,YAAAvW,EAAAyT,OAAAG,WAKA5T,EAAAyT,OAAAI,QAAA,OAAAgD,EAAAV,QAAAU,EAAAK,WAAAlX,EAAAyT,OAAAI,QAAA,OAAAgD,EAAAV,SAAAU,EAAAK,UAKA9a,QAAAuC,UAAAqB,EAAAyT,OAAAH,MAAAuD,EAAAM,SAAAnX,EAAAyT,OAAAH,KAKAlX,QAAAuC,UAAAqB,EAAAyT,OAAAqB,OAAA+B,EAAAO,UAAApX,EAAAyT,OAAAqB,MAKA1Y,QAAAuC,UAAAqB,EAAAyT,OAAAK,MAAA+C,EAAAQ,SAAArX,EAAAyT,OAAAK,KAKA1X,QAAAuC,UAAAqB,EAAAyT,OAAAM,MAAA8C,EAAAS,SAAAtX,EAAAyT,OAAAM,OAOAkC,EAAA,SAAA5d,EAAAkf,GACAA,EAAAA,GAAAvX,EAAA0V,SAGArd,EAAA+d,YAAA/d,EAAAuc,OAAAyB,SAAAhe,EAAAuc,MAAAla,MAAA,KAAA,IACArC,EAAA6e,SAAA,OAAA7e,EAAA8d,QAAA9d,EAAA+d,aAAA/d,EAAA+d,YAAApW,EAAAuU,qBAEA,IAAAf,EAAAgE,EAAAnf,GACAof,GAAA,EAEAvB,EAAA1C,EAAAtU,QAAA,SAAAgX,EAAAW,GACA,IAAAa,EAAA1e,EAAAiM,UAAAjF,EAAAwT,MAAA,CAAArZ,GAAA0c,EAAA1c,KACAwd,EAAAD,EAAAA,EAAA5c,KAAA,KACA8c,IAAAF,GAAAA,EAAA7D,OAEA,OAAAqC,EAAA9W,OACAyY,EAAAhB,GACArX,MAAA,SAAAsY,GACA,GAAAJ,EAEA,IAAAI,GAAAA,EAAAjE,SAAA7T,EAAAyT,OAAAI,QAAA,QAAA7T,EAAAyT,OAAAI,OAAA,CACA,IAAAkE,EAAA/X,EAAAwT,MAAAwE,QAAAN,IACA,IAAAK,IACA9U,QAAAqB,MAAA,4CAAApG,OAAA2Y,EAAAoB,OAAAH,EAAAA,EAAAjE,OAAA,KAAA,OAAA,aACA7T,EAAAwT,MAAA0E,OAAAH,EAAA,GACAN,GAAA,QAGAK,EAAAhd,OAAA6c,GACA1U,QAAAqB,MAAA,iDAAApG,OACA4Z,EAAAxE,MAAAwE,EAAAxE,IAAA6E,OAAA,MAAA,SAAA,OACAL,EAAAG,SACAR,GAAA,GAEAG,IAAAE,EAAAjE,QACA5Q,QAAAqB,MAAA,0CAAApG,OACA4Z,EAAAxE,MAAAwE,EAAAxE,IAAA6E,OAAA,MAAA,SAAA,OACAL,EAAAG,OACAH,EAAAjE,OAAA,KAAA,SACA4D,GAAA,GAGAxU,QAAAqB,MAAA,yCAAApG,OACA4Z,EAAAxE,MAAAwE,EAAAxE,IAAA6E,OAAA,MAAA,SAAA,OACAL,EAAAG,cAGAH,GAAAA,EAAAjE,SAAA7T,EAAAyT,OAAAI,QAAA,QAAA7T,EAAAyT,OAAAI,SACA5Q,QAAAqB,MAAA,sCAAApG,OACA4Z,EAAAxE,MAAAwE,EAAAxE,IAAA6E,OAAA,MAAA,SAAA,OACAL,EAAAG,OACAH,EAAAjE,OAAA,KAAA,SAEA0D,EAAAvB,KAAA8B,GACAL,GAAA,SAIA,IACA,OAAA,IAAAvB,EAAAnd,OAAAmd,EAAA,GAAArZ,EAAAgQ,IAAAqJ,IACA1W,MAAA,WACA,OAAAiY,MAIAD,EAAA,SAAAnf,EAAAie,GACA,IAAAje,EAAA,MAAA,GACA,IAAAwe,EAAA,IAAAze,EAAAC,GAGA,IAAAie,EAAA,CACA,IAAA8B,EAAAvB,EAAAwB,eACA,IAAAD,EAAA,MAAA,GAEA,IAAAxf,EAAAwf,EAAAlZ,QAAA,SAAAC,EAAAmZ,GACA,IAAAhC,EAAAlZ,EAAA0T,KAAAyH,cAAAD,GACA,OAAAhC,EAAAnX,EAAAC,OAAAkX,GAAAnX,IACA,IAGA,GAAAvG,EAAAG,OAAA,EACA,OAAAH,EAAAsG,QAAA,SAAAC,EAAAmX,GACA,OAAAnX,EAAAC,OAAAoY,EAAAnf,EAAAie,MACA,IAIAA,EAAA1d,EAAA,GAUA,OAPAie,EAAAvD,IAAAgD,EACAO,EAAAoB,OAAApB,EAAA2B,YACA3B,EAAA4B,IAAA5B,EAAA6B,SACA7B,EAAA/b,KAAA+b,EAAA/b,MAAA+b,EAAAjC,MACAiC,EAAAT,YAAAS,EAAA/b,MAAAub,SAAAQ,EAAA/b,KAAAJ,MAAA,KAAA,IACAmc,EAAA9X,IAAA8X,EAAAhc,QAAAmF,EAAAwU,cAAAqC,EAAAhc,QACAgc,EAAA1c,GAAA0c,EAAAE,QACA,CAAAF,IAGAgB,EAAA,SAAAhB,GAGA,IAAAI,EAAAJ,GAAA,OAAAha,EAAAsH,OAEA,IAAAnE,EAAAyT,OAAAI,SAAA7T,EAAAyT,OAAAI,QAAA,SAAAgD,EAAAV,SAAAU,EAAA8B,UAEA,OADA9B,EAAAhD,QAAA,EACAhX,EAAAsH,KAAA0S,GAGA,GAAAA,EAAAvD,IAAAwD,SAAA9W,EAAA2U,UAAA,CACA,IAAAiE,EAAA,CAAA/B,EAAAhc,OAAAgc,EAAAvD,IAAA3X,QAAArB,KAAA,KACA4a,EAAAlV,EAAA2U,UAAAiE,GAcA,cAbA5Y,EAAA2U,UAAAiE,GACA1D,IACA2B,EAAA/b,KAAAoa,EAAApa,KACA+b,EAAAD,cAAA1B,EAAApa,MAAAub,SAAAnB,EAAApa,KAAAJ,MAAA,KAAA,IACAmc,EAAAhb,QAAAqZ,EAAArZ,QACAgb,EAAA/a,UAAAoZ,EAAApZ,WAEA+a,EAAAhD,SAAAgD,EAAA/b,KAEA+b,EAAA9X,KAAAiB,EAAA0P,YAAA1P,EAAA0U,eACAmC,EAAAG,WAAAhX,EAAA0U,aAAAmC,EAAA9X,MAGAlC,EAAAsH,KAAA0S,GAIA,OAAAA,EAAAvD,IAAAwD,UAAA3D,GAAA0D,EAAAvD,IAAAuF,OAaAhC,EAAAvD,IAAAhY,QAAAub,EAAAvD,IAAAwD,SACAD,EAAAhD,OAAA,OAAAgD,EAAAV,OACAU,EAAA/b,MA7dA,SA8dA+b,EAAAhb,QAEAgb,EAAA9X,KAAAiB,EAAA0P,YAAA1P,EAAA0U,eACAmC,EAAAG,WAAAhX,EAAA0U,aAAAmC,EAAA9X,MAEAlC,EAAAsH,KAAA0S,KAGAA,EAAAnG,IAAAmG,EAAAnG,KAAAtT,EAAA0b,cAAAjC,EAAA8B,UAAA9B,EAAAkC,UAAAlC,EAAAQ,QAAArX,EAAA8I,SAGA+N,EAAAnG,IAAA2E,WAAA2D,SAAA,GACAxZ,MAAA,SAAAoV,GACA,IAAAA,EAAA,MAAA,IAAAha,MAAA,kDAQA,OAPAic,EAAAD,cAAAhC,EAAAxa,OACAyc,EAAAhD,QAAA,EACAgD,EAAA/b,KAAAA,EAAA8Z,GACAiC,EAAAoC,WAAArE,EAAAqE,YACA,IAAAjZ,EAAAqU,YAAA2D,QAAAnB,EAAA/b,OACAkF,EAAAqU,YAAA2B,KAAAa,EAAA/b,MAEA+b,KAEAjV,OAAA,SAAA6B,GAEA,GAAAA,GAAAA,EAAAgC,OAAArI,EAAAsI,WAAAwT,iBAIA,OAHArC,EAAAhD,QAAA,EACAgD,EAAA/b,KAAAA,EAAA,CAAAV,OAAA,EAAAC,KAAA+C,EAAAe,UAAAgb,kBACAtC,EAAAG,WAAA,EACAH,EAEA,IAAAA,EAAAuC,UAAA,CACA,IAAA9F,EAAAuD,EAAAvD,KAAAuD,EAAAwC,SACA,GAAA/F,EAAAmF,MAAA,IAAA5B,EAAAoB,OAAAD,QAAA1E,EAAAmF,KAIA,OAFA5B,EAAAuC,WAAA,EACAvC,EAAAnG,IAAAtT,EAAA0b,cAAAxF,EAAAmF,IAAAnF,EAAAgG,KAAAhG,EAAAuF,QACAhB,EAAAhB,GASA,OALAA,EAAA/b,KAAA,KACA+b,EAAAT,YAAA,KACAS,EAAAD,cAAA,KACAC,EAAAhD,QAAA,EACAgD,EAAA9X,IAAAiB,EAAAwU,cAAAqC,EAAAhc,QACAgc,KAEArX,MAAA,SAAAqX,GAEA,KAAA7W,EAAAyT,OAAAI,QAAAgD,GAAAA,EAAAhD,QAAA7T,EAAA0P,YAAA,OAAAmH,EACA,IAAAX,EAAA,GAwBA,OArBAW,EAAA9X,KACAmX,EAAAF,KAAAa,EAAAnG,IAAA2E,WAAAC,MAAAiE,SAAA,CAAA1e,OAAAgc,EAAAhc,SACA2E,MAAA,SAAAL,GACA0X,EAAAG,WAAA7X,EAAAA,EAAAqW,MAAA,QAEA5T,OAAA,WACAiV,EAAAG,WAAA,SAKAd,EAAAF,KAAAa,EAAAnG,IAAAI,KAAA0I,UACAha,MAAA,SAAAL,GACA0X,EAAAjb,SAAAuD,GAAAA,EAAAsa,SAAAta,EAAAsa,QAAA7d,eAAA+F,EACAkV,EAAAhb,QAAAsD,GAAAA,EAAAsa,SAAAta,EAAAsa,QAAA5d,SAAA,OAEA+F,OAAA,WACAiV,EAAAjb,cAAA+F,EACAkV,EAAAhb,QAAA,QAGAgB,EAAAgQ,IAAAqJ,GACA1W,MAAA,WACA,OAAAqX,UA5FAA,EAAAhD,OAAA,OAAAgD,EAAAV,OACAU,EAAA/b,MAhdA,SAidA+b,EAAAhb,QAEAgb,EAAA9X,KAAAiB,EAAA0P,YAAA1P,EAAA0U,eACAmC,EAAAG,WAAAhX,EAAA0U,aAAAmC,EAAA9X,MAGAlC,EAAAsH,KAAA0S,KAyFAjB,EAAA,SAAAF,EAAAgE,GAEA,IADAhE,EAAAA,GAAA1V,EAAA0V,UACA3c,OAAA,CACA,IAAA4gB,EAAA3gB,EAAA4gB,IAAA5Z,EAAAwT,OAAA,SAAAqD,GACA,OAAAA,EAAA1c,MAEAsd,GAAA,EACAoC,EAAA,EACA7gB,EAAAN,QAAAgd,EAAAwC,OAAA,IAAA,SAAArB,GACA8C,EAAA9C,EAAA1c,MACA6F,EAAAwT,MAAAwC,KAAAa,GACA8C,EAAA9C,EAAA1c,IAAA0c,EACAY,GAAA,EACAoC,QAGApC,IACAxU,QAAAqB,MAAA,sCAAApG,OAAA2b,IACAhE,EAAA6D,MAIAI,EAAA,SAAAlR,EAAAmR,EAAA7F,GACA,IAAAtL,EAAA,OAAA,EACA,IAAAoR,EAAA,EAEAD,GADAnR,EAAAA,EAAAhJ,eACA7G,SACAghB,EAAAnR,EAAA7P,QAEAihB,GAAApR,EAAAqR,WAAA,GACA,IAAA,IAAAC,EAAA,EAAAA,EAAAH,EAAAG,IACAF,GAAAG,KAAAC,IAAA,KAAAF,GAAAtR,EAAAqR,WAAAC,GAEA,OAAAhG,EAAA,IAAA8F,EAAAA,GAGAnE,EAAA,SAAA6D,GAEA,IAAAW,EAAA,GACAra,EAAAsa,iBAAA,EACAthB,EAAAN,QAAAsH,EAAAwT,OAAA,SAAAqD,GACA,GAAAA,EAAA/b,KAAA,CACA,IAAAA,EAAAuf,EAAAxD,EAAA/b,MACAA,GAAAA,EAAAme,YASAne,EAAAme,YAAApC,EAAAoC,aACAne,EAAAme,WAAApC,EAAAoC,aATAne,EAAA,CACAA,KAAA+b,EAAA/b,KACAme,WAAApC,EAAAoC,WACAsB,MAAA,GAEAF,EAAAxD,EAAA/b,MAAAA,IAjmBA,IAumBAA,EAAAA,MACAA,EAAAyf,QAGAva,EAAAsa,kBAAAzD,EAAA9X,IAAA,EAAA,KAEA,IAoDAyb,EApDAlG,EAAAtU,EAAAsU,UACAtU,EAAAyT,OAAAI,SAEA7a,EAAAN,QAAAM,EAAAyd,OAAA4D,IAAA,SAAAvf,GACAA,EAAA2f,IAAA,IAAA3f,EAAAyf,MAAAva,EAAAwT,MAAAza,UAEAub,EAAAtb,EAAA0hB,IAAAL,GAAA,SAAA5H,GACA,OAAAA,EAAA8H,SAEAvhB,EAAAN,QAAAsH,EAAAwT,OAAA,SAAAqD,GACAA,EAAA8D,sBAAA9D,EAAA/b,OAAAwZ,EAAAxZ,KACA+b,EAAA+D,kBAAA/D,EAAA/b,OAAA+b,EAAA8D,uBAAAN,EAAAxD,EAAA/b,MAAAyf,MAAA,EACA1D,EAAA+D,oBACA/D,EAAAgE,oBAAAR,EAAAxD,EAAA/b,MAAAme,WAAA3E,EAAA2E,gBAIAjZ,EAAAwT,MAAAxa,EAAA8hB,KAAA9a,EAAAwT,OAAA,GAAA,SAAAqD,GACA,OAAAA,EAAA1c,MAEA6F,EAAAwT,MAAAxa,EAAA+hB,OAAA/a,EAAAwT,OAAA,SAAAqD,GACA,IAAAmD,EAAA,EA2BA,OA1BAha,EAAAgU,KAAAC,OACA+F,GAAA,QAAAha,EAAAgU,KAAAC,KAAA6F,EAAAjD,EAAA9X,KAAA8X,EAAAhc,OAAA,EAAAmF,EAAAgU,KAAAE,KAAA,EACA8F,GAAA,QAAAha,EAAAgU,KAAAC,OACA4C,EAAAO,WAAApX,EAAAgU,KAAAE,IAAA,GAAA,IAAA,IACA2C,EAAAN,YAAA,iBAAAvW,EAAAgU,KAAAE,IAAA,KAAA,MAAA,IACA2C,EAAAQ,UAAArX,EAAAgU,KAAAE,IAAA,KAAA,MAAA,IAAA,EACA8F,GAAA,eAAAha,EAAAgU,KAAAC,MAAA4C,EAAAG,WAAAhX,EAAAgU,KAAAE,IAAA,IAAA2C,EAAAG,WAAAH,EAAAG,WAAA,EACAgD,GAAA,kBAAAha,EAAAgU,KAAAC,MAAA4C,EAAAD,cAAA5W,EAAAgU,KAAAE,IAAA,IAAA2C,EAAAD,cAAAC,EAAAD,cAAA,GAEAoD,GAAA,KACAA,GAAA,KAAAnD,EAAAhD,OAAA,EAAA,GACAmG,GAAA,KAAAnD,EAAA8D,sBAAA,EAAA,GACAX,GAAA,KAAAnD,EAAA+D,kBAAAP,EAAAxD,EAAA/b,MAAA2f,IAAA,GACAza,EAAA0P,YACAsK,GAAA,KAAAnD,EAAAG,WAAA,IAAAH,EAAAG,WAAA,GACAgD,GAAA,GAAAnD,EAAA9X,IAAA+a,EAAAjD,EAAA9X,IAAA,GAAA,GAAA,GACAib,GAAA,MAAAnD,EAAA9X,IAAA,EAAA+a,EAAAjD,EAAAhc,OAAA,GAAA,MAGAmf,GAAA,KAAAnD,EAAA9X,IAAA+a,EAAAjD,EAAA9X,IAAA,GAAA,GAAA,GACAib,GAAA,MAAAnD,EAAA9X,IAAA,EAAA+a,EAAAjD,EAAAhc,OAAA,GAAA,KAEAmf,GAAA,MAAAnD,EAAAM,QAAAN,EAAAQ,QAAA,EAAA,GAAA,GAEAR,EAAAmD,MAAAA,GAEAA,KAGAha,EAAAoU,SAEApU,EAAAwT,MAAA9a,SAAA,SAAAme,GACAA,EAAAmE,UAAAR,GAAA3D,EAAA7W,EAAAoU,UAAAyC,EAAA7W,EAAAoU,WAAAoG,EAAAxa,EAAAoU,SACAoG,EAAA3D,KAKA6C,GAAApF,GAAAA,EAAAxZ,QAAAkF,EAAAsU,WAAAtU,EAAAsU,UAAAxZ,OAAAwZ,EAAAxZ,QACAkF,EAAAsU,UAAAA,EACA5D,EAAA1Q,KAAA4Q,MAAAqK,iBAAA3G,IAIA5D,EAAA1Q,KAAA4Q,MAAAC,QAAA7Q,IA2DAqR,EAAA,SAAAiC,EAAAlO,GAEA,OADAA,EAAAA,GAAA,GACAhI,EAAA0U,QACAtS,MAAA,WAWA,GAVA0b,IAEAlb,EAAAsT,IAAAA,GAAAlW,EACA4C,EAAAyT,OAAArO,EAAAqO,OAAArX,QAAA+S,MAAAnP,EAAAyT,OAAArO,EAAAqO,QAAAzT,EAAAyT,OACAzT,EAAAgU,KAAA5O,EAAA4O,KAAA5X,QAAA+S,MAAAnP,EAAAgU,KAAA5O,EAAA4O,MAAAhU,EAAAgU,KACAhU,EAAA0P,WAAAtT,QAAAuC,UAAAyG,EAAAsK,YAAAtK,EAAAsK,WAAA1P,EAAA0P,WACA1P,EAAA8I,QAAA1M,QAAAuC,UAAAyG,EAAA0D,SAAA1D,EAAA0D,QAAAxL,EAAAwL,QAGA9I,EAAAuU,qBAAAvU,EAAAsU,WAAAtU,EAAAsU,UAAAxZ,MAAAub,SAAArW,EAAAsU,UAAAxZ,KAAAJ,MAAA,KAAA,IAtvBA,UAsvBAiH,OACAA,IAAA3B,EAAAuU,qBACA,OAAAxM,EAAAsN,WAAA2D,SAAA,GACAxZ,MAAA,SAAAwZ,GACAhZ,EAAAuU,qBAAAyE,EAAA5e,OA1vBA,UA8vBAoF,MAAA,WACAyD,QAAAkY,KAAA,wCAAAjd,OAAAoV,EAAA2E,SACA,IAAAtG,EAAAC,KAAAD,MAIA,OA3EA3R,EAAAuT,UAAA,CAGAvT,EAAAsT,IAAA8H,UAAAxG,QAAAyG,YAAA,SAAAzG,GACA,GAAAA,IAAA5U,EAAAzD,QAAA,CACA,IAAAzB,EAAA,CAAA8Z,EAAAxa,OAAAwa,EAAAva,MAAAC,KAAA,MACA,IAAA0F,EAAAqU,YAAA2D,QAAAld,KACAmI,QAAAqB,MAAA,8BAAAxJ,EAAAU,UAAA,EAAA,KACAwE,EAAAqU,YAAA2B,KAAAlb,GAEA,IAAAkF,EAAAqU,YAAAtb,SAEAiH,EAAAzD,SAAA,EAEAN,GAAA,WACAgH,QAAAqB,MAAA,0DACAmR,MACA,KAAA,SAMAzV,EAAAsT,IAAA8H,UAAAvE,OAAAwE,YAAA,SAAAhjB,GACA,GAAAA,IAAA2H,EAAAzD,QAAA,CACA,IAAAmZ,EAAA,GACAO,EAAA5d,EAAAqd,GACAlW,MAAA,SAAAiY,GACAA,IACA/B,EAAA3c,OAAA,EACA6c,EAAAF,GAAA,IAGAzS,QAAAqB,MAAA,yCACAuR,GAAA,aAyCAJ,IACAjW,MAAA,SAAAgU,GAEA,OADAvQ,QAAAqB,MAAA,yBAAAsN,KAAAD,MAAAA,GAAA,MACA6B,SAKA0H,EAAA,WACAlb,EAAAsT,MACArQ,QAAAkY,KAAA,iCA5FAniB,EAAAN,QAAAsH,EAAAuT,WAAA,SAAA+H,GACAA,OAEAtb,EAAAuT,UAAA,GA3oBAvT,EAAAsT,IAAA,KACAtT,EAAAuT,UAAA,GACAvT,EAAAwT,MAAA0E,OAAA,GACAlY,EAAAyT,OAAA,CACAC,QAAA,EACAC,QAAA,EACAC,SAAA,KACAC,QAAA,EACAP,KAAA,EACAQ,SAAAnS,EACAoS,SAAApS,GAEA3B,EAAAgU,KAAA,CACAC,KAAA,KACAC,KAAA,GAEAlU,EAAAoU,QAAA,SACApU,EAAA0P,YAAA,EACA1P,EAAAsa,iBAAA,EACAta,EAAAqU,YAAA,GACArU,EAAAsU,UAAA,KACAtU,EAAAuU,qBAAA,EACAvU,EAAAwU,cAAA,GACAxU,EAAAzD,SAAA,EACAyD,EAAAyU,yBAAA,EACAzU,EAAA0U,aAAA,KACA1U,EAAA2U,UAAA,KACA3U,EAAA8I,QAAAxL,EAAAwL,UAmtBAyS,EAAA,SAAAC,GACA,OAJAxb,EAAAsT,IAKAjC,IACA7R,MAAA,WACA,OAAA3C,EAAA2e,MAIA3e,EAAA2e,IAyBA,OAJA9K,EAAAyB,cAAA,OAAA,WACAzB,EAAAyB,cAAA,OAAA,oBACAzB,EAAAyB,cAAA,OAAA,YAEA,CACAnS,KAAAA,EACAqR,MAAAA,EACA6J,MAAAA,EACAO,SArvBA,WACA,OAAAzb,EAAAwT,OAAAxT,EAAAwT,MAAAza,OAAA,GAqvBA2iB,SAlvBA,WACA,OAAA1b,EAAAwT,OAkvBAQ,KA7FA,SAAA5O,GACAA,EAAAA,GAAA,GACApF,EAAAyT,OAAArO,EAAAqO,OAAArX,QAAA+S,MAAAnP,EAAAyT,OAAArO,EAAAqO,QAAAzT,EAAAyT,OACAzT,EAAAgU,KAAA5O,EAAA4O,KAAA5X,QAAA+S,MAAAnP,EAAAgU,KAAA5O,EAAA4O,MAAAhU,EAAAgU,KACA6B,GAAA,IA0FA8F,gBArBA,WACA,OAAAJ,GAAA,SAAAK,EAAAC,GACAD,EAAA5b,EAAAwT,MAAAtU,QAAA,SAAAC,EAAA0X,GACA,OAAAA,EAAA8D,uBAAA9D,EAAA9X,IAAAI,EAAAC,OAAAyX,GAAA1X,IACA,SAkBA2c,eA7uBA,WACA,OAAA9b,EAAAqU,aA6uBA0H,gBA9BA,WACA,OAAAR,GAAA,SAAAK,EAAAC,GACAD,EAAA5b,EAAAgc,cA6BAvG,UAAAA,EACAwG,OApvBA,WACA,OAAAjc,EAAAzD,SAqvBAmU,IAAAA,MC90BAtU,QAAA6Q,OAAA,0BAAA,CAAA,yBAAA,6BAEAC,QAAA,YAAA,CAAA,aAAA,SAAA,SAAAC,EAAA3P,GAGAA,EAAA0e,aAEAjZ,QAAAkY,KAAA,+BCPA/e,QAAA6Q,OAAA,yBAAA,CAAA,0BAEAC,QAAA,cAAA,CAAA,KAAA,WAAA,aAAA,SAAArQ,EAAAZ,EAAAiB,GAOA,SAAAif,IACA5jB,KAAA6jB,QAAA,EACA,IAAA9jB,EAAAC,KAEAA,KAAA4M,KAAA,SAAAkX,GACArjB,EAAAN,QAAAM,EAAAP,KAAA4jB,IAAA,SAAA1jB,GACAL,EAAAK,GAAA0jB,EAAA1jB,OAIAJ,KAAA+jB,SAAA,WACA,OAAA/jB,KAAA6jB,QAGA7jB,KAAAgJ,KAAAhJ,KAAAgJ,MAAA,GASAhJ,KAAAgJ,KAAAgb,gBAAA,SAAAC,EAAAhB,GACA,IAAAiB,EAAA,IAAAC,KAAA,CAAA,IAAAC,WAAAH,KACAI,EAAA,IAAAC,WACAD,EAAAE,OAAA,SAAAxV,GACAkU,EAAAlU,EAAAyV,OAAAC,SAEAJ,EAAAK,WAAAR,IAIAN,EAAAnO,UAAA7P,UAAA,CACA+e,kBAAA,GACAC,4BAAA,GACAC,oBAAA,GACAC,YAAA,GACApe,cAAA,CACAqe,OAAA,CACAC,EAAA,KACAC,EAAA,EACAC,EAAA,EACAC,QAAA,GAEAC,QAAA,CACAJ,EAAA,KACAC,EAAA,GACAC,EAAA,EACAC,QAAA,KAKAvB,EAAAnO,UAAA4P,kBAAA,SAAAC,GACA,IAAAvlB,EAAAC,KACA,GAAA,OAAAulB,OAAA,OAAAD,EAAAC,QACA7hB,GAAA,WAAA3D,EAAAslB,kBAAAC,KAAA,MAGA1B,EAAAnO,UAAA+P,kBAAA,SAAAF,EAAAzY,GACA,IAAA9M,EAAAC,KACA,OAAAylB,sBAAAA,sBAAAH,EAAAzY,GACAnJ,GAAA,WAAA3D,EAAAylB,kBAAAF,EAAAzY,KAAA,MAGA+W,EAAAnO,UAAAiQ,mBAAA,SAAAJ,EAAAzY,GACA,IAAA9M,EAAAC,KACA,OAAA2lB,aAAAA,aAAAC,YAAAN,EAAAzY,GACAnJ,GAAA,WAAA3D,EAAA2lB,mBAAAJ,EAAAzY,KAAA,MAGA+W,EAAAnO,UAAAoQ,kBAAA,SAAAP,GACA,IAAAvlB,EAAAC,KACA,OAAA8lB,OAAAR,EAAAQ,QACApiB,GAAA,WAAA3D,EAAA8lB,kBAAAP,KAAA,MAGA1B,EAAAnO,UAAAsQ,kBAAA,SAAAT,GACA,IAAAvlB,EAAAC,KACA,GAAA,OAAAgmB,OAAA,OAAAV,EAAAU,QACAtiB,GAAA,WAAA3D,EAAAgmB,kBAAAT,KAAA,MAGA1B,EAAAnO,UAAAwQ,iBAAA,SAAA/Z,GAEA,IADA,IAAAga,EAAA,IAAA9B,WAAApkB,KAAA4F,UAAAkf,aACAnD,EAAA,EAAAA,EAAAuE,EAAA1lB,OAAAmhB,IAAAuE,EAAAvE,GAAAzV,EAAAyV,GACA,OAAAuE,GAIA,IAAAC,EAAAC,OAAAD,QAAAC,OAAAC,UAAAD,OAAAE,OAWA,SAAAC,IACAvmB,KAAA4B,GAAA,SAGA5B,KAAA4I,OAAA,KACA5I,KAAAwmB,KAAA,KACAxmB,KAAAmM,OAAA,KACAnM,KAAAymB,OAAA,KACA,IAAA1mB,EAAAC,KA8VA,SAAA0mB,EAAAC,EAAAlC,GACA,GAAA,IAAAA,EACA,KAAA,CAAAxiB,QAAA,YAAA0kB,EAAA,uBAIA,SAAAC,EAAAD,EAAAE,EAAAC,EAAAC,EAAAC,GAEA,OAfA,SAAAL,EAAAE,EAAAC,EAAAC,GACA,GAAAD,EAAAtmB,SAAAumB,EACA,KAAA,CAAA9kB,QAAA,QAAA0kB,EAAA,aACAI,EAAA,SAAAF,EAAA,mBAAAC,EAAAtmB,QAWAymB,CAAAN,EAAAE,EAAAC,EAAAC,GAIA,SAAAG,EAAAF,GACA,IAAA9B,EAAA8B,GAAA,EACAG,EAAAC,EAAAF,EAAA1mB,OAAA0kB,GACAnlB,EAAAymB,KAAAa,SAAAC,OAAAC,IAAAL,EAAAC,EAAAjC,GACA,IAAA,IAAAvD,EAAAwF,EAAAxF,EAAAwF,EAAAjC,EAAAvD,IACA5hB,EAAAymB,KAAAa,SAAAC,OAAA3F,GAAA,EAEA,OAAAwF,EAVAK,CAAAV,EAAAE,GAaA,SAAAI,EAAAK,GACA,IAAAhD,EAAA1kB,EAAAymB,KAAAa,SAAAK,QAAAD,GACA,GAAA,IAAAhD,EACA,KAAA,CAAAxiB,QAAA,kBAAAwlB,OAAAA,GAEA,OAAAhD,EAGA,SAAAkD,EAAAC,GACA7nB,EAAAymB,KAAAa,SAAAQ,MAAAD,GAeA,SAAAE,EAAAtnB,GACAR,KAAAQ,OAAAA,EACAR,KAAAmnB,QAAAC,EAAA5mB,GA3YAR,KAAAgJ,KAAAhJ,KAAAgJ,MAAA,GACAhJ,KAAAgJ,KAAA+e,YAAA,SAAAC,GACA,IAAArG,EAAAsG,EAAAC,SAAAC,mBAAAH,IAAAI,EAAA,IAAAhE,WAAA6D,EAAAznB,QACA,IAAAmhB,EAAA,EAAAA,EAAAsG,EAAAznB,OAAAmhB,IAAAyG,EAAAzG,GAAAsG,EAAAvG,WAAAC,GACA,OAAAyG,GAEApoB,KAAAgJ,KAAAqf,YAAA,SAAAL,GACA,OAAAjoB,EAAAymB,KAAA6B,YAAAL,IAEAhoB,KAAAgJ,KAAAC,cAAA,SAAAqf,GACA,OAAAvoB,EAAAoM,OAAAC,OAAAkc,IAEAtoB,KAAAgJ,KAAAuf,cAAA,SAAAD,GACA,IAAA3G,EACAsG,EAAAloB,EAAAoM,OAAAqc,OAAAF,GACAF,EAAA,IAAAhE,WAAA6D,EAAAznB,QACA,IAAAmhB,EAAA,EAAAA,EAAAsG,EAAAznB,OAAAmhB,IAAAyG,EAAAzG,GAAAsG,EAAAtG,GACA,OAAAyG,GAEApoB,KAAAgJ,KAAAyf,cAAA,SAAAH,GACA,OAAAvoB,EAAA0mB,OAAA+B,OAAAF,IAEAtoB,KAAAgJ,KAAA0f,cAAA,SAAAN,GACA,OAAAroB,EAAA0mB,OAAAra,OAAAgc,IAGApoB,KAAAgJ,KAAA2f,YAAA,SAAA1mB,GACA,OAAAqC,GAAA,SAAA+e,GACA,IAAAuF,EAAA7oB,EAAAiJ,KAAA+e,YAAA9lB,GAEAohB,EADAtjB,EAAAymB,KAAAqC,OAAA9oB,EAAAymB,KAAAsC,mBAAAF,IACAG,mBAGA/oB,KAAAgJ,KAAAggB,aAAA,WACA,GAAAjpB,EAAAomB,QAAApmB,EAAAomB,OAAA8C,gBAAA,CACA,IAAAC,EAAA,IAAA9E,WAAArkB,EAAA6F,UAAAgf,6BAEA,OADA7kB,EAAAomB,OAAA8C,gBAAAC,GACA5kB,EAAAsH,KAAAsd,GAGA,OAAA5kB,EAAAsH,KAAA7L,EAAAymB,KAAA2C,4BAGAnpB,KAAAgJ,KAAA8f,mBAAA,SAAAM,GACA,OAAArpB,EAAAymB,KAAAsC,mBAAAM,IAEAppB,KAAAgJ,KAAAqgB,cAAA,SAAA3gB,EAAAqC,EAAAia,EAAAC,EAAAC,EAAAoE,GAEA,OAAAhlB,GAAA,SAAA+e,EAAAC,GACA,IAQAD,EAPAtjB,EAAA6I,OAAAygB,cACA3gB,EACAqC,EACAia,EACAC,EACAC,EACAoE,IAGA,MAAApe,GACAoY,EAAApY,QAQAlL,KAAAupB,sBAAA,SAAAC,GACA,OAAAA,EAAAC,OAAAD,EAAAE,MAAAplB,EAAAsH,KAAA4d,GACAllB,GAAA,SAAA+e,EAAAC,GACA,IAIAD,GA6OAsG,EAAA/C,EAAA,kCAAA,KA7OA4C,EAAAtd,OA8OAnM,EAAAymB,KAAAa,SAAAuC,+BACAC,EAAA,IAAA/B,EAAA/nB,EAAAymB,KAAAa,SAAAyC,8BACApD,EAAA,wCACA3mB,EAAAymB,KAAAa,SAAA0C,sCAAAF,EAAA1C,QAAAwC,IACAhC,EAAAgC,GACA5pB,EAAAymB,KAAAwD,+BAAAH,EAAAI,kBAjPA,MAAA/e,GACAoY,EAAApY,GAyOA,IACAye,EAEAE,MApOA7pB,KAAAkqB,iBAAA,SAAAhhB,GACA,OAAA5E,GAAA,SAAA+e,EAAAC,GACA,IAIAD,GAsOA8G,EAAAvD,EAAA,6BAAA,KAtOA1d,EAuOAnJ,EAAAymB,KAAAa,SAAA+C,+BACAC,EAAA,IAAAvC,EAAA/nB,EAAAymB,KAAAa,SAAAiD,8BACA5D,EAAA,wCACA3mB,EAAAymB,KAAAa,SAAAkD,sCAAAF,EAAAlD,QAAAgD,IACAxC,EAAAwC,GACAE,EAAAJ,iBA1OA,MAAA/e,GACAoY,EAAApY,GAkOA,IACAif,EAEAE,MAhOArqB,KAAAwqB,iBAAA,SAAAte,GACA,OAAA5H,GAAA,SAAA+e,EAAAC,GACA,IAGAD,GAmOAsG,EAAA/C,EAAA,6BAAA,KAnOA1a,EAoOAnM,EAAAymB,KAAAa,SAAAuC,+BACAC,EAAA,IAAA/B,EAAA/nB,EAAAymB,KAAAa,SAAAyC,8BACApD,EAAA,wCACA3mB,EAAAymB,KAAAa,SAAA0C,sCAAAF,EAAA1C,QAAAwC,IACAhC,EAAAgC,GACAE,EAAAI,iBAvOA,MAAA/e,GACAoY,EAAApY,GA+NA,IACAye,EAEAE,MA1NA7pB,KAAAyqB,IAAA,SAAAxoB,EAAAinB,EAAAwB,EAAAC,GACA,OAAArmB,GAAA,SAAA+e,EAAAC,GACA,GAAArhB,EAAA,CAIA,IAAA2oB,EAAA7qB,EAAAymB,KAAA6B,YAAApmB,GACA,iBAAAyoB,IACAA,EAAA3qB,EAAAiJ,KAAAuf,cAAAmC,IAGA,IACA,IAAAG,EAAA9qB,EAAAymB,KAAAsE,WAAAF,EAAA1B,EAAAwB,EAAAC,GAEAtH,EADAtjB,EAAAiJ,KAAA0f,cAAAmC,IAGA,MAAA3f,GACAoY,EAAApY,SAdAmY,EAAAphB,OAsBAjC,KAAA+qB,SAAA,SAAAC,EAAA9B,EAAA+B,EAAAC,GACA,OAAA5mB,GAAA,SAAA+e,EAAAC,GACA,GAAA0H,EAAA,CAKA,IAAAH,EAAA9qB,EAAAiJ,KAAAyf,cAAAuC,GACA,iBAAAC,IACAA,EAAAlrB,EAAAiJ,KAAAuf,cAAA0C,IAGA,IACA,IAAAhpB,EAAAlC,EAAAymB,KAAA2E,gBAAAN,EAAA3B,EAAA+B,EAAAC,GACA7H,EAAAtjB,EAAAymB,KAAAuB,YAAA9lB,IAEA,MAAAiJ,GACAoY,EAAApY,SAdAmY,EAAA2H,OAuBAhrB,KAAA8I,cAAA,SAAAiC,EAAArC,EAAA0iB,GACA,OAAArrB,EAAAiJ,KAAAqgB,cACAtpB,EAAAiJ,KAAAqf,YAAA3f,GACA3I,EAAAiJ,KAAAqf,YAAAtd,GACAqgB,GAAAA,EAAApG,GAAAjlB,EAAA6F,UAAAc,cAAA0e,QAAAJ,EACAoG,GAAAA,EAAAnG,GAAAllB,EAAA6F,UAAAc,cAAA0e,QAAAH,EACAmG,GAAAA,EAAAlG,GAAAnlB,EAAA6F,UAAAc,cAAA0e,QAAAF,EACAnlB,EAAA6F,UAAAkf,aACA7d,MAAA,SAAAif,GACA,IAAAmF,EAAAtrB,EAAAymB,KAAA8E,yBAAApF,GACAqF,EAAAxrB,EAAAymB,KAAAgF,wBAAAtF,GACA,MAAA,CACAhd,OAAAmiB,EAAAniB,OACAgD,OAAAmf,EAAAnf,OACAwd,MAAA6B,EAAA7B,MACAD,MAAA8B,EAAA9B,WAQAzpB,KAAAyrB,YAAA,SAAAvF,GACA,OAAA5hB,GAAA,SAAA+e,EAAAC,GACA,IAAA+H,EAAAtrB,EAAAymB,KAAA8E,yBAAApF,GACAqF,EAAAxrB,EAAAymB,KAAAgF,wBAAAtF,GACA7C,EAAA,CACAna,OAAAmiB,EAAAniB,OACAgD,OAAAmf,EAAAnf,OACAwd,MAAA6B,EAAA7B,MACAD,MAAA8B,EAAA9B,YAQAzpB,KAAAiL,aAAA,SAAAF,EAAArC,EAAA0iB,GACA,OAAA9mB,GAAA,SAAA+e,EAAAC,GACA,IACA,IAAA4C,EAAAnmB,EAAA6I,OAAAygB,cACAtpB,EAAAiJ,KAAAqf,YAAA3f,GACA3I,EAAAiJ,KAAAqf,YAAAtd,GACAqgB,GAAAA,EAAApG,GAAAjlB,EAAA6F,UAAAc,cAAA0e,QAAAJ,EACAoG,GAAAA,EAAAnG,GAAAllB,EAAA6F,UAAAc,cAAA0e,QAAAH,EACAmG,GAAAA,EAAAlG,GAAAnlB,EAAA6F,UAAAc,cAAA0e,QAAAF,EACAnlB,EAAA6F,UAAAkf,aAEAzB,EADAtjB,EAAAymB,KAAA8E,yBAAApF,GACAhd,QAEA,MAAAgC,GACAoY,EAAApY,QAQAlL,KAAA0rB,OAAA,SAAAzpB,EAAA0pB,EAAArpB,GACA,OAAAgC,GAAA,SAAA+e,EAAAC,GACA,IAIA3B,EAJAiH,EAAA7oB,EAAAiJ,KAAA+e,YAAA9lB,GACAya,EAAA3c,EAAAiJ,KAAAyf,cAAAkD,GACAC,EAAA7rB,EAAAiJ,KAAAuf,cAAAjmB,GACAupB,EAAA,IAAAzH,WAAArkB,EAAA6F,UAAA+e,kBAAAiE,EAAApoB,QAEA,IAAAmhB,EAAA,EAAAA,EAAA5hB,EAAA6F,UAAA+e,kBAAAhD,IAAAkK,EAAAlK,GAAAjF,EAAAiF,GACA,IAAAA,EAAA,EAAAA,EAAAiH,EAAApoB,OAAAmhB,IAAAkK,EAAAlK,EAAA5hB,EAAA6F,UAAA+e,mBAAAiE,EAAAjH,GAIA0B,EADA,OAAAtjB,EAAAymB,KAAAsF,iBAAAD,EAAAD,QAQA5rB,KAAA+rB,KAAA,SAAA9pB,EAAA8G,GACA,OAAAzE,GAAA,SAAA+e,EAAAC,GAKA,IAJA,IAAA0I,EAAAjsB,EAAAiJ,KAAA+e,YAAA9lB,GACAgqB,EAAAljB,EAAAmD,OACAggB,EAAAnsB,EAAAymB,KAAA2F,YAAAH,EAAAC,GACAvP,EAAA,IAAA0H,WAAArkB,EAAA6F,UAAA+e,mBACAhD,EAAA,EAAAA,EAAAjF,EAAAlc,OAAAmhB,IAAAjF,EAAAiF,GAAAuK,EAAAvK,GAEA0B,EADAtjB,EAAA0mB,OAAAra,OAAAsQ,QAKA1c,KAAAosB,KAAA,WACA,IAAAC,EAAA/nB,EAAAgoB,QACAC,EAAA,GACAC,EAAA,GACA,KAAAtlB,MAAAC,SAAAC,MAAAC,gBACAqD,QAAAkY,KAAA,4EAAAjd,OAAAuB,MAAAC,SAAAC,QACAmlB,EAAAE,uBAAA,UAEA,IAAAC,EAAA,EACAC,EAAA,WAEA,KADAD,IAEA3sB,EAAA8jB,QAAA,EACAwI,EAAAhJ,YAoBA,OAjBArjB,KAAA0lB,oBAAA,SAAAkH,GACA7sB,EAAAymB,KAAAoG,EACAD,MACAJ,GACAvsB,KAAAwlB,mBAAA,SAAAoH,GACA7sB,EAAA6I,OAAAgkB,EACA7sB,EAAA6I,OAAA6jB,uBAAAD,EAAAC,uBACAE,MACAH,GACAxsB,KAAAqlB,mBAAA,SAAAuH,GACA7sB,EAAAoM,OAAAygB,EACAD,OAEA5sB,EAAA8lB,mBAAA,SAAA+G,GACA7sB,EAAA0mB,OAAAmG,EACAD,OAEAN,EAAA7jB,SAIAxI,KAAAgJ,KAAAlH,KAAA/B,EAAAiJ,KAAA2f,YACA3oB,KAAAyqB,IAAA,CACA1hB,QAAA,CACA8jB,gBAAA9sB,EAAAwpB,sBACAuD,aAAA/sB,EAAAyqB,iBACAuC,aAAAhtB,EAAAmqB,kBAEA8C,KAAAjtB,EAAA0qB,IACAwC,KAAAltB,EAAAgrB,UA8FAjD,EAAArS,UAAAwU,aAAA,SAAAiD,GACA,IAAAzI,EAZA,SAAA0C,EAAA3mB,GACA,IAAAikB,EAAA,IAAAL,WAAA5jB,GAEA,OADAikB,EAAA8C,IAAAxnB,EAAAymB,KAAAa,SAAAC,OAAA6F,SAAAhG,EAAAA,EAAA3mB,IACAikB,EASAwF,CAAAjqB,KAAAmnB,SAAA+F,GAAA,GAAAltB,KAAAQ,QAAA0sB,GAAA,IAGA,OAFAvF,EAAA3nB,KAAAmnB,SACAnnB,KAAAmnB,QAAA,KACA1C,GAtaA0B,GAAAA,EAAA8C,kBACArF,EAAAnO,UAAA0Q,OAAAA,EACAvC,EAAAnO,UAAAzM,KAAA,GACA4a,EAAAnO,UAAAzM,KAAAggB,aAAA,WACA,IAAAE,EAAA,IAAA9E,WAAAQ,6BAEA,OADA5kB,KAAAmmB,OAAA8C,gBAAAC,GACA5kB,EAAAsH,KAAAsd,KAwaA3C,EAAA9Q,UAAA,IAAAmO,EAkVA,IAAAA,EAOA,IAAAwJ,EAAA,IAAAxJ,EAwCA,OA7BAjf,IAAAsC,MAAA,WACAyD,QAAAqB,MAAA,wBACA,IAEAshB,EAFAjU,EAAAC,KAAAD,MAUA1O,QAAAqB,MAAA,gDACAshB,EAAA,IAAA9G,GAIA6F,OACA/iB,OAAA,SAAA6B,GAEA,MADAR,QAAAxG,MAAAgH,GACAA,KAEAjE,MAAA,WACAmmB,EAAAxgB,KAAAygB,GACA3iB,QAAAqB,MAAA,gDAAApG,OAAAynB,EAAAxrB,GAAAyX,KAAAD,MAAAA,UAKAgU,KAQAzY,QAAA,WAAA,CAAA,KAAA,aAAA,WAAA,cAAA,UAAA,SAAA,SAAArQ,EAAAsQ,EAAAlR,EAAAe,EAAAG,EAAAE,GAGA,SAAAwoB,EAAAC,GACA,OAAA,IAAAC,OAAAD,GAGA,SAAAE,EAAAnF,EAAAF,GAGA,IAFA,IAAA5nB,EAAAohB,KAAAO,IAAAmG,EAAA9nB,OAAA4nB,EAAA5nB,QACAktB,EAAA,IAAAtJ,WAAA5jB,GACAmhB,EAAA,EAAAA,EAAAnhB,IAAAmhB,EACA+L,EAAA/L,GAAA2G,EAAA3G,GAAAyG,EAAAzG,GAEA,OAAA+L,EAGA,SAAAC,EAAAC,EAAAC,GACA,IAAAC,EAAA,IAAA1J,WAAAwJ,EAAAG,WAAAF,EAAAE,YAGA,OAFAD,EAAAvG,IAAA,IAAAnD,WAAAwJ,GAAA,GACAE,EAAAvG,IAAA,IAAAnD,WAAAyJ,GAAAD,EAAAG,YACAD,EAGA,IAAAloB,EAAA,CACAooB,IAAA,CACAC,YAAA,IAEAC,KAAA,CACAC,YAAA,EACAC,oBAAA,GACAH,YAAA,GACAvnB,cAAA,CACAse,EAAA,MACAC,EAAA,EACAC,EAAA,IAGAmJ,OAAA,CACAxoB,OAAA,sEACAyoB,OAAA,sEACAC,KAAA,CACAC,UAAA,0BACAC,QAAA,sBACAC,IAAA,kFACAC,IAAA,sFACAC,KAAA,oFAIAlsB,EAAA,CACA6rB,KAAA,CACAC,UAAAlB,EAAA1nB,EAAAyoB,OAAAE,KAAAC,WACAC,QAAAnB,EAAA1nB,EAAAyoB,OAAAE,KAAAE,SACAC,IAAApB,EAAA1nB,EAAAyoB,OAAAE,KAAAG,KACAC,IAAArB,EAAA1nB,EAAAyoB,OAAAE,KAAAI,KACAC,KAAAtB,EAAA1nB,EAAAyoB,OAAAE,KAAAK,QAGAzhB,EAAA,CACAC,aAAA,KACAyhB,aAAA,MA2BA,SAAAC,EAAArhB,EAAAZ,GAEA,IAAAY,EAAA,OAAAnJ,EAAAgf,OAAA,iCAMA,IAAA7gB,GAJAoK,EAAAA,GAAA,IACAnD,aAAA7F,QAAAuC,UAAAyG,EAAAnD,aAAAmD,EAAAnD,WACAmD,EAAAkiB,YAAAliB,EAAAkiB,aAAA,SAIA,IAAAC,EAAAtsB,EAAA6rB,KAAAC,UAAA5rB,KAAA6K,GAGAiO,EAAAsT,GAAAA,EAAA,GACA,IAAAtT,GAAA7O,EAAAkiB,YACA,OAAAD,EAAA,iBAAAnpB,OAAAkH,EAAAkiB,YAAAthB,GAAAZ,GAIA,GAAA,UAAA6O,EAAA,CAIA,KADAjZ,EAAAC,EAAA6rB,KAAAG,IAAA9rB,KAAA6K,IACA,OAAAnJ,EAAAgf,OAAA,4DACA,IAAA+H,EAAA,CACAniB,OAAAzE,EAAA0H,OAAAqc,OAAA/lB,EAAA,KAEA,OAAAoK,EAAAnD,YAGAjH,EAAAC,EAAA6rB,KAAAI,IAAA/rB,KAAA6K,KAEA4d,EAAAnf,OAAAzH,EAAA0H,OAAAqc,OAAA/lB,EAAA,IACA6B,EAAA+e,QAAAgI,IAFA/mB,EAAAgf,OAAA,4DAJAhf,EAAA+e,QAAAgI,GAUA,MAAA,OAAA3P,GAAA,QAAAA,GACAjZ,EAAAC,EAAA6rB,KAAAK,KAAAhsB,KAAA6K,IAKAwhB,EAAAxsB,EAAA,GAAA,CACAiZ,KAAAA,EACAhT,SAAAmE,EAAAnE,WAEAzB,MAAA,SAAAokB,GACA,OAAAA,IAAAxe,EAAAnD,WAAA,CAAAR,OAAAmiB,EAAAniB,QAAAmiB,KARA/mB,EAAAgf,OAAA,yEAaAzW,EAAAkiB,YACAzqB,EAAAgf,OAAA,uCAGAhf,EAAAgf,OAAA,kCAAA5H,EAAA,KAWA,SAAAuT,EAAAC,EAAAriB,GACAA,EAAAA,GAAA,GAEA,IAAAsiB,EAAAD,GAAAzqB,EAAA0H,OAAAqc,OAAA0G,GACA,OAAAC,GAAAA,EAAA3uB,QAAAoF,EAAAsoB,KAAAD,aAAAkB,EAAA3uB,QAAAoF,EAAAooB,IAAAC,YACA3pB,EAAAgf,OAAA,sDAIAzW,EAAA6O,KAAA7O,EAAA6O,MAAA,GAAAyT,EAAA,IAAA,OAAA,GAAAA,EAAA,IAAA,OAGA,OAAAtiB,EAAA6O,KAqCA,SAAA0T,GACA,IAAAC,EAAA5qB,EAAAuE,KAAAuf,cAAA6G,GAGA,GAAA,GAAAC,EAAA,GACA,OAAA/qB,EAAAgf,OAAA,CAAArhB,QAAA,yDAIA,GAAAotB,EAAA7uB,QAAAoF,EAAAooB,IAAAC,YACA,OAAA3pB,EAAAgf,OAAA,CAAArhB,QAAA,yCAAA2D,EAAAooB,IAAAC,YAAA,sCAGA,IAAAqB,EAAAD,EAAAE,MAAA,GAAA,GACArJ,EAAAmJ,EAAAE,MAAA,GAAA,GACAxlB,EAAAslB,EAAAE,OAAA,GAGAC,EAAA/qB,EAAAuE,KAAA8f,mBAAArkB,EAAAuE,KAAA8f,mBAAAwG,IAAAC,MAAA,EAAA,GAMA,OALA9qB,EAAAuE,KAAAC,cAAAc,IAAAtF,EAAAuE,KAAAC,cAAAumB,IACAlrB,EAAAgf,OAAA,CAAArhB,QAAA,qCAIAwC,EAAAgnB,YAAAvF,GA5DAuJ,CAAAP,GAIA,QAAAriB,EAAA6O,KAGA,mBAAA7O,EAAAnE,WAEAmE,EAAAnE,SAAAmE,EAAAnE,WACAmE,EAAAnE,UAMA,iBAAAmE,EAAAnE,UAAAmE,EAAAnE,SAAAzB,KACA4F,EAAAnE,SAAAzB,MAAA,SAAAyB,GACA,IAAAA,EAAA,KAAA,YACA,OAAAgnB,EAAAR,EAAAxmB,MAKA,iBAAAmE,EAAAnE,SACAgnB,EAAAR,EAAAriB,EAAAnE,UAGApE,EAAAgf,OAAA,CAAArhB,QAAA,uFAjBAqC,EAAAgf,OAAA,CAAArhB,QAAA,yFAqBAqC,EAAAgf,OAAA,CAAArhB,QAAA,gEA+BA,SAAAytB,EAAAC,EAAAjnB,GACA,IAAAknB,EAAAnrB,EAAAuE,KAAAuf,cAAAoH,GAGA,GAAA,GAAAC,EAAA,GACA,OAAAtrB,EAAAgf,OAAA,CAAArhB,QAAA,0DAIA,GAAA2tB,EAAApvB,QAAAoF,EAAAsoB,KAAAD,YACA,OAAA3pB,EAAAgf,OAAA,CAAArhB,QAAA,kEAAA0D,OAAAC,EAAAsoB,KAAAD,eAGA,IAAA4B,EAAAD,EAAAL,MAAA,GAAA,GACAxlB,EAAA6lB,EAAAL,OAAA,GACAxkB,EAAA6kB,EAAAL,MAAA,EAAA,GACAO,EAAAF,EAAAL,MAAA,EAAA,IACAQ,EAAAH,EAAAL,MAAA,GAAA,IAGA,OAAA9qB,EAAAuE,KAAAqgB,cACA5kB,EAAAuE,KAAAqf,YAAA3f,GACAqC,EACAnF,EAAAsoB,KAAAxnB,cAAAse,EACApf,EAAAsoB,KAAAxnB,cAAAue,EACArf,EAAAsoB,KAAAxnB,cAAAwe,EACA,IAGAje,MAAA,SAAA+oB,GAEA,IAAAC,EAAAD,EAAAT,MAAA,EAAA,IACAW,EAAAF,EAAAT,MAAA,GAAA,IAGAY,EAAA,IAAAC,MAAAC,gBAAAC,IAAAJ,GACAK,EAAAJ,EAAAK,QAAAV,GACAW,EAAAN,EAAAK,QAAAT,GAUA,OARAQ,EAAA,IAAAnM,WAAAmM,GACAE,EAAA,IAAArM,WAAAqM,GAKA9C,EAFAF,EAAA8C,EAAAN,EAAAV,MAAA,EAAA,KACA9B,EAAAgD,EAAAR,EAAAV,MAAA,GAAA,SAOAtoB,KAAAxC,EAAAgnB,aAGAxkB,MAAA,SAAA8B,GAGA,IAAA2nB,EAAAjsB,EAAAuE,KAAA8f,mBAAArkB,EAAAuE,KAAA8f,mBAAA/f,EAAAG,SAAAqmB,MAAA,EAAA,GACA,GAAA9qB,EAAAuE,KAAAC,cAAA8B,KAAAtG,EAAAuE,KAAAC,cAAAynB,GACA,KAAA,CAAAxjB,MAAAC,EAAAC,aAAAnL,QAAA,+CAIA,IAAAutB,EAAA/qB,EAAAuE,KAAA8f,mBAAArkB,EAAAuE,KAAA8f,mBAAA+G,IAAAN,MAAA,EAAA,GACA,GAAA9qB,EAAAuE,KAAAC,cAAAc,IAAAtF,EAAAuE,KAAAC,cAAAumB,GACA,KAAA,CAAAtiB,MAAAC,EAAA0hB,aAAA5sB,QAAA,+CAGA,OAAA8G,KA8IA,SAAA4nB,EAAA5nB,GACA,IAAAA,EACA,MAAA,IAAA1G,MAAA,mBAEA,OAAA0G,EAAA2gB,OAAA3gB,EAAA0gB,MACAnlB,EAAAsH,KAAA7C,GAGAzE,EAAAgQ,IAAA,CACA7P,EAAAgmB,IAAA1hB,QAAA+jB,aAAA/jB,EAAAmD,QACAzH,EAAAgmB,IAAA1hB,QAAAgkB,aAAAhkB,EAAAG,UAEAjC,MAAA,SAAAL,GACA,MAAA,CACA6iB,MAAA7iB,EAAA,GACA8iB,MAAA9iB,EAAA,OA+JA,MAAA,CACAuG,WAAAA,EACAvH,UAAAA,EAEAoD,KAAAnF,QAAAC,OAAA,CACA+F,WA1LA,SAAAvH,GACA,IAAAsuB,EAAAnsB,EAAAuE,KAAAuf,cAAAjmB,GACA,OAAAmC,EAAAuE,KAAAC,cAAAxE,EAAAuE,KAAA8f,mBAAArkB,EAAAuE,KAAA8f,mBAAA8H,KAAA3tB,UAAA,EAAA,KAyLAwB,EAAAuE,MACAgD,QAAA,CACAiB,KA9iBA,SAAA1D,EAAAsD,GAEA,OAAAtD,GAAAA,EAAAkE,QACAqhB,EAAAvlB,EAAAkE,QAAAZ,GAGAvI,GAAA,SAAA+e,EAAAC,GACA,IAAA/Z,EACA,OAAA+Z,EAAA,8BAIA,IAAAuN,EAAA,IAAAvM,WACAuM,EAAAtM,OAAA,SAAAtW,GACA6gB,EAAA7gB,EAAAuW,OAAAC,OAAA5X,GACA5F,KAAAoc,GACAha,MAAAia,IAEAuN,EAAAnM,WAAAnb,EAAA,YA6hBA0C,UApDA,SAAA6kB,EAAArpB,EAAAoF,GA2BA,OA1BAA,EAAAA,GAAA,IACAnD,YAAA7F,QAAAuC,UAAAyG,EAAAnD,aAAAmD,EAAAnD,WACAmD,EAAArC,SAAA3G,QAAAuC,UAAAyG,EAAAnD,aAAAmD,EAAArC,OACAqC,EAAAnE,SAAA,WACA,OAAA9D,EAAAZ,QAAA+D,KAAA,KACAd,MAAA,WACA,OAAAnC,EAAAgI,aAAA,CACA5G,MAAA,gDACA6G,SAAA,+CACA7I,MAAA2I,EAAA3I,MACA8I,MAAAH,EAAAG,WAGA/F,MAAA,SAAAyB,GAEA,OAAAhF,GAAA,WAEA,OADAgF,GAAA9D,EAAAZ,QAAA6E,OACAH,IACA,SAIAmE,EAAArC,QACA5F,EAAAZ,QAAA6E,OAGAomB,EAAAxnB,EAAAoF,GACA5F,MAAA,SAAAL,GACA,OAAAA,KAEAyC,OAAA,SAAA6B,GACA,IAAAA,GAAA,cAAAA,EAAA,CACA,GAAAA,GAAAA,EAAAgC,OAAAC,EAAAC,aAEA,OAAA0jB,EAAArpB,EAAA,CAAAiC,WAAAmD,EAAAnD,WAAAxF,MAAA,gDAGA,MADAwG,QAAAxG,MAAA,oDAAAgH,GAAAA,EAAAjJ,SAAAiJ,IACAA,OAeA6lB,gBAlQA,SAAAC,EAAAjoB,EAAA8D,GAIA,QAHAA,EAAAA,GAAA,IACA6O,KAAA7O,EAAA6O,MAAA,SAEA7O,EAAA6O,MAGA,IAAA,SACA,OAAApX,EAAA+e,QACA,kCAEA5e,EAAA0H,OAAAC,OAAArD,EAAAG,QAFA,UAGAzE,EAAA0H,OAAAC,OAAArD,EAAAmD,QAAA,MAGA,IAAA,MACA,OA/EA,SAAAnD,GAEA,IAAAmd,EAAAzhB,EAAAwhB,iBAAAld,EAAAmD,QACA,IAAAga,GAAAA,EAAA6H,aAAAtpB,EAAAmB,UAAAkf,YACA,KAAA,qCAAAnf,OAAAlB,EAAAmB,UAAAkf,aAEA,IAAAmM,EAAA,IAAA7M,WAAA,GACA6M,EAAA,GAAA,EACA,IAAAC,EAAAvD,EAAAsD,EAAA/K,GAKAmJ,EAAA1B,EAAAuD,EAFAzsB,EAAAuE,KAAA8f,mBAAArkB,EAAAuE,KAAA8f,mBAAAoI,IAAA3B,MAAA,EAAA,IAGA,OAAAjrB,EAAAsH,KAAAnH,EAAAuE,KAAAC,cAAAomB,IAiEA8B,CAAApoB,GACA9B,MAAA,SAAAQ,GACA,MAAA,gCAEAA,EAAA,QAIA,IAAA,OAEA,OAAAoF,EAAAnE,SAGAmE,EAAAnE,UAAA,mBAAAmE,EAAAnE,WACAgC,QAAAqB,MAAA,6EACAc,EAAAnE,SAAAmE,EAAAnE,YACAmE,EAAAnE,UACApE,EAAAgf,OAAA,CAAArhB,QAAA,yFAKA4K,EAAAnE,UAAA,iBAAAmE,EAAAnE,UAAAmE,EAAAnE,SAAAzB,KACA4F,EAAAnE,SAAAzB,MAAA,SAAAyB,GACA,IAAAA,EAAA,KAAA,YAEA,OAAAsoB,EAAAjoB,EAAAlF,QAAA+S,MAAA,GAAA/J,EAAA,CAAAnE,SAAAA,QAKAmE,EAAAnE,UAAA,iBAAAmE,EAAAnE,SA7FA,SAAAK,EAAAL,GAEA,IAAAwd,EAAAzhB,EAAAwhB,iBAAAld,EAAAmD,QACA,IAAAga,GAAAA,EAAA6H,aAAAtpB,EAAAmB,UAAAkf,YACA,OAAAxgB,EAAAgf,OAAA,CAAArhB,QAAA,qCAAA0D,OAAAlB,EAAAmB,UAAAkf,eAGA,IAAA/Z,EAAAtG,EAAAuE,KAAA8f,mBAAArkB,EAAAuE,KAAA8f,mBAAA/f,EAAAG,SAAAqmB,MAAA,EAAA,GAGA,OAAA9qB,EAAAuE,KAAAqgB,cACA5kB,EAAAuE,KAAAqf,YAAA3f,GACAqC,EACAnF,EAAAsoB,KAAAxnB,cAAAse,EACApf,EAAAsoB,KAAAxnB,cAAAue,EACArf,EAAAsoB,KAAAxnB,cAAAwe,EACA,IACAje,MAAA,SAAA+oB,GACA,IAAAC,EAAAD,EAAAT,MAAA,EAAA,IACAW,EAAAF,EAAAT,MAAA,GAAA,IAGA6B,EAAA3D,EAAAvH,EAAAqJ,MAAA,EAAA,IAAAU,EAAAV,MAAA,EAAA,KACA8B,EAAA5D,EAAAvH,EAAAqJ,MAAA,GAAA,IAAAU,EAAAV,MAAA,GAAA,KAEAY,EAAA,IAAAC,MAAAC,gBAAAC,IAAAJ,GACAJ,EAAAK,EAAAmB,QAAAF,GACArB,EAAAI,EAAAmB,QAAAD,GAEAvB,EAAA,IAAA1L,WAAA0L,GACAC,EAAA,IAAA3L,WAAA2L,GAGA,IAAAH,EAAA,IAAAxL,WAAA,GASA,OARAwL,EAAA,GAAA,EACAA,EAAAjC,EAAAiC,EAAA7kB,GACA6kB,EAAAjC,EAAAiC,EAAAE,GACAF,EAAAjC,EAAAiC,EAAAG,GAGAH,EAAAjC,EAAAiC,EADAnrB,EAAAuE,KAAA8f,mBAAArkB,EAAAuE,KAAA8f,mBAAA8G,IAAAL,MAAA,EAAA,IAGA9qB,EAAAuE,KAAAC,cAAA2mB,MAoDA2B,CAAAxoB,EAAA8D,EAAAnE,UACAzB,MAAA,SAAAQ,GACA,MAAA,iCAEAA,EAAA,QAIAnD,EAAAgf,OAAA,CAAArhB,QAAA,uFA9BAqC,EAAAgf,OAAA,CAAArhB,QAAA,mCAgCA,QACA,OAAAqC,EAAAgf,OAAA,CAAArhB,QAAA,2BAAA4K,EAAA6O,UAyMA+O,IAAA,CACA+G,WAAAb,EACA3D,KAxKA,SAAAyE,EAAA1oB,EAAA2oB,EAAAC,EAAAzI,GAGA,IAAAuI,EADAC,EAAAA,GAAA,aAEA,OAAAptB,EAAAgf,OAAA,CAAArhB,QAAA,2CAIA,iBADA0vB,EAAAA,GAAA,aAEAA,EAAA,CAAAA,IAIAF,EAAA5tB,QAAA+I,KAAA6kB,GAGA,IAAA/G,EAAAjmB,EAAAuE,KAAAuf,cAAAkJ,EAAAC,IAEA,OAAAptB,EAAAgQ,IAAA,CACAqc,EAAA5nB,GACAtE,EAAAgmB,IAAA1hB,QAAAgkB,aAAArC,GACAxB,EAAA5kB,EAAAsH,KAAAsd,GAAAzkB,EAAAuE,KAAAggB,iBAEA/hB,MAAA,SAAAL,GAEA,IACA+jB,EADA/jB,EAAA,GACA6iB,MACAmI,EAAAhrB,EAAA,GACAsiB,EAAAtiB,EAAA,GAEA,OAAAtC,EAAAgQ,IACAqd,EAAAhrB,QAAA,SAAAC,EAAAirB,GACA,OAAAJ,EAAAI,GACAjrB,EAAAC,OACApC,EAAAgmB,IAAAuC,KAAAyE,EAAAI,GAAA3I,EAAA0I,EAAAjH,IAFA/jB,IAIA,KAEAK,MAAA,SAAA6qB,GAEA,IAAAnQ,EAAA,EAeA,OAdAlhB,EAAAN,QAAAwxB,GAAA,SAAAI,GACAN,EAAAM,GAMAN,EAAAM,GAAAD,EAAAnQ,KAHA8P,EAAAM,GAAA,QAQAN,EAAAvI,MAAAzkB,EAAAuE,KAAAC,cAAAigB,GAEAuI,SAkHAxE,KA7GA,SAAA+E,EAAAjpB,EAAAkpB,EAAAN,GAEAM,EAAAA,GAAA,SAEA,iBADAN,EAAAA,GAAA,aAEAA,EAAA,CAAAA,IAGA,IAAAvY,EAAAC,KAAAD,MACA8Y,EAAA,GAEAvU,EAAA,CAAAgT,EAAA5nB,IACA,OAAAzE,EAAAgQ,IAAA0d,EAAArrB,QAAA,SAAAgX,EAAA1b,GACA,IAAAkwB,EAAAlwB,EAAAgwB,GACA,IAAAE,EAAA,KAAA,iBAAAF,EACA,OAAAC,EAAAC,GAAAvrB,IACA+W,EAAA9W,OACApC,EAAAgmB,IAAA1hB,QAAAgkB,aAAAtoB,EAAAuE,KAAAuf,cAAA4J,IACAlrB,MAAA,SAAAmrB,GACAF,EAAAC,GAAAC,QAEAzU,IACA1W,MAAA,SAAAL,GACA,IAAA2kB,EAAA3kB,EAAA,GACA,OAAAtC,EAAAgQ,IAAA0d,EAAArrB,QAAA,SAAAgX,EAAA8T,GACA,IAAAW,EAAAF,EAAAT,EAAAQ,IACA/I,EAAAzkB,EAAAuE,KAAAuf,cAAAkJ,EAAAvI,OAGA,OAFAuI,EAAAjoB,OAAA,EAEAmU,EAAA9W,OACA8qB,EAAAhrB,QAAA,SAAAC,EAAAmrB,GACA,OAAAN,EAAAM,GACAnrB,EAAAC,OAAApC,EAAAgmB,IAAAwC,KAAAwE,EAAAM,GAAA7I,EAAAkJ,EAAA7G,EAAA9B,OACAxiB,MAAA,SAAAorB,GACAZ,EAAAM,GAAAM,KAEAhpB,OAAA,SAAA6B,GACAR,QAAAxG,MAAAgH,GACAR,QAAAC,KAAA,kDAAAonB,GACAN,EAAAjoB,OAAA,MARA5C,IAUA,OACA,QAEAK,MAAA,WAEA,OADAyD,QAAAqB,MAAA,0CAAAsN,KAAAD,MAAAA,GAAA,MACA4Y,WCn9CAnuB,QAAA6Q,OAAA,wBAAA,CAAA,8BAIAC,QAAA,aAAA,CAAA,iBAAA,SAAA2d,GAGA,IAAAC,EAEA,OAAA,WAIA,OAHAA,IACAA,EAAAD,EAAA/Y,SAEAgZ,MAIA5d,QAAA,UAAA,CAAA,gBAAA,cAAA,eAAA,gBAAA,aAAA,KAAA,mBAAA,sBAAA,UAAA,WAAA,aAAA,gBAAA,SAAA,aAAA,cAAA,SAAA6d,EAAAC,EAAAC,EAAAC,EAAA5d,EAAAzQ,EACAsuB,EAAAC,EAAAruB,EAAAd,EAAAovB,EACAvuB,EAAAsK,EAAA+F,EAAAme,GAIA,IAWAC,EAVAC,EAAA,KAOAxrB,EAAA,CACAyrB,YAAAH,EAAAI,KAAA,SAAAve,IAGAwe,EAAA,GAGA,SAAAC,EAAAnoB,EAAAooB,GACA,OAAApoB,EAIA5G,GAAA,SAAA+e,GACAtO,EAAA,CAAA7J,EAAA,oBAAA,sBAAA,iBAAArE,OAAAysB,EAAA,CAAAA,GAAA,KACArsB,MAAA,SAAAssB,GACA,IAAAtxB,EAAAiJ,EAAAjJ,SAAAsxB,EAAAroB,GACA,OAAAunB,EAAA5pB,KAAA,CACA2qB,SAAA,OAAAvxB,GAAAsxB,EAAA,wBAAA,OACArtB,MAAAqtB,EAAA,qBACAxmB,SAAAumB,GAAAC,EAAAD,SAAAlqB,EACAqqB,QAAA,CACA,CACApB,KAAA,MAAAkB,EAAA,iBAAA,OACA7X,KAAA,mBACAgY,MAAA,SAAA3kB,GACAsU,EAAAtU,cAhBAzK,EAAAsH,OAyBA,SAAA+nB,EAAA1xB,EAAAqxB,EAAAzmB,GACA,OAAA5K,IACA4K,EAAAA,GAAA,IACA+mB,SAAA/mB,EAAA+mB,UAAA,OACA/mB,EAAA5G,OAAA4G,EAAA5G,QAAA,gBAEA3B,GAAA,SAAA+e,GACAtO,EAAA,CAAA9S,EAAA,mBAAA4K,EAAA5G,QAAAY,OAAAysB,EAAA,CAAAA,GAAA,KACArsB,MAAA,SAAAssB,GACAd,EAAA5pB,KAAA,CACA2qB,SAAA,MAAAD,EAAAtxB,GAAA,OACAiE,MAAAqtB,EAAA,oBACAxmB,SAAAumB,GAAAC,EAAAD,SAAAlqB,EACAwqB,SAAA/mB,EAAA+mB,SACAH,QAAA,CACA,CACApB,KAAAkB,EAAA1mB,EAAA5G,QACAyV,KAAA,kBACAgY,MAAA,SAAA3kB,GACAsU,EAAAtU,eAlBAzK,EAAAgf,OAAA,8BA6DA,SAAAuQ,EAAAtjB,GACA,OAAAA,EACA7M,GAAA,WACA,OAAA8uB,EAAAzqB,SACAwI,GAGAiiB,EAAAzqB,OAIA,SAAA+rB,EAAAjnB,GACA,OAAAomB,IAOApmB,EAAAA,GAAA,IACA2mB,SAAA3mB,EAAA2mB,UAAAP,EAEAT,EAAA3pB,KAAAgE,IATAkI,EAAA,kBACA9N,MAAA,SAAA8sB,GAEA,OADAd,EAAAc,EACAD,EAAAjnB,MA8EA,SAAAmnB,IACA,OAAAvsB,EAAAyrB,YAAAe,OAiCA,SAAAC,EAAA7Q,EAAAC,EAAA6Q,GACA,OAAA,SAAAlmB,GACA,IAOAmmB,EAPAC,EAAApmB,EAAAuW,OAAA6P,MACAC,EAAArmB,EAAAuW,OAAA8P,OACAC,EAAAJ,EAtOA,IAFA,IAyOAK,EAAAL,EAxOA,IAFA,IA6OAM,EAAAthB,SAAAuhB,cAAA,UAIA,GAAAP,EAAA,CAGAE,EAAAC,GACAD,GAAAG,EAAAF,EACAA,EAAAE,IAKAF,GAAAC,EAAAF,EACAA,EAAAE,GAEAE,EAAAJ,MAAAE,EACAE,EAAAH,OAAAE,EACAJ,EAAAK,EAAAE,WAAA,MACA,IAAAC,EAAAhT,KAAAiT,OAAAN,EAAAF,GAAA,EAAA,IACAS,EAAAlT,KAAAiT,OAAAL,EAAAF,GAAA,EAAA,IACAF,EAAAW,UAAA9mB,EAAAuW,OACAoQ,EACAE,EACAP,GAAA,EAAAK,EACAJ,GAAA,EAAAM,QAQAT,EAAAC,EACAD,EAAAE,IACAD,GAAAC,EAAAF,EACAA,EAAAE,GAMAD,EAAAE,IACAH,GAAAG,EAAAF,EACAA,EAAAE,GAIAC,EAAAJ,MAAAA,EACAI,EAAAH,OAAAA,GACAF,EAAAK,EAAAE,WAAA,OAGAI,UAAA9mB,EAAAuW,OAAA,EAAA,EAAAiQ,EAAAJ,MAAAI,EAAAH,QAGA,IAAAU,EAAAP,EAAAQ,YAEAR,EAAA1R,SAEAM,EAAA2R,IAwFA,SAAAE,EAAAjnB,EAAApB,GAEA,IAAAwf,EAAA/nB,EAAAgoB,SAEAzf,EAAAA,GAAA,IACAuB,YAAAvB,EAAAuB,YAAAvB,EAAAuB,YAAA,qCACAvB,EAAAG,MAAAH,EAAAG,OAAA4H,EACA/H,EAAAG,MAAAmoB,SAAAtoB,EAAAG,MAAAmoB,UAAA,GACAtoB,EAAAuoB,WAAAvoB,EAAAuoB,aAAA,EACAvoB,EAAAwB,YAAAxK,QAAAuC,UAAAyG,EAAAwB,aAAAxB,EAAAwB,WACAxB,EAAA4D,sBAAA5M,QAAAuC,UAAAyG,EAAA4D,uBAAA5D,EAAA4D,qBACA5D,EAAAwoB,kBAAAxxB,QAAAuC,UAAAyG,EAAAwoB,kBAAAxoB,EAAAwoB,gBAEA,IAAAC,EAAA,SAAAnnB,IACAA,EAAAA,GAAAtB,EAAAG,MAAAmoB,SAAAtoB,EAAAuB,cACAmnB,YAAA,EACApnB,EAAAke,SAAAA,EACAle,EAAAtB,QAAAA,EAEAA,EAAAuD,UACAvM,QAAA+S,MAAAzI,EAAAnB,MAAAH,EAAAuD,UAEA1M,GAAA,WACAyK,EAAAtF,KAAAoF,GACAhH,MAAA,WACA,IAAAoM,EAEAxG,EAAAuoB,YACA/hB,EAAAF,SAAAC,iBAAAvG,EAAAuoB,YAAA,MAEA5wB,EAAAgxB,eAAAhxB,EAAAgxB,eAAAC,YACApiB,EAAAqiB,kBAAA,EAAAriB,EAAAhD,MAAA7P,QACA6S,EAAAsiB,SAGAtiB,EAAAsiB,SAMA9oB,EAAA+oB,YACAviB,EAAAF,SAAAC,iBAAAvG,EAAA+oB,WAAA,KACAviB,EAAAsiB,QAIAxnB,EAAAnB,MAAA6oB,QAAAC,MAAA,iBAGAjpB,EAAAyB,WAAAzB,EAAAyB,UAAAH,UAKA4nB,EAAA,SAAA5nB,IACAA,EAAAA,GAAAtB,EAAAG,MAAAmoB,SAAAtoB,EAAAuB,uBAEAvB,EAAAG,MAAAmoB,SAAAtoB,EAAAuB,aAEAD,EAAA4U,SAIA9b,MAAA,WACApD,QAAAwP,QAAA7O,EAAA2O,SAAAC,iBAAA,QAAA,IACA4iB,YAAA,qBAKA7nB,EAAAtB,EAAAG,MAAAmoB,SAAAtoB,EAAAuB,aAsDA,OArDAD,EAkDAmnB,EAAAnnB,GAhDA5J,EAAA0xB,gBAAAppB,EAAAuB,YAAA,CACApB,MAAAH,EAAAG,MACAyD,qBAAA5D,EAAA4D,uBAEAxJ,MAAA,SAAAkH,GACAA,EAAAonB,YAAA,EAEApnB,EAAAnB,MAAAkpB,aAAA,SAAAzR,GACA,IAAApW,EAAAF,EAAAtB,SAAAsB,EAAAtB,QAAAwB,WACAF,EAAAtB,gBAAAsB,EAAAtB,QAAAwB,WACAF,EAAApG,OACAd,MAAA,WACA,GAAAoH,EACA,OAAA0nB,EAAA5nB,MAGAlH,MAAA,WACAkH,EAAAke,UACAle,EAAAke,SAAAhJ,QAAAoB,UAEAtW,EAAAke,gBACAle,EAAAtB,YAKAsB,EAAAnB,MAAA5I,IAAA,kBAAA,WACA+J,EAAAtB,SAAAsB,EAAAtB,QAAAspB,aACAhoB,EAAAtB,QAAAspB,cAEAhoB,EAAAtB,SAAAsB,EAAAtB,QAAAwB,YACA0nB,EAAA5nB,MAKAtB,EAAAG,MAAA5I,IAAA,WAAA,WACA+J,EAAAke,UACAle,EAAAke,SAAAhJ,UAEA0S,OAGAlpB,EAAAG,MAAAmoB,SAAAtoB,EAAAuB,aAAAD,EACAmnB,EAAAnnB,MAOAke,EAAA7jB,QAyIA,SAAA4tB,EAAAC,EAAAC,GACA,IAAAC,EAAAvC,IAAA,IAAA,GACAwC,EAAA,oCAAA7wB,OAAA2wB,EAAAA,GACA,MAAA,CACAA,aAAAA,EACAztB,KAAA,SAAAgE,GAKA,OAJAA,EAAAA,GAAA,IACA5E,SAAA4E,EAAA5E,UAAAuuB,EACA3pB,EAAA7E,KAAAnE,QAAAuC,UAAAyG,EAAA7E,MAAA6E,EAAA7E,IACA6E,EAAA4pB,cAAA5pB,EAAA4pB,gBAAAzC,IAAA,KAAA,KACAtwB,GAAA,WAGAmJ,EAAA7E,KAAAgrB,EAAAhrB,MAGAquB,EAAAxpB,KACAA,EAAA0D,SAAAgmB,KAuDA,SAAAG,EAAArE,EAAAsE,EACAC,EAAA5zB,EAAA6zB,GAEAA,EAAAA,GAAA,UACAC,OAAAC,cAAAD,OAAAE,mBAAAH,GAEA,IAAAI,EAAAH,OAAAH,GAAA,EAAAC,GAAA,KAIA,OAHAK,EAAAC,QAAA7E,EAAArvB,GACAi0B,EAAAE,OAEAF,EAmCA,SAAAG,EAAAvqB,EAAA0D,GAWA,GATA,iBAAA1D,IACAA,EAAA,CACA5E,SAAA4E,SAKA,IAAAA,EAAA5E,UAAA,KAAA4E,EAAA5E,SAIA,OADAyC,QAAAxG,MAAA,8BACA,EAGAR,GAAA,WACA,IAAAuQ,EAAAd,SAAAC,iBAAAvG,EAAA5E,UACAgM,GAAAxT,EAAAN,QAAA8T,GAAA,SAAAZ,GACAA,EAAAgkB,UAAAC,OAAA,MAAA,QAEA/mB,GAAA,KAGA,SAAAgnB,EAAA1qB,EAAA0D,GAWA,GATA,iBAAA1D,IACAA,EAAA,CACA5E,SAAA4E,SAKA,IAAAA,EAAA5E,UAAA,KAAA4E,EAAA5E,SAIA,OADAyC,QAAAxG,MAAA,+BACA,EAGAR,GAAA,WACA,IAAAuQ,EAAAd,SAAAC,iBAAAvG,EAAA5E,UACAgM,GAAAxT,EAAAN,QAAA8T,GAAA,SAAAZ,GACAA,EAAAgkB,UAAAC,OAAA,MAAA,QAEA/mB,GAAA,KAqDA,OAhKA6iB,EAAAoE,OAAA,CACAhnB,QAAA,EACAinB,QAAArB,EAAAvD,EAAA6E,OAAA,kBACAC,OAAAvB,EAAAvD,EAAA8E,OAAA,kBACAC,YAAAxB,EAAAvD,EAAA+E,YAAA,yBACAC,iBAAAzB,EAAAvD,EAAAgF,iBAAA,+BACAC,UAAA1B,EAAAvD,EAAAiF,UAAA,uBACAC,SAAA3B,EAAAvD,EAAAkF,SAAA,aACAL,OAAAtB,EAAAvD,EAAA6E,OAAA,kBACAM,QAAA5B,EAAAvD,EAAAmF,QAAA,YACAC,OAAA7B,GAAA,SAAAvpB,GACAuqB,EAAAvqB,KACA,WACAuqB,SAAAA,EACAG,UAAAA,GAgGAvE,EAAA,CACA1mB,MAAA,CACApI,MAAAmvB,EACAzQ,KAAA+Q,EACAuE,QAluBA,SAAAj2B,EAAAiE,EAAA2G,GAQA,OAPA3G,EAAAA,GAAA,uBAEA2G,EAAAA,GAAA,IACA+mB,SAAA/mB,EAAA+mB,UAAA,UACA/mB,EAAA5G,OAAA4G,EAAA5G,QAAA,gBACA4G,EAAAsrB,WAAAtrB,EAAAsrB,YAAA,oBAEApjB,EAAA,CAAA9S,EAAAiE,EAAA2G,EAAAsrB,WAAAtrB,EAAA5G,SACAgB,MAAA,SAAAssB,GACA,OAAAd,EAAAyF,QAAA,CACA1E,SAAAD,EAAAtxB,GACA2xB,SAAA/mB,EAAA+mB,SACA1tB,MAAAqtB,EAAArtB,GACAiyB,WAAA5E,EAAA1mB,EAAAsrB,YACAC,WAAAvrB,EAAAurB,WACAnyB,OAAAstB,EAAA1mB,EAAA5G,QACAoyB,OAAAxrB,EAAAwrB,aAktBAC,eA/uBA,WACA,OAAA3E,EAAA,kCA+uBAxuB,KA5uBA,WACA,OAAA4P,EAAA,CAAA,kCAAA,2BACA9N,MAAA,SAAAssB,GAEA,OAAAI,EADAJ,EAAA,mCAAA,aAAAA,EAAA,+BACAnqB,EAAA,CAAAwqB,SAAA,eA0uBA5vB,QAAA,CACA6E,KAAAirB,EACA/rB,KAAA8rB,EACA0E,OA1rBA,SAAA1rB,GACA,OAAA2lB,EAAAgG,aAAAvxB,MAAA,SAAAwxB,GACA,GAAAA,GAAAA,EAAAC,QAEA,OAAA7rB,GAAAA,EAAA2mB,SACAze,EAAAlI,GAAAA,EAAA2mB,UACAvsB,MAAA,SAAAusB,GAEA,OADA3mB,EAAA2mB,SAAAA,EACAiF,UAJA,KAQAxxB,MAAA,SAAAwxB,GACA,GAAAA,GAAAA,EAAAC,QAAA,OAAA5E,EAAAjnB,QA+qBA8rB,MAAA,CACA9vB,KA5qBA,SAAA5G,EAAA22B,EAAAnmB,GACA,OAAAxQ,GACA22B,EAAAA,GAAA,QACAnmB,EAAAA,GAAA,SAEAsC,EAAA,CAAA9S,IACAgF,MAAA,SAAAssB,GAaA,MARA,iBAAAqF,IAEAA,EADA,SAAAA,EACA,IAGA,KAGApG,EAAA3pB,KAAA,CAAA2qB,SAAAD,EAAAtxB,GAAA42B,YAAA,EAAAD,SAAAA,QAlBAt0B,EAAAgf,OAAA,gCA6qBAha,QAtpBA,SAAAsf,EAAAtF,GACA,OAAA,SAAApY,GACA,IACAooB,EADAwF,EAAAlQ,EAUA,GARA1d,GAAAA,EAAAjJ,SACA62B,EAAA5tB,EAAAjJ,QACAqxB,EAAA1K,GAEAA,IACAkQ,EAAA5tB,IAGAoY,EAIA,MAAA,cAAAwV,EACAjF,EAAA,KAKAA,EAAA,IACAR,EAAAyF,EAAAxF,IAVAhQ,EAAAwV,KA0oBAxxB,OAAA,CACAC,QAAAysB,EACA+E,WAAAjG,GAEA9qB,IAAA4qB,EAAAoG,cACAxB,OAAApE,EAAAoE,OACAyB,WAtKA,SAAAzoB,GACA,GAAAwiB,EAAAwE,OAAAhnB,SAAAA,EAAA,CAIA,GAHA9F,QAAAqB,MAAA,mBAAAyE,EAAA,SAAA,YAEAwiB,EAAAwE,OAAAhnB,OAAAA,EACAA,EACAkiB,EAAAwG,MAAAC,WAAA,YACAt1B,QAAA+S,MAAAoc,EAAAwE,OAAApE,EAAAoE,YAEA,CACA9E,EAAAwG,MAAAC,WAAA,QACA,IAAAC,EAAA,CACAC,WAAAjwB,EACAP,KAAA,cAEAhF,QAAA+S,MAAAoc,EAAAwE,OAAA,CACAhnB,QAAA,EACAinB,QAAA2B,EACAxB,YAAAwB,EACAvB,iBAAAuB,EACAtB,UAAAsB,EACArB,SAAAqB,EACA1B,OAAA0B,EACApB,QAAAoB,EACAnB,OAAAmB,EACAhC,SAAAA,EACAG,UAAAA,IAEA3iB,EAAA4iB,OAAA4B,EAEAzG,EAAA2G,eAyIAxC,OAAA,CACAyC,IAhGA,SAAAlH,EAAAsE,EACAC,EAAA5zB,EAAA6zB,GAGA,OADAH,EAAArE,EAAAsE,EAAAC,EAAA5zB,EAAA6zB,GACA2C,gBA6FAC,IAjFA,SAAApH,EAAAsE,EACAC,EAAA5zB,EAAA6zB,GAGA,OADAH,EAAArE,EAAAsE,EAAAC,EAAA5zB,EAAA6zB,GACA6C,iBA+EAC,IAAA,CACA9wB,KAlOA,SAAAjH,EAAA2O,GACAA,IACAA,EAAA,KAEA7M,GAAA,WAGA,IAAAk2B,EAAAzmB,SAAA0mB,uBAAA,cACAp5B,EAAAN,QAAAy5B,GAAA,SAAAD,GACAA,EAAA/3B,IAAAA,GACA+3B,EAAAtC,UAAAC,OAAA,MAAA,QAGA/mB,IAsNAxI,KAnNA,SAAAnG,EAAA2O,GACAA,IACAA,EAAA,IAEA7M,GAAA,WAGA,IAAAk2B,EAAAzmB,SAAA0mB,uBAAA,cACAp5B,EAAAN,QAAAy5B,GAAA,SAAAD,GACAA,EAAA/3B,IAAAA,GACA+3B,EAAAtC,UAAAC,OAAA,MAAA,QAGA/mB,KAwMApC,QAAA,CACAtF,KAAAqsB,EACAtoB,KA7UA,SAAAqB,EAAAoC,GACA,IAAAypB,EAAAzpB,GAAAA,EAAAoP,QAAA,OAAA,EAAApP,EAAAlO,MAAA,MAAA3B,OAAA,EACA,OAAA00B,EAAAjnB,EAAA,CACAG,YAAA,qCACAgC,SAAA,CACAC,MAAAA,EACAypB,KAAAA,GAEA1E,WAAA,kBAAA0E,GAAA,EAAA,QAAA,eAsUAC,MAlUA,SAAA9rB,EAAApB,GAUA,OATAA,EAAAA,GAAA,IACAuB,YAAAvB,EAAAuB,YAAAvB,EAAAuB,YAAA,sCACAvB,EAAAuoB,WAAAvoB,EAAAuoB,YAAA,uBACAvoB,EAAAuD,SAAAvD,EAAAuD,UAAA,GACAvD,EAAAuD,SAAAC,MAAAxD,EAAAuD,SAAAC,OAAAxD,EAAAuD,SAAA4pB,KACAnrB,EAAAorB,KAAAprB,EAAA4R,QAAA5R,EAAA9H,OAAA,CAAAmzB,UAAA,IACArtB,EAAAuD,SAAA+pB,QAAAttB,EAAAuD,SAAA+pB,SAAAttB,EAAAuD,SAAAC,MACAxD,EAAAuD,SAAAgqB,YAAAvtB,EAAAuD,SAAAgqB,aAAA,GACAvtB,EAAAuD,SAAAiqB,SAAAxtB,EAAAuD,SAAAiqB,UAAA,6BACAnF,EAAAjnB,EAAApB,IAyTA6D,QAtTA,SAAA4pB,EAAA14B,EAAAiL,GACA,IAAAwG,EAAA,iBAAAzR,GAAAA,EAAA4C,EAAA2O,SAAAK,eAAA5R,GAAAA,EACAA,GAAAyR,IAAAxG,EAAA5E,WACAoL,EAAA7O,EAAA2O,SAAAonB,cAAA1tB,EAAA5E,WAIA,IAAAokB,GADAxf,EAAAA,GAAA,IACAwf,UAAA/nB,EAAAgoB,QAEA,GAAAjZ,IAAAxG,EAAA0D,QACA1D,EAAA2tB,WACAnnB,EAAAxG,EAAA2tB,aAEA3tB,EAAAuB,YAAAvB,EAAAuB,YAAAvB,EAAAuB,YAAA,wCACAvB,EAAA+oB,UAAA/oB,EAAA+oB,WAAA,kBACA/oB,EAAAuD,SAAAvD,EAAAuD,UAAA,GACAvD,EAAAuD,SAAAoC,KAAA3F,EAAAuD,SAAAoC,MAAA,GACA3F,EAAAuD,SAAAoC,KAAAC,SAAA5F,EAAAuD,SAAAoC,KAAAC,WAAA,EACA5F,EAAAuD,SAAAoC,KAAAK,MAAAhG,EAAAuD,SAAAoC,KAAAK,QACAhG,EAAAuD,SAAAoC,KAAAC,UAAA5F,EAAAuD,SAAAoC,KAAAC,SAAArQ,WAAA,WAAA,mBAAA,kBACAyK,EAAAuD,SAAAoC,KAAA6mB,MAAAxsB,EAAAuD,SAAAoC,KAAA6mB,OAAA,aAAAxsB,EAAAuD,SAAAoC,KAAAK,MACAhG,EAAAuD,SAAAV,OAAA7L,QAAAuC,UAAAyG,EAAAuD,SAAAV,OAAA7C,EAAAuD,SAAAV,KACAwlB,EAAA7hB,EAAAxG,GACA5F,MAAA,SAAAwd,GACA5X,EAAA4tB,YACApnB,EAAAxG,EAAA4tB,cAEApO,EAAAhJ,QAAAoB,MAEApb,OAAA,SAAA6B,GACA2B,EAAA4tB,YACApnB,EAAAxG,EAAA4tB,cAEApO,EAAA/I,OAAApY,WAMA,GAAA2B,EAAA0D,QAAA,CACA,IAAAA,EAAA1D,EAAA0D,QACA1D,EAAA6tB,aAAA7tB,EAAA6tB,cAAAnqB,SACA1D,EAAA0D,QACA1D,EAAAwf,SAAAA,EACA3oB,GAAA,WACA42B,EAAA14B,EAAAiL,KACA0D,QAIA1M,QAAAuC,UAAAyG,EAAAkG,SAAAlG,EAAAkG,MAEA,aAAAlG,EAAAvD,QACA5F,GAAA,WACA2oB,EAAAhJ,SAAA,MAIA3f,GAAA,WACA2oB,EAAA/I,OAAA,gCAAA1hB,OAOAiL,EAAAkG,MAAAlP,QAAAqM,YAAArD,EAAAkG,OAAA,EAAAlG,EAAAkG,MAAA,EACAlG,EAAAwf,SAAAA,EACA3oB,GAAA,WACA42B,EAAA14B,EAAAiL,KACAA,EAAA0D,SAAA1D,EAAA6tB,cAAA,MAIA,OAAArO,EAAA7jB,UA8OAmyB,UAAA,CACAC,OA7oBA,SAAAC,EAAA3mB,GACA,GAAAA,EAAA7D,OAAA,QAAA6D,EAAAwH,MAAA,YAAAxH,EAAAwH,KAEAlX,EAAAgxB,eAAAhxB,EAAAgxB,eAAAC,YACAvhB,EAAAwhB,kBAAA,EAAAxhB,EAAA7D,MAAA7P,aAIA,GAAA0T,EAAA4mB,YAAA5mB,EAAA4mB,WAAAt6B,OAAA,EACAq6B,EAAA3mB,EAAA4mB,WAAA,QAEA,CAEA,IAAAC,EAAAv2B,EAAA2O,SAAA6nB,cACAD,EAAAE,mBAAA/mB,GACA,IAAAymB,EAAAn2B,EAAAgxB,eACAmF,EAAAO,kBACAP,EAAAQ,SAAAJ,KA6nBA/nB,IAxnBA,WACA,IAAAooB,EAAA,GAIA,OAHAhV,OAAAoP,eACA4F,EAAA52B,EAAAgxB,eAAAC,YAEA2F,IAqnBAC,MAAA,CACAC,WA1iBA,SAAA/xB,EAAA4qB,GACA,IAAAsF,EAAAtmB,SAAAuhB,cAAA,OACA,OAAApwB,GAAA,SAAA+e,EAAAC,GAEA,GAAA/Z,EAAA,CACA,IAAAsnB,EAAA,IAAAvM,WACAuM,EAAAtM,OAAA,SAAAtW,GACAwrB,EAAAlV,OAAA2P,EAAA7Q,EAAAC,EAAA6Q,GACAsF,EAAA8B,IAAAttB,EAAAuW,OAAAC,QAEAoM,EAAA2K,cAAAjyB,QAGA+Z,EAAA,wBAGArc,MAAA,SAAA+tB,GAEA,OADAyE,EAAA1W,SACAiS,MAyhBAyG,UAphBA,SAAAC,EAAAvH,GACA,IAAAsF,EAAAtmB,SAAAuhB,cAAA,OACA,OAAApwB,GAAA,SAAA+e,EAAAC,GACAmW,EAAAlV,OAAA2P,EAAA7Q,EAAAC,EAAA6Q,GACAsF,EAAA8B,IAAAG,KAEAz0B,MAAA,SAAAQ,GAEA,OADAgyB,EAAA1W,SACAtb,MA6gBAk0B,UApeA,SAAAD,EAAAE,GACA,IAAAnC,EAAAtmB,SAAAuhB,cAAA,OACA,OAAApwB,GAAA,SAAA+e,EAAAC,GACAmW,EAAAlV,OAxCA,SAAAlB,EAAAC,GACA,IACAsY,EADAha,KAAAia,GAAA,IACA,GACA,OAAA,SAAA5tB,GACA,IAAAomB,EAAApmB,EAAAuW,OAAA6P,MACAC,EAAArmB,EAAAuW,OAAA8P,OAIAD,EAAAC,EACAD,EA1VA,MA2VAC,GA3VA,IA2VAD,EACAA,EA5VA,KA+VAC,EAhWA,MAiWAD,GAjWA,IAiWAC,EACAA,EAlWA,KAsWA,IAAAG,EAAAthB,SAAAuhB,cAAA,UACAD,EAAAJ,MAAAC,EACAG,EAAAH,OAAAD,EAEA,IAAAD,EAAAK,EAAAE,WAAA,MACAP,EAAA0H,OAAAF,GACAxH,EAAAW,UAAA9mB,EAAAuW,OAAA,GAAA,EAAAiQ,EAAAJ,OAEA,IAAAW,EAAAP,EAAAQ,YAEAR,EAAA1R,SAEAM,EAAA2R,IAOA+G,CAAA1Y,GACAoW,EAAA8B,IAAAG,KAEAz0B,MAAA,SAAAQ,GAEA,OADAgyB,EAAA1W,SACAtb,OA8dA2rB,IAAAA,MAQAze,QAAA,SAAA,CAAA,WAAA,UAAA,SAAAjR,EAAAc,GAGA,OAAA,SAAA5C,GAKA8B,GAAA,WACA,IAAA2P,EAAA7O,EAAA2O,SAAAK,eAAA5R,GACAyR,GACAA,EAAAsiB,eC34BA9xB,QAAA6Q,OAAA,wBAAA,CAAA,kBAEAC,QAAA,UAAA,CAAA,aAAA,QAAA,UAAA,aAAA,eAAA,SAAAC,EAAAonB,EAAAx3B,EAAAQ,EAAAi3B,GAGA,IACAr2B,EAAA,CACAs2B,UAAA,KACAC,KAAA,KACAC,OAAA,IACAC,MAAAr3B,EAAA2R,gBAAAX,aAEAsmB,EAAAC,IACAC,EAAA,GAGA,SAAAD,EAAA/kB,GAEA,OADAA,EAAAA,GAAAxS,EAAAyC,OACA+P,EAAAnN,iBAAAmN,EAAAV,cAAAtS,EAAAsQ,aAAA,eAAA,SAGA,SAAA2nB,EAAA5vB,GAOA,OANAA,EAAAA,GAAA,IACAyvB,YAAAC,IACA1vB,EAAA6vB,eAAA,iBAAA7vB,EAAAyvB,aAAAzvB,EAAA8vB,SAAA,aAAA,UACA9vB,EAAA+vB,mBAAA,YAAA/vB,EAAA6vB,eACA,KACA,KACA7vB,EAyDA,SAAAgwB,EAAArlB,GACA,IAAAslB,EAAAP,EAAA/kB,GACAslB,IAAAR,IAEAA,EAAAQ,EACApyB,QAAAqB,MAAA,kDAAApG,OAAA22B,IACA77B,EAAAN,QAAAM,EAAAP,KAAAs8B,IAAA,SAAAO,GACA,IAAAC,EAAAf,EAAAjpB,IAAA+pB,GACAC,GACAA,EAAAC,WAAAR,KAAA,OAeA,OATA,WACAzhB,UAAA,CAEAhW,EAAAmT,IAAA1Q,KAAAy1B,GAAA5kB,QAAA1D,EAAAioB,EAAA78B,OAIAm9B,GAEA,CACAnqB,IA/EA,SAAAxQ,EAAA46B,EAAAT,GAGA,IAGAK,EAHAD,GAFAv6B,EAAAA,GAAA,MACA46B,EAAAA,GAAAx3B,EAAAy2B,OACA,IAAA,KAIA,GAAAM,GAAA,mBAAAA,EAAA,CAEA,IADA,IAAAU,EAAA,EACApB,EAAAjpB,IAAA+pB,EAAAM,IACAA,IAEAN,GAAAM,OAGAL,EAAAf,EAAAjpB,IAAA+pB,GAOA,GAHAP,EAAAO,KAAAP,EAAAO,IAAA,GAGAC,EAAA,OAAAA,EAGA,IAAAnwB,EAAA4vB,EAAA,CACAW,OAAAA,EACAT,SAAAA,GAAA,OAGA,OADAjyB,QAAAqB,MAAA,0DAAApG,OAAAo3B,EAAAlwB,EAAAyvB,cACAL,EAAAqB,YAAAP,EAAAlwB,IAkDA0wB,MArCA,SAAAC,GACA/8B,EAAAN,QAAAM,EAAAP,KAAAs8B,IAAA,SAAAO,GACA,GAAAA,EAAA36B,WAAAo7B,GAAA,CACA,IAAAR,EAAAf,EAAAjpB,IAAA+pB,GACAC,GACAA,EAAAS,iBAiCAC,SAhDA,WACAhzB,QAAAqB,MAAA,kCACAtL,EAAAN,QAAAM,EAAAP,KAAAs8B,IAAA,SAAAO,GACA,IAAAC,EAAAf,EAAAjpB,IAAA+pB,GACAC,GACAA,EAAAS,gBA4CA73B,UAAAA,MCjHA/B,QAAA6Q,OAAA,wBAAA,CAAA,0BAGAipB,WAAA,kBAAA,eAKAA,WAAA,iBAAA,CAAA,SAAA,WAAA,UAAA,SAAA,qBAAA,SAAAl6B,EAAAsB,EAAAH,EAAA8V,EAAAkjB,GAGAn6B,EAAAo6B,SAAA,SAAA5vB,EAAApC,EAAAgB,GAQA,OAPAA,EAAAA,GAAA,IAGAvD,QAAA,WACA,OAAA1E,EAAAuJ,QAAAvB,KAAAqB,EAAApC,IAGA6O,EAAA7O,IAAAohB,KAAAphB,EAAAgB,IAIApJ,EAAAq6B,UAAAtkB,OAAAzU,EAAAg5B,OAAAp4B,OAAAi4B,EAAAI,cAAA,uBAGArpB,QAAA,aAAA,CAAA,cAAA,aAAA,KAAA,YAAA,cAAA,WAAA,SAAA,SAAAspB,EAAArpB,EAAAtQ,EAAA45B,EAAAv6B,EAAAD,EAAAuB,GAsBA,SAAAk5B,EAAA16B,EAAA4oB,EAAAnnB,GAEAzB,EAAA4oB,SAAAA,GAAA/nB,EAAAgoB,QACA7oB,EAAA26B,UAAA,EAEA36B,EAAA46B,UAAA,WACA,OAAA56B,EAAA66B,MAAAz1B,QAGApF,EAAA86B,UAAA,WACA,OAAA96B,EAAA66B,MAAAv2B,QAGAtE,EAAAgH,WAAA,SAAAga,GAGA,OAFAhhB,EAAA26B,UAAA,EAEA36B,EAAA66B,MAAAvb,SACA9b,MAAA,WAIA,OAFAkM,SAAAqrB,KAAAnH,UAAAtU,OAAA,cACAtf,EAAA4oB,SAAAhJ,QAAAoB,GACAA,MAMAhhB,EAAAkL,QAAA,SAAArG,EAAAm2B,GACAA,EACAh7B,EAAAg7B,GAAAn2B,EAGA7E,EAAA6E,KAAAA,GAKA7E,EAAAi7B,cAAA,WACA,OAAAx5B,GAGAzB,EAAAW,IAAA,gBAAA,WAGAX,EAAA26B,WACA36B,EAAA26B,UAAA,EAEA16B,GAAA,WAEA,OADAD,EAAA4oB,SAAAhJ,UACA5f,EAAA66B,MAAAvb,SAAA9b,MAAA,WAEAkM,SAAAqrB,KAAAnH,UAAAtU,OAAA,oBAEAtf,EAAA66B,MAAAK,WAAA,KAAA,QAyDA,MAAA,CACA91B,KArDA,SAAAuF,EAAAuvB,EAAAz4B,EAAA2H,GACA,IAKAwoB,EAlFAuJ,EACAna,EAKAoa,EAuEAxS,EAAA/nB,EAAAgoB,QAYA,IAVAzf,EAAAA,GAAA,IACAiyB,UAAAjyB,EAAAiyB,WAAA,cAIAzJ,IAAAxxB,QAAAuC,UAAAyG,EAAAwoB,kBAAAxoB,EAAAwoB,gBAEAxoB,EAAAwoB,gBAAAA,EAGAsI,EAAA,CAEA9wB,EAAAG,MAAAH,EAAAG,MAAAH,EAAAG,MAAA+xB,OAAAnqB,EAAAmqB,OACAZ,EAAAzoB,KAAA,GAAA7I,EAAAG,MAAAqf,EAAAnnB,GAGA,IAAA85B,EAAA,CAAAv7B,OAAAoJ,EAAAG,MAAA9H,WAAAA,GACA+5B,GA/FAxa,EAAA,CACAya,gBAAA,EACAC,eAAA,GACAV,SAAA,IAEAI,IANAD,EAgGAjB,IA1FA,IAAAh0B,OAAAxH,MAAA,OACAsiB,EAAAya,eAAA,IAAAL,EAAAr+B,QAAA,QAAAq+B,EAAA,IAAA,IAAAx3B,cACAod,EAAAya,gBACAza,EAAA0a,eAAAN,EAAA,GACApa,EAAAga,SAAAI,EAAA,IAEApa,EAAA0a,eAAAP,EAGAna,GAkFA2a,EAAAz7B,EAAAg6B,EAAAqB,GACAC,EAAAC,iBACAE,EAAAf,UAAAxxB,EAAAG,MAAAqxB,UACAe,EAAA30B,WAAAoC,EAAAG,MAAAvC,YAyBA,OArBAwzB,EAAAhI,gBAAA7nB,EAAAvB,GACA5F,MAAA,SAAAq3B,GACA,GAAAX,EAEAW,EAAAtxB,MAAA6oB,QAAAyI,MAAAA,MAEA,CACA,IAAAtxB,EAAAsxB,EAAAtxB,MAEAmxB,EAAAzoB,KAAA,GAAA1I,EAAAqf,EAAAnnB,GAEA8H,EAAAsxB,MAAAA,EAIA,OAAAA,EAAAz1B,UAEA,SAAAqC,GACAmhB,EAAA/I,OAAApY,MAGAmhB,EAAA7jB,aAQAmM,QAAA,SAAA,CAAA,aAAA,aAAA,cAAA,WAAA,aAAA,UAAA,SAAAC,EAAAG,EAAA0d,EAAA/uB,EAAA27B,EAAAz6B,GA+CA,SAAA06B,EAAAp6B,GACA,OAAAm6B,EAAAx2B,KAAA,wCAAA,gBACA3D,GAGA,SAAAq6B,EAAAr6B,GACA,OAAAm6B,EAAAx2B,KAAA,wCAAA,gBACA3D,GA+DA,MAAA,CACAs6B,aAnHA,SAAAt6B,GACA,IAAAu6B,EAAA76B,EAAA0C,OAAAC,UACA,OAAA83B,EAAAx2B,KAAA,uCAAA,oBACA3D,EAAA,CACAmwB,iBAAAoK,KAgHAC,UA5GA,SAAAx6B,GACA,OAAAm6B,EAAAx2B,KAAA,mCAAA,iBACA3D,EAAA,CAAAmwB,iBAAA,EAAA5kB,sBAAA,KA2GA3C,cAxGA,SAAA5I,GACA,OAAAm6B,EAAAx2B,KAAA,kCAAA,qBACA3D,GAAA,GAAA,CAAAmwB,iBAAA,KAuGAsK,kBApGA,SAAAz6B,GACA,OAAAm6B,EAAAx2B,KAAA,uCAAA,yBACA3D,EAAA,CAAAmwB,iBAAA,KAmGAuK,UAhGA,SAAA16B,GACA,OAAAm6B,EAAAx2B,KAAA,6BAAA,iBACA3D,IA+FAkG,SAvFA,SAAAlG,GACA,OAAAm6B,EAAAx2B,KAAA,gDAAA,iCACA3D,GACA+B,MAAA,SAAAL,GACA,GAAAA,EACA,MAAA,UAAAA,EAAAi5B,YACAP,EAAA14B,GACA24B,EAAA34B,OAiFA04B,eAAAA,EACAC,eAAAA,EACA/zB,SArEA,SAAAtG,GACA,OAAAm6B,EAAAx2B,KAAA,iCAAA,gBACA3D,IAoEAoG,oBAhGA,SAAApG,GACA,OAAAm6B,EAAAx2B,KAAA,uCAAA,0BACA3D,IA+FA46B,YAlEA,SAAA56B,GACA,OAAAm6B,EAAAx2B,KAAA,wCAAA,2BACA3D,IAiEA66B,yBA9DA,SAAA76B,GACA,OAAAm6B,EAAAx2B,KAAA,kDAAA,mCACA3D,IA6DA86B,iBA1DA,SAAA96B,GACA,OAAAm6B,EAAAx2B,KAAA,2CAAA,wBACA3D,IAyDA4H,aAtDA,SAAAD,IACAA,EAAAA,GAAA,IACA3G,MAAA2G,EAAA3G,OAAA,4BACA2G,EAAAE,SAAAF,EAAAE,UAAA,+BACA,IAAAC,EAAAH,EAAAG,MAAAH,EAAAG,MAAA+xB,OAAAnqB,EAAAmqB,OAgBA,OAfA/xB,EAAA1H,SAAA,CAAAoD,cAAAU,GACA4D,EAAA2B,QAAA,SAAArG,GACA0E,EAAA1E,KAAAA,GAEA0E,EAAAizB,OAAA,SAAAlxB,GACA/B,EAAA1E,KAAAiE,YAAA,EACAwC,GAAAA,EAAAmxB,gBAAAnxB,EAAAmxB,iBACAlzB,EAAA1E,KAAAC,QAAAyE,EAAA1H,SAAAoD,UACAmE,EAAAszB,MAAAxd,MAAA3V,EAAA1H,SAAAoD,WAIAsE,EAAA9I,MAAA2I,EAAA3I,YAAAkF,EAGA2L,EAAA,CAAAlI,EAAA3G,MAAA2G,EAAAE,SAAA,gBAAA,sBACA9F,MAAA,SAAAssB,GAcA,OAbA1mB,EAAAszB,MAAA1N,EAAA5pB,KAAA,CACAuF,YAAA,uCACAlI,MAAAqtB,EAAA1mB,EAAA3G,OACA6G,SAAAwmB,EAAA1mB,EAAAE,UACAC,MAAAA,EACAymB,QAAA,CACA,CAAApB,KAAAkB,EAAA,sBACA,CAAAlB,KAAAkB,EAAA,iBACA7X,KAAA,kBACAgY,MAAA1mB,EAAAizB,WAIApzB,EAAAszB,cAwBAxrB,QAAA,aAAA,CAAA,aAAA,aAAA,cAAA,WAAA,UAAA,cAAA,SAAAC,EAAAG,EAAA0d,EAAA/uB,EAAAkB,EAAAjB,GAqCA,MAAA,CACAq8B,iBAnCA,SAAA/xB,EAAApB,GAGA,IAAA3H,GAFA2H,EAAAA,GAAA,IAEA3H,YAAA,UACA2H,EAAA3H,WAEA,IAAA8H,EAAAH,EAAAG,OAAAH,EAAAG,MAAA+xB,QAAAnqB,EAAAmqB,MAAA,GACAlyB,EAAAG,MAAAA,EACAH,EAAAuB,YAAA,6CACAvB,EAAAwB,YAAA,EAGAxK,QAAAC,OAAA9D,KAAA2D,EAAA,0BAAA,CAAAF,OAAAoJ,EAAAG,MAAA9H,WAAAA,KAEA,IAAAk7B,EAAAvzB,EAAAyB,UAYA,OAXAzB,EAAAyB,UAAA,SAAAH,GAGAnB,EAAAkpB,aAAA,SAAAtvB,GACAuH,EAAAnB,MAAAkpB,aAAAtvB,IAIAw5B,GAAAA,EAAAjyB,IAGAvJ,EAAAuJ,QAAAtF,KAAAoF,EAAApB,GACA5F,MAAA,SAAAL,GAGA,OADAoG,EAAAqzB,WACAz5B,UC5UA/C,QAAA6Q,OAAA,uBAAA,CAAA,0BAEAC,QAAA,SAAA,CAAA,QAAA,KAAA,WAAA,UAAA,aAAA,UAAA,SAAA,SAAAqnB,EAAA13B,EAAAZ,EAAAc,EAAAQ,EAAAs7B,EAAAr7B,GAGA,IAAAsL,EAAAvL,EAAAyC,KAAA8I,QAGAgwB,EAAA,GAEAC,EAAA,GAMA,SAAAvgB,EAAAwgB,EAAA1f,GAEA,OAAA0f,EAAAA,GAAA1f,GAAA,IAAAA,GAAA,KAAAA,EAAA,IAAAA,EAAA,IAAA,KAGA,SAAA2f,EAAAD,EAAA1f,EAAA/G,EAAAsG,GAEA,OADA,KAAAS,GAAAT,EAAA,QAAA,QACA,MAAAL,EAAAwgB,EAAA1f,IAAA/G,GAAA,IAQA,SAAA2mB,EAAArd,EAAA7b,EAAAuyB,EAAApc,GACAnW,GAAAA,EAAAxF,QACAqhB,EAAA7b,GAGA,KAAAmW,EACA0F,EAAA,CAAApW,MAAA,IAAAjL,QAAA,yBAAA+3B,EAAA,KAAAA,EAAA,IAAA,MAEA,KAAApc,EACA0F,EAAA,CAAApW,MAAA,IAAAjL,QAAA,sBAAA+3B,EAAA,KAAAA,EAAA,IAAA,MAEAA,GACAtvB,QAAAxG,MAAA,kCAAA0Z,EAAA,SAAAoc,EAAA,KACA1W,EAAA,2BAAA0W,EAAA,MAGA1W,EAAA,2BAKA,SAAAsd,EAAA5G,EAAAjzB,EAAA0H,EAAAwU,GACA,IAAA4d,EAAA,GAAAC,EAAA,GAAAC,EAAA/G,EAaA,MAZA,iBAAAjzB,IACA85B,EAAApgC,EAAAP,KAAA6G,IAGAtG,EAAAN,QAAA0gC,GAAA,SAAAG,GACAD,KACAA,EAAAA,EAAAE,QAAA,IAAAD,EAAAj6B,EAAAi6B,OAEAF,EAAAE,GAAAj6B,EAAAi6B,OAGAvyB,EAAA1H,OAAA+5B,EACA7d,EAAA8d,EAAAtyB,GA4PA,SAAAyyB,EAAAr1B,GACA,IAAAiP,EACAjP,EAAAzJ,WAAA,gBACA0Y,EAAA,UACAjP,EAAAA,EAAAo1B,QAAA,aAAA,YAGA,IAAAE,EAAAhuB,SAAAuhB,cAAA,KACAyM,EAAAlH,KAAApuB,EAEA,IAAAu1B,EAAAD,EAAAC,SACAA,GAAAA,EAAAh/B,WAAA,OACAg/B,EAAAA,EAAAn+B,UAAA,IAGA,IAAAwhB,EAAA,CACA3J,SAAAA,GAAAqmB,EAAArmB,SACAumB,SAAAF,EAAAE,SACAZ,KAAAU,EAAAV,KACA1f,KAAAogB,EAAApgB,KACAtY,SAAA04B,EAAA14B,SACAC,SAAAy4B,EAAAz4B,SACA04B,SAAAA,EACAE,OAAAH,EAAAG,OACAx/B,KAAAq/B,EAAAr/B,MAGA,OADAq/B,EAAApe,SACA0B,EAgHA,SAAA8c,EAAAC,EAAAC,GACA,IAAAC,EAAAF,EAAAr/B,MAAA,KACAw/B,EAAAF,EAAAt/B,MAAA,KAGA,SAAAy/B,EAAA1/B,GACA,IAAA,IAAAyf,EAAA,EAAAA,EAAAzf,EAAA1B,SAAAmhB,EAAA,CACA,GA9BAkgB,EA8BA3/B,EAAAyf,IA5BA,QAAA2L,KAAAuU,GA6BA,OAAA,EAEA3/B,EAAAyf,GAAA7D,SAAA5b,EAAAyf,IAjCA,IAAAkgB,EAmCA,OAAA,EAEA,IAAAD,EAAAF,KAAAE,EAAAD,GACA,OAAAG,IAGA,IAAA,IAAAngB,EAAA,EAAAA,EAAA+f,EAAAlhC,SAAAmhB,EAAA,CACA,GAAAggB,EAAAnhC,SAAAmhB,EACA,OAAA,EAGA,GAAA+f,EAAA/f,KAAAggB,EAAAhgB,GAGA,OAAA+f,EAAA/f,GAAAggB,EAAAhgB,GACA,GAEA,EAGA,OAAA+f,EAAAlhC,QAAAmhC,EAAAnhC,QACA,EAGA,EAqBA,OAtfA+P,IACAA,EAAA,KAqfA,CACAyC,IA9bA,SAAAytB,EAAA1f,EAAA/G,EAAAsG,EAAAyhB,GAEA,IAAAtB,EACA,OAAAn8B,EAAAgf,OAAA,iCAAAmd,GAEA,IAAAzG,EAAA0G,EAAAD,EAAA1f,EAAA/G,EAAAsG,GACA,OAAA,SAAAvZ,GACA,OAAAzC,GAAA,SAAA+e,EAAAC,GAMAsd,EAAA5G,EAAAjzB,EALA,CACAwJ,QAAAwxB,GAAAxxB,EACAyxB,aAAA,SAGA,SAAAhI,EAAAvrB,GACAutB,EAAAhpB,IAAAgnB,EAAAvrB,GACAlE,SAAA,SAAA9C,EAAAmW,EAAAqkB,EAAAxzB,GACA4U,EAAA5b,MAEAvD,OAAA,SAAAuD,EAAAmW,EAAAqkB,EAAAxzB,GACAkyB,EAAArd,EAAA7b,EAAAuyB,EAAApc,cA4aAskB,aAraA,SAAAzB,EAAA1f,EAAA/G,EAAAsG,EAAA8c,EAAA+E,EAAAJ,EAAAvE,GACA,IAAAxD,EAAA0G,EAAAD,EAAA1f,EAAA/G,EAAAsG,GAOA,OANAkd,EAAAA,GAxFA,UAyFAJ,EAAAA,GAAAkD,EAAA16B,UAAAu2B,KACAqE,EAAAhD,IAAA,EAIA,SAAAz2B,GACA,OAAAzC,GAAA,SAAA+e,EAAAC,GACA,IAAA7U,EAAA,CACA8B,QAAAwxB,GAAAxxB,EACAyxB,aAAA,QAGAvzB,EAAAuuB,MADAmF,EACA7B,EAAAttB,IAAAwqB,EAAAJ,GAAA,SAAAh9B,EAAAiQ,EAAA+xB,GACA13B,QAAAqB,MAAA,qCAAApG,OAAAvF,IACA47B,EAAAhpB,IAAA5S,EAAAqO,GACAlE,SAAA,SAAA9C,GACAgH,EAAAuuB,MAAAqF,IAAAjiC,EAAAqH,GACA26B,GAAAA,EAAAhiC,EAAAqH,SAKA64B,EAAAttB,IAAAwqB,EAAAJ,GAGAwD,EAAA5G,EAAAjzB,EAAA0H,GAAA,SAAAurB,EAAAvrB,GACAutB,EAAAhpB,IAAAgnB,EAAAvrB,GACAlE,SAAA,SAAA9C,GACA4b,EAAA5b,MAEAvD,OAAA,SAAAuD,EAAAmW,GACA+iB,EAAArd,EAAA7b,EAAAuyB,EAAApc,cAoYA0kB,KA7XA,SAAA7B,EAAA1f,EAAA/G,EAAAsG,EAAAyhB,GACA,IAAA/H,EAAA0G,EAAAD,EAAA1f,EAAA/G,EAAAsG,GACA,OAAA,SAAA7Y,EAAAV,GACA,OAAAzC,GAAA,SAAA+e,EAAAC,GAMAsd,EAAA5G,EAAAjzB,EALA,CACAwJ,QAAAwxB,GAAAxxB,EACA0xB,QAAA,CAAAM,eAAA,oCAGA,SAAAvI,EAAAvrB,GACAutB,EAAAsG,KAAAtI,EAAAvyB,EAAAgH,GACAlE,SAAA,SAAA9C,GACA4b,EAAA5b,MAEAvD,OAAA,SAAAuD,EAAAmW,GACA+iB,EAAArd,EAAA7b,EAAAuyB,EAAApc,cA+WA4kB,GAxWA,SAAA/B,EAAA1f,EAAA/G,EAAAsG,EAAA/P,GACA,IAAAyJ,EAEA,MADAtP,QAAAxG,MAAA,2CACA,0CAEA,IAAA2H,EAzIA,SAAA40B,EAAA1f,EAAA/G,EAAAsG,GAEA,OADA,KAAAS,GAAAT,EAAA,MAAA,MACA,MAAAL,EAAAwgB,EAAA1f,IAAA/G,GAAA,IAuIAyoB,CAAAhC,EAAA1f,EAAA/G,EAAAsG,GAGA,SAAAoiB,EAAAC,GACA,IAAAA,EAAAtM,SACA,MAAA,IAAAh0B,MAAA,4BAAAsD,OAAAkG,IAEA,OAAA,GAAA82B,EAAAtM,SAAAuM,WACAt+B,EAAAsH,KAAA+2B,EAAAtM,UAEA,GAAAsM,EAAAtM,SAAAuM,WACAt+B,EAAAgf,OAAA,mCAAAqf,EAAAtM,SAAA2D,IAAA,MAGA2I,EAAAE,cAAAtyB,GACAoyB,EAAAG,eAAAH,EAAAG,gBAAAlhB,KAAAmhB,IAAAJ,EAAAG,eAAA,IAAA,MAAA,IACAp4B,QAAAqB,MAAA,+CAAApG,OAAAg9B,EAAA3oB,KAAA4H,KAAAohB,MAAAL,EAAAG,eAAA,QAEAlhB,KAAAohB,MAAAL,EAAAE,aAAA,KAAA,IAAA,GACAn4B,QAAAqB,MAAA,6BAAA42B,EAAA3oB,KAAA,QAGAtW,GAAA,WAEA,OADAi/B,EAAAE,cAAAF,EAAAG,eACAJ,EAAAC,KACAA,EAAAG,iBAGA,SAAAG,EAAAN,EAAA1f,EAAAlc,GA8DA,OA7DA47B,EAAAtM,WACAsM,EAAA3oB,KAAAA,EACA2oB,EAAAO,UAAA,GACAP,EAAAE,aAAA,EACAF,EAAAG,eAAA,IAEAlC,EAAA/0B,EAAA9E,EAAA,IAAA,SAAA8E,GACA82B,EAAAtM,SAAA,IAAA8M,UAAAt3B,GACA82B,EAAAtM,SAAA+M,QAAA,SAAAr0B,GACA4zB,EAAAtM,SAAAuM,WAAA,GAEAD,EAAAtM,SAAAgN,UAAA,SAAAt0B,GACA,IAAAmL,EAAAopB,KAAAx3B,MAAAiD,EAAAtH,MACAhH,EAAAN,QAAAwiC,EAAAO,WAAA,SAAAjgB,GACAA,EAAA/I,OAGAyoB,EAAAtM,SAAAkN,OAAA,SAAAx0B,GACArE,QAAAqB,MAAA,kCAAA42B,EAAA3oB,KAAA,QACAumB,EAAA9iB,KAAAklB,GACAA,EAAAtM,SAAAmN,SAAAnqB,KAAAD,OAEAupB,EAAAtM,SAAAoN,QAAA,SAAAC,GAGA,IAAA3zB,EAAAtP,EAAAkjC,UAAApD,GAAA,SAAAqD,GAAA,OAAAA,EAAA5pB,OAAA2oB,EAAA3oB,QACAjK,GAAA,GACAwwB,EAAA5gB,OAAA5P,EAAA,GAIA4yB,EAAAtM,SAAAwN,QACAlB,EAAAtM,SAAA,KAKAsM,EAAAtM,SAAAmN,UACA94B,QAAAqB,MAAA,8EAAAiO,EAAAX,KAAAD,MAAAupB,EAAAtM,SAAAmN,UAGAb,EAAAtM,SAAA,KAGA4M,EAAAN,EAAA,KAAA57B,IAEA28B,IACAh5B,QAAAqB,MAAA,2DAAApG,OAAAqU,GAAA0pB,GAAAA,EAAAI,MAAAJ,GAGAf,EAAAtM,SAAA,KAGA4M,EAAAN,EAAA,KAAA57B,SAOAkc,GAAA0f,EAAAO,UAAAzlB,KAAAwF,GACAyf,EAAAC,GAGA,SAAAoB,EAAApB,GACAA,EAAAtM,WACAsM,EAAAtM,SAAAwN,SAAA,EACAn5B,QAAAqB,MAAA,6BAAA42B,EAAA3oB,KAAA,QACA2oB,EAAAtM,SAAA1T,QACAggB,EAAAO,UAAA,GACAP,EAAAc,SAAAd,EAAAc,WAaA,OA/GAlzB,EAAAA,GAAAvL,EAAAyC,KAAA8I,QA+GA,CACA0c,KAAA,SAAAlmB,GACA,OAAAk8B,EAAAjjC,KAAA,KAAA+G,IAEAm2B,GAAA,SAAAja,EAAAlc,GACA,OAAAk8B,EAAAjjC,KAAAijB,EAAAlc,IAEA+b,WAAA,SAAAG,EAAAlc,GACA,IAAA47B,EAAA3iC,KAEA,OADAijC,EAAAN,EAAA1f,EAAAlc,GACA,YAnBA,SAAA47B,EAAA1f,GACA0f,EAAAO,UAAAziC,EAAA6iB,OAAAqf,EAAAO,WAAA,SAAAz2B,GACA,OAAAA,IAAAwW,KAEA0f,EAAAO,UAAA1iC,QACAujC,EAAApB,GAeAqB,CAAArB,EAAA1f,KAGAghB,KAAA,SAAAx8B,GACA,IAAAk7B,EAAA3iC,KACA,OAAA0iC,EAAAC,GACA17B,MAAA,WACA07B,EAAAtM,UAAAsM,EAAAtM,SAAA4N,KAAAx8B,OAGAkb,MAAA,WAEAohB,EADA/jC,OAGAkkC,SAAA,WAEA,OADAlkC,KACAq2B,UADAr2B,KACAq2B,SAAAwN,WAyNAM,WApNA,WACA5D,EAAA//B,OAAA,IACAkK,QAAAqB,MAAA,mCACAtL,EAAAN,QAAAogC,GAAA,SAAA6D,GACAA,EAAAzhB,WAEA4d,EAAA,KA+MAG,OAAAA,EACAzgB,UAAAA,EACApU,IAAA,CACAC,MAAAo1B,EACAjU,KA1KA,SAAAphB,EAAAgB,GAGA,GAFAA,EAAAA,GAAA,IAEAhB,EAAAzJ,WAAA,aAAAyJ,EAAAzJ,WAAA,YAAA,CACA,IAAAF,EAAAg/B,EAAAr1B,GASA,IAPA3J,EAAA4Y,UAAAjO,EAAA6O,OACAxZ,EAAA4Y,SAAA,SAAAjO,EAAA6O,KAAA,UACA,SAAA7O,EAAA6O,KAAA,OAAA,GACA7P,EAAA3J,EAAA4Y,SAAAjP,GAIA,WAAA3J,EAAA4Y,UAAA7V,EAAA0e,YACA,IAEA,iBLlXA0gB,GKiXAC,MAAAC,aAAA14B,GAGA,MAAAX,GACAR,QAAAxG,MAAA,4DAMA,GADA,WAAAhC,EAAA4Y,UAAA,QAAA5Y,EAAA4Y,WAAA7V,EAAAuL,OAKA,YAHA3D,EAAAvD,SAAA,mBAAAuD,EAAAvD,SACAuD,EAAAvD,QAAAuC,IAOA,IAcA24B,EAdAC,EAAA53B,EAAA2X,SAAAvf,EAAAuL,OAAA,UAAA,UAGA,GAAA,WAAAi0B,GAAA,YAAAA,GAAAx/B,EAAA0e,YACA,IAEA,iBL1YA0gB,GKyYAC,MAAAC,aAAA14B,GAGA,MAAAX,GACAR,QAAAxG,MAAA,qDAMA,WAAAugC,GAAAx/B,EAAA0e,cAOA6gB,EAAA,8EAEAhgC,EAAA8C,QAAA9C,EAAA8C,OAAA+sB,OAAA7vB,EAAA8C,OAAAgtB,SACAkQ,GAAA,wBAAA7+B,OAAAic,KAAAiT,MAAArwB,EAAA8C,OAAA+sB,MAAA,GAAAzS,KAAAiT,MAAArwB,EAAA8C,OAAAgtB,OAAA,MAIA,IAAAoQ,EAAAlgC,EAAAyoB,KAAAphB,EACA44B,EACAD,GAGAA,GAAAhgC,EAAA8C,QAAA9C,EAAA8C,OAAA+sB,OAAA7vB,EAAA8C,OAAAgtB,SACAoQ,EAAAC,OAAAngC,EAAA8C,OAAA+sB,MAAA,EAAA,EAAA7vB,EAAA8C,OAAAgtB,OAAA,EAAA,GACAoQ,EAAA/O,WAsGAiP,KAAA,CACAxrB,IAjGA,WACA,OAAAI,SAAAqrB,MAAAC,SAkGAxhC,QAAA,CACAyhC,QAAAxD,EACAyD,aAnCA,SAAA7uB,EAAA8uB,GAEA,OADAv6B,QAAAqB,MAAA,qFAAApG,OAAAs/B,EAAA9uB,IACAorB,EAAAprB,EAAA8uB,IAAA,IAmCAjI,MAAAn5B,QAAA+S,MAAA,CACA2mB,MAjCA,SAAAC,GACAA,EAAAA,GA7eA,UA8eA9yB,QAAAqB,MAAA,2CAAApG,OAAA63B,IACA8C,EAAA/C,MAAAC,IA+BAE,SA5BA,WACAhzB,QAAAqB,MAAA,iCACAtL,EAAAP,KAAAsgC,GAAArgC,SAAA,SAAAq9B,GACA8C,EAAA/C,MAAAC,QA0BA8C,EAAA16B,eCxhBA/B,QAAA6Q,OAAA,0BAAA,CAAA,kBAGAC,QAAA,iBAAA,CAAA,UAAA,KAAA,SAAAnQ,EAAAF,GAGA,IACA0uB,EAAA,CACAkS,QAAA1gC,EAAA2gC,gBAAA,GAGA9C,IAAA,SAAAjiC,EAAAiQ,GAEA,OADA2iB,EAAAkS,QAAA9kC,GAAAiQ,EACA/L,EAAAsH,QAGAoH,IAAA,SAAA5S,EAAA6Z,GACA,OAAA3V,EAAAsH,KAAAonB,EAAAkS,QAAA9kC,IAAA6Z,IAGArB,UAAA,SAAAxY,EAAAiQ,GAEA,OADA2iB,EAAAkS,QAAA9kC,GAAAkjC,KAAA8B,UAAA/0B,GACA/L,EAAAsH,QAGA6M,UAAA,SAAArY,GACA,OAAAkE,EAAAsH,KAAA03B,KAAAx3B,MAAAknB,EAAAkS,QAAA9kC,IAAA,WAGA,OAAA4yB,KAGAre,QAAA,eAAA,CAAA,UAAA,KAAA,OAAA,iBAAA,SAAAnQ,EAAAF,EAAA+gC,EAAAF,GAGA,IAGAvvB,EADAsC,GAAA,EAGA8a,EAAA,CACAsS,SAAA,CACAJ,QAAA,MAEAK,OAAA,CACAL,QAAA,OAiLA,SAAApsB,IACA,GAAAlD,EAAA,OAAAA,EAEA,IAAAwD,EAAAC,KAAAD,MAYA,OA1EA5U,EAAAsQ,cACApK,QAAAqB,MAAA,yCACAinB,EAAAsS,SAAAJ,QAAA1gC,EAAAsQ,aAEArU,EAAAN,QAAAM,EAAAP,KAAA8yB,EAAAsS,WAAA,SAAAllC,GACA4yB,EAAA5yB,GAAA4yB,EAAAsS,SAAAllC,QAMAsK,QAAAqB,MAAA,2CAEAtL,EAAAN,QAAAM,EAAAP,KAAAilC,IAAA,SAAA/kC,GACA4yB,EAAA5yB,GAAA+kC,EAAA/kC,OAyDAwV,EAtDAtR,EAAAsH,QA0DA3E,MAAA,WACAyD,QAAAqB,MAAA,yBAAAsN,KAAAD,MAAAA,GAAA,MACAlB,GAAA,EACAtC,EAAA,QAOA,OAhMAod,EAAAsS,SAAAjD,IAAA,SAAAjiC,EAAAiQ,GAOA,OANAxM,QAAAuC,UAAAiK,IAAA,MAAAA,EACA2iB,EAAAsS,SAAAJ,QAAA9kC,GAAAiQ,EAGA2iB,EAAAsS,SAAAJ,QAAAM,WAAAplC,GAEAkE,EAAAsH,QAGAonB,EAAAsS,SAAAviB,OAAA,SAAA3iB,EAAAiQ,GAEA,OADA2iB,EAAAsS,SAAAJ,QAAAM,WAAAplC,GACAkE,EAAAsH,QAGAonB,EAAAsS,SAAAtyB,IAAA,SAAA5S,EAAA6Z,GACA,OAAA3V,EAAAsH,KAAAonB,EAAAsS,SAAAJ,QAAA9kC,IAAA6Z,IAGA+Y,EAAAsS,SAAA1sB,UAAA,SAAAxY,EAAAiQ,GAEA,OADA2iB,EAAAsS,SAAAJ,QAAA9kC,GAAAkjC,KAAA8B,UAAA/0B,GACA/L,EAAAsH,QAGAonB,EAAAsS,SAAA7sB,UAAA,SAAArY,GACA,OAAAkE,EAAAsH,KAAA03B,KAAAx3B,MAAAknB,EAAAsS,SAAAJ,QAAA9kC,IAAA,UAMA4yB,EAAAuS,OAAAlD,IAAA,SAAAjiC,EAAAiQ,GACA,OAAA/L,GAAA,SAAA+e,EAAAC,GACAjT,MAAAA,EACA2iB,EAAAuS,OAAAL,QAAA3d,KACA,SAAAnnB,GACAijB,OAEA,SAAAnY,GACAm6B,EAAAnhC,MAAAgH,GACAoY,EAAApY,KAEA9K,EAAAiQ,GAIA2iB,EAAAuS,OAAAL,QAAAniB,QACA,WACAM,OAEA,SAAAnY,GACAm6B,EAAAnhC,MAAAgH,GACAmY,MAEAjjB,OAMA4yB,EAAAuS,OAAAvyB,IAAA,SAAA5S,EAAA6Z,GACA,OAAA3V,GAAA,SAAA+e,EAAAC,GACA0P,EAAAuS,OAAAL,QAAAlyB,KACA,SAAA3C,GAEAgT,GADAhT,GAAA4J,EACAA,EAGA5J,MAGA,SAAAnF,GACAm6B,EAAAnhC,MAAAgH,GACAmY,MAEAjjB,OAKA4yB,EAAAuS,OAAA3sB,UAAA,SAAAxY,EAAAiQ,GAEA,OADAg1B,EAAAt5B,MAAA,2DAAA3L,GACAkE,GAAA,SAAA+e,EAAAC,GACA0P,EAAAuS,OAAAL,QAAA3d,IACAlE,EACAC,EACAljB,EACAiQ,EAAAizB,KAAA8B,UAAA/0B,QAAAjH,OAKA4pB,EAAAuS,OAAA9sB,UAAA,SAAArY,GAEA,OADAilC,EAAAt5B,MAAA,2DAAA3L,GACAkE,GAAA,SAAA+e,EAAAC,GACA0P,EAAAuS,OAAAL,QAAAlyB,KACA,SAAA3C,GAAAgT,EAAAigB,KAAAx3B,MAAAuE,GAAA,YACA,SAAAnF,GACAm6B,EAAAnhC,MAAAgH,GACAmY,MAEAjjB,OAwDA4yB,EAAAnZ,UAAA,WACA,OAAA3B,GAGA8a,EAAAzZ,MAAA,WACA,OAAArB,EAAA5T,EAAAsH,OACAgK,GAAAkD,KA2BAA,IAEAka,KCtPAnvB,QAAA6Q,OAAA,yBAAA,CAAA,wBAAA,6BAEAC,QAAA,SAAA,CAAA,aAAA,aAAA,cAAA,KAAA,aAAA,SAAAC,EAAAG,EAAA0d,EAAAnuB,EACAK,GAGA,IAWAiR,EANAod,EAAA,CAEAxiB,QAAA,GAEAwsB,EAAA,GACA9kB,GAAA,EA4DA,SAAAvM,EAAA85B,GACA,IAAAzS,EAAAxiB,OACA,OAAAlM,EAAAgf,OAAA,2FAEA,IAAA+I,EAAA/nB,EAAAgoB,QAiBA,OAhBAoZ,QAAAC,QAAAC,eAAAj6B,MACA,SAAA8Y,GACAA,EAAA/S,WAKAhH,QAAAqB,MAAA,4CACAsgB,EAAAhJ,YALA3Y,QAAAqB,MAAA,kCAAA0Y,EAAA4N,MACAhG,EAAAhJ,QAAAoB,EAAA4N,UAOA,SAAAnnB,GACAR,QAAAxG,MAAA,+CAAAgH,GACAmhB,EAAA/I,OAAApY,KAEAu6B,GACApZ,EAAA7jB,QAqKA,OAjPAwqB,EAAAxiB,QAAA,EAmGAwiB,EAAA6S,UAAA,CAAAj5B,KApBA,SAAAylB,EAAApP,GACA,IAAA+P,EAAAxiB,OACA,OAAAlM,EAAAgf,OAAA,mBAEA,IAAA+I,EAAA/nB,EAAAgoB,QAaA,OAZAwZ,kBACAl5B,KAAAylB,GACAprB,MAAA,WAEAgc,GACAA,IAEAoJ,EAAAhJ,aACA,WAEAgJ,EAAA/I,OAAA,CAAArhB,QAAA,4BAEAoqB,EAAA7jB,UAIAwqB,EAAA+S,OAAA,CACAC,WAlGA,SAAAn5B,GACA,OAAAmmB,EAAA+S,OAAAv1B,QAKA3D,GAAA,iBAAAA,IACAA,EAAA,CACAo5B,WAAAp5B,IAGAA,EAAAA,GAAA,GAGAhJ,QAAAqM,YAAArD,EAAAo5B,YACAlxB,EAAA,CAAA,6BAAA,6BAAA,8BACA9N,MAAA,SAAAssB,GACA,OAAAd,EAAA5pB,KAAA,CACA3C,MAAAqtB,EAAA,8BACAE,QAAA,CACA,CACApB,KAAAkB,EAAA,8BACA7X,KAAA,SACAgY,MAAA,SAAA3kB,GACA,OAAAm3B,UAAAH,OAAAI,kBAAAC,eAGA,CACA/T,KAAAkB,EAAA,6BACA7X,KAAA,yBACAgY,MAAA,SAAA3kB,GACA,OAAAm3B,UAAAH,OAAAI,kBAAAE,YAKAp/B,MAAA,SAAAg/B,GAGA,OAFAv7B,QAAAkY,KAAA,mCAAAqjB,GACAp5B,EAAAo5B,WAAAA,EACAjT,EAAA+S,OAAAC,WAAAn5B,UAKAA,EAAAy5B,QAAAz5B,EAAAy5B,SAAA,GACAz5B,EAAA05B,gBAAA15B,EAAA05B,iBAAAL,UAAAH,OAAAS,gBAAAC,SACA55B,EAAA65B,aAAA75B,EAAA65B,cAAAR,UAAAH,OAAAY,aAAAC,IACA/5B,EAAAg6B,YAAAh6B,EAAAg6B,aA9DA,IA+DAh6B,EAAAi6B,aAAAj6B,EAAAi6B,cAhEA,IAiEAC,eAAAf,WAAAn5B,KA/CAvI,EAAAgf,OAAA,mFAiGA3X,KAAA,SAAA85B,GAEA,OADA/6B,QAAAC,KAAA,6EACAgB,EAAA85B,KAGAzS,EAAAtnB,QAAA,CACA8E,QAAA,EACA7E,KAAAA,GAEAqnB,EAAAgU,SAAA,CACAx2B,QAAA,EACAmS,MAAA,WACAqQ,EAAAgU,SAAAx2B,QACAk1B,QAAAC,QAAAsB,SAAAtkB,UAKAqQ,EAAAgU,SAAAE,MAAA,CACA1vB,SAAA,CACA2vB,UAAA,SAAAC,EAAAC,EAAA7vB,GAEA4vB,EAAAA,GAAAxyB,EACA,IAAA0yB,EAAA,WACA,OAAAD,GAAA,IAAAllC,MAAA,KAAAwE,QAAA,SAAAC,EAAAoT,GACA,OAAApT,EAAAA,EAAAoT,QAAA5Q,IACAg+B,IAEAG,EAAA,SAAAl3B,GACA,IAAAm3B,GAAAH,GAAA,IAAAllC,MAAA,KACAslC,EAAAD,EAAAhnC,QAAAgnC,EAAAA,EAAAhnC,OAAA,GACAgnC,EAAA7gC,QAAA,SAAAC,EAAAoT,GACA,GAAAA,GAAAytB,EAIA,OAAA7gC,EAAAoT,GAHApT,EAAA6gC,GAAAp3B,IAIA+2B,IAiCA,OAjDA5vB,EAAAA,GAAA,IAmBAsnB,UAAAtnB,EAAAsnB,WAAA,MACAtnB,EAAAkwB,OAAAlwB,EAAAkwB,QAAA,SAAA7lC,GACA0lC,GAAAD,KAAA,IAAAzlC,IAEA2V,EAAAmwB,UACAnwB,EAAAowB,iBAAApwB,EAAAowB,kBAAA,IACApwB,EAAAqwB,WAAA,CACAC,KAAA,iBACAJ,OAAA,WACA,IAAArV,EAAAiV,KAAA,GAEAjV,EAAA5S,QAAAjI,EAAAowB,mBAAA,IAEAvV,EAAA1oB,OAAAnJ,SACA6xB,EAAA,KAEAkV,EAAAlV,EAAA7a,EAAAowB,sBAIApwB,EAAAuwB,YAAAvwB,EAAAuwB,aAAA,CACAD,KAAA,6CACAJ,OAAA,WACA,IAAArV,EAAAiV,IACAjV,GAAAA,EAAA7xB,SACA6xB,EAAAA,EAAA9C,MAAA,GAAA,GACAgY,EAAAlV,MAIA7a,KAKAwb,EAAAgV,MAAA,WACA,QAAA9B,UAAA+B,UAAAC,MAAA,0BAAAhhC,MAAAC,SAAA6gC,SAGAhV,EAAAmV,MAAA,WACA,QAAAjC,UAAA+B,UAAAC,MAAA,eAAAhhC,MAAAC,SAAA2L,GAAA,QAGAkgB,EAAArP,UAAA,WACA,IAAA9f,QAAAuC,UAAA42B,EAAArZ,WACA,IAEAqZ,EAAArZ,WAAAqP,EAAAxiB,QAAA43B,SAAA,GACA,MAAAl9B,GACA8xB,EAAArZ,WAAA,EAGA,OAAAqZ,EAAArZ,WAGAqP,EAAAqV,MAAA,WACA,OAAArV,EAAAxiB,SAAAwiB,EAAArP,aAGAqP,EAAAzZ,MAAA,WACA,OAAArB,EAAA5T,EAAAsH,OACAgK,GAAAod,EAAAla,SAGAka,EAAAla,MAAA,WAgCA,OA9BAlD,EAAAjR,IACAsC,MAAA,WAEA+rB,EAAAxiB,OAAA4V,OAAAsf,SAAAA,SAAAA,QAAAC,QAEA3S,EAAAxiB,QACAwiB,EAAA+S,OAAAv1B,SAAA01B,UAAAH,OACA/S,EAAAgU,SAAAx2B,OAAAk1B,SAAAA,QAAAC,WAAAD,QAAAC,QAAAsB,SACAjU,EAAAtnB,QAAA8E,OAAAk1B,SAAAA,QAAAC,WAAAD,QAAAC,QAAAC,iBAAA5S,EAAAmV,QACAnV,EAAA6S,UAAAr1B,OAAAk1B,SAAAA,QAAAC,WAAAD,QAAAC,QAAAE,UAEA7S,EAAAgU,SAAAx2B,QACA3M,QAAAC,OAAAkvB,EAAAgU,SAAAtB,QAAAC,QAAAsB,UAGAv8B,QAAAqB,MAAA,4GACApG,OAAAqtB,EAAA+S,OAAAv1B,OAAAwiB,EAAAtnB,QAAA8E,OAAAwiB,EAAAgU,SAAAx2B,OAAAwiB,EAAA6S,UAAAr1B,SAEAk1B,QAAA4C,cACA59B,QAAAqB,MAAA,mCAIArB,QAAAqB,MAAA,uDAGAmM,GAAA,EACAtC,EAAA,SAMAod,KCvQAnvB,QAAA6Q,OAAA,2BAAA,CAAA,QAAA,wBAEAC,QAAA,aAAA,CAAA,aAAA,KAAA,WAAA,MAAA,MAAA,aAAA,SAAAC,EAAAtQ,EAAAZ,EAAAmB,EAAAgQ,EAAA7P,GAGA,IAaA4Q,EACAoF,EAbApV,EAAA,CAEA2iC,sBAAA,CACAC,GAAA,CACAC,eAAA,WACAC,iBAAA,QAKAjhC,EAAA,GACAyQ,GAAA,EAGAC,EAAA,IAAAtD,EAAA7U,KAAA,cAMA,SAAA2oC,IACAlhC,EAAA8F,KAAA,KACA9F,EAAAvC,WAAA,KACAuC,EAAAghC,eAAA,KACAhhC,EAAAmhC,aAAA,KACAnhC,EAAAu1B,MAAA,GACAv1B,EAAA8Q,KAAA1T,EACA4C,EAAAgM,UAAA,KACAhM,EAAAihC,iBAAA,EACAxwB,GAAA,EACAtC,OAAAxM,EACA+O,EAAA1Q,KAAA4Q,MAAA+B,MAAA3S,GAGA,SAAAohC,IAGA,OAAAvkC,EAAAgQ,IAAA,CAsBAzP,EAAAiY,WAAA5X,aACA+B,MAAA,SAAAL,GAIA,OAHAa,EAAA8F,KAAA3G,EAAAqL,SACAxK,EAAAvC,WAAA0B,EACAa,EAAAihC,iBAAA9hC,EAAAkiC,WAAAliC,EAAAmiC,iBAAA,EACAniC,KAvBAK,MAAA,SAAA/B,GAEA,OAyBA8jC,EAzBA9jC,EAAA+M,SA2BArM,EAAA2iC,sBAAAS,IACAnlC,QAAA+S,MAAAnP,EAAA7B,EAAA2iC,sBAAAS,IACA1kC,EAAAsH,QAGA/G,EAAAiY,WAAAT,MAAA,CAAAA,MAAA,IACApV,MAAA,SAAAnH,GAEA2H,EAAAghC,eAAA3oC,EAAA4gB,cAEArX,OAAA,SAAA6B,GAEA,GAAAA,GAAAA,EAAAgC,QAAArI,EAAAsI,WAAA87B,gBAIA,OAHAxhC,EAAAghC,eAAA,EACAhhC,EAAAyhC,WAAA,OACAx+B,QAAAC,KAAA,8DAGA,MAAAO,KApBA,IAAA89B,KAyBAnkC,EAAAiY,WAAAC,MAAAosB,KACAliC,MAAA,SAAAL,GAEA,OAAAA,EAAA6d,OAAA2kB,OAAA5oC,OAmBA,SAAA6oC,EAAAziC,EAAA0iC,GAEA,IAAA1iC,EAAA6d,OAAA2kB,OAAA5oC,QAAA8oC,EAAA,EAEA,OADA7hC,EAAAgM,UAAAhM,EAAAvC,WAAAuC,EAAAvC,WAAAqkC,KAAA,EACA9hC,EAAAgM,UAGA,IAAA+1B,EAAA5iC,EAAA6d,OAAA2kB,OAAAE,GACA,OAAAzkC,EAAAiY,WAAAT,MAAA,CAAAA,MAAAmtB,IACAviC,MAAA,SAAAoV,GA5GA,IAAAotB,EAAAC,EA8GA,OADAjiC,EAAAgM,WA7GAg2B,EA6GAptB,EAAAstB,UA7GAD,EA6GArtB,EAAAutB,WA5GA,EAAAH,EAAAA,EAAA7nB,KAAAC,IAAA,GAAA6nB,IA6GAjiC,EAAAgM,aAEApK,OAAA,SAAA6B,GAEA,GADAR,QAAAxG,MAAA,gEAAAyB,OAAA6jC,IACAF,EAAA,EAEA,OADA5+B,QAAAxG,MAAA,2DACAmlC,EAAAziC,EAAA0iC,EAAA,GAGA,MADA7hC,EAAAgM,UAAA,KACAvI,KAnCAm+B,CAAAziC,EAAAA,EAAA6d,OAAA2kB,OAAA5oC,OAAA,IAHAiH,EAAAgM,UAAAhM,EAAAvC,WAAAuC,EAAAvC,WAAAqkC,KAAA,EACA9hC,EAAAgM,cAIApK,OAAA,SAAA6B,GAEA,MADAzD,EAAAgM,UAAA,KACAvI,KAtDAiN,EAAA1Q,KAAAoR,aAAAuT,KAAA3kB,KAEA4B,OAAA,SAAA6B,GAEA,MADAy9B,IACAz9B,KAsFA,SAAA2+B,IAEA,OAAA3xB,EACA5T,EAAAsH,KAAAnE,GAIAmO,GAAAkD,IAGA,SAAAgxB,EAAAC,GACA,OAAA,WACA,OAAA7xB,EACA5T,EAAAsH,KAAAnE,EAAAsiC,IAIAn0B,GAAAkD,IACA7R,MAAA,WACA,OAAAQ,EAAAsiC,OAKA,SAAAC,EAAAlqC,GACA,IAAAuc,EAAA,IAAA/b,EAAAR,GACAuc,EAAA4tB,YAGAv/B,QAAAqB,MAAA,kCAAAsQ,EAAAxa,OAAA,IAAAwa,EAAAva,KAAA,KAEA2F,EAAAyiC,aAAA7tB,EACA5U,EAAAyiC,aAAAC,WAAA3wB,SAAAqrB,MAAAC,OAEAr9B,EAAAiZ,WAAArE,EAAAqE,WACAjZ,EAAAmhC,aAAAvsB,EAAAusB,aAGAvsB,EAAAstB,WACAliC,EAAAgM,UAAA4I,EAAAstB,UAIAxxB,EAAA1Q,KAAA4Q,MAAA+xB,SAAA/tB,GAwBA,SAAAguB,IACA3/B,QAAAqB,MAAA,0BAZAtL,EAAAN,QAAA6a,GAAA,SAAA+H,GACAA,OAEA/H,EAAA,GAWA2tB,IAGA,SAAA2B,IAEA,OADAD,IACA3mC,EAAAoV,EAAA,KAGA,SAAAA,EAAAyxB,GACA,GAAA30B,EAAA,OAAAA,EACA,GAAAsC,EAAA,OAAA5T,EAAAsH,KAAAnE,GAEA,IAAA8iC,EACA,OAAA1lC,EAAA0U,QACAtS,MAAA,SAAAujC,GACA,OAAAA,EAAA1xB,EAAA0xB,GACA9mC,EAAAoV,EAAA,QAIApO,QAAAqB,MAAA,0BACA,IAAAqN,EAAAC,KAAAD,MA2BA,OAzBAxD,EAAA/Q,EAAA0U,QACAtS,MAAA,SAAAiR,GACA,QAAAA,GACAxU,GAAA,WAAA,OAAAoV,GAAA,KAAA,QAIA7R,KAAA4hC,GAGA5hC,MAAA,YAzDA,WACA+T,EAAA,CAEAnW,EAAAsT,IAAAI,KAAA2kB,GAAAoN,QAAA11B,EAAA01B,EAAAtqC,MAEA6E,EAAAge,UAAAxG,QAAAyG,WAAAknB,IAqDA7M,GAEAzyB,QAAAqB,MAAA,0BAAAsN,KAAAD,MAAAA,GAAA,MAEAlB,GAAA,EACAtC,EAAA,KAGAuC,EAAA1Q,KAAA4Q,MAAAkB,MAAA9R,MAEAR,MAAA,WACA,OAAAQ,KAMA,IAAAgjC,EAAAX,EAAA,gBAEA,SAAAY,EAAA1N,GAEA,OAAAyN,IAEAxjC,MAAA,SAAAijC,GAEA,IAAA9wB,EAAAI,SAAAqrB,MAAAC,OAEA,GAAA9H,EAAA,CACA,GAAAkN,GAAAA,EAAAC,YAAA/wB,EAAA8wB,EAAAC,WAAA,GAEA,OAAAD,EAGAA,GAEAx/B,QAAAC,KAAA,yGAIA,OAAA9F,EAAAiY,WAAA2D,SAAA,GACApX,OAAA,SAAA6B,GAEA,GAAAA,GAAAA,EAAAgC,OAAArI,EAAAsI,WAAAwT,iBACA,MAAA,CAAA9e,OAAA,EAAAC,KAAA+C,EAAAe,UAAAgb,gBAAAF,WAAAtH,GAEA,MAAAlO,KAEAjE,MAAA,SAAAwZ,GAGA,OAFAhZ,EAAAyiC,aAAAzpB,EACAhZ,EAAAyiC,aAAAC,WAAA/wB,EACAqH,QAoCA,OAXAtI,EAAAyB,cAAA,OAAA,SACAzB,EAAAyB,cAAA,OAAA,QACAzB,EAAAyB,cAAA,OAAA,SACAzB,EAAAyB,cAAA,OAAA,YAGA+uB,IAKA,CACApvB,MAjIA,WACA,OAAArB,EAAA5T,EAAAsH,KAAAnE,GACAmO,GAAAkD,KAgIAA,MAAAA,EACAuxB,KAAAA,EACA5iC,KAAAA,EACAuL,IAAA62B,EACAt8B,KAAAu8B,EAAA,QACA5kC,WAAA4kC,EAAA,cACAr2B,UAAAq2B,EAAA,aACApB,iBAAAoB,EAAA,oBACAhtB,WAAA,CACA2D,QAAAiqB,EACAC,UA3CA,WACA,OAAA3lC,EAAAyC,KAAA6P,qBAAA,EACAozB,GAAA,GAGAA,GAAA,GACAzjC,MAAA,SAAAwZ,GACA,IAAA5e,EAAA4e,EAAA5e,OAAAmD,EAAAyC,KAAA6P,oBACA,OAAAzV,EAAA,EAAAgD,EAAAiY,WAAAT,MAAA,CAAAA,MAAAxa,IAAA4e,OAqCAmkB,KAAA,CACAxrB,IAjCA,WACA,OAAAI,SAAAqrB,MAAAC,QAAAr9B,EAAAihC,kBAAA9iC,EAAA2iC,sBAAAC,GAAAE,oBAmCAvwB,IAAAA,EAEAsf,QAAA,WAEA,OADA/sB,QAAAC,KAAA,kGACAk/B,SCrWAhmC,QAAA6Q,OAAA,sBAAA,CAAA,QAAA,uBAAA,6BAEAC,QAAA,MAAA,CAAA,KAAA,UAAA,aAAA,WAAA,WAAA,MAAA,SAAA,UAAA,WAAA,aAAA,UAAA,SAAA,SAAArQ,EAAAE,EAAAoQ,EAAAlR,EAAAgB,EAAAmQ,EAAA5P,EAAAL,EAAAG,EAAAC,EAAAs7B,EAAA5lB,GAGA,SAAA7V,EAAA47B,EAAA1f,EAAAT,EAAAsqB,GAEA,IA+DA5vB,EA9DApZ,EAAA6+B,EAAA,UAAA96B,OAAA86B,EAAA1f,IAAAT,EAAA,MAAA,OAAA,UAEAhe,EAAA,sEAEAuoC,EAAA,UAAAvoC,EAAA,OAOAwoC,EAAA,oBAEAC,EAAA,6EACA5yB,EAAA,CACAtT,IAAA,oBACAmmC,KAAA,OACAC,KAAA,OACAC,OAAA,SACAC,QAAA,WAEAzoC,EAAA,CACA0oC,QAAA,iBACAC,SAAA,iBACAxlC,OAAAvD,EACAwD,qBAAA,IAAAxD,EAAA,sEACAgpC,QAAA,oDACAC,sBAAA,qDAEAC,YAAA,oCAAAlpC,EAAA,wDACAmpC,cAAA,gDAAAnpC,EAAA,0BACAopC,aAAAvzB,EAAAtT,IAAAkmC,EACAY,cAAAxzB,EAAA6yB,KAAAD,EACAa,cAAAzzB,EAAA8yB,KAAA,iBAAAF,EACAc,gBAAA1zB,EAAA+yB,OAAA,yDACAY,iBAAA3zB,EAAAgzB,QAAA,kFAmBAvlC,EAAA,CACAmmC,iBAAA,GACAnrB,gBAAA,mEACAorB,oBAAA,EACAC,oBAAA,IACAvpC,OAAAA,EACAyV,IAAAA,GAGApY,EAAAC,KAqBA,SAAAgH,EAAAy5B,EAAA1f,EAAAT,GACAvgB,EAAAmY,SAAAnY,EAAAsqC,OACAtqC,EAAAyqC,OAAA,EAGAxlC,EAAAyC,MAAAzC,EAAAyC,KAAA8Q,OACAkoB,EAAAA,GAAAz7B,EAAAyC,KAAA8Q,KAAAkoB,KACA1f,EAAAA,GAAA/b,EAAAyC,KAAA8Q,KAAAwI,KAEAT,EAAAzc,QAAAuC,UAAAka,GAAAA,EAAA,KAAAS,GAAA/b,EAAAyC,KAAA8Q,KAAA+H,QAAAvgB,EAAAmsC,aAGAzL,IAGA1gC,EAAA0gC,KAAAA,EACA1gC,EAAAghB,KAAAA,GAAA,GACAhhB,EAAAugB,OAAAzc,QAAAuC,UAAAka,GAAAA,EAAA,KAAAvgB,EAAAghB,MAAAhhB,EAAAmsC,YACAnsC,EAAA2f,OAAAhF,EAAAuF,UAAAwgB,EAAA1f,GACAhhB,EAAAi6B,IAAAtf,EAAAgmB,OAAAD,EAAA1f,EAAA,GAAAT,IAGA,SAAA6rB,EAAA5e,GACA,OAAA,IAAAC,OAAA,IAAAD,EAAA,KAGA,SAAAD,EAAAC,GACA,OAAA,IAAAC,OAAAD,GAGA,SAAA6e,IACArsC,EAAAqzB,MAEA1oB,QAAAC,KAAA,mCACAlK,EAAAP,KAAAH,EAAAqzB,IAAAiZ,UAAA,IAAAlsC,SAAA,SAAAC,GACAL,EAAAqzB,IAAAiZ,SAAAjsC,GACAuiB,WAEA5iB,EAAAqzB,IAAAiZ,SAAA,IAaA,SAAAr5B,EAAAgH,EAAAsyB,GAEAA,EAAAvsC,EAAA6qC,UAAA0B,GAAA,EACA,IAAAC,EAAAvyB,GAAAsyB,EAAA,IAAAA,EAAA,IAEAE,EAAA,SAAAzlC,GAEA,IAAAhH,EAAAmY,QAIA,OAHAnY,EAAA0sC,eACA/hC,QAAAC,KAAA,uDAAAhF,OAAAqU,IAEAja,EAAAwZ,QAAAtS,MAAA,WACA,OAAAulC,EAAAzlC,MAIA,IAAA2lC,EAAA3sC,EAAAqzB,IAAArZ,UAAAwyB,GACAG,IAEAA,EADAJ,EACA5xB,EAAAwnB,aAAAniC,EAAA0gC,KAAA1gC,EAAAghB,KAAA/G,EAAAja,EAAAugB,OAAAgsB,EAAA,KAAA,KAzJA,QA4JA5xB,EAAA1H,IAAAjT,EAAA0gC,KAAA1gC,EAAAghB,KAAA/G,EAAAja,EAAAugB,QAEAvgB,EAAAqzB,IAAArZ,UAAAwyB,GAAAG,GAEA,IAAAC,EAAA,EACA,OAAAD,EAAA3lC,GACAsC,OAAA,SAAA6B,GAEA,GAAAA,GAAAA,EAAAgC,QAAA8lB,EAAA7lB,WAAAyP,iBAEA+vB,GAAA3Z,EAAAptB,UAAAomC,oBAOA,OANA,IAAAW,IACAjiC,QAAAC,KAAA,yDAEA/F,EAAAZ,QAAAu0B,OAAA,CAAA/E,SAAA,yBAGA9vB,GAAA,WAEA,OADAipC,IACAD,EAAA3lC,KACAisB,EAAAptB,UAAAqmC,qBAGA,MAAA/gC,MAIA,OAAAshC,EAGA,SAAAlK,EAAAtoB,GACA,IAAA4yB,EAAA,SAAA1yB,EAAAnT,GACA,IAAAhH,EAAAmY,QAIA,OAHAnY,EAAA0sC,eACA/hC,QAAAxG,MAAA,+CAAAyB,OAAAqU,IAEAja,EAAAwZ,QAAAtS,MAAA,WACA,OAAA2lC,EAAA1yB,EAAAnT,MAIA,IAAA2lC,EAAA3sC,EAAAqzB,IAAAyZ,WAAA7yB,GAKA,OAJA0yB,IACAA,EAAAhyB,EAAA4nB,KAAAviC,EAAA0gC,KAAA1gC,EAAAghB,KAAA/G,EAAAja,EAAAugB,QACAvgB,EAAAqzB,IAAAyZ,WAAA7yB,GAAA0yB,GAEAA,EAAAxyB,EAAAnT,IAGA,OAAA6lC,EAGA,SAAApK,EAAAxoB,GACA,OAAA,WACA,IAAAoqB,EAAArkC,EAAAqzB,IAAAiZ,SAAAryB,GAWA,OAVAoqB,IAAAA,EAAAF,cACAE,EAAA1pB,EAAA8nB,GAAAziC,EAAA0gC,KAAA1gC,EAAAghB,KAAA/G,EAAAja,EAAAugB,SAGAmjB,QAAA,kBACA1jC,EAAAqzB,IAAAiZ,SAAAryB,IAGAja,EAAAqzB,IAAAiZ,SAAAryB,GAAAoqB,GAEAA,GA0DA,SAAAvH,EAAArlB,GAEA9T,GAAA,WACAsvB,EAAApmB,KAAA4K,EAAAe,QACA,KA3NAxY,EAAAqzB,IAAA,CACArZ,UAAA,GACA8yB,WAAA,GACAR,SAAA,IAEAtsC,EAAAoY,IAAA,IAAAtD,EAAA7U,KAAA,OAAA4B,GACA7B,EAAAmY,SAAA,EACAnY,EAAAiH,KAAAA,EAGAjH,EAAAmsC,eAAA,SAAAnnC,EAAA2R,YAAA,IAAA3R,EAAA2R,WAAA,UAAA3R,EAAA2R,WACAlS,EAAAqW,UAAA,WAAArW,EAAAqW,SAAAC,UACA/a,EAAAmsC,aACAxhC,QAAAqB,MAAA,0DAGA00B,GAAAz5B,EAAAy5B,EAAA1f,EAAAT,GACAvgB,EAAA6qC,UAAA/mC,QAAAuC,UAAAwkC,IAAAA,EAgJA7qC,EAAA+sC,QAAA,SAAAv0B,GAMA,OALAA,EAAAA,GAAAxY,EAKA2a,EAAA1H,IAAAuF,EAAAkoB,KAAAloB,EAAAwI,KAAA,gBAAAxI,EAAA+H,OAAA5F,GACAzT,MAAA,SAAAnH,GACA,IAAAuD,EAAAvD,GAAAA,EAAAohB,SAAAphB,EAAAohB,QAAA7d,SACA2hC,GAAA,EAaA,MAVA,YAAA3hC,GAAAvD,EAAAohB,QAAA5d,QACA0hC,EAAAtqB,EAAApX,QAAA0hC,aAAAhgC,EAAAyC,KAAA0O,WAAArW,EAAAohB,QAAA5d,SAIAoH,QAAAqB,MAAA,yEAAApG,OAAAtC,GAAA,IAAAvD,EAAAohB,QAAA5d,SAAA,MAEA0hC,GACAt6B,QAAAxG,MAAA,6DAAAyB,OAAAtC,EAAAvD,EAAAohB,QAAA5d,QAAA0B,EAAAyC,KAAA0O,aAEA6uB,KAEA37B,OAAA,WACA,OAAA,MAoCAtJ,EAAA8Z,UAAA,WACA,OAAA9Z,EAAAmY,SAGAnY,EAAAwZ,MAAA,WACA,OAAAxZ,EAAAmY,QAAA5T,EAAAsH,KAAA7L,EAAAyqC,OACAzqC,EAAA0sC,eAAA1sC,EAAA+Y,SAGA/Y,EAAA+Y,MAAA,WACA,GAAA/Y,EAAA0sC,cAAA,OAAA1sC,EAAA0sC,cACA,GAAA1sC,EAAAmY,QAAA,OAAA5T,EAAAsH,KAAA7L,EAAAyqC,OAEA,IAAAzqC,EAAA0gC,KACA,OAAAz7B,EAAAuU,QACAtS,MAAA,WAMA,OALAlH,EAAAiH,OAGAjH,EAAA6qC,UAAA,EAEA7qC,EAAA+Y,WAIApO,QAAAqB,MAAA,mCAAApG,OAAA5F,EAAA2f,OAAA3f,EAAAugB,SACA,IAAAlH,EAAAC,KAAAD,MA0BA,OAxBArZ,EAAA0sC,cAAAnoC,EAAAgQ,IAAA,CACAtP,EAAAuU,QACAxZ,EAAA+sC,YAEA7lC,MAAA,SAAAL,GAEA,OADA7G,EAAAyqC,MAAA5jC,EAAA,GACA7G,EAAAyqC,OAQAxvB,GAAAA,EAAAxa,QAxDA,WACAwa,EAAA,CAEAhW,EAAAmT,IAAA1Q,KAAAy1B,GAAA5kB,QAAA1D,EAAAioB,EAAA78B,OAsDAm9B,GAEAzyB,QAAAqB,MAAA,qBAAAsN,KAAAD,MAAAA,GAAA,MAEArZ,EAAAoY,IAAAI,KAAAF,MAAAS,QACA/Y,EAAAmY,SAAA,SACAnY,EAAA0sC,eACA,IAfA/hC,QAAAxG,MAAA,0CAAAyB,OAAA5F,EAAA2f,SACA3f,EAAAmY,SAAA,SACAnY,EAAA0sC,eACA,MAcA1sC,EAAA0sC,eAGA1sC,EAAAsqC,KAAA,WACA,OAAAtqC,EAAAmY,SAAAnY,EAAA0sC,eAEA/hC,QAAAqB,MAAA,qBA9EAtL,EAAAN,QAAA6a,GAAA,SAAA+H,GACAA,OAEA/H,EAAA,UA8EAjb,EAAA0sC,cAEA1sC,EAAAyqC,OACA4B,IAjOA1hC,QAAAqB,MAAA,0CAAApG,OA7HA,SA8HA26B,EAAA/C,MA9HA,QAiIAx9B,EAAAqzB,IAAArZ,UAAA,GACAha,EAAAqzB,IAAAyZ,WAAA,GACA9sC,EAAAqzB,IAAAiZ,SAAA,GA6NAtsC,EAAAyqC,OAAA,EACAzqC,EAAAmY,SAAA,EACAnY,EAAAoY,IAAAI,KAAAF,MAAAgyB,QAGAtqC,EAAAmY,SAAA,EAEA5T,EAAAsH,QAjBAtH,EAAAsH,QAoBA7L,EAAAuqC,QAAA,WAEA,OADAvqC,EAAAsqC,OACA3mC,EAAA3D,EAAA+Y,MAAA,KACA7R,MAAA,SAAAujC,GAIA,OAHAA,GACAzqC,EAAAoY,IAAAI,KAAAF,MAAAiyB,UAEAE,MAIAzqC,EAAAoY,IAAAyB,cAAA,OAAA,SACA7Z,EAAAoY,IAAAyB,cAAA,OAAA,QACA7Z,EAAAoY,IAAAyB,cAAA,OAAA,WAEA,IAAAoZ,EAAA,CACA7lB,WAtVA,CACA4/B,8BAAA,KACAnwB,gBAAA,KACAowB,sBAAA,KACAC,qBAAA,KACAC,iBAAA,KACAC,mBAAA,KACAC,4BAAA,KACAC,2BAAA,KACAC,wBAAA,KACA3sB,iBAAA,KACAsoB,gBAAA,KACAsE,wBAAA,KACAC,4BAAA,KACAC,qCAAA,KACAC,qBAAA,MAwUA9nC,UAAAA,EACAlD,OAAA,CACA0oC,QAAAe,EAAAzpC,EAAA0oC,SACAE,QAAAa,EAAAzpC,EAAA4oC,SACAzlC,OAAAsmC,EAAAzpC,EAAAmD,QACAC,qBAAAqmC,EAAAzpC,EAAAoD,sBACAulC,SAAAc,EAAAzpC,EAAA2oC,UACAsC,IAAAxB,EAAAzpC,EAAAirC,KACAjC,aAAAS,EAAAzpC,EAAAgpC,cACAC,cAAAQ,EAAAzpC,EAAAipC,eACAC,cAAAO,EAAAzpC,EAAAkpC,eACAC,gBAAAM,EAAAzpC,EAAAmpC,iBACAC,iBAAAK,EAAAzpC,EAAAopC,kBAEA8B,cAAAzB,EAAAtB,GACAgD,mBAAAvgB,EAnYAud,0JAoYAiD,2BAAAxgB,EAAAwd,EAAA,eAAAA,EAAA,OACAiD,0BAAAzgB,EAAAwd,EAAA,mBAAAA,EAAA,OACAkD,cAAA1gB,EAAAwd,GACAmD,uBAAA3gB,EAnYAwd,2DAoYAoD,0BAAA5gB,EAAA,OAAAwd,EAAA,QACAqD,oBAAA7gB,EAvYA8gB,yUAyYA71B,KAAA,CACA0I,QAAAjO,EAAA,gBAAAstB,EAAA16B,UAAAu2B,MACAkS,KAtJA,SAAAC,GAIA,OAHAA,EAAAA,GAAA,IACAhuB,OAAAzc,QAAAuC,UAAAkoC,EAAAhuB,QAAAguB,EAAAhuB,OAAAguB,EAAAvtB,MAAA,KAAAutB,EAAAvtB,KAEAhhB,EAAA0gC,OAAA6N,EAAA7N,QAEA1gC,EAAAghB,OAAAutB,EAAAC,OAAAxuC,EAAAghB,MAAAutB,EAAAC,OAAA,KAEAxuC,EAAAugB,SAAAguB,EAAAhuB,QA+IA4rB,YAAAnsC,EAAAmsC,aAEA/5B,QAAA,CACAq8B,QAAA,CACA7L,KAAA3vB,EAAA,oBACAiI,MAAAjI,EAAA,2BAEAiI,MAAAjI,EAAA,kBACAuJ,KAAA,CACAqG,KAAA5P,EAAA,sBACAwJ,MAAAxJ,EAAA,yBAGAnB,IAAA,CACA48B,OAAAz7B,EAAA,uBACA07B,YAAA17B,EAAA,4BAAAstB,EAAA16B,UAAAy2B,OACAsS,aAAA37B,EAAA,6BAAAstB,EAAA16B,UAAAy2B,OACAlhB,OAAA,CACA7G,IAAAtB,EAAA,eAAAstB,EAAA16B,UAAAu2B,MACAyS,QAAA57B,EAAA,eAAAstB,EAAA16B,UAAAy2B,QAEAzoB,aAAA,SAAA7M,EAAAi2B,GAEA,OAAA,IAAAA,EAAAhK,EAAAI,IAAAvhB,IAAA+B,aAAA7M,GACAisB,EAAAI,IAAAvhB,IAAAg9B,sBAAA9nC,IAEA+nC,IAAAxM,EAAA,YACAyM,QAAAzM,EAAA,gBACA0M,OAAA1M,EAAA,gBAEAxlB,WAAA,CACA5X,WAAA8N,EAAA,yBAAAstB,EAAA16B,UAAAs2B,WACA7f,MAAArJ,EAAA,2BAAAstB,EAAA16B,UAAAy2B,OACA4S,YAAAj8B,EAAA,mCACAyN,QAAA,SAAAuc,GAEA,OAAA,IAAAA,EAAAhK,EAAAI,IAAAtW,WAAA2D,UAAAuS,EAAAI,IAAAtW,WAAAoyB,oBAEAC,WAAA7M,EAAA,0BACAvlB,MAAA,CACAosB,GAAAn2B,EAAA,sBAAAstB,EAAA16B,UAAAw2B,QACAhrB,GAAA4B,EAAA,uBACAo8B,UAAAp8B,EAAA,6BAAAstB,EAAA16B,UAAAw2B,QACApb,SAAAhO,EAAA,gCACAmJ,aAAAnJ,EAAA,8BAGA5B,GAAA,CACAi+B,QAAAr8B,EAAA,sBAAAstB,EAAA16B,UAAAy2B,OACA+L,QAAA9F,EAAA,eACAgN,QAAA,CACAh7B,IAAA,SAAAvN,GACA,OAAAisB,EAAAI,IAAAhiB,GAAAk+B,QAAAh7B,IAAAvN,GACAE,MAAA,SAAAL,GAKA,OAJAA,EAAA0oC,QAAA1oC,EAAA0oC,SAAA,GAEA1oC,EAAA0oC,QAAAC,QAAA,GACA3oC,EAAA0oC,QAAAE,SAAA,GACA5oC,MAGA6oC,MAAA,SAAA1oC,EAAAi2B,GAEA,QAAA,IAAAA,EAAAhK,EAAAI,IAAAhiB,GAAAk+B,QAAAG,MAAA1oC,GAAAisB,EAAAI,IAAAhiB,GAAAk+B,QAAAI,eAAA3oC,IACAE,MAAA,SAAAL,GAKA,OAJAA,EAAA0oC,QAAA1oC,EAAA0oC,SAAA,GAEA1oC,EAAA0oC,QAAAC,QAAA,GACA3oC,EAAA0oC,QAAAE,SAAA,GACA5oC,MAGAwiC,OAAAp2B,EAAA,uCAAAstB,EAAA16B,UAAAu2B,MACAyS,QAAA57B,EAAA,iCAGAm2B,GAAA,CACAmG,QAAAt8B,EAAA,wBAEAnH,IAAA,GACAvI,QAAA,GACA8vB,IAAA,CACAtW,WAAA,CACAoyB,iBAAAl8B,EAAA,sBAAAstB,EAAA16B,UAAAy2B,OACA5b,QAAAzN,EAAA,wBAEAnB,IAAA,CACAg9B,sBAAA77B,EAAA,4BAAAstB,EAAA16B,UAAAu2B,MACAvoB,aAAAZ,EAAA,8BAEA5B,GAAA,CACAk+B,QAAA,CACAI,eAAA18B,EAAA,sCAAAstB,EAAA16B,UAAAu2B,MACAsT,MAAAz8B,EAAA,uCACAsB,IAAAtB,EAAA,2BAMAggB,EAAA5hB,GAAAu+B,qBAAA,SAAAC,GAaA,IAVA,IAEAC,EACAC,EACAC,EACAC,EALAC,EAAAL,EACAM,EAAA,GAKAC,EAAA,GAGA1tC,EAAAuwB,EAAAtwB,OAAAmrC,mBAAAjrC,KAAAqtC,GACAxtC,GACAotC,EAAA,GACAC,EAAA,OAAAI,EAAA1vC,OAAA,IACAqvC,EAAAn0B,KAAAu0B,EAAAx2B,OAAAhX,EAAAsN,MAAAtN,EAAA,GAAAgd,QAAA,MACAowB,EAAAx/B,MAAA5N,EAAA,IAAAA,EAAA,IAAAA,EAAA,IAAAA,EAAA,GACAytC,EAAAzyB,KAAAoyB,GAEAM,EAAAN,EAAAn0B,MAAAy0B,EAAAN,EAAAn0B,SAAA,EAEAu0B,EAAAA,EAAAhP,QAAAx+B,EAAA,GAAAqtC,GACArtC,EAAAuwB,EAAAtwB,OAAAmrC,mBAAAjrC,KAAAqtC,GAIA,IADA,IAAAG,GAAA,EACAA,GAAA,CAIA,IADAA,KADA3tC,EAAAuwB,EAAAtwB,OAAAorC,2BAAAlrC,KAAAqtC,IAEAxtC,GAAA,CASA,IARAotC,EAAA,GACAC,EAAA,OAAAI,EAAA1vC,OAAA,IACAqvC,EAAAn0B,KAAA,MACAm0B,EAAAQ,SAAA,GACAH,EAAAzyB,KAAAoyB,GAEAE,EAAAttC,EAAA,GACAutC,EAAAhd,EAAAtwB,OAAAsrC,cAAAprC,KAAAmtC,GACAC,GAEAH,EAAAQ,SAAA5yB,KAAAyyB,EAAAF,EAAA,KACAD,EAAAA,EAAA9O,QAAA+O,EAAA,GAAA,IACAA,EAAAhd,EAAAtwB,OAAAsrC,cAAAprC,KAAAmtC,GAGAE,EAAAA,EAAAhP,QAAAx+B,EAAA,GAAAqtC,GACArtC,EAAAuwB,EAAAtwB,OAAAorC,2BAAAlrC,KAAAmtC,GAOA,IAFAttC,EAAAuwB,EAAAtwB,OAAAqrC,0BAAAnrC,KAAAqtC,GACAG,EAAAA,KAAA3tC,EACAA,GAAA,CASA,IARAotC,EAAA,GACAC,EAAA,OAAAI,EAAA1vC,OAAA,IACAqvC,EAAAn0B,KAAA,KACAm0B,EAAAQ,SAAA,GACAH,EAAAzyB,KAAAoyB,GAEAE,EAAAttC,EAAA,GACAutC,EAAAhd,EAAAtwB,OAAAsrC,cAAAprC,KAAAmtC,GACAC,GACAH,EAAAQ,SAAA5yB,KAAAyyB,EAAAF,EAAA,KACAD,EAAAA,EAAA9O,QAAA+O,EAAA,GAAA,IACAA,EAAAhd,EAAAtwB,OAAAsrC,cAAAprC,KAAAmtC,GAGAE,EAAAA,EAAAhP,QAAAx+B,EAAA,GAAAqtC,GACArtC,EAAAuwB,EAAAtwB,OAAAorC,2BAAAlrC,KAAAqtC,GAMA,IAFAxtC,EAAAuwB,EAAAtwB,OAAAwrC,0BAAAtrC,KAAAqtC,GACAG,EAAAA,KAAA3tC,EACAA,GACAwtC,EAAAA,EAAAhP,QAAAx+B,EAAA,GAAAA,EAAA,IACAA,EAAAuwB,EAAAtwB,OAAAwrC,0BAAAtrC,KAAAqtC,GAKA,GAAA,KADAE,EAAA1vC,EAAAP,KAAAiwC,IACA3vC,OAKA,OADAkK,QAAAqB,MAAA,+CAAA8jC,GACA,CACAS,gBAAAH,EACAI,WAAAV,GANAnlC,QAAAxG,MAAA,uCAAAssC,SAUAxd,EAAAza,KAAAyH,cAAA,SAAA3E,EAAAo1B,GAEA,IAAAhuC,EAAAuwB,EAAAtwB,OAAAgpC,aAAA9oC,KAAAyY,GACA,OAAA5Y,EACA,CACAyd,IAAAzd,EAAA,IAAA,GACAiuC,KAAAjuC,EAAA,IAAA,GACAkuC,KAAAluC,EAAA,IAAA,GACAse,KAAAte,EAAA,IAAA,GACA6d,OAAA7d,EAAA,IAAA,KAAAA,EAAA,GACAuX,KAAAvX,EAAA,IACAmd,QAAA,IAIAnd,EAAAuwB,EAAAtwB,OAAAipC,cAAA/oC,KAAAyY,IAEA,CACA6E,IAAAzd,EAAA,IAAA,GACAiuC,KAAAjuC,EAAA,IAAA,GACAkuC,KAAAluC,EAAA,IAAA,GACAse,KAAAte,EAAA,IAAA,GACA6d,QAAA,EACAtG,KAAAvX,EAAA,IACAmd,QAAA,IAIAnd,EAAAuwB,EAAAtwB,OAAAmpC,gBAAAjpC,KAAAyY,IAEA,CACA6E,IAAAzd,EAAA,IAAA,GACAse,KAAAte,EAAA,IAAA,GACA6d,QAAA,EACAvd,QAAA,EACA6c,QAAA,IAIAnd,EAAAuwB,EAAAtwB,OAAAkpC,cAAAhpC,KAAAyY,IAEA,CACAjY,OAAAX,EAAA,IAAA,GACAyd,IAAAzd,EAAA,IAAA,GACAiuC,KAAAjuC,EAAA,IAAA,GACAkuC,KAAAluC,EAAA,IAAA,GACAse,KAAAte,EAAA,IAAA,GACA6d,OAAA7d,EAAA,IAAA,KAAAA,EAAA,GACAuX,KAAAvX,EAAA,KAAA,GACA8b,SAAA,IAIA9b,EAAAuwB,EAAAtwB,OAAAopC,iBAAAlpC,KAAAyY,IAEA,CACAjY,OAAAX,EAAA,IAAA,GACAyd,IAAAzd,EAAA,IAAA,GACAse,KAAAte,EAAA,IAAA,GACAuX,KAAAvX,EAAA,IAAA,GACA6d,QAAA,EACAvd,QAAA,EACAwb,SAAA,GAKAkyB,IACAhuC,EAAA0pC,EAAAsE,EAAA1F,GAAAnoC,KAAAyY,IAEA,CACA6E,IAAAzd,EAAA,IAAA,GACAiuC,KAAAjuC,EAAA,IAAA,GACAkuC,KAAAluC,EAAA,IAAA,GACAse,KAAAte,EAAA,IAAA,GACA6d,OAAA7d,EAAA,IAAA,KAAAA,EAAA,GACAuX,KAAAvX,EAAA,IACAmd,QAAA,QAVA,GAiBAoT,EAAApmB,KAAA,SAAAgkC,GAIA,GAFAl2B,EAAAgmB,OAAAkQ,EAAAnQ,KAAAmQ,EAAA7vB,KAAA,GAAA6vB,EAAAtwB,UACAvgB,EAAAi6B,IACA,CACA,IAAA6W,EAAA9wC,EAAAmY,QAGA,GAFA24B,GAAA9wC,EAAAsqC,OACAtqC,EAAAiH,KAAA4pC,EAAAnQ,KAAAmQ,EAAA7vB,KAAA6vB,EAAAtwB,OAAAvgB,EAAA6qC,UACAiG,EACA,OAAAntC,GAAA,WACA,OAAA3D,EAAA+Y,QACA7R,MAAA,SAAAujC,GAIA,OAHAA,GACAzqC,EAAAoY,IAAAI,KAAAF,MAAAiyB,UAEAE,OAEA,OAKAxX,EAAAnhB,IAAAsJ,OAAAqC,KAAA,WACA,OAAAwV,EAAAnhB,IAAAsJ,OAAA7G,MACArN,MAAA,SAAAL,GACA,OAAAA,EAAAkqC,QAAAnqC,QAAA,SAAAC,EAAAuU,GAEA,OADAvU,EAAAuU,EAAA7Y,QAAA6Y,EAAA3U,IACAI,IACA,QAIAosB,EAAAnhB,IAAAsJ,OAAAnI,IAAA,SAAA1Q,GACA,OAAA0wB,EAAAnhB,IAAAsJ,OAAAqC,OACAvW,MAAA,SAAA8pC,GACA,IAAAvqC,EAAAuqC,EAAAzuC,GACA,MAAA,CACAA,OAAAA,EACAkE,IAAAA,GAAA,UAKAwsB,EAAAnhB,IAAAsJ,OAAA61B,SAAA,SAAAxqC,GACA,OAAAwsB,EAAAnhB,IAAAsJ,OAAA7G,MACArN,MAAA,SAAAL,GACA,OAAAnG,EAAAiM,UAAA9F,EAAAkqC,QAAA,CAAAtqC,IAAAA,QAQAwsB,EAAAlW,WAAAssB,OAAA,SAAA6H,GACA,OAAAje,EAAAI,IAAA8d,iBAAAle,EAAAlW,WAAAT,MAAA,QAAA40B,IAOAje,EAAA7gB,QAAAq8B,QAAA2C,cAAA,SAAAC,GACA,OAAApe,EAAAI,IAAA8d,iBAAAle,EAAA7gB,QAAAq8B,QAAAvzB,MAAA,OAAAm2B,EAAA,EAAA,KAGApe,EAAAI,IAAA8d,iBAAA,SAAAG,EAAAC,EAAAC,EAAArkB,EAAA1f,GAGA,OAFA0f,EAAArpB,QAAAuC,UAAA8mB,GAAAA,EAAA,EACA1f,EAAAA,GAAAwlB,EAAAptB,UAAAomC,oBACA1nC,GAAA,SAAA+e,EAAAC,GACA,IAAAmB,EAAA,GACA9G,EAAA,GACAld,EAAA0Z,KAAAo3B,EAAAhiB,MAAArC,EAAAA,EAAA1f,IAAA,SAAAgkC,GACA,IAAAC,EAAA,GACAA,EAAAH,GAAAE,EACA7zB,EAAAF,KACA4zB,EAAAI,GACAxqC,MAAA,SAAAL,GACAA,GACA6d,EAAAhH,KAAA7W,UAKAtC,EAAAgQ,IAAAqJ,GACA1W,MAAA,WACAimB,EAAAqkB,EAAA/wC,OAAA,EACAkD,GAAA,WACAsvB,EAAAI,IAAA8d,iBAAAG,EAAAC,EAAAC,EAAArkB,EAAA1f,EAAAA,GACAvG,MAAA,SAAAL,GACAA,GAAAA,EAAApG,OAKA6iB,EAAAoB,EAAA5d,OAAAD,IAJAyc,EAAAoB,MAMApb,OAAA,SAAA6B,GACAoY,EAAApY,QAEA8nB,EAAAptB,UAAAqmC,qBAGA5oB,EAAAoB,MAGApb,OAAA,SAAA6B,GACAA,GAAAA,EAAAgC,QAAA8lB,EAAA7lB,WAAAyP,gBACAyG,EAAAoB,GAGAnB,EAAApY,UAMA8nB,EAAAI,IAAAse,6BAAA,SAAA9uC,GACA,OAAAA,IACAyG,OAAA,SAAA6B,GAEA,GAAAA,GAAAA,EAAAgC,OAAA8lB,EAAA7lB,WAAAyP,gBACA,OAAAlZ,GAAA,WAEA,OAAAsvB,EAAAI,IAAAse,6BAAA9uC,KACAowB,EAAAptB,UAAAqmC,yBAKAjZ,EAAAlW,WAAA60B,OAAA,WACA,OAAA3e,EAAAlW,WAAAC,MAAAosB,KACAliC,MAAA,SAAAL,GACA,IAAAA,EAAA6d,OAAA2kB,SAAAxiC,EAAA6d,OAAA2kB,OAAA5oC,OACA,OAAA,KAEA,IAAAgpC,EAAA5iC,EAAA6d,OAAA2kB,OAAAxiC,EAAA6d,OAAA2kB,OAAA5oC,OAAA,GACA,OAAAwyB,EAAAlW,WAAAT,MAAA,CAAAA,MAAAmtB,IACAviC,MAAA,SAAAoV,GACA,OAAAA,EAAAutB,SAAA,EAAAvtB,EAAAstB,SAAA/nB,KAAAC,IAAA,GAAAxF,EAAAutB,UAAAvtB,EAAAstB,gBAKA3W,EAAAnnB,IAAAC,MAAA,SAAAD,GACA,OAAAvH,GAAA,SAAA+e,EAAAC,GACA,IAAAhhB,EAGA,GAAA6pC,EAAAzpC,EAAAmD,QAAAynB,KAAAzhB,GACAwX,EAAA,CACA/gB,OAAAuJ,SAIA,GAAAsgC,EAAAzpC,EAAAoD,sBAAAwnB,KAAAzhB,GAAA,CACAnB,QAAAqB,MAAA,iDAAAF,GACA,IAAApJ,EAAAuwB,EAAAtwB,OAAAoD,qBAAAlD,KAAAiJ,GACAvJ,EAAAG,EAAA,GACA,IAAAsH,EAAAtH,EAAA,GACAiI,QAAAqB,MAAA,mCAAAzJ,EAAA,oBAAAyH,EAAA,KACA,IAAAylB,EAAA9qB,EAAAsE,KAAAa,WAAAvH,GACAoI,QAAAqB,MAAA,iDAAAyjB,EAAA,KACAzlB,GAAAylB,EACAlM,EAAA,CAAArhB,QAAA,kCAGAohB,EAAA,CACA/gB,OAAAA,SAIA,GAAAuJ,EAAAzJ,WAAA,cAAA,CACA,IACAoE,EADA26B,EAAAzmB,EAAA7O,IAAAC,MAAAD,GAEAoG,GAAA,IAAAkvB,EAAAV,KAAAhhB,QAAA,KAAA0hB,EAAAV,KAAA,KACAA,GAAA,IAAAU,EAAAV,KAAAhhB,QAAA,KAAA0hB,EAAAV,KAAA,KAUA,GATAU,EAAA14B,WACA04B,EAAAz4B,UACAlC,EAAA26B,EAAA14B,SACAnG,EAAA6+B,EAAAz4B,UAGApG,EAAA6+B,EAAA14B,UAGA04B,EAAAC,SAAA,CACA,IAAAoG,EAAArG,EAAAC,SAAAj/B,MAAA,KACAyvC,EAAApK,EAAAA,EAAAhnC,OAAA,EACAuP,EAAA,EAUA,IATAkC,GAAA2/B,EAAA7hC,IACAkC,EAAAu1B,EAAAz3B,OAEAzN,GAAAsvC,EAAA7hC,IACAzN,EAAAklC,EAAAz3B,OAEAvJ,GAAAorC,EAAA7hC,IACAvJ,EAAAghC,EAAAz3B,MAEA6hC,EAAA7hC,EACA,YAAAuT,EAAA,CAAArhB,QAAA,mEAAAk/B,EAAAC,WAIA,GAAAnvB,EA8BA,OATAwuB,GACApd,EAAA,CACA7c,IAAAA,EACAlE,OAAAA,EACA2P,SAAAA,IAKAyI,EAAA1H,IAAAytB,EAAA,yBAAA/lB,GACAzT,MAAA,SAAA/B,GACAA,EAAA+M,WAAAA,EAGAoR,EAAA,CACA7c,IAAAA,EACAlE,OAAAA,EACAm+B,KAAAA,EACAxuB,SAAAA,IANAqR,EAAA,CAAArhB,QAAA,oBAAAiD,EAAA+M,SAAA,sCAAAA,EAAA,UASA5I,OAAA,SAAA6B,GACAR,QAAAxG,MAAAgH,GACAoY,EAAA,CAAArhB,QAAA,oEA3CA,IAAAw+B,EAgBA,YAAAnd,EAAA,CAAArhB,QAAA,qEAfAyY,EAAA1H,IAAAytB,EAAA,yBAAA/lB,GACAzT,MAAA,SAAA/B,GACAme,EAAA,CACA7c,IAAAA,EACAlE,OAAAA,EACAm+B,KAAAA,EACAxuB,SAAA/M,EAAA+M,cAGA5I,OAAA,SAAA6B,GACAR,QAAAxG,MAAAgH,GACAoY,EAAA,CAAArhB,QAAA,yEAoCAyI,QAAAqB,MAAA,oCAAAF,GACAyX,EAAA,CAAArhB,QAAA,gCAKAgF,MAAA,SAAAwd,GACA,GAAAA,EAAA,CACA,GAAAA,EAAAniB,SAAA6pC,EAAAzpC,EAAAmD,QAAAynB,KAAA7I,EAAAniB,QACA,KAAA,CAAAL,QAAA,0BAAAwiB,EAAAniB,OAAA,KAEA,GAAAmiB,EAAAje,MAAA2lC,EAAAzpC,EAAA0oC,SAAA9d,KAAA7I,EAAAje,KACA,KAAA,CAAAvE,QAAA,uBAAAwiB,EAAAje,IAAA,KAEA,GAAAie,EAAAxS,WAAAk6B,EAAAzpC,EAAA2oC,UAAA/d,KAAA7I,EAAAxS,UACA,KAAA,CAAAhQ,QAAA,4BAAAwiB,EAAAxS,SAAA,KAEA,OAAAwS,OAKA,IAAAhO,EAAAzR,EAAAyC,KAAAgP,yBAAAiE,EAAA7O,IAAAC,MAAA9G,EAAAyC,KAAAgP,yBACAuc,EAAAI,IAAAye,iBAAAp7B,EACAiE,EAAAwnB,aAAAzrB,EAAAgqB,KACAhqB,EAAAsK,KACA,IAAAtK,EAAA2qB,SACA,MAAA3qB,EAAA,MAAA,WAAAA,EAAAqE,UAAA/a,EAAAmsC,YACA5L,EAAA16B,UAAAu2B,MAGA,WACA,OAAA73B,EAAAsH,QAGAonB,EAAA1vB,QAAAwuC,OAAA,WACA,OAAA9e,EAAAI,IAAAye,mBACA5qC,MAAA,SAAAnH,GACA,GAAAA,EACA,OAAAA,EAAAyN,MAAAzN,EAAAiyC,SACA,CACAzuC,QAAAxD,EAAAyN,KACAysB,IAAAl6B,EAAAiyC,UAGAjyC,EAAAkyC,UAAAlyC,EAAAiyC,SACA,CACAzuC,QAAAxD,EAAAkyC,SAAA/uC,UAAA,GACA+2B,IAAAl6B,EAAAiyC,eAHA,KAOA1oC,OAAA,SAAA6B,GAEAR,QAAAxG,MAAA,6CAAAgH,OAIA8nB,EAAAnQ,UAAA,CACAxG,MAAAmmB,EAAA,aACAlkB,KAAAkkB,EAAA,YACA7f,MAAAypB,GAGAvoC,QAAA+S,MAAA7W,EAAAizB,GAGA,IAAA5F,EAAA,IAAAvoB,EAoCA,OAlCAuoB,EAAA6kB,SAAA,SAAAxR,EAAA1f,EAAAT,EAAAsqB,GAEA,OAAA,IAAA/lC,EAAA47B,EAAA1f,EAAAT,EADAsqB,IAAA/mC,QAAAuC,UAAAwkC,IAAAA,IAIAxd,EAAA7M,cAAA,SAAAkgB,EAAA1f,EAAAT,EAAA/P,GAGA,MAAA,CACAkwB,KAAAA,EACA1f,KAJAA,EAAAA,GAAA,GAKAT,OAJAA,EAAAzc,QAAAuC,UAAAka,GAAAA,EAAA,KAAAS,EAKAiZ,IAAAtf,EAAAgmB,OAAAD,EAAA1f,EAAA,GAAAT,GACA/H,KAAA,CACA0I,QAAAvG,EAAAwnB,aAAAzB,EAAA1f,EAAA,gBAAAT,EAAAggB,EAAA16B,UAAAw2B,QAAA,EAAA7rB,IAEA4B,QAAA,CACAq8B,QAAA,CACA7L,KAAAjoB,EAAA1H,IAAAytB,EAAA1f,EAAA,mBAAAT,EAAA/P,IAEA0K,MAAAP,EAAA1H,IAAAytB,EAAA1f,EAAA,iBAAAT,EAAA/P,IAEAuM,WAAA,CACA2D,QAAA/F,EAAA1H,IAAAytB,EAAA1f,EAAA,sBAAAT,EAAA/P,GACAwM,MAAA,CACAiE,SAAAtG,EAAA1H,IAAAytB,EAAA1f,EAAA,+BAAAT,EAAA/P,OASA6c,KC1hCAvpB,QAAA6Q,OAAA,sBAAA,CAAA,QAAA,sBAAA,yBAAA,wBACA,6BAEAC,QAAA,QAAA,CAAA,aAAA,KAAA,WAAA,MAAA,MAAA,eAAA,UAAA,WAAA,aAAA,aAAA,UAAA,SAAAC,EAAAtQ,EAAAZ,EAAAmB,EAAAgQ,EAAAonB,EAAAr3B,EAAAG,EAAAyK,EAAAxK,EAAAs7B,GAIA,IACAnoB,EAAA,IAAAtD,EAAA7U,KAAA,SAEAkyC,EAAA5R,EAAAttB,IAAAwqB,cAAA8C,EAAA16B,UAAAw2B,QACA+V,EAAA7R,EAAAttB,IAAAwqB,sBAAA8C,EAAA16B,UAAAw2B,QAGAgW,EAAA,SAAAC,GACA,IAAAC,EAAA,GACA,OAAAD,EAAA1rC,QAAA,SAAAC,EAAA2rC,GAEA,OADAA,EAAA3wC,GAAA2wC,EAAA3wC,IAAA2wC,EAAA/rC,IAAA,IAAA+rC,EAAAjwC,OACAgwC,EAAAC,EAAA3wC,IAIAgF,GAHA0rC,EAAAC,EAAA3wC,KAAA,EACAgF,EAAAC,OAAA0rC,MAGA,KAGAC,EAAA,SAAAH,EAAAnlB,EAAA1f,GAkBA,OAjBA0f,EAAAA,GAAA,EAGAmlB,EAAAD,EAAAC,GAGAA,EAAA5xC,EAAA+hB,OAAA6vB,GAAA,SAAAE,GACA,IAAA9wB,EAAA,EAGA,OAFAA,GAAA,IAAA8wB,EAAA,QACA9wB,GAAA,IAAA,IAAA8wB,EAAA/rC,IAAAa,cAAAqa,WAAA,QAGA7d,QAAAuC,UAAAoH,IAAA6kC,EAAA7xC,OAAAgN,IACA6kC,EAAAA,EAAA9iB,MAAArC,EAAAA,EAAA1f,IAIA6kC,GAcAI,EAAA,SAAAhrC,GACAA,EAAAmM,aAAA,CACAiQ,QAAA,EACA6uB,KAAA,GACAC,SAAA,EACAC,UAAA,EACAC,gBAAA,EACAC,kBAAA,EACAC,WAAA,EACAl/B,mBAAA,EACAF,UAAA,EACAq/B,WAAA,EACAC,mBAAA,EACAC,oBAAA,EACAC,uBAAA,EACAC,2BAAA,EACAC,kBAAAjqC,GAEA3B,EAAA6rC,SAAA,KACA7rC,EAAAkM,UAAA,EACAlM,EAAA8rC,QAAA,KACA9rC,EAAAkrC,SAAA,GAGAa,EAAA,SAAA5/B,EAAA6/B,GAyBA,GAvBA7/B,EAAA++B,UAAA/+B,EAAA8+B,KAAAgB,UACA9/B,EAAAg/B,UAAAh/B,EAAA++B,SAAA/+B,EAAA8+B,KAAAiB,QACA//B,EAAAo/B,YAAAnvC,QAAAuC,UAAAwN,EAAAo/B,YAAAp/B,EAAAo/B,UACAp/B,EAAAi/B,gBAAAj/B,EAAAzS,SAAAyS,EAAAggC,qBAAA,GAAAhgC,EAAAigC,4BAAA,IAAAjgC,EAAAo/B,UACAp/B,EAAAm/B,WAAAn/B,EAAAi/B,iBAAAj/B,EAAAzS,SACAyS,EAAAggC,qBAAA5uC,EAAAyC,KAAAwO,6BACArC,EAAAigC,4BAAA,GACAjgC,EAAAo/B,YAAAp/B,EAAAzS,SAAA,IAAAyS,EAAAggC,qBACA,IAAAhgC,EAAAigC,2BACAjgC,EAAAk/B,kBAAAl/B,EAAAzS,SAAAyS,EAAAggC,oBAAA,EACAhgC,EAAAC,mBAAAD,EAAAzS,SAAAyS,EAAAggC,qBAAA,GAAAhgC,EAAAigC,2BAAA,EACAjgC,EAAAD,UAAAC,EAAAzS,SAAAyS,EAAAggC,oBAAA,EACAhgC,EAAA0/B,SAAA1/B,EAAA8+B,KAAAgB,UAEA9/B,EAAAq/B,oBAAAr/B,EAAAD,UAAAC,EAAAo/B,YAAAp/B,EAAAkgC,UAAAlgC,EAAArS,eAAAqS,EAAArS,eAAAf,OAAA,EACAoT,EAAAmgC,6BAAAngC,EAAArS,eAAAqS,EAAArS,eAAAoF,QAAA,SAAAqb,EAAAgyB,GACA,OAAAhyB,GAAAgyB,EAAAC,WAAAjvC,EAAAyC,KAAAyO,kBAAA,EAAA,KACA,GAAA,EACAtC,EAAAsgC,WAAAtgC,EAAAmgC,6BAAA,EACAngC,EAAAugC,mBAAAvgC,EAAAzS,WAAAyS,EAAAwgC,eAIAxgC,EAAAD,UAAAC,EAAAo/B,UAQAp/B,EAAAygC,0BAAAxwC,QAAAuC,UAAAwN,EAAA0gC,cAAA1gC,EAAA0gC,aAAA9zC,OAAA,MARA,CACA,IAAA+zC,EAAA9zC,EAAA+zC,MACA/zC,EAAAg0C,MAAA7gC,EAAA0gC,cAAA,GAAA,QACA7zC,EAAAg0C,MAAA7gC,EAAArS,gBAAA,GAAA,SAEAqS,EAAAygC,0BAAA5zC,EAAA+M,KAAA+mC,GAiBA,OAVA3gC,EAAAu/B,wBAAAv/B,EAAAg/B,UAAAh/B,EAAAq/B,mBAAAQ,EAAAiB,OACAjB,EAAAiB,OAAA9gC,EAAAq/B,mBAAA,EACAr/B,EAAAw/B,4BAAAx/B,EAAAi/B,iBAAAj/B,EAAAu/B,wBACAv/B,EAAAq/B,mBAAAr/B,EAAAmgC,6BAAAN,EAAAiB,OACAjB,EAAAiB,OAAA9gC,EAAAq/B,mBAAAr/B,EAAAmgC,6BAAA,EAGAngC,EAAAiQ,QAAA,EAGAjQ,GAGA+gC,EAAA,SAAAh0C,GACA,IAAAA,EAAA,OAAA2D,EAAAsH,KAAAjL,GAEA,IAAAyoC,EAAA,GAWA,OAVA3oC,EAAAN,QAAAQ,GAAA,SAAAi0C,GACA,IAAAtB,EAAAsB,EAAAlC,KAAAgB,UAAAvxC,MAAA,IAAA,GACAyyC,EAAAlC,KAAA7wC,OAAAic,SAAAw1B,EAAA,IACAsB,EAAAlC,KAAA5wC,KAAAwxC,EAAA,GACAsB,EAAAlC,KAAAh2B,IAAAk4B,EAAAlC,KAAAh2B,KAAAk4B,EAAAl4B,WACAk4B,EAAAl4B,IACA0sB,EAAA3rB,KAAAm3B,EAAAlC,KAAA7wC,WAIAgD,EAAAiY,WAAAssB,OAAA3oC,EAAA8hB,KAAA6mB,IACAniC,MAAA,SAAAmiC,GAWA,OAVA3oC,EAAAN,QAAAQ,GAAA,SAAAi0C,GACA,IAAAv4B,EAAA5b,EAAAiM,UAAA08B,EAAA,CAAAvnC,OAAA+yC,EAAAlC,KAAA7wC,SACA+yC,EAAAlC,KAAAmC,KAAAx4B,GAAAA,EAAAqE,WAGArE,GAAA,IAAAu4B,EAAAlC,KAAA7wC,QAAA+yC,EAAAlC,KAAA5wC,OAAAua,EAAAva,OACA8yC,EAAAlC,KAAAiB,SAAA,MAIAhzC,KAEA0I,OAAA,SAAA6B,GAEA,GAAAA,GAAAA,EAAAgC,OAAArI,EAAAsI,WAAA87B,gBAMA,OALAxoC,EAAAN,QAAAQ,GAAA,SAAAi0C,GACA,IAAAA,EAAA/yC,SACA+yC,EAAAlC,KAAAmC,KAAAr7B,SAAAqrB,MAAAC,WAGAnkC,EAGA,MAAAuK,MAKA4pC,EAAA,SAAAC,EAAAC,GACA,IAAAD,IAAAA,EAAAzyC,SAAAyyC,EAAAvuC,IAAA,OAAAlC,EAAAsH,KAAAmpC,GAEA,IAAAE,EAAAF,EAAAzyC,QAAAyyC,EAAAvuC,IACAiB,GAAA,IAAAutC,EAAA7C,EAAAn/B,IAAAiiC,GAAA,KACA,GAAAxtC,EAIA,OAHAiD,QAAAqB,MAAA,sBAAAkpC,EAAA,mBAEApxC,QAAA+S,MAAAm+B,EAAAttC,GACAnD,EAAAsH,KAAAnE,GAEAA,EAAA,CAAAnF,OAAAyyC,EAAAzyC,OAAAkE,IAAAuuC,EAAAvuC,KAGA9C,GAAA,WACA+D,EAAAmM,cAAAnM,EAAAmM,aAAAiQ,QAAAjf,EAAAZ,QAAAu0B,OAAA,CAAA/E,SAAA,0BACA,KAEA,IAAApa,EAAAC,KAAAD,MACA,OAAA9U,EAAAgQ,IAAA,CAEA9E,EAAAwD,MAGAnO,EAAAgN,IAAA+B,aAAA,CAAAtR,OAAAmF,EAAAnF,QAAAmF,EAAAjB,MAAA,GACAS,MAAA,SAAAL,GACA,OAAA+tC,EAAA/tC,GAAAA,EAAAjG,iBAGAsG,MAAA,SAAAL,GACA,IAAAqL,EAAArL,EAAA,GACAjG,EAAAiG,EAAA,GAEA,GAAAjG,GAAAA,EAAAH,OA0DA,OAvDAG,EAAAH,OAAA,IAWAG,EAAAF,EAAA+hB,OAAA7hB,GAAA,SAAA4xC,GACA,IAAA9wB,EAAA,EACAA,GAAA,MAAAha,EAAAjB,KAAA+rC,EAAA/rC,MAAAiB,EAAAjB,IAAA,EAAA,GACAib,GAAA,MAAA8wB,EAAAG,KAAAiB,QAAA,EAAA,GACAlyB,GAAA,MAAAha,EAAA6rC,UAAAf,EAAAG,KAAAgB,WAAAnB,EAAAG,KAAAgB,YAAAjsC,EAAA6rC,SAAA,EAAA,GACA7xB,GAAA,KAAA8wB,EAAAqB,oBAAA,EAAA,EAAA,GACAnyB,GAAA,KAAA8wB,EAAAsB,2BAAA,EAAA,EAAA,GACApyB,GAAA,KAAA8wB,EAAAuB,QAAA,EAAA,GACAryB,GAAA,KAAA8wB,EAAA2C,aAAA,EAAA,GACAzzB,GAAA,KAAA8wB,EAAAS,UAAA,EAAA,GACA,IAAAmC,GAAA5C,EAAAuB,SAAAvB,EAAAhxC,eAAAgxC,EAAAhxC,eAAAf,OAAA,EAGA,OAFAihB,GAAA,GAAA0zB,GAAA,KACA1zB,GAAA,IAAA0zB,GAAA5C,EAAAsB,2BAAA,EAAAtB,EAAAsB,2BAAA,IAAA,OAGAnpC,QAAAqB,MAAA,2EAAApG,OAAAhF,EAAAH,UAIAiH,EAAAmM,aAAA4/B,EAAA7yC,EAAA,GAAAsR,EAAA/M,YAGAuC,EAAAnF,OAAAmF,EAAAmM,aAAAtR,OACAmF,EAAAjB,IAAAiB,EAAAmM,aAAApN,IACAiB,EAAAkM,SAAAlM,EAAAmM,aAAAD,SACAlM,EAAA6rC,SAAA7rC,EAAAmM,aAAA8+B,MAAAjrC,EAAAmM,aAAA8+B,KAAAgB,UACAjsC,EAAAkrC,QAAAlrC,EAAAmM,aAAA++B,QACAlrC,EAAA8rC,QAAA9rC,EAAAmM,aAAA8+B,MAAAjrC,EAAAmM,aAAA8+B,KAAAmC,MAGAptC,EAAAmM,aAAAD,WAAAlM,EAAAmM,aAAAo/B,WAAAryC,EAAAH,OAAA,IACAiH,EAAAmM,aAAAy/B,aAAA1yC,EAAAgf,OAAA,GACAlf,EAAAN,QAAAsH,EAAAmM,aAAAy/B,cAAA,SAAAz/B,GACA4/B,EAAA5/B,EAAA3B,EAAA/M,gBAKAitC,EAAA9P,IAAA4S,EAAAxtC,GAEA5D,QAAA+S,MAAAm+B,EAAAttC,GAEAiD,QAAAqB,MAAA,+CAAApG,OAAA8B,EAAAnF,QAAAmF,EAAAnF,OAAAW,UAAA,EAAA,IAAAwE,EAAAjB,IAAA6S,KAAAD,MAAAA,IAEA27B,KAEA1rC,OAAA,SAAA6B,GAIA,GAHAzD,EAAAmM,aAAA,CAAAiQ,QAAA,GACA4uB,EAAAsC,GAEA7pC,IACAA,EAAAgC,OAAArI,EAAAsI,WAAAggC,oBACAjiC,EAAAgC,OAAArI,EAAAsI,WAAAigC,6BAEA,OADA2H,EAAAnhC,aAAAiQ,QAAA,EACAkxB,EAEA,MAAA7pC,MAIAkqC,EAAA,SAAA9yC,EAAAkE,GACA,IAAAiB,EAAA,CACAnF,OAAAA,EACAkE,IAAAA,EACAmsC,SAAA,GAEA,OAAA9tC,EAAAgN,IAAA48B,OAAA,CAAAnN,OAAAh/B,GAAAkE,IACAS,MAAA,SAAAL,GACA,IAAAjG,EAAAiG,EAAAkqC,QAAAnqC,QAAA,SAAA0rC,EAAAzrC,GACA,OAAAyrC,EAAAxrC,OAAAD,EAAA4W,KAAA7W,QAAA,SAAA6W,EAAA+0B,GACA,IAAAe,EAAAf,EAAAG,KAAAgB,UAAAvxC,MAAA,IAAA,GACA0b,EAAAC,SAAAw1B,EAAA,IACA,OAAA91B,EAAA3W,OAAA,CACAL,IAAA+rC,EAAA/rC,IACAlE,OAAAsE,EAAAtE,OACAowC,KAAA,CACAgB,UAAAnB,EAAAG,KAAAgB,UACA7xC,OAAAgc,EACA/b,KAAAwxC,EAAA,GACA52B,IAAA61B,EAAA5P,MAEAxhC,QAAAoxC,EAAApxC,QACAk0C,WAAA9C,EAAA8C,eAEA,OACA,IAGA,OAAAV,EAAAh0C,GACAsG,MAAA,SAAAtG,GACA,MAAA,CACAA,WAAAA,EACAmwC,QAAAlqC,EAAAkqC,eAIA7pC,MAAA,SAAAL,GACA,IAAAjG,EAAAiG,EAAAjG,WAGAA,EAAAH,OAAA,IAMAoG,EAAAjG,WAAAF,EAAA+hB,OAAA7hB,GAAA,SAAA4xC,GACA,IAAA9wB,EAAA,EAMA,OALAA,GAAA,MAAAha,EAAAjB,KAAA+rC,EAAA/rC,MAAAiB,EAAAjB,IAAA,EAAA,GACAib,GAAA,MAAA8wB,EAAAG,KAAAiB,QAAA,EAAA,GACAlyB,GAAA,KAAAha,EAAA6rC,UAAAf,EAAAG,KAAAgB,WAAAnB,EAAAG,KAAAgB,YAAAjsC,EAAA6rC,SAAA,EAAA,GACA7xB,GAAA,KAAA8wB,EAAApxC,QAAA,EAAA,KACAsgB,GAAA,GAAA8wB,EAAAG,KAAA7wC,OAAA0wC,EAAAG,KAAA7wC,OAAA,GAAA,QAGA6I,QAAAqB,MAAA,qEAAApG,OAAAhF,EAAAH,UAIAC,EAAAN,QAAAQ,GAAA,SAAA4xC,GACAA,EAAAI,WAAAJ,EAAA/rC,KAAA+rC,EAAAG,KAAAgB,WAAAnB,EAAAG,KAAAh2B,QAIAjV,EAAAmM,aAAAjT,EAAA,GAGA8G,EAAAnF,OAAAmF,EAAAmM,aAAAtR,OACAmF,EAAAjB,IAAAiB,EAAAmM,aAAApN,IACAiB,EAAA6rC,SAAA7rC,EAAAmM,aAAA8+B,MAAAjrC,EAAAmM,aAAA8+B,KAAAgB,UACAjsC,EAAAkrC,QAAAlrC,EAAAmM,aAAA++B;AACAlrC,EAAA8rC,QAAA9rC,EAAAmM,aAAA8+B,MAAAjrC,EAAAmM,aAAA8+B,KAAAmC,KAEAl0C,EAAAH,OAAA,IACAiH,EAAAmM,aAAAy/B,aAAA1yC,EAAAgf,OAAA,IAIAlY,EAAAgnC,OAAA,GAGA,IAAA6G,EAAA,GAsEA,OArEA7tC,EAAAgnC,OAAAltC,gBAAAqF,EAAAkqC,SAAA,IAAAnqC,QAAA,SAAA4uC,EAAA3uC,GACA,OAAAA,EAAA4W,KAAA7W,QAAA,SAAA4uC,EAAAhD,GACA,IAAAiD,EAAAjD,EAAA/rC,IAAA,KAAA+rC,EAAAG,KAAAH,EAAAG,KAAAgB,UAAA,IA4BA,OA3BA6B,EAAAC,IAAAjD,EAAAkD,QAAA,IAAA9uC,QAAA,SAAA+uC,EAAA1B,GACA,IAAA2B,EAAAH,EAAA,IAAAxB,EAAA1xC,OACAmiB,EAAA,CACAniB,OAAA0xC,EAAA1xC,OACAkE,IAAAwtC,EAAAx2B,KAAA,GACAo4B,UAAA,CACAv5B,MAAA23B,EAAAtB,MAAAsB,EAAAtB,KAAAmD,aAAA7B,EAAAtB,KAAAmD,aAAA,EACAC,WAAA9B,EAAAtB,MAAAsB,EAAAtB,KAAAoD,WAAA9B,EAAAtB,KAAAoD,WAAA,MAEAniC,SAAAqgC,EAAArgC,SACAq/B,UAAAgB,EAAAhB,WAEA,OAAAsC,EAAAK,GAIAlxB,EAAAmxB,UAAAv5B,MAAAi5B,EAAAK,GAAAC,UAAAv5B,OACAi5B,EAAAK,GAAAlxB,EACAixB,EAAA/1B,OAAAlf,EAAAkjC,UAAA+R,EAAA,CAAApzC,OAAA0xC,EAAA1xC,SAAA,EAAAmiB,GACAixB,GAGAA,GATAJ,EAAAK,GAAAlxB,EAYAixB,EAAA7uC,OAAA4d,MACA,IACA8wB,IACAA,KACA,IAGAD,EAAA,GACA7tC,EAAAgnC,OAAAsH,qBAAAnvC,EAAAkqC,SAAA,IAAAnqC,QAAA,SAAA+uC,EAAA9uC,GACA,OAAAA,EAAAovC,QAAA,IAAArvC,QAAA,SAAA+uC,EAAA1B,GACA,IAAAvvB,EAAA,CACAniB,OAAA0xC,EAAA1xC,OACAkE,IAAAwtC,EAAAxtC,IACAovC,UAAA,CACAv5B,MAAA23B,EAAA4B,WAAA5B,EAAA4B,UAAAv5B,MAAA23B,EAAA4B,UAAAv5B,MAAA,EACAy5B,WAAA9B,EAAA4B,WAAA5B,EAAA4B,UAAAE,WAAA9B,EAAA4B,UAAAE,WAAA,MAEAvC,QAAAS,EAAAtB,KAAAsB,EAAAtB,KAAAgB,UAAA,KACA//B,SAAAqgC,EAAArgC,SACAq/B,UAAAgB,EAAAhB,WAEA,GAAAsC,EAAAtB,EAAA1xC,QAGA,CACA,KAAAmiB,EAAApI,MAAAi5B,EAAAtB,EAAA1xC,QAAA+Z,OASA,OAAAq5B,EARAJ,EAAAtB,EAAA1xC,QAAAmiB,OAJA6wB,EAAAtB,EAAA1xC,QAAAmiB,EAeA,OAAAixB,EAAA7uC,OAAA4d,KACAixB,KACA,IAEAjuC,KAEA4B,OAAA,SAAA6B,GACA,GAAAA,GAAAA,EAAAgC,OAAArI,EAAAsI,WAAA8/B,qBAEA,OADAwF,EAAAhrC,GACAA,EAGA,MAAAyD,MAKA+qC,EAAA,SAAAC,EAAA5zC,EAAA6zC,EAAAjxC,EAAAwb,EAAAiuB,GAEA,SAAAyH,EAAA9zC,EAAA+Z,GACA,OAAA/Z,EAAA,IAAA+Z,EAIA,IAAAg6B,GAAA,EACAC,EAAAH,EAAAA,EAAAxvC,QAAA,SAAAC,EAAAotC,GACA,IAAAuC,EAAAH,EAAApC,EAAA1xC,OAAA0xC,EAAA4B,UAAA5B,EAAA4B,UAAAv5B,MAAA23B,EAAAT,SAGA,OAFAS,EAAA4B,YAAAS,GAAA,GACAzvC,EAAA2vC,GAAAvC,EACAptC,IACA,IAAA,GAIA,OAAAsvC,EAAA,CAAA5zC,OAAAA,IACA2E,MAAA,SAAAL,GACA,OAAAA,GAAAA,EAAArF,gBAAA,IAAAoF,QAAA,SAAAC,EAAAotC,GAMA,IAAApF,GAAAoF,EAAAwC,QACAC,EAAAzC,EAAA4B,UAAA5B,EAAA4B,UAAAl1B,WAAA,KACAuzB,EAAAwC,EAAA7H,EACA6H,EAAAvxC,EAAAwxC,UAAAh2B,EACA+1B,EAAAvxC,EAAAyxC,YAAAj2B,EAFA,EAGAuzB,EAAAA,EAAA,EAAA,EAAAA,EAEA,IAAAsC,EAAAH,EAAApC,EAAA1xC,OAAA+zC,GAAArC,EAAA4B,UAAA5B,EAAA4B,UAAAv5B,MAAA23B,EAAAT,SAIA,cAHA+C,EAAAC,GAGA3vC,EAAAC,OAAA,CACAvE,OAAA0xC,EAAA1xC,OACAkE,IAAAwtC,EAAAxtC,IACAquC,KAAA4B,EACA9iC,SAAAqgC,EAAArgC,SACAq/B,UAAAgB,EAAAhB,UACAiB,UAAAA,EACAC,WAAAD,GAAAA,GAAAjvC,EAAAyC,KAAAyO,kBACA04B,QAAAA,EACAvyB,MAAA,OAAA23B,EAAAwC,QAAAxC,EAAAwC,QAAA30C,OACAmyC,EAAA4B,UAAA5B,EAAA4B,UAAAv5B,MAAA,KACA7S,MAAAyqC,EAAA,MAEA,OAEA5qC,OAAA,SAAA6B,GACA,GAAAA,GAAAA,EAAAgC,OAAArI,EAAAsI,WAAAggC,mBAEA,MAAA,GAGA,GAAAjiC,GAAA,MAAAA,EAAAgC,MAGA,OAFAxC,QAAAC,KAAA,4EAEA,GAGA,MAAAO,KAKAjE,MAAA,SAAA1F,GACA,IAAAq1C,EAAAn2C,EAAAyd,OAAAo4B,GACA,IAAAM,EAAAp2C,OAAA,OAAAe,EAGA,GAAAiO,EAAA/H,KAAAyhC,UACA,OAAA0N,EAAAjwC,QAAA,SAAAC,EAAAotC,GACA,OAAAptC,EAAAC,OAAA,CACAvE,OAAA0xC,EAAA1xC,OACAkE,IAAAwtC,EAAAxtC,IACAmN,SAAAqgC,EAAArgC,SACAq/B,UAAAgB,EAAAhB,UACA6B,KAAA,KACAZ,UAAA/uC,EAAAwxC,UACAxC,YAAA,EACAtF,SAAA,EACAvyB,MAAA,EACA7S,OAAA,MAEAjI,GAGA,IAAAs1C,EAAAD,EAAAjwC,QAAA,SAAAC,EAAAotC,GACA,IAAA33B,EAAAg6B,GAAArC,EAAA4B,UAAA5B,EAAA4B,UAAAv5B,MACA23B,EAAAT,QAAAS,EAAAT,QAAApxC,MAAA,KAAA,GAAA,KASA,OARA0B,QAAAuC,UAAAiW,KACAzV,EAAAyV,GAIAzV,EAAAyV,GAAAoB,KAAAu2B,GAHAptC,EAAAyV,GAAA,CAAA23B,IAMAptC,IACA,IAGA,OAAA/B,EAAAiY,WAAAssB,OAAA3oC,EAAAP,KAAA22C,IAAA5vC,MAAA,SAAAmiC,GAyBA,OAxBA7nC,EAAA6nC,EAAAziC,QAAA,SAAAC,EAAAyV,GACA,OAAAzV,EAAAC,OAAAgwC,EAAAx6B,EAAAxa,QAAA8E,QAAA,SAAAC,EAAAotC,GACA,IAAAyC,EAAAp6B,EAAAqE,WACAuzB,EAAAryB,KAAAO,IAAA,EAAAs0B,EAAAvxC,EAAAwxC,UAAAh2B,GACAo2B,GAAA9C,EAAA4B,YAAA5B,EAAA4B,UAAAE,YAAA9B,EAAA4B,UAAAE,YAAAz5B,EAAAva,KACAg1C,GACApsC,QAAAqB,MAAA,6CAAApG,OAAAquC,EAAA1xC,OAAAW,UAAA,EAAA,KAEA,IAAAuG,EAAAyqC,EAAA,KAAAtF,GAAAqF,EAAArgC,WAAAmjC,EACA,OAAAlwC,EAAAC,OAAA,CACAvE,OAAA0xC,EAAA1xC,OACAkE,IAAAwtC,EAAAxtC,IACAmN,SAAAqgC,EAAArgC,SACAq/B,UAAAgB,EAAAhB,UACA6B,KAAA4B,EACAxC,UAAAA,EACAC,WAAAD,GAAAA,GAAAjvC,EAAAyC,KAAAyO,kBACA04B,SAAA,EACAvyB,MAAAg6B,GAAArC,EAAA4B,UAAA5B,EAAA4B,UAAAv5B,MACA23B,EAAAT,QAAAS,EAAAT,QAAApxC,MAAA,KAAA,GAAA,KACAqH,MAAAA,MAEA,OACAjI,SAMA0F,MAAA,SAAA1F,GAGA,IAAAw1C,EAAAx1C,EAAAoF,QAAA,SAAAC,EAAAotC,GAIA,OAHAA,EAAApF,SAAAoF,EAAAxqC,OAAAwqC,EAAAC,WAAA/uC,EAAAwxC,YACA9vC,EAAAotC,EAAA1xC,SAAA,GAEAsE,IACA,IAGArF,EAliBA,SAAAA,GAQA,OAPAd,EAAA+hB,OAAAjhB,GAAA,SAAAyyC,GACA,IAAAvyB,EAAA,EAIA,OAHAA,GAAA,MAAAuyB,EAAAC,UAAAD,EAAAC,UAAA,GACAxyB,GAAA,KAAAuyB,EAAArgC,SAAA,EAAA,KACA8N,GAAA,IAAAuyB,EAAA33B,MAAA23B,EAAA33B,MAAA,OA6hBA26B,CAAAz1C,GAGA,IAAAq1C,EAAA,GACAK,EAAA,GAcA,MAAA,CACAztC,MAdAjI,EAAAoF,QAAA,SAAAC,EAAAotC,GACA,OAAAA,EAAApF,SACAoF,EAAAxqC,QAAAutC,EAAA/C,EAAA1xC,QACAs0C,EAAAn5B,KAAAu2B,GAEAA,EAAAxqC,OAAAutC,EAAA/C,EAAA1xC,SACA20C,EAAAx5B,KAAAu2B,GAEAptC,GAEAA,EAAAC,OAAAmtC,KACA,IAIApF,QAAAgI,EACA1yC,MAAA+yC,OAgDApO,EAAA,SAAAvmC,EAAAkE,EAAAqG,GAGA,IAAApF,EAEA,GAHAoF,EAAAA,GAAA,IAGAvK,GAAAkE,IAAAqG,EAAAqqC,MACA,OAAAryC,EAAAgN,IAAAsJ,OAAA61B,SAAAxqC,GACAS,MAAA,SAAAkU,GACA,GAAAA,EAAA,OAAA0tB,EAAA1tB,EAAA7Y,OAAA6Y,EAAA3U,IAAAqG,GAEA,IAAAA,EAAAhJ,QAAA+I,KAAAC,GAAA,IAEA,OADAA,EAAAqqC,OAAA,EACArO,EAAAvmC,EAAAkE,EAAAqG,MAKA,GAAAvK,EAAA,CAEA,IADAmF,GAAA,IAAAoF,EAAAmwB,MAAAkV,EAAAl/B,IAAA1Q,GAAA,SACAkE,GAAAiB,EAAAjB,MAAAA,MAAAqG,EAAAymC,UAAA7rC,EAAA6rC,WAAAzmC,EAAAymC,UAEA,OADA5oC,QAAAqB,MAAA,sCAAApG,OAAArD,EAAAW,UAAA,EAAA,KACAqB,EAAAsH,KAAAnE,GAEAiD,QAAAqB,MAAA,kCAAApG,OAAArD,EAAAW,UAAA,EAAA,KACAwE,EAAA,CACAnF,OAAAA,EACAkE,IAAAA,QAIAkE,QAAAqB,MAAA,2CAAApG,OAAAa,IACAiB,EAAA,CACAjB,IAAAA,GAGAqG,EAAAymC,WACA7rC,EAAA6rC,SAAAzmC,EAAAymC,UAGA,IACApuC,EACAwb,EAFAtH,EAAAC,KAAAD,MAIA,OAAA9U,EAAAgQ,IAAA,CAGA9E,EAAAtK,aACA+B,MAAA,SAAAL,GACA1B,EAAA0B,KAIA4I,EAAAsN,WAAA2D,SAAA,GACAxZ,MAAA,SAAAwZ,GACAC,EAAAD,EAAAC,cAEArX,OAAA,SAAA6B,GAEA,IAAAA,GAAAA,EAAAgC,OAAArI,EAAAsI,WAAAwT,iBAIA,MAAAzV,EAHAwV,EAAAlH,OAAAqrB,MAAAC,UAQAgQ,EAAArtC,GAAA,IAAAoF,EAAAmwB,OAGAoY,EAAA9yC,EAAAkE,KAGAS,MAAA,SAAAL,GACA,IAAAuwC,EAAAvwC,EAAA,GAGA,IAAAa,EAAAmM,aAAApN,IAIA,OAHAkE,QAAAqB,MAAA,uDACAlI,QAAA+S,MAAAnP,EAAA0vC,eACA1vC,EAAAgnC,OAIA,IAAA+G,EAAA/tC,EAAAmM,aAAApN,IAAA,IAAAiB,EAAAmM,aAAA8+B,KAAAgB,UAEA,OAAApvC,EAAAgQ,IAAA,CAEA2hC,EAAApxC,EAAAgN,IAAA88B,aAAAlnC,EAAAnF,OAAA60C,EAAA1I,OAAA0I,EAAA1I,OAAAltC,eAAAi0C,GAAA,KAAAtwC,EAAAwb,GAAA,GACAzZ,MAAA,SAAAL,GACAa,EAAA2vC,cAAAxwC,EAAA4C,MACA/B,EAAA4vC,sBAAAzwC,EAAAgoC,QACAnnC,EAAA6vC,oBAAA1wC,EAAA1C,SAIA+xC,EAAApxC,EAAAgN,IAAA68B,YAAAjnC,EAAAnF,OAAA60C,EAAA1I,OAAA0I,EAAA1I,OAAAsH,oBAAA,KAAA7wC,EAAAwb,GAAA,GACAzZ,MAAA,SAAAL,GACAa,EAAA8vC,WAAA3wC,EAAA4C,MACA/B,EAAA+vC,mBAAA5wC,EAAAgoC,QACAnnC,EAAAgwC,iBAAA7wC,EAAA1C,cAIA+C,MAAA,WAWA,OARAQ,EAAAmM,aAAAygC,0BAAA5sC,EAAA4vC,sBAAA5vC,EAAA4vC,sBAAA72C,OAAAiH,EAAAmM,aAAAygC,0BAEA5sC,EAAAmM,aAAAzS,QAAA0C,QAAAuC,UAAAqB,EAAAmM,aAAAzS,SAAAsG,EAAAmM,aAAAzS,QAAAsG,EAAAtG,QAtJA,SAAAsG,GAEAA,EAAAmM,aAAAzS,gBACAsG,EAAAmM,aAAA8+B,KAAAiB,QACAlsC,EAAAmM,aAAAyhC,YACAqC,EAAAjwC,EAAA,CAAAiU,KAAA,QAAAzZ,QAAA,mCAAA01C,cAAA,CAAAC,eAAAnwC,EAAAmM,aAAAyhC,cACA3qC,QAAAqB,MAAA,+CAAApG,OAAA8B,EAAAjB,IAAAiB,EAAAmM,aAAAyhC,eAGAqC,EAAAjwC,EAAA,CAAAiU,KAAA,QAAAzZ,QAAA,2BACAyI,QAAAqB,MAAA,wCAAApG,OAAA8B,EAAAjB,QAGAiB,EAAAmM,aAAAugC,0BACA1sC,EAAAmM,aAAA8+B,KAAAiB,QACA+D,EAAAjwC,EAAA,CAAAiU,KAAA,QAAAzZ,QAAA,sCACAyI,QAAAqB,MAAA,8CAAApG,OAAA8B,EAAAjB,OAEAiB,EAAAmM,aAAA8+B,MAAAjrC,EAAAmM,aAAA8+B,KAAAiB,QACAlsC,EAAAkM,WACA+jC,EAAAjwC,EAAA,CAAAiU,KAAA,QAAAzZ,QAAA,sCACAyI,QAAAqB,MAAA,2DAAApG,OAAA8B,EAAAjB,OAGAiB,EAAAmM,aAAAkgC,SACA4D,EAAAjwC,EAAA,CAAAiU,KAAA,QAAAzZ,QAAA,2BACAyI,QAAAqB,MAAA,0CAAApG,OAAA8B,EAAAjB,OAEAiB,EAAAmM,aAAAw/B,2BAAA,GACAsE,EAAAjwC,EAAA,CAAAiU,KAAA,QAAAzZ,QAAA,4CAAA01C,cAAAlwC,EAAAmM,eACAlJ,QAAAqB,MAAA,oDAAApG,OAAA8B,EAAAjB,IAAAiB,EAAAmM,aAAAw/B,+BAEA3rC,EAAAmM,aAAAg/B,UAAAnrC,EAAAmM,aAAAi/B,iBACA6E,EAAAjwC,EAAA,CAAAiU,KAAA,QAAAzZ,QAAA,kCACAyI,QAAAqB,MAAA,kDAAApG,OAAA8B,EAAAjB,QAEAiB,EAAAkM,UAAAlM,EAAAmM,aAAAy/B,cACAqE,EAAAjwC,EAAA,CAAAiU,KAAA,OAAAzZ,QAAA,oCAoHA41C,CAAApwC,GAGA0Q,EAAA1Q,KAAAoR,aAAAuT,KAAA3kB,GACA4B,OAAA,SAAA6B,GACAR,QAAAqB,MAAA,0DACArB,QAAAxG,MAAAgH,SAGAjE,MAAA,WACA,GAAAQ,EAAAnF,OAGA,OAFA4vC,EAAA7P,IAAA56B,EAAAnF,OAAAmF,GACAiD,QAAAqB,MAAA,kBAAAtE,EAAAnF,OAAAW,UAAA,EAAA,GAAA,eAAAoW,KAAAD,MAAAA,GAAA,MACA3R,MAIA65B,EAAA,SAAAjP,EAAAxlB,GACA,IAAAwlB,GAAAA,EAAA1oB,SAAA0oB,EACA,OAAA/tB,EAAAsH,UAAAxC,GAIA,IAAA0uC,EAAAzlB,EAAA4O,QAAA,cAAA,IAiDA,OA/CA6W,GADAA,EAAAA,EAAA7W,QAAA,qBAAA,KACAA,QAAA,OAAA,KAAAt3B,QAEAkD,EAAAA,GAAA,IACAkrC,aAAAl0C,QAAAuC,UAAAyG,EAAAkrC,cAAAlrC,EAAAkrC,YACAlrC,EAAAmrC,gBAAAn0C,QAAAuC,UAAAyG,EAAAmrC,iBAAAnrC,EAAAmrC,eACAnrC,EAAAorC,iBAAAp0C,QAAAuC,UAAAyG,EAAAorC,iBAAAprC,EAAAorC,gBAGAH,EAIAxzC,EAAAgQ,IACAwjC,EAAA31C,MAAA,KAAAwE,QAAA,SAAAC,EAAAyrB,GAEA,OADA3nB,QAAAqB,MAAA,0BAAAsmB,EAAA,KACAzrB,EAAAC,OAAAhC,EAAAgN,IAAA48B,OAAA,CAAAnN,OAAAjP,OACA,KACAprB,MAAA,SAAAL,GACA,OAAAA,EAAAD,QAAA,SAAA0rC,EAAAzrC,GACA,OAAAyrC,EAAAxrC,OAAAD,EAAAkqC,QAAAnqC,QAAA,SAAA0rC,EAAAzrC,GACA,OAAAyrC,EAAAxrC,OAAAD,EAAA4W,KAAA7W,QAAA,SAAA6W,EAAA+0B,GACA,IAAA2F,EAAA3F,EAAAG,KAAAgB,UAAAvxC,MAAA,IAAA,GACAhB,GAAAoxC,EAAApxC,SAAAoxC,EAAA6B,eACA,OAAAvnC,EAAAorC,gBAAA92C,EASAqc,EARAA,EAAA3W,OAAA,CACAL,IAAA+rC,EAAA/rC,IACAlE,OAAAsE,EAAAtE,OACAT,OAAAq2C,EAAA,GACAp2C,KAAAo2C,EAAA,GACA/2C,QAAAA,MAIA,OACA,OACA,OAEAkI,OAAA,SAAA6B,GACA,GAAAA,GAAAA,EAAAgC,OAAArI,EAAAsI,WAAA8/B,qBACA,MAAA,GAGA,MAAA/hC,KAjCA5G,EAAAsH,KAAA,KAuCA3E,MAAA,SAAAorC,GACA,IAAAxlC,EAAAmrC,eAEA,OAAAnrC,EAAAkrC,YAAA3F,EAAAC,GAAAA,EAEA,IAAA8F,EAAA9F,EAAA7xC,OAEA,OAAA2X,EAAA1Q,KAAAoR,aAAAyoB,OAAAjP,EAAAggB,EAAA,UACAprC,MAAA,WAGA,GAAAorC,EAAA7xC,OAAA23C,GACA13C,EAAAya,OAAAm3B,GAAA,SAAAE,GACA,OAAAA,EAAA/rC,KAAA+rC,EAAAjwC,UAEA9B,OACA,OAAAqE,EAAAgN,IAAAsJ,OAAAqC,OACAvW,MAAA,SAAAuW,GACA/c,EAAAN,QAAAkyC,GAAA,SAAAE,IACAA,EAAA/rC,KAAA+rC,EAAAjwC,SACAiwC,EAAA/rC,IAAAgX,EAAA+0B,EAAAjwC,kBAOA2E,MAAA,WAEA,OAAA4F,EAAAkrC,YAAA3F,EAAAC,GAAAA,SA0CA+F,EAAA,SAAAhP,EAAAlc,EAAA1f,EAAA6qC,GACA,OAAA/zC,GAAA,SAAA+e,EAAAC,GACA,IAAAmB,EAAA,GACA9G,EAAA,GACAld,EAAA0Z,KAAAivB,EAAA7Z,MAAArC,EAAAA,EAAA1f,IAAA,SAAA3L,GACA8b,EAAAF,KACA5Y,EAAAiY,WAAAT,MAAA,CAAAA,MAAAxa,IACAoF,MAAA,SAAAoV,GACAA,GAAAA,EAAAxb,SACAJ,EAAA0Z,KAAAkC,EAAAxb,SAAA,SAAAy3C,GACA,IAAAp2C,EAAAo2C,EAAAn2C,MAAA,KACAo2C,EAAAr2C,EAAAA,EAAA1B,OAAA,GAAA,IAAA0B,EAAA,GACAuiB,EAAAhH,KAAA,CACA7b,GAAA22C,EACA/xC,IAAAtE,EAAAA,EAAA1B,OAAA,GACA8B,OAAAJ,EAAA,GACAs2C,WAAAn8B,EAAAqE,WACArE,MAAAA,EAAAxa,mBAOAyC,EAAAgQ,IAAAqJ,GACA1W,MAAA,WACAwd,EAAAjkB,OAAA63C,GAAAnrB,EAAAkc,EAAA5oC,OAAA,EACAkD,GAAA,WACA00C,EAAAhP,EAAAlc,EAAA1f,EAAAA,EAAA6qC,EAAA5zB,EAAAjkB,QACAyG,MAAA,SAAAL,GACAyc,EAAAoB,EAAA5d,OAAAD,OAEAyC,OAAA,SAAA6B,GACAoY,EAAApY,QAEA,KAGAmY,EAAAoB,MAGApb,OAAA,SAAA6B,GACAA,GAAAA,EAAAgC,QAAArI,EAAAsI,WAAAyP,gBACAyG,EAAAoB,GAGAnB,EAAApY,UA6GAutC,EAAA,SAAAC,EAAAxrB,EAAA1f,GACA,OAAAlJ,GAAA,SAAA+e,EAAAC,GACA,IAAAmB,EAAA,GACAk0B,EAAA,GACAh7B,EAAA,GACAld,EAAA0Z,KAAAu+B,EAAAnpB,MAAArC,EAAAA,EAAA1f,IAAA,SAAAorC,GACAj7B,EAAAF,KACA6jB,EAAAsX,EAAA,CACAb,aAAA,EACAC,gBAAA,IAEA/wC,MAAA,SAAAorC,GACAA,GAAAA,EAAA7xC,SACAikB,EAAA4tB,EAAA1rC,QAAA,SAAAC,EAAA2rC,GACA,OAAAoG,EAAApG,EAAAjwC,QAIAsE,GAHA+xC,EAAApG,EAAAjwC,SAAA,EACAsE,EAAAC,OAAA0rC,MAGA9tB,WAKAngB,EAAAgQ,IAAAqJ,GACA1W,MAAA,WACAimB,EAAAwrB,EAAAl4C,OAAA,EACAkD,GAAA,WACA+0C,EAAAC,EAAAxrB,EAAA1f,EAAAA,GACAvG,MAAA,SAAAorC,GACAA,GAAAA,EAAA7xC,OAIA6iB,EAAAgvB,EAAA1rC,QAAA,SAAAC,EAAA2rC,GACA,OAAAoG,EAAApG,EAAAjwC,QAIAsE,GAHA+xC,EAAApG,EAAAjwC,SAAA,EACAsE,EAAAC,OAAA0rC,MAGA9tB,IATApB,EAAAoB,MAWApb,OAAA,SAAA6B,GACAoY,EAAApY,QAEArG,EAAAe,UAAAqmC,qBAGA5oB,EAAAoB,MAGApb,OAAA,SAAA6B,GACAA,GAAAA,EAAAgC,QAAArI,EAAAsI,WAAAyP,gBACAyG,EAAAoB,GAGAnB,EAAApY,UAaA2tC,EAAA,SAAAxG,EAAAyG,EAAAC,GAEAD,EAAAA,GAAA,SAEA,IAAAn7B,EAAA,GASA,OARAo7B,GAAAp7B,EAAAF,KAAA5Y,EAAAgN,IAAAsJ,OAAAqC,QAEAG,EAAAF,KAAAtF,EAAA1Q,KAAAoR,aAAAyoB,OAAA,KAAA+Q,EAAAyG,GACAzvC,OAAA,SAAA6B,GACAR,QAAAqB,MAAA,sDACArB,QAAAxG,MAAAgH,OAGA5G,EAAAgQ,IAAAqJ,GACA1W,MAAA,SAAAL,GACA,IAAAmyC,EAAA,CACA,IAAAC,EAAApyC,EAAA,GAEAnG,EAAAN,QAAAkyC,GAAA,SAAA5qC,IACAA,EAAAjB,KAAAiB,EAAAqxC,KACArxC,EAAAjB,IAAAwyC,EAAAvxC,EAAAqxC,IAEArxC,EAAAjB,KAAAiB,EAAAjB,KAAAiB,EAAA8F,aACA9F,EAAA8F,SAMA,OAAA8kC,MAIAqF,EAAA,SAAAjwC,EAAAwG,IACAA,EAAAA,GAAA,IACAyN,KAAAzN,EAAAyN,MAAA,OACAzN,EAAAhM,QAAAgM,EAAAhM,SAAA,GACAgM,EAAA0pC,cAAA1pC,EAAA0pC,eAAA,GACAlwC,EAAAwxC,OAAAxxC,EAAAwxC,QAAA,GACAxxC,EAAAwxC,OAAAx7B,KAAAxP,IAgBA,OANAkK,EAAAyB,cAAA,OAAA,QACAzB,EAAAyB,cAAA,OAAA,UAGA/U,EAAAsT,IAAAI,KAAA2kB,GAAAmN,KAAAz1B,GAXA,WACAlK,QAAAqB,MAAA,2BACAu0B,EAAA/C,MAzpCA,YAkqCAv9B,MAEA,CACAosB,KAAAyc,EACAiM,iBAAAA,EACAxT,OAAAA,EACA8N,UAhUA,SAAAliB,EAAA1f,GAGA,IAAA0rC,EACA,OAHAhsB,EAAAA,GAAA,EACA1f,EAAAA,GAAA,GAEAlJ,EAAAgQ,IAAA,CACA9E,EAAAsN,WAAA2D,SAAA,GACAxZ,MAAA,SAAAoV,GACA68B,EAAA78B,EAAAusB,cAAA,KAEA/jC,EAAAiY,WAAAC,MAAAqyB,cAEAnoC,MAAA,SAAAL,GAEA,MADAA,EAAAA,EAAA,KACAA,EAAA6d,QAAA7d,EAAA6d,OAAA2kB,QAAAxiC,EAAA6d,OAAA2kB,OAAA5oC,QAAA,OAAA,KACA,IAAA4oC,EAAA3oC,EAAA+hB,OAAA5b,EAAA6d,OAAA2kB,QAAA,SAAA3D,GACA,OAAAA,KAEA,OAAA2S,EAAAhP,EAAA,EAAA,EAAAlc,EAAA1f,MAEAvG,MAAA,SAAAorC,GACA,OAAAA,GAAAA,EAAA7xC,QAGA6xC,EAAAG,EAAAH,EAAAnlB,EAAA1f,GAGAqrC,EAAAxG,EAAA,UAAA,IALA,QAOAprC,MAAA,SAAAorC,GACA,MAAA,CACA8G,KAAA9G,EACA6G,MAAAA,OAkSAtK,QAxOA,SAAA1hB,EAAA1f,GACA0f,EAAAA,GAAA,EACA1f,EAAAA,GAAA,GACA,IAAA4L,EAAAC,KAAAD,MACA,OAAA9U,EAAAgQ,IAAA,CACAzP,EAAAgN,IAAAsJ,OAAAqC,OACA3Y,EAAAgN,IAAAsJ,OAAAyzB,UACA3nC,MAAA,SAAAL,GACA,OAAAA,EAAAwyC,aAAAxyC,EAAAwyC,YAAA54C,OAAAoG,EAAAwyC,iBAAAhwC,OAGAnC,MAAA,SAAAL,GACA,IAAA4W,EAAA5W,EAAA,GACAwyC,EAAAxyC,EAAA,GACA,GAAAwyC,EAAA,CAEA,IAAAC,EAAA,GACAC,EAAA,GACA74C,EAAAN,QAAAi5C,GAAA,SAAAG,GACA,GAAA,MAAAA,EAAApK,aAAA3xB,EAAA+7B,EAAAj3C,QAAA,CACA,IAAAiwC,EAAA,CACA/rC,IAAA+yC,EAAA/yC,IACAlE,OAAAi3C,EAAAj3C,OACA+Z,MAAAk9B,EAAA17B,YACA27B,UAAAD,EAAAC,WAEAC,EAAAH,EAAAC,EAAAj3C,QACA,GAAAm3C,GAAAlH,EAAAl2B,MAAAo9B,EAAAp9B,MACA,OAEAi9B,EAAA/G,EAAAjwC,QAAAiwC,EACA8G,EAAA9G,EAAAl2B,OAIAg9B,EAAA9G,EAAAl2B,OAAAoB,KAAA80B,GAHA8G,EAAA9G,EAAAl2B,OAAA,CAAAk2B,GAOAkH,IACAJ,EAAAI,EAAAp9B,OAAAg9B,EAAAI,EAAAp9B,OAAA1V,QAAA,SAAAC,EAAA8yC,GACA,OAAAA,EAAAp3C,QAAAm3C,EAAAn3C,OAAAsE,GACAA,GAAA,IAAAC,OAAA6yC,KACA,MACA,OAAAL,EAAAI,EAAAp9B,eACAg9B,EAAAI,EAAAp9B,YAMA,IAAAg2B,EAAA5xC,EAAAyd,OAAAo7B,GACAJ,EAAA7G,EAAA7xC,OAGA4oC,GADAiJ,EAAAG,EAAAH,EAAAnlB,EAAA1f,IACA7G,QAAA,SAAAC,EAAA8yC,GACA,OAAA9yC,EAAAC,OAAA6yC,EAAAr9B,SACA,IAEA,OAAA/X,EAAAgQ,IAAA,CAEAzP,EAAAiY,WAAAssB,OAAA3oC,EAAA8hB,KAAA6mB,IACAniC,MAAA,SAAAmiC,GAEA3oC,EAAAN,QAAAipC,GAAA,SAAA/sB,GACA5b,EAAAN,QAAAk5C,EAAAh9B,EAAAxa,SAAA,SAAA0wC,GACAA,EAAAgB,QAAAl3B,EAAAqE,WACA,IAAArE,EAAAxa,QAAA0wC,EAAAiH,YAAAn9B,EAAAva,OACA41C,EAAAnF,EAAA,CAAA72B,KAAA,QAAAzZ,QAAA,yCACAyI,QAAAqB,MAAA,qDAAApG,OAAA4sC,EAAA/rC,gBAOAqyC,EAAAxG,EAAA,UAAA,KAEAprC,MAAA,WAEA,OADAyD,QAAAqB,MAAA,yDAAApG,OAAA0sC,GAAAA,EAAA7xC,QAAA,EAAA04C,EAAA7/B,KAAAD,MAAAA,IACA,CACA+/B,KAAA9G,EACA6G,MAAAA,WAuJA5kC,IAjJA,WAEA,OAAAmkC,EADA,CAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,KACA,EAAA5zC,EAAAe,UAAAomC,qBACA/kC,MAAA,SAAAorC,GACA,OAAAwG,EAAAxG,EAAA,UAAA,MAEAprC,KAAAmrC,GACAnrC,MAAA,WACA,MAAA,CACAkyC,KAAA9G,OACA6G,MAAA7G,OAAA7xC,YAwIAsD,OArEA,SAAAyuC,EAAAuG,EAAAC,GACA,OAAAF,EAAA,CAAAtG,GAAAuG,EAAAC,GACA9xC,MAAA,SAAAL,GACA,OAAAA,EAAA,OAmEAiyC,UAAAA,EAEA1gC,IAAAA,MCvrCAtU,QAAA6Q,OAAA,qBAAA,CAAA,QAAA,sBACA,2BAAA,wBAEAC,QAAA,OAAA,CAAA,KAAA,WAAA,UAAA,aAAA,YAAA,UAAA,MAAA,MAAA,WAAA,aAAA,QAAA,aAAA,SAAArQ,EAAAZ,EAAAi2C,EAAA5kC,EAAA6kC,EAAAh1C,EAAAC,EAAAgQ,EACA9P,EAAAC,EAAA60C,EAAArqC,GAGA,IACA2I,EAAA,IAAAtD,EAAA7U,KAAA,QAEA,SAAA85C,EAAAx3C,EAAAy3C,EAAAt1B,EAAAu1B,EAAAC,GACAF,GAAAA,EAAAv5C,QAEAC,EAAAN,QAAA45C,GAAA,SAAA3oC,GACA,GAAA,OAAAA,EAAAykC,cAAAoE,EAAA,CACA,IAMAC,EAEAC,EARAC,GAAA,EACAC,EAAAjpC,EAAAkpC,QAAA3zC,QAAA,SAAAC,EAAAurB,GAEA,OADAioB,EAAAA,GAAAjoB,IAAA7vB,EACA6vB,IAAA7vB,EAAAsE,EAAAC,OAAAsrB,GAAAvrB,IACA,IACA2zC,EAAA,GAEAlL,EAAA,GAGA5F,EAAAr4B,EAAAopC,QAAA7zC,QAAA,SAAA8zC,EAAAjK,EAAAkK,GAEA,IAAAC,EAAA,iBAAAnK,EAAAA,EAAAruC,MAAA,IAAA,GAAA,CAAAquC,EAAA/G,OAAA+G,EAAA9G,KAAA8G,EAAAoK,YACAV,EAAAp8B,SAAA68B,EAAA,IACA,IAAAE,EAAAC,EAAAh9B,SAAA68B,EAAA,IAAAT,GACAa,EAAAJ,EAAA,GACAK,EAAAn2C,EAAAnC,OAAAkrC,cAAAhrC,KAAAm4C,GAGA,GAAAC,EAAA,CACA,IAAAC,EAAAD,EAAA,GACA,GAAAC,IAAA34C,EAAA,CACA,IAAA83C,EACA,OAAAK,EAAAI,EAGA,OAAAzpC,EAAAykC,cACAxG,EAAA5xB,KAAA,CACAgsB,OAAA3rB,SAAA68B,EAAA,IACAjR,KAAAwQ,EACAx+B,KAAA,IACAw/B,WAAA9pC,EAAAtP,KACA44C,QAAAA,EACAS,UAAA,EACAP,WAAAG,SAWA,GAHA,KAAAE,GAAAx6C,EAAA26C,SAAAf,EAAAY,IACAV,EAAA98B,KAAAw9B,GAEAb,EAEA,OAAAK,EAAAI,OAOA,IAAA,IAAAE,EAAAt7B,QAAA,OAAAnd,EAAA,KAAA,CACA,IAAA+4C,EAAAx2C,EAAAuM,GAAAu+B,qBAAAoL,GACA,GAAAM,EAgBA,OAdAhM,EAAA5xB,KAAA5Z,QAAA+S,MAAA,CACA6yB,OAAA3rB,SAAA68B,EAAA,IACAjR,KAAAwQ,EACAx+B,KAAA,IACAw/B,WAAA9pC,EAAAtP,KACA44C,QAAAA,EACAE,WAAAG,EACAI,UAAA,GACAE,IACAA,EAAA5R,OAAAoR,GACAV,EAAAA,GAAA,IACA18B,KAAA49B,GACA3wC,QAAAqB,MAAA,0BAAAsvC,GAEAZ,EAAAI,EAGA,OAAAJ,IACA,GAEAa,EAAA7R,EAAA,EAAA4Q,EAAAE,EACA1F,EAAAzjC,EAAAyjC,MAAAzjC,EAAAmqC,eAGAC,EAAA,IAAA/R,GAAAA,EAAA,IAAAr4B,EAAAtP,KAAA,IAAA+yC,EACA,GAAA2G,IAAAxB,EAAAwB,GAAA,CACAxB,EAAAwB,IAAA,EACA,IAAAC,EAAA,CACA5G,KAAAA,EACApL,OAAAA,EACAnnC,OAAA,IAAAg5C,EAAA96C,OAAA86C,EAAA,QAAAlyC,EACAuvC,QAAA2C,EAAA96C,OAAA,EAAA86C,OAAAlyC,EACAsyC,QAAAtqC,EAAAsqC,QACAC,MAAA,EACA75C,KAAAsP,EAAAtP,KACA85C,SAAAxqC,EAAAwqC,SACA/F,aAAAzkC,EAAAykC,cAIAuE,GAAA,OAAAhpC,EAAAykC,eACA4F,EAAAI,OAAAzqC,EAAAyqC,OACAJ,EAAApM,QAAAA,GAEA8K,IACAsB,EAAAtB,cAAAA,GAEA11B,EAAAhH,KAAAg+B,QAOA,SAAAK,EAAAx5C,EAAAy5C,GACA,OAAAz3C,GAAA,SAAA+e,EAAAC,GAEA,IAAA04B,EAAAxiC,SAAAqrB,MAAAC,OACAiX,EAAAA,GAAAC,EAAAh3C,EAAAyC,KAAAsP,wBACA,IAAA3F,EAAA,CACAo+B,SAAA,GACAyM,WAAA,GACA3M,QAAA,GACA4M,OAAA,IAGAlC,EAAA,GAEAr8B,EAAA,CAEAnO,EAAAsN,WAAA2D,SAAA,GAGA5b,EAAAuM,GAAAk+B,QAAAV,QAAA,CAAAtsC,OAAAA,IACA2E,MAAA,SAAAL,GACAkzC,EAAAx3C,EAAAsE,EAAA0oC,QAAAC,QAAAn+B,EAAAo+B,SAAAwK,GAAA,GACAF,EAAAx3C,EAAAsE,EAAA0oC,QAAAV,QAAAx9B,EAAAo+B,SAAAwK,GAAA,OAKA,GAAA,YAAA+B,EAAA,CACA,IAAAI,EAAA,SAAAv1C,GACAkzC,EAAAx3C,EAAAsE,EAAA0oC,QAAA8M,KAAAhrC,EAAAk+B,QAAA0K,GAAA,GACAF,EAAAx3C,EAAAsE,EAAA0oC,QAAA+M,SAAAjrC,EAAAk+B,QAAA0K,GAAA,IAIA,GAAA+B,EAAA,EAAA,CAIA,IAFA,IAAAO,EAAAt3C,EAAAyC,KAAAuP,yBAEA2K,EADAo6B,GAAAA,EAAAO,EACA36B,EAAA26B,EAAAN,EAAAr6B,GAAA26B,EACA3+B,EAAAF,KAAA5Y,EAAAuM,GAAAk+B,QAAAG,MAAA,CAAAntC,OAAAA,EAAAi6C,KAAA56B,EAAA66B,GAAA76B,EAAA26B,EAAA,IAAA,GACAr1C,KAAAk1C,IAKAx+B,EAAAF,KAAA5Y,EAAAuM,GAAAk+B,QAAAG,MAAA,CAAAntC,OAAAA,EAAAi6C,KAAAP,EAAAA,EAAAM,EAAAE,GAAAR,EAAA,YAAA,GACA/0C,KAAAk1C,SAKAx+B,EAAAF,KAAA5Y,EAAAuM,GAAAk+B,QAAAh7B,IAAA,CAAAhS,OAAAA,IACA2E,KAAAk1C,IAKAn3C,EAAAyC,KAAAyP,eAAA6kC,EAAA,GAiBAp+B,EAAAF,KACAtF,EAAA1Q,KAAAoR,aAAA4jC,QAAA,CACAn6C,OAAAA,EACAy5C,SAAAA,IAEA90C,MAAA,SAAAL,GACAA,GAAAA,EAAApG,QACAC,EAAAN,QAAAyG,GAAA,SAAAuyC,GACA/nC,EAAAk+B,QAAA7xB,KAAA07B,SAIA9vC,OAAA,SAAA6B,GACAR,QAAAqB,MAAA,wDACArB,QAAAxG,MAAAgH,OAOA5G,EAAAgQ,IAAAqJ,GACA1W,MAAA,SAAAL,GACA,IAAA6Z,EAAA7Z,EAAA,GAGAwK,EAAAk+B,QAAA7zB,MAAA,SAAAihC,EAAAC,GACA,OAAAA,EAAA9H,KAAA6H,EAAA7H,QAEA,IAAA+H,EAAAn8C,EAAAkjC,UAAAvyB,EAAAk+B,SAAA,SAAAl+B,GACA,OAAAA,EAAAykC,cAAAp1B,EAAA5e,OAAAmD,EAAAyC,KAAA6P,uBAGAlG,EAAA6qC,WAAAW,EAAA,EAAAxrC,EAAAk+B,QAAA3vB,OAAA,EAAAi9B,GAAA,GAEAxrC,EAAA2qC,SAAA,YAAAA,GAAAA,QAAA3yC,EACAgI,EAAAyrC,OAAAzrC,EAAAk+B,QAAA9uC,OAAA4Q,EAAAk+B,QAAA,GAAAuF,KAAAzjC,EAAA2qC,SAEA14B,EAAAjS,MAEA/H,MAAAia,MAIA,SAAAw3B,EAAArR,EAAAC,GACA,OAAAA,GAAA,EAAAD,EAAAA,EAAA7nB,KAAAC,IAAA,GAAA6nB,GAWA,SAAAoT,EAAAr4B,EAAA4qB,GACA5uC,EAAA4uC,GAAAlvC,SAAA,SAAAo7B,IATA,SAAAA,EAAA8T,EAAA0N,GACA,IAAAC,EAAAzhB,EAAA7f,KAAA,IAAA6f,EAAA2f,WAAA,IAAA3f,EAAAmf,QACA72C,QAAAqM,YAAA6sC,EAAAC,MACA3N,EAAA5xB,KAAA8d,GACAwhB,EAAAC,GAAA3N,EAAA7uC,OAAA,GAMAy8C,CAAA1hB,EAAA9W,EAAA4qB,QAAA5qB,EAAAs4B,sBAIA,SAAAG,EAAA56C,GACA,OAAAuC,EAAAuM,GAAAi+B,QAAA,CAAA/sC,OAAAA,IACA2E,MAAA,SAAAL,GACA,IAAAa,EAAA,CACA4nC,QAAA,GACA0N,kBAAA,GACAI,QAAA,GASA,OAPAv2C,EAAAyoC,SAAAzoC,EAAAyoC,QAAA7uC,SACAC,EAAAN,QAAAyG,EAAAyoC,SAAA,SAAA9T,GACAA,EAAA4f,UAAA,EACA1zC,EAAA01C,SAAArC,EAAAvf,EAAAkO,OAAAlO,EAAAmO,SAEAoT,EAAAr1C,EAAAb,EAAAyoC,UAEA5nC,KAEA4B,OAAA,SAAA6B,GAEA,MADAR,QAAAC,KAAA,sCAAAO,GACAA,KAIA,SAAA29B,EAAAvmC,EAAAy5C,GACA,IAEAt0C,EAFA2R,EAAAC,KAAAD,MASA,OAJA1V,GAAA,WACA+D,GAAA7C,EAAAZ,QAAAu0B,OAAA,CAAA/E,SAAA,0BACA,KAEAlvB,EAAAgQ,IAAA,CAGA4oC,EAAA56C,GAGAw5C,EAAAx5C,EAAAy5C,KAGA90C,MAAA,SAAAL,IAEAa,EAAAb,EAAA,IACAwK,GAAAxK,EAAA,GAEA,IAAAw2C,EAAA,GACAC,EAAA,GACAC,EAAA71C,EAAA01C,QACAI,EAAA91C,EAAA01C,QAEA,SAAAK,EAAApsC,GACA,IAAAqsC,EAAA,GACAj0C,GAAA,EACA4H,EAAAq4B,OAAA,EACAjgC,GAAA,GAIA/I,EAAA+L,KAAA4E,EAAAyqC,QAAA,SAAA6B,GACA,IAAAC,EAAAD,EAAAv7C,MAAA,KAAAotB,MAAA,GAAAxtB,KAAA,KACA67C,EAAAn2C,EAAAs1C,kBAAAY,GACA,IAAA95C,QAAAuC,UAAAw3C,GAKA,OADAp0C,GAAA,GACA,EAJAi0C,EAAAhgC,KAAAhW,EAAA4nC,QAAAuO,OAOAxsC,EAAAi+B,SACAyN,EAAAr1C,EAAA2J,EAAAi+B,gBAEAj+B,EAAAi+B,eACAj+B,EAAAyqC,QAEAryC,GACA+zC,GAAAnsC,EAAAq4B,OACA2T,EAAA3/B,KAAArM,GACA3Q,EAAAN,QAAAs9C,GAAA,SAAAliB,GACAA,EAAA4f,UAAA,MAIAkC,EAAA5/B,KAAArM,GAMA,IAFA,IAAAysC,EAAAp2C,EAAA2J,GAAAo+B,SACAz8B,GAAA,EACA8qC,GAAAA,EAAAr9C,QAEAC,EAAAN,QAAA09C,EAAAL,GAGAH,EAAA78C,OAAA,GAAA48C,EAAA58C,OAAA,GAAAuS,GACA8qC,EAAAR,EACAA,EAAA,GACAtqC,GAAA,GAGA8qC,EAAA,KAIAp2C,EAAA2J,GAAA3J,EAAA2J,IAAA,GACA3J,EAAA2J,GAAAo+B,SAAA4N,EAAA3hC,MAAA,SAAAihC,EAAAC,GACA,OAAAA,EAAA9H,KAAA6H,EAAA7H,QAEAptC,EAAA2J,GAAA8qC,OAAAmB,EAAA5hC,MAAA,SAAAihC,EAAAC,GACA,OAAAA,EAAA9H,KAAA6H,EAAA7H,QAGAptC,EAAA01C,QAAAI,EAAA,EAAAD,EAAAC,EAGA,IAAAO,GAAAr2C,EAAA2J,GAAAk+B,SAAA,IAAAzoC,OAAAY,EAAA2J,GAAA6qC,YAAA,GAAAx0C,EAAA2J,GAAAo+B,UAAA,GAAA/nC,EAAA2J,GAAA8qC,QAAA,IACA,OAAArC,EAAAhB,UAAAiF,EAAA,UACA72C,MAAA,WAEA,OADAyD,QAAAqB,MAAA,kCAAAsN,KAAAD,MAAAA,GAAA,MACA3R,QAGA4B,OAAA,SAAA6B,GAEA,MADAR,QAAAC,KAAA,6CAAAO,GACAA,KAyEA,OAFAiN,EAAAyB,cAAA,OAAA,WAEA,CACAwS,KAAAyc,EACAkV,YAvEA,SAAAz7C,GAEA,OADAoI,QAAAqB,MAAA,4BAAAzJ,EAAAW,UAAA,EAAA,IACA4lC,EAAAvmC,EAAA,YAsEA07C,oBAlEA,SAAA17C,EAAAuK,GAOA,OALAA,EAAAA,GAAA,IACAkvC,SAAAlvC,EAAAkvC,WAAA,EAEArxC,QAAAqB,MAAA,6CAAApG,OAAArD,EAAAmX,OAAA,EAAA,KAEAnV,EAAAgQ,IAAA,CACAS,EAAA,CAAA,uBACA,aACA,gBACA,4BACA,yBACA,4BACAvF,EAAAsN,WAAA2D,SAAA,GACAooB,EAAAvmC,EAAAuK,EAAAkvC,YAEA90C,MAAA,SAAAwd,GACA,IAAA8O,EAAA9O,EAAA,GACAylB,EAAAzlB,EAAA,GACAw5B,EAAA/T,GAAAA,EAAAxpB,YAAAlH,SAAAqrB,MAAAC,OACA7yB,EAAAi4B,GAAAA,EAAAj4B,SAEAxK,EAAAgd,EAAA,GAGA,OAAAhd,GAAAA,EAAA2J,IAAA3J,EAAA2J,GAAAk+B,QAIAv6B,EAAA,oBAAA,CAAA9C,SAAAA,EAAA3P,OAAAA,EAAA27C,YAAAA,IACAh3C,MAAA,SAAAi3C,GAEA,IAAAC,EAAAxE,EAAA,iBACAyE,EAAAzE,EAAA,cACA0E,EAAA1E,EAAA,wBAEA1X,EAAA,CACA1O,EAAA,wBACAA,EAAA,cACAA,EAAA,iBACAA,EAAA,0BAAA,KAAA8qB,EAAApsC,GAAA,IACAshB,EAAA,4BAEA9lB,EAAAhG,EAAA2J,GAAAk+B,QAAAzoC,OAAAY,EAAA2J,GAAA6qC,YAAAt1C,QAAA,SAAAC,EAAAwK,GACA,OAAAxK,EAAAC,OAAA,CACAu3C,EAAAhtC,EAAAyjC,MACAzjC,EAAA5K,IACA4K,EAAA9O,OACA67C,EAAA/sC,EAAAq4B,OAAA,KACA,KAAAr4B,EAAAuqC,KAAApoB,EAAA,6BAAAniB,EAAAsqC,SAAA,KACA35C,KAAA,KAAA,QACA,CAAAkgC,EAAAlgC,KAAA,KAAA,OAEAwH,EAAA,IAAA4a,KAAA1W,EAAA,CAAAiO,KAAA,8BACAk+B,EAAA0E,OAAA/0C,EAAA20C,MA5BAt5C,EAAA+zB,MAAA9vB,KAAA,6BAyCAsP,IAAAA,MCndAtU,QAAA6Q,OAAA,yBAAA,CAAA,QAAA,cAAA,sBAAA,yBAAA,wBACA,6BAGAC,QAAA,WAAA,CAAA,KAAA,aAAA,WAAA,aAAA,UAAA,gBAAA,UAAA,MAAA,OAAA,eAAA,iBAAA,SAAA,cAAA,WAAA,MAAA,WAAA,aAAA,YAAA,OAAA,QAAA,OAAA,aAAA,SAAArQ,EAAAsQ,EAAAlR,EAAAqR,EAAA4kC,EAAAhnB,EAAA/tB,EACAiQ,EAAA0pC,EAAAzpC,EAAAqwB,EAAArgC,EACAL,EAAAC,EAAAG,EAAAE,EAAAC,EAAA40C,EAAAz1B,EAAA01B,EAAA2E,EAAAhvC,GAGA,IACA4d,EADAqxB,EAAA55C,EAGA,SAAA65C,EAAA98C,EAAAiD,GAGA,IACAmuB,EAeAxb,EACAwD,EACA9C,EACAtC,EACA+oC,EAlBA/4C,GAHAf,EAAAA,GAAA45C,GASA74C,UAAAmmC,iBANAnmC,EAOAf,EAAAe,UAAAmmC,iBAPAnmC,EAQAf,EAAAe,UAAAmmC,iBARAnmC,EASAf,EAAAe,UAAAmmC,iBATAnmC,EAUAf,EAAAe,UAAAmmC,iBAGAtkC,EAAA,GAMAm3C,GAAA,EACAzmC,EAAA,IAAAtD,EAAA7U,KAAA,YAAA4B,GAEA+mC,EAAA,SAAA3hC,GACAS,EAAAoc,QAAA,EACApc,EAAAnF,OAAA,KACAmF,EAAAqvB,OAAA,KAEArvB,EAAAjB,IAAA,KACAiB,EAAAo3C,UAAA,KACAp3C,EAAAq3C,MAAA,KACAr3C,EAAAs1C,kBAAA,KACAt1C,EAAAiZ,WAAA,KACAjZ,EAAAmM,aAAA,GACAnM,EAAA6rC,SAAA,KACA7rC,EAAA8rC,QAAA,KACA9rC,EAAAs3C,SAAA,KACAt3C,EAAAkM,UAAA,EACAlM,EAAAwxC,OAAA,GAGAxxC,EAAA4oC,SAAA,GAGA5oC,EAAAu3C,cAAA,KAEAC,IACAC,IAEAhnC,GAAA,EACAtC,OAAAxM,EAEApC,EACAmR,EAAA1Q,KAAA4Q,MAAArR,KAAAS,IAGA03C,KAAA3nC,IAAAA,EAAAnN,iBACArF,EAAAoV,QAEAjC,EAAA1Q,KAAA4Q,MAAA+B,MAAA3S,KAIAw3C,EAAA,WACAx3C,EAAAsB,QAAA,CACAmD,OAAA,KACAhD,OAAA,OAsBAg2C,EAAA,WAhBAz3C,EAAA4nC,aAAAjmC,EACA3B,EAAAs1C,uBAAA3zC,EACA3B,EAAA01C,QAAA,EAKA11C,EAAA2J,GAAA3J,EAAA2J,IAAA,GACA3J,EAAA2J,GAAAk+B,QAAA,GACA7nC,EAAA2J,GAAAo+B,SAAA,GACA/nC,EAAA2J,GAAA6qC,WAAA,GACAx0C,EAAA2J,GAAA8qC,OAAA,UACAz0C,EAAA2J,GAAA2qC,gBACAt0C,EAAA2J,GAAAyrC,QAUAsC,EAAA,WACA,MAAA,YAAAv9C,GAGAw9C,EAAA,WACA,OAAA33C,EAAAu3C,eAAAv3C,EAAAu3C,cAAA91B,OAAAzhB,EAAAu3C,cAAAvxC,SAcAqvC,EAAA,SAAAzN,GACA5nC,EAAA4nC,QAAA5nC,EAAA4nC,SAAA,GACA5nC,EAAAs1C,kBAAAt1C,EAAAs1C,mBAAA,GACAt8C,EAAA4uC,GAAAlvC,SAAA,SAAAo7B,IAdA,SAAAA,EAAA8T,EAAA0N,GACA,IAAAC,EAAAzhB,EAAA7f,KAAA,IAAA6f,EAAA2f,WAAA,IAAA3f,EAAAmf,QACA72C,QAAAqM,YAAA6sC,EAAAC,MACAzhB,EAAAqf,YACAlwC,QAAAC,KAAA,oDAAA4wB,GAEA8T,EAAA5xB,KAAA8d,GACAwhB,EAAAC,GAAA3N,EAAA7uC,OAAA,GAQAy8C,CAAA1hB,EAAA9zB,EAAA4nC,QAAA5nC,EAAAs1C,uBAKA54C,EAAA,SAAA0I,GACA,IAAAqL,EACA,OAAAtC,GAAAkD,MACA7R,MAAA,WACA,OAAA9C,EAAA0I,MAIA,IAAAwyC,GAAAp7C,IACAq7C,EAAAzyC,IAAAA,EAAA7G,OAAAD,KAAA8G,EAAA0yC,WAGA,IAAAF,IAAAC,EACA,OAAAE,GAAA3yC,GAGAvI,EAAAsH,KAAAnE,GAFAohC,GAAAh8B,GAIA,IAEA4yC,EAFA93C,EAAA3C,EAAAyC,KAAAC,aAAA,EAGA,OAAAmF,GAAAA,EAAA4yC,SAAAn7C,EAAAsH,KAAAiB,EAAA4yC,UAAA36C,EAAA46B,UAAA7yB,IACA5F,MAAA,SAAAL,GACA,IAAAA,IAAAA,EAAAtE,SACA+8C,GAAAz4C,EAAAtE,SAAAmF,EAAAnF,QACAg9C,KAAA14C,EAAAmC,UAAAnC,EAAAmC,QAAAG,SAAAtC,EAAAmC,QAAAmD,QACA,KAAA,YAcA,GAXAuzC,EAAA74C,EACAa,EAAAnF,OAAAm9C,EAAAn9C,OACAmF,EAAAjB,IAAAi5C,EAAAj5C,KAAAiB,EAAAjB,IACAiB,EAAAq3C,MAAAjyC,GAAAhJ,QAAAuC,UAAAyG,EAAAiyC,OAAAjyC,EAAAiyC,MAAAr3C,EAAAq3C,MACAn3C,IACAF,EAAAsB,QAAA02C,EAAA12C,SAAA,CACAmD,OAAA,KACAhD,OAAA,OAIAm2C,EAEA,OAAAlnC,EAAA1Q,KAAAoR,aAAA6mC,WAAAj4C,GACA4B,OAAA,SAAA6B,GAEA,MADAy9B,IACAz9B,KAGAjE,MAAA,WACA,GAAAo4C,EACA,OAAAlnC,EAAA1Q,KAAAoR,aAAA1U,MAAAsD,GACA4B,OAAA,SAAA6B,GACAR,QAAAC,KAAA,yDAAAO,YAQAjE,MAAA,WAEA,OAAAo4C,EACAM,KAGAL,EACAM,UADA,KAKA34C,MAAA,WAQA,GAPAo4C,GAGA/0C,KAIAg1C,GAAAv5C,IAIA,OAFA85C,IAAA,GAEA1nC,EAAA1Q,KAAAoR,aAAA7S,KAAA2B,EAAAF,EAAAg4C,MAGAx4C,MAAA,WAIA,IAAA64C,GAAAT,GAAAxyC,GAAAA,EAAAkzC,QAAA,CAAAA,SAAA,QAAA32C,EACA,IAAAo2C,GAAAM,GACA,OAAAjX,GAAAiX,MAGA74C,MAAA,WAQA,OAPA4F,GAAAA,EAAArC,OACA5F,EAAAZ,QAAA+D,KAAA,IAGAnD,EAAAZ,QAAA+D,KAAA,KAGAJ,EAAAF,EAAA5D,QAAA+S,MAAA,GAAAnP,EAAAg4C,MAEAp2C,OAAA,SAAA6B,GACA,KAAA,UAAAA,GAAA2B,GAAAA,EAAA4yC,UACA,OAAA/7C,GAAA,WACA,OAAAS,EAAA0I,KACA,KAEA,MAAA3B,MAIA80C,EAAA,WACA,IAAAC,EAAAl6C,IAEA,OAAAzB,GAAA,SAAA+e,EAAAC,GAEA,IAAAhhB,EAAAmF,EAAAnF,OACAqmC,IACAuX,GAAA59C,GAGA6V,EAAA1Q,KAAA4Q,MAAA2nC,SAEAC,GACA9nC,EAAA1Q,KAAA4Q,MAAA8nC,SAGAN,IAAA,GAEAltB,EAAA2G,aAEAjW,QAIApf,EAAA,WACA,QAAAwD,EAAAnF,QAGA0D,EAAA,SAAA6G,GACA,OAAAqL,EAQAnT,EAAA2J,UAAA3J,EAAAI,KACAP,EAAA0H,MAAAnH,OACA8B,MAAA,WACA,KAAA,gBAIAlB,KAAA8G,GAAAA,EAAA0yC,YAIA1yC,EAAAA,GAAA,IACAvG,eAAArC,KAAAwD,EAAAnF,OACAuK,EAAA7G,MAAA,EACA7B,EAAA0I,IANAvI,EAAAsH,KAAAnE,IAfAmO,GAAAkD,MACA7R,MAAA,WACA,OAAAjB,EAAA6G,OAsBAszC,EAAA,WACA,OAAA77C,GAAA,SAAA+e,EAAAC,GAEA27B,IACA30C,KAGA6N,EAAA1Q,KAAA4Q,MAAA8nC,SAEAN,IAAA,GAEAltB,EAAA2G,aAEAjW,QAIAtd,EAAA,WACA,OAAA0B,EAAAnF,QAAAmF,EAAAsB,SAAAtB,EAAAsB,QAAAmD,SAAA,GAGAslB,EAAA,SAAA3kB,GACA,OAAAqL,EAOAnS,IACAzB,EAAAsH,KAAAnE,EAAAsB,WAEA8D,EAAAA,GAAA,IACArC,QAAA3G,QAAAuC,UAAAyG,EAAArC,SAAAqC,EAAArC,OACAxE,EAAA6G,GACA5F,MAAA,WACA,OAAAQ,EAAAsB,aAbA6M,GAAAkD,MACA7R,MAAA,WACA,OAAAuqB,EAAA3kB,OAmBA2yC,GAAA,SAAA3yC,GACA,GAAAA,EAAA,CACA,GAAAA,EAAAkzC,UAAAlzC,EAAAwiC,QAAA,OAAA5nC,EAAAoc,SAAA,EACA,GAAAhX,EAAA+G,eAAAnM,EAAAmM,aAAAiQ,OAAA,OAAA,EACA,GAAAhX,EAAAuE,IAAAvE,EAAAuE,GAAAZ,UAAA/I,EAAA2J,GAAA2qC,UAAA,YAAAt0C,EAAA2J,GAAA2qC,UAAA,OAAA,EACA,GAAAlvC,EAAAkyC,WAAAt3C,EAAAs3C,SAAA,OAAA,EAEA,OAAAt3C,EAAAoc,QAAApc,EAAA4nC,UAAA,GAGA+Q,GAAA,WACA,GAAA34C,EAAAoc,OACA,OAAApc,EAAAnF,UAEAmF,EAAAkM,UACAlM,EAAAmM,aAAAC,mBACApM,EAAAmM,aAAAzS,UACAsG,EAAAmM,aAAAg/B,UACAnrC,EAAAmM,aAAAo/B,WAGAvrC,EAAA4nC,SAAA5nC,EAAA4nC,QAAA7uC,OAAA,GAGAiH,EAAA2J,GAAAk+B,QAAA9uC,OAAA,GACAiH,EAAA2J,GAAA6qC,WAAAz7C,OAAA,GACAiH,EAAA2J,GAAAo+B,SAAAhvC,OAAA,GAGAiH,EAAAo3C,WACAp3C,EAAA8F,MACA9F,EAAA44C,SAIAvB,GAAA,WAAA,QAAAr3C,EAAAq3C,OAQAx0C,GAAA,SAAAhI,GAEA,GADAA,EAAAA,GAAA,iBAAAA,EAAAA,EAAAmF,EAAAnF,OACAkV,GAAAA,EAAAnN,gBAAA,CAEA,GAAApG,KAAAuT,EAAAhQ,WAAA,CAEA,IAAA4R,EAAAC,KAAAD,MACA1O,QAAAqB,MAAA,uBAEA,IAAA4R,EAAA,GAqBA,OAlBAnG,EAAA9P,cAAA1C,EAAAY,UAAAgC,wBAAA7B,IACA4X,EAAAF,KAAA0nB,EAAA9C,IAnYA,SAmYA59B,EAAAuE,KAAAC,cAAAxB,EAAAsB,QAAAmD,UAGAyR,EAAAF,KAAA0nB,EAAA9C,IAtYA,SAsYA,OAIA1kB,EAAAF,KAAA3I,EAAAutB,IA7YA,SA6YA56B,EAAAnF,SAGAmF,EAAAjB,IACAmX,EAAAF,KAAA3I,EAAAutB,IAhZA,MAgZA56B,EAAAjB,MAGAmX,EAAAF,KAAA3I,EAAAutB,IAnZA,MAmZA,OAGA/9B,EAAAgQ,IAAAqJ,GACA1W,MAAA,WACAyD,QAAAqB,MAAA,uBAAAsN,KAAAD,MAAAA,GAAA,SAKA,OAAA9U,EAAAgQ,IAAA,CACA6wB,EAAA9C,IA5ZA,SA4ZA,MACAvtB,EAAAutB,IAhaA,SAgaA,MACAvtB,EAAAutB,IAhaA,MAgaA,MAEA//B,EAAA6iC,EAAA9C,IAjaA,QAiaA//B,EAAA,MAAAgC,EAAAsH,SAKA,OAAAtH,EAAAgQ,IAAA,CACA6wB,EAAA9C,IAtaA,SAsaA,MACAvtB,EAAAutB,IA1aA,SA0aA,MACAvtB,EAAAutB,IA1aA,MA0aA,MAEA//B,EAAA6iC,EAAA9C,IA3aA,QA2aA//B,EAAA,MAAAgC,EAAAsH,OACAtJ,EAAAwS,EAAAutB,IA5aA,QA4aA//B,EAAA,MAAAgC,EAAAsH,UAMAs0C,GAAA,SAAA59C,GAQA,OANAoI,QAAAqB,MAAA,kEAEAo5B,EAAA9C,IArbA,SAqbA,MACAvtB,EAAAutB,IAzbA,SAybA,MACAvtB,EAAAutB,IAzbA,MAybA,MAEA7qB,GAAAA,EAAAnN,gBAEA/H,EAAA6iC,EAAA9C,IA5bA,QA4bA//B,EAAA,MAAAgC,EAAAsH,QAGAlB,QAAAqB,MAAA,sDACAzH,EAAAgQ,IAAA,CACAhS,EAAA6iC,EAAA9C,IAjcA,QAicA//B,EAAA,MAAAgC,EAAAsH,OACAtJ,EAAAwS,EAAAutB,IAlcA,QAkcA//B,EAAA,MAAAgC,EAAAsH,WAMA00C,GAAA,WACA,IAAAr8C,IAAA,KAAA,CAAAhC,QAAA,0BAEA,IAGAwL,EACA8yC,EAJAC,EAAAhpC,GAAAA,EAAAX,0BACA4pC,EA5cA,QA4cAh5C,EAAAnF,OAMAmF,EAAAi5C,eAAAj5C,EAAAi5C,cAAA7L,QACApnC,EAAAA,GAAA,IACAizC,cAAA,CACA7L,KAAAptC,EAAAi5C,cAAA7L,OAGAptC,EAAAk5C,aAAAl5C,EAAAk5C,YAAA9L,QACApnC,EAAAA,GAAA,IACAkzC,YAAA,CACA9L,KAAAptC,EAAAk5C,YAAA9L,OAKAptC,EAAA4oC,UAAA5oC,EAAA4oC,SAAA7vC,UAEAiN,EAAAA,GAAA,IACAmzC,cAAAn5C,EAAA4oC,SAAA7vC,QAEA+/C,EAAAA,GAAA,IAEAlQ,SAAA5vC,EAAA4gB,IAAA5Z,EAAA4oC,UAAA,SAAAr/B,GACA,MAAA,CACA1O,OAAA0O,EAAAvJ,KAAAnF,OACAkE,IAAAwK,EAAAvJ,KAAAjB,IACAq4C,UAAA7tC,EAAAvJ,KAAAo3C,eAIA,IAAAgC,GAAApzC,GAAA8yC,IAAAjd,KAAA8B,UAAAvhC,QAAA+S,MAAA,GAAAnJ,GAAA,GAAA8yC,GAAA,KAGA,OAAAC,GAAAD,EASAx6C,IAIAzB,EAAAgQ,IAAA,CAEA7P,EAAAuE,KAAAggB,eAEAvkB,EAAAgmB,IAAA1hB,QAAA8jB,gBAAAplB,EAAAsB,SAEAo8B,EAAA9C,IAAAoe,EAAAI,GAAA,QAEA55C,MAAA,SAAAL,GACA,IAAAsiB,EAAAtiB,EAAA,GACAmC,EAAAnC,EAAA,GAEA,OAAAnC,EAAAgmB,IAAAuC,KAAAsW,KAAA8B,UAAAmb,GAAAr3B,EAAAngB,EAAA2gB,MAAA3gB,EAAA0gB,OACAxiB,MAAA,SAAA65C,GAQA,OAPArzC,EAAA5J,QAAA+S,MAAAnJ,GAAA,GAAA,CACAuxC,cAAA,CACA91B,MAAAzkB,EAAAuE,KAAAC,cAAAigB,GACAzb,QAAAqzC,KAIAhsC,EAAAutB,IAAAoe,EAAAnd,KAAA8B,UAAA33B,UAxBA03B,EAAA9C,IAAAoe,EAAAI,GAAA,MATAv8C,EAAAgQ,IAAA,CACA6wB,EAAA9C,IAAAoe,EAAA,MACA3rC,EAAAutB,IAAAoe,EAAAI,GAAA,SAoCA1nC,GAAA,WACA,OAAA7U,EAAAgQ,IAAA,CACA6wB,EAAAnyB,IA1hBA,UA2hBA8B,EAAA9B,IA9hBA,UA+hBA8B,EAAA9B,IA9hBA,SAgiBA/L,MAAA,SAAAL,GACA,IAAAm6C,EAAAn6C,EAAA,GACAtE,EAAAsE,EAAA,GACAJ,EAAAI,EAAA,GACA,GAAAtE,GAAA,QAAAA,EAAA,CAIA,IAAAyG,EACA,GAHA2B,QAAAqB,MAAA,qBAAAzJ,EAAAW,UAAA,EAAA,GAAA,wBAGA89C,GAAAA,EAAAvgD,QAAA,QAAAugD,EACA,IACAh4C,EAAA,CACAG,OAAAzE,EAAAuE,KAAAuf,cAAAjmB,GACA4J,OAAAzH,EAAAuE,KAAAuf,cAAAw4B,IAGA,MAAA71C,GACAR,QAAAC,KAAA,2CAAAO,GACAnC,OAAAK,EASA,OALA3B,EAAAnF,OAAAA,EACAmF,EAAAjB,IAAAA,GAAA,QAAAA,EAAAA,OAAA4C,EACA3B,EAAAsB,QAAAA,GAAA,CAAAG,YAAAE,EAAA8C,YAAA9C,GAGAu2C,SAGA14C,MAAA,WAEA,OAAAlB,IACAzB,EAAAgQ,IAAA,CACA6D,EAAA1Q,KAAAoR,aAAA1U,MAAAsD,GACAo4C,IAAA,GACA1nC,EAAA1Q,KAAAoR,aAAA7S,KAAAyB,KAEA4B,OAAA,SAAA6B,GACAR,QAAAC,KAAA,wDAAAO,MAIAjH,IACAkU,EAAA1Q,KAAAoR,aAAA1U,MAAAsD,GACA4B,OAAA,SAAA6B,GACAR,QAAAC,KAAA,yDAAAO,WAHA,KASAjE,MAAA,WACA,OAAAQ,MAIAk4C,GAAA,WACA,IAAA17C,IAAA,KAAA,CAAAhC,QAAA,0BACA,OAAA68C,KAAAx6C,EAAAsH,KAAAnE,GAEAnD,EAAAgQ,IAAA,CACA6wB,EAAA1sB,UA7lBA,QA6lBAhR,EAAAnF,QACAwS,EAAA2D,UA9lBA,QA8lBAhR,EAAAnF,UAGA2E,MAAA,SAAAL,GACA,IAAAo6C,EAAAp6C,EAAA,GACAq6C,EAAAr6C,EAAA,GACA,OAAAo6C,GAAAA,EAAA3Q,UAAA2Q,EAAA3Q,SAAA7vC,SAAAygD,EAAAL,cACAM,GAAAF,GACA33C,OAAA,SAAA6B,GAGA,OAFAR,QAAAxG,MAAA,2FAAAgH,GAEAg2C,GAAAD,MAGAC,GAAAD,OAIAC,GAAA,SAAAzzC,GACA,IAAAA,EAAA,OAAAnJ,EAAAsH,OAGA,GAAA6B,EAAA4iC,SAAA,CACA,IAAA8Q,EAAA15C,EAAAm5C,cACAQ,EAAAC,GAAA,CACAhX,MAAA,EACA//B,OAAA,IAGA,IACA,IAAAquC,EAAA,GACAl4C,EAAAN,QAAAsN,EAAA4iC,UAAA,SAAAiR,GACA,IAAA3I,EAAA2I,EAAAh/C,QAAA,CACAq2C,EAAA2I,EAAAh/C,SAAA,EACA,IAAA0O,EAAAuwC,KACAvwC,EAAAvJ,KAAAnF,OAAAg/C,EAAAh/C,OACA0O,EAAAvJ,KAAAo3C,UAAAyC,EAAAzC,UACA7tC,EAAAvJ,KAAAjB,IAAA86C,EAAA96C,IACAg7C,GAAAxwC,EAAA,CAAA1G,OAAA,eAGAmD,EAAA4iC,gBAEA5oC,EAAAm5C,cAEA,MAAA11C,GAKA,OAJAR,QAAAxG,MAAA,8CAAAgH,GAEAzD,EAAAm5C,cAAAO,EACA15C,EAAA4oC,SAAA+Q,EACA98C,EAAAgf,OAAA,CAAArhB,QAAA,qCAIAxB,EAAAN,QAAAihD,GAAA,IAAA,SAAAE,GACAA,EAAAjX,UAYA,cAPA58B,EAAAnL,cACAmL,EAAAjH,IAGA3C,QAAA+S,MAAAnP,EAAAgG,GAGA2xC,KAAAr5C,IACA65C,GAAA,CAAAt1C,OAAA,IACArD,MAAA,WACA,OAAAQ,KAIAnD,EAAAsH,KAAAnE,IAOAqtC,GAAA,SAAAE,EAAAn0B,GAKA,OAHA4gC,GAAA,gBAGA5H,EAAA/E,iBAAArtC,EAAAutC,GACA3rC,OAAA,SAAA6B,GAEA,IAAA2V,EAGA,OAFAnW,QAAAxG,MAAA,0EAAAyB,OAAAuF,GAAAA,EAAAjJ,SAAAiJ,GAAAA,GACAtG,EAAAZ,QAAAu0B,OAAA,CAAA/E,SAAA,wBACAshB,GAAAE,GAAA,GAGA,MADAtqC,QAAAxG,MAAA,iEAAAyB,OAAAuF,GAAAA,EAAAjJ,SAAAiJ,GAAAA,GACAA,MAIAw2C,GAAA,SAAA3F,GACA,OAAAyC,EAAApyB,KAAA3kB,EAAAnF,OAAAy5C,GACA90C,MAAA,SAAAL,GACAs4C,IACAr7C,QAAA+S,MAAAnP,EAAAb,MAEAyC,OAAA,SAAA6B,GAEA,MADAg0C,IACAh0C,MAmBA2sC,GAAA,WACApwC,EAAAmM,aAAAzS,gBACAsG,EAAAmM,aAAA8+B,KAAAiB,QACA+D,GAAA,CAAAh8B,KAAA,OAAAzZ,QAAA,uBAAA0/C,QAAA,kBAEAl6C,EAAAmM,aAAAugC,0BACA1sC,EAAAmM,aAAA8+B,KAAAiB,QACA+D,GAAA,CAAAh8B,KAAA,UAAAzZ,QAAA,uCAAA0/C,QAAA,oBAKAl6C,EAAAkM,UAAAlM,EAAAmM,aAAA8+B,MAAAjrC,EAAAmM,aAAA8+B,KAAAiB,SACA+D,GAAA,CAAAh8B,KAAA,QAAAzZ,QAAA,kCAAA0/C,QAAA,iBACAj3C,QAAAqB,MAAA,qDAAApG,OAAA8B,EAAAjB,QAGAiB,EAAAkM,UAAAlM,EAAAmM,aAAAkgC,SACA4D,GAAA,CAAAh8B,KAAA,QAAAzZ,QAAA,gCAAA0/C,QAAA,iBACAj3C,QAAAqB,MAAA,gCAAApG,OAAA8B,EAAAjB,OAGAiB,EAAAmM,aAAAC,mBACA6jC,GAAA,CAAAh8B,KAAA,UAAAzZ,QAAA,6BAAA0/C,QAAA,kBAIAl6C,EAAAmM,aAAAu/B,wBAAA1rC,EAAAmM,aAAAshC,cACAwC,GAAA,CAAAh8B,KAAA,OAAAzZ,QAAA,wBAAA0/C,QAAA,mBAIAl6C,EAAAmM,aAAAg/B,UAAAnrC,EAAAmM,aAAAi/B,gBACA6E,GAAA,CAAAh8B,KAAA,OAAAzZ,QAAA,gCAAA0/C,QAAA,iBAGAl6C,EAAAmM,aAAAm/B,UAEAtrC,EAAAkM,UAAAlM,EAAAmM,aAAAggC,oBAAA,EACA8D,GAAA,CAAAh8B,KAAA,OAAAzZ,QAAA,qCAAA01C,cAAAlwC,EAAAmM,aAAA+tC,QAAA,kBAGAl6C,EAAAkM,UAAAlM,EAAAmM,aAAAggC,oBAAA,GAAAnsC,EAAAmM,aAAAu/B,uBAAA,EACAuE,GAAA,CAAAh8B,KAAA,OAAAzZ,QAAA,gDAAA01C,cAAAlwC,EAAAmM,aAAA+tC,QAAA,iBAIAjK,GAAA,CAAAh8B,KAAA,OAAAzZ,QAAA,gCAAA01C,cAAAlwC,EAAAmM,aAAA+tC,QAAA,kBAKAl6C,EAAAmM,aAAAu/B,uBAAA,IACAuE,GAAA,CAAAh8B,KAAA,OAAAzZ,QAAA,iCAAA01C,cAAAlwC,EAAAmM,aAAA+tC,QAAA,iBAEAl6C,EAAAmM,aAAAo/B,WACA0E,GAAA,CACAh8B,KAAA,OACAzZ,QAAA,sCACA01C,cAAAlwC,EAAAmM,aACA+tC,QAAA,kBAIAl6C,EAAAmM,aAAAw/B,2BAAA,GACAsE,GAAA,CAAAh8B,KAAA,OAAAzZ,QAAA,sCAAA01C,cAAAlwC,EAAAmM,aAAA+tC,QAAA,iBAEAl6C,EAAAmM,aAAAo/B,WAAAvrC,EAAAmM,aAAAi/B,gBACA6E,GAAA,CAAAh8B,KAAA,OAAAzZ,QAAA,gCAAA01C,cAAAlwC,EAAAmM,aAAA+tC,QAAA,iBAGAl6C,EAAAmM,aAAAu/B,wBAAA1rC,EAAAmM,aAAAw/B,6BAAA3rC,EAAAmM,aAAAshC,cACAwC,GAAA,CAAAh8B,KAAA,OAAAzZ,QAAA,wBAAA0/C,QAAA,oBAMAC,GAAA,WAEA,OAAA/8C,EAAAgN,IAAA68B,YAAA,CAAApsC,OAAAmF,EAAAnF,SACA2E,MAAA,SAAAL,GACAa,EAAAs3C,SAAAn4C,EAAArF,eAAAqF,EAAArF,eAAAoF,QAAA,SAAAC,EAAAotC,GACA,OAAA,OAAAA,EAAAwC,QAAA5vC,EAAAA,EAAA,IACA,GAFA,KAIAyC,OAAA,SAAA6B,GACA,GAAAA,GAAAA,EAAAgC,OAAArI,EAAAsI,WAAAggC,mBACA1lC,EAAAs3C,SAAA,MAGA,CAAA,IAAA7zC,GAAA,MAAAA,EAAAgC,MAKA,MAAAhC,EAJAR,QAAAC,KAAA,4EACAlD,EAAAs3C,SAAA,OAQA8C,GAAA,WACA,OAAAp6C,EAAAnF,QAAAmF,EAAAqvB,OAAAxyB,EAAAsH,KAAAnE,EAAAqvB,SACApsB,QAAAqB,MAAA,mCACArI,GAAA,WAEA,OADA+D,EAAAqvB,OAAAlyB,EAAAkyB,OAAAyC,IAAA9xB,EAAAnF,QACAmF,EAAAqvB,YAIA+R,GAAA,SAAAh8B,GAEA,IAAA8K,GAAAnI,EAAA/H,KAAAyhC,aAAAlkC,EAAAyC,KAAAuJ,QAAAhM,EAAAyC,KAAAuJ,OAAA2G,uBACAlQ,EAAAoc,UAAAhX,IAAAA,EAAAkzC,UAAAlzC,EAAArC,QAGA,OAAAm0C,EACAA,EAAA13C,MAAA,WACA,OAAAu4C,GAAA3yC,GAAApF,EAAAq6C,GAAAj1C,OAKA8xC,EADA9xC,GAAAA,EAAAkzC,QACAgC,GAAAl1C,GAEAA,GAAApF,EAAAoc,OACAi+B,GAAAj1C,GAGAm1C,KAGA19C,EAAAgQ,IAAA,CACAqqC,EAGAkD,OAGA56C,MAAA,WACA,IAAAg7C,EAAA7B,KAEA,QADAzoC,IAAAmnC,OAAA,IAAAmD,IAEAr9C,EAAAZ,QAAA+D,OACAd,MAAA,WACA,OAAArC,EAAA0H,MAAA4rB,QAAA,8BAAA,oCAAA,CACAC,WAAA,sBACAlyB,OAAA,wBAGAgB,MAAA,SAAA8L,GACA,OAAAA,EACAitC,IAAA/4C,MAAA,WACA,KAAA,YAKAjC,EAAAyC,KAAAuJ,OAAA2G,sBACA3S,EAAAyC,KAAAuJ,OAAA2G,qBAAA,EACA3S,EAAAsF,UAGA,SAKArD,MAAA,SAAAixB,GAEA,GADAymB,EAAA,KACAzmB,EACA,OAAAzwB,EAIA,KAAA,iBAKAu6C,GAAA,SAAAjG,GACAt0C,EAAAoc,QAAA,EAEA,IAAAzK,EAAAC,KAAAD,MAGA,OAFA1O,QAAAqB,MAAA,sCAAApG,OAAA8B,EAAAnF,QAAAmF,EAAAnF,OAAAmX,OAAA,EAAA,KAEAnV,EAAAgQ,IAAA,CAGAwgC,IAAA,GACA7tC,MAAA,SAAAQ,GACA,GAAAA,EAAAmM,eAAAnM,EAAAmM,aAAAD,UAAAlM,EAAAmM,aAAAo/B,WAEA,OAAA4O,KAGAn6C,EAAAs3C,SAAA,KAKA2C,GAAA3F,GAAA,aAEA90C,MAAA,WAMA,OAHA4wC,KAGA1/B,EAAA1Q,KAAAoR,aAAAuT,KAAA3kB,GACA4B,OAAA,SAAA6B,GACAR,QAAAxG,MAAA,kEAAAgH,SAGAjE,MAAA,WAMA,OALAQ,EAAAoc,QAAA,EACAnZ,QAAAqB,MAAA,2CAAApG,OAAA8B,EAAAnF,QAAAmF,EAAAnF,OAAAmX,OAAA,EAAA,GAAAJ,KAAAD,MAAAA,IAGAxU,EAAAZ,QAAA+D,KAAA,KACAN,KAEA4B,OAAA,SAAA6B,GAEA,MADAzD,EAAAoc,QAAA,EACA3Y,MAIA62C,GAAA,SAAAl1C,GAIA,OAHAA,EAAAA,GAAA,IACA+G,aAAA/P,QAAAuC,UAAAyG,EAAA+G,cAAA/G,EAAA+G,cACAnM,EAAAmM,aAAAiQ,QAAAhgB,QAAAqM,YAAAzI,EAAAmM,aAAAg/B,UACA/lC,EAAA+G,aAIAkuC,GAAAj1C,GACA5F,MAAA,SAAAQ,GAEA,OADAA,EAAAoc,QAAA,EACApc,KANAnD,EAAAsH,KAAAnE,IAUAq6C,GAAA,SAAAj1C,IACAA,EAAAA,GAAA,CACA+G,cAAA,EACAy7B,SAAA,EACAj+B,GAAA,CACAZ,QAAA,EACAurC,SAAAt0C,EAAA2J,IAAA,YAAA3J,EAAA2J,GAAA2qC,SAAAt0C,EAAA2J,GAAA2qC,cAAA3yC,GAEA21C,UAAA,EACA5mC,KAAA,IAIAvE,aAAA/P,QAAAuC,UAAAyG,EAAA+G,cAAA/G,EAAA+G,cAAAnM,EAAAmM,aAAAiQ,OAGAhgB,QAAAqM,YAAArD,EAAAwiC,UAAAxiC,EAAAuE,IAAAvE,EAAAuE,GAAAZ,SACA3D,EAAAwiC,SAAA,GAGA,IAAA1xB,EAAA,GAEAvE,EAAAC,KAAAD,MA6BA,OA5BA1O,QAAAqB,MAAA,0CAAApG,OAAA8B,EAAAoc,OAAA,aAAA,UAAApc,EAAAnF,OAAAmX,OAAA,EAAA,IAAA5M,GAGAA,EAAA+G,eAEA6tC,GAAA,gBAEA9jC,EAAAF,KACAq3B,IAAA,GAGA7tC,KAAA4wC,OAIAhrC,EAAAwiC,SAAAxiC,EAAAuE,KAAAvE,EAAAuE,GAAAZ,OAKA3D,EAAAwiC,SAAAxiC,EAAAuE,KAAAvE,EAAAuE,GAAAZ,QAEAmN,EAAAF,KAAAikC,GAAA,YALA/jC,EAAAF,KAAAikC,GAAA70C,EAAAuE,GAAAvE,EAAAuE,GAAA2qC,cAAA3yC,IASAyD,EAAAkyC,UAAAphC,EAAAF,KAAAmkC,OAEAjkC,EAAAnd,OAAA8D,EAAAgQ,IAAAqJ,GAAArZ,EAAAsH,QACA3E,MAAA,WAEA,OAAApD,QAAAuC,UAAAyG,EAAAsL,OAAAtL,EAAAsL,IAAA1Q,EAGA0Q,EAAA1Q,KAAAoR,aAAAuT,KAAA3kB,GACAR,MAAA,WASA,OAPAyD,QAAAqB,MAAA,mCAAApG,OAAA8B,EAAAoc,OAAA,YAAA,SAAApc,EAAAnF,OAAAmX,OAAA,EAAA,GAAAJ,KAAAD,MAAAA,IAGA3R,EAAAoc,SACApc,EAAAoc,OAAApc,EAAAmM,aAAAiQ,QAAApc,EAAA4nC,UAAA,GAGA5nC,QAGA4B,OAAA,SAAA6B,GAGA,MAFAR,QAAAxG,MAAA,qCAAAyB,OAAA8B,EAAAoc,OAAA,aAAA,UAAA3Y,GAAAA,EAAAjJ,SAAAiJ,GAAAA,GACAzD,EAAAoc,OAAApc,EAAAmM,aAAAiQ,QAAApc,EAAA4nC,UAAA,EACAnkC,MAIAg3C,GAAA,SAAA17C,EAAA8sC,GAEA,OAAA7rC,EAAAjB,KAAAA,GAAA8sC,GAAA7rC,EAAA6rC,UAAAA,EAGA7rC,EAAAoc,QAUApc,EAAAjB,IAAAA,EACAiB,EAAA6rC,SAAAA,EAGAwO,GAAA,CAAAluC,cAAA,EAAAmrC,UAAA,IACA93C,MAAA,WAEA,OAAAqD,GAAA,CAAA63C,UAAA,QAhBAxD,EAIAA,EAAA13C,MAAA,WACA,OAAAi7C,GAAA17C,EAAA8sC,MAHAhvC,EAAAsH,OANAtH,EAAAsH,QAgCAw2C,GAAA,SAAA3Y,EAAAC,GACA,IAAA7nB,EAAAD,KAAAC,IAAA,GAAA6nB,GACA,OAAAD,EAAA5nB,EAAA,EACAD,KAAAiT,MAAA4U,EAAA5nB,GAAAA,GASAi5B,GAAA,SAAArR,EAAAC,GACA,OAAAA,GAAA,EAAAD,EAAAA,EAAA7nB,KAAAC,IAAA,GAAA6nB,IAGA2Y,GAAA,SAAA5Y,EAAAyQ,EAAAoI,GACAz+C,QAAAqM,YAAAoyC,KACAA,EAAApI,GAEA,IAAAqI,EAAA,EACAlT,EAAA,GACAmT,EAAAF,EACAG,EAAAH,EAcA,GAbA7hD,EAAA+L,KAAA/E,EAAA4nC,SAAA,IAAA,SAAAvrB,GASA,OARAA,EAAAq3B,UAAAr3B,EAAA4lB,OAAA4Y,GAEAz9C,EAAAnC,OAAAkrC,cAAAhrC,KAAAkhB,EAAA82B,cAEA2H,GAAAzH,GAAAh3B,EAAA2lB,OAAA3lB,EAAA4lB,MACA2F,EAAA5xB,KAAAqG,IAGAy+B,GAAA9Y,KAIA8Y,EAAA9Y,GAAA6Y,EAAA,EAAA,CAEA,IACAI,EAAAL,GADA5Y,EAAA8Y,EACArI,EAFAoI,GAAA,GAKAI,EAAAjZ,OAAA,IACA+Y,EAAAE,EAAAF,QACAD,GAAAG,EAAAjZ,OACA,GAAAhsB,KAAA3D,MAAAu1B,EAAAqT,EAAArT,UAIA,MAAA,CACAmT,QAAAA,EACAC,QAAAA,EACAhZ,OAAA8Y,EACAlT,QAAAA,IAOAsT,GAAA,SAAAC,EAAAnZ,EAAAoZ,EAAAjwC,EAAAkwC,EAAAzmC,GACA,OAAA/X,EAAAgQ,IAAA,CACAkd,IACAhiB,EAAAwD,MACAqJ,GAAA/X,EAAAsH,KAAAyQ,IAAA7M,EAAAsN,WAAA2D,SAAA,KAEAxZ,MAAA,SAAAL,GACA,IAAAmC,EAAAnC,EAAA,GACAqL,EAAArL,EAAA,GAEA,GADAyV,EAAAzV,EAAA,IACA/B,EAAAnC,OAAAmD,OAAAynB,KAAAs1B,GACA,KAAA,CAAA3gD,QAAA,wBAEA,IAAA4C,EAAAnC,OAAA4oC,QAAAhe,KAAAu1B,GACA,KAAA,CAAA5gD,QAAA,yBAEA,IAAAgC,IACA,KAAA,CAAAhC,QAAA,0BAEA,GAAA2gD,IAAAn7C,EAAAnF,OACA,KAAA,CAAAL,QAAA,2BAEA,IAAAwnC,EACA,KAAA,CAAAxnC,QAAA,yBAEA,GAAAwnC,GAAA,EACA,KAAA,CAAAxnC,QAAA,yBAEAwnC,EAAA7nB,KAAAmhC,MAAAtZ,GAEA,IAAAoS,EAAA,CACApS,OAAA,EACA+Y,QAAAnmC,EAAAutB,SACA6Y,QAAApmC,EAAAutB,SAAA,EACAyF,QAAA,IAGA2T,EAAA,GACAA,EAAAvlC,KAAA,mBAAAgsB,GAIA,IADA,IAAAwZ,EAAA,EACApH,EAAApS,OAAAA,GAAAwZ,GAAA5mC,EAAAutB,WACAiS,EAAAwG,GAAA5Y,EAAAptB,EAAAutB,WAEAH,OAAAA,KAEAwZ,GACA5mC,EAAAutB,WACAH,EAAA2Y,GAAA3Y,EAAAwZ,GACAD,EAAAvlC,KAAA,oDAAAgsB,EAAA,kCAAAwZ,IAKA,GAAApH,EAAApS,OAAAA,EAAA,CACA,GAAAhiC,EAAA01C,QAAA1T,EACA,KAAA,CAAAxnC,QAAA,2BAEA,GAAA,IAAA45C,EAAApS,OACA,KAAA,CAAAxnC,QAAA,0BAGA,OAAA8S,EAAA,aACA9N,MAAA,SAAAi8C,GACA,IAAAn8C,EAeA,OAbAA,EADA6L,EACA,CACA62B,OAAAkQ,EAAA,gBAAA,CAAAkC,EAAApS,OAAAx3B,EAAAwB,WACA0vC,KAAAD,EACAE,QAAAzJ,EAAA,aAAAA,CAAA1nC,EAAA1E,OAIA,CACAk8B,OAAAkQ,EAAA,gBAAA,CAAAkC,EAAApS,OAAA,KACA0Z,KAAAxJ,EAAA,aAAAA,CAAA1nC,EAAA1E,MACA61C,QAAA,IAGAruC,EAAA,2BAAAhO,GACAE,MAAA,SAAAhF,GACA,KAAA,CAAAA,QAAAA,SAiBA,OAXAghD,EAAApH,EAAA2G,UA7JA,SAAA/Y,EAAAC,GACA,IAAAA,EAAA,OAAA,EACA,GAAAD,EAAA7nB,KAAAC,IAAA,GAAA6nB,GAAA,OAAA,EACA,IAAA2Z,EAAA,WAAA5Z,EAEA,OAAA,IADA3rB,SAAAulC,EAAApgD,UAAAogD,EAAA7iD,OAAAkpC,IAyJA4Z,CAAA7Z,EAAAoS,EAAA2G,UACA/Y,EAhJA,SAAAA,EAAAC,GACA,IAAA7nB,EAAAD,KAAAC,IAAA,GAAA6nB,GACA,OAAAD,EAAA5nB,EAAAA,EACAD,KAAAiT,MAAA4U,EAAA5nB,GAAAA,EA6IA0hC,CAAA9Z,EAAAoS,EAAA2G,SACA93C,QAAAqB,MAAA,wCAAA09B,GACAuZ,EAAAvlC,KAAA,wCAAAgsB,IAEAwZ,EAAA,IACAv4C,QAAAqB,MAAA,wCAAA09B,GACAuZ,EAAAvlC,KAAA,yCAAAgsB,EAAA,gBAAAwZ,EAAA,MAIAO,GAAAvxC,EAAAoK,EAAAtT,EAAA65C,EAAAnZ,EAAAoS,EAAAgH,EAAAC,GAAAr7C,EAAAnF,OAAA0gD,GACA/7C,MAAA,SAAAL,GACAa,EAAA01C,SAAAv2C,EAAA6iC,OACAhiC,EAAA01C,QAAA,IAAA11C,EAAA01C,QAAA,GACA18C,EAAAN,QAAA07C,EAAAxM,SAAA,SAAAvrB,GACAA,EAAAq3B,UAAA,KAIAv0C,GAAAA,EAAAyoC,QAAA7uC,SACAkK,QAAAqB,MAAA,wDAAAnF,EAAAyoC,SACAyN,EAAAl2C,EAAAyoC,UAIA,IAAAoU,EAAA,CACA5O,KAAArlC,EAAAo1B,KAAAxrB,MACAqwB,QAAAA,EACAnnC,OAAAsgD,EACAlH,QAAAmH,EACAlH,MAAA,EACA75C,KAAA8E,EAAA9E,KACA85C,SAAA,EACA/F,aAAA,MAEA,OAAAgE,EAAAhB,UAAA,CAAA4K,GAAA,UACAx8C,MAAA,WAQA,OAPAQ,EAAA2J,GAAAo+B,SAAAkU,QAAAD,GAGAtrC,EAAA1Q,KAAA4Q,MAAAsrC,eAAAl8C,GACA0Q,EAAA1Q,KAAA4Q,MAAAojC,MAAAh0C,GAGA,CACA3F,KAAA8E,EAAA9E,YAIAuH,OAAA,SAAA6B,GAGA,GAAAA,GAAAA,EAAAgC,QAAArI,EAAAsI,WAAAogC,wBAEA,OADA7iC,QAAAqB,MAAA,iFAAApG,OAAAuF,EAAAjJ,SAAA,4BACAyB,EAAAg+C,GAAA,KACAz6C,MAAA,WACA,OAAA07C,GAAAC,EAAAnZ,EAAAoZ,EAAAjwC,EAAAkwC,EAAAzmC,MAKA,GAAAnR,GAAAA,EAAAgC,QAAArI,EAAAsI,WAAAqgC,6BAEAxoC,EAAAyC,KAAAk+B,SAAA3gC,EAAAyC,KAAAk+B,QAAAie,IAAA5+C,EAAAyC,KAAAk+B,QAAAie,GAAApzC,OAGA,OADA5L,EAAAZ,QAAA+D,OACAnD,EAAA0H,MAAA4rB,QAAA,6BAAA,oBAAA,CACAtE,SAAA,UACA3tB,OAAA,gBACAkyB,WAAA,kBAEAlxB,MAAA,SAAAixB,GACA,GAAAA,EAOA,OANA/f,EAAAjU,MAAAmU,MAAA4rB,KAAA,CACA/9B,MAAA,kBACAuH,QAAA,gBAAA1I,EAAAzB,QAAA,gBACAyB,EAAAg5B,MADA,cAEAilB,EAAAjhD,KAAA,QAEA2B,GAAA,WACA,KAAA,CAAAzB,QAAA,+BACA,MAEA,KAAA,CAAAA,QAAA,2BAIA,MAAAiJ,SAyCAs4C,GAAA,SAAAvxC,EAAAoK,EAAAtT,EAAA65C,EAAAnZ,EAAAoS,EAAAgH,EAAAC,EAAAE,GAIA,GAAAnH,EAAAxM,QAAA7uC,OAh1CA,GAg1CA,CACAkK,QAAAqB,MAAA,qDAGA,IAAA83C,EAAA,CACArB,QAAAnmC,EAAAutB,SACA6Y,QAAA,EACAhZ,OAAA,EACA4F,QAAAwM,EAAAxM,QAAA9f,MAAA,EAx1CA,KAi2CA,OAPA9uB,EAAAN,QAAA0jD,EAAAxU,SAAA,SAAAvrB,GACAA,EAAA4lB,KAAAma,EAAArB,UAAAqB,EAAArB,QAAA1+B,EAAA4lB,MACA5lB,EAAA4lB,KAAAma,EAAApB,UAAAoB,EAAApB,QAAA3+B,EAAA4lB,MACAma,EAAApa,QAAAqR,GAAAh3B,EAAA2lB,OAAA3lB,EAAA4lB,SAIA8Z,GAAAvxC,EAAAoK,EAAAtT,EAAAtB,EAAAnF,OAAAuhD,EAAApa,OAAAoa,OAAAz6C,EAAA3B,EAAAnF,OAAA0gD,GACA/7C,MAAA,SAAAL,GACAnG,EAAAN,QAAA0jD,EAAAxU,SAAA,SAAAvrB,GACAA,EAAAq3B,UAAA,KAEA2B,EAAAl2C,EAAAyoC,SAEA,IAAAyU,EAAA,CACAtB,QAAAnmC,EAAAutB,SACA6Y,QAAA,EACAhZ,OAAA,EACA4F,QAAAwM,EAAAxM,QAAA9f,MA52CA,IA42CA1oB,OAAAD,EAAAyoC,UASA,OAPA5uC,EAAAN,QAAA2jD,EAAAzU,SAAA,SAAAvrB,GACAA,EAAA4lB,KAAAoa,EAAAtB,UAAAsB,EAAAtB,QAAA1+B,EAAA4lB,MACA5lB,EAAA4lB,KAAAoa,EAAArB,UAAAqB,EAAArB,QAAA3+B,EAAA4lB,MACAoa,EAAAra,QAAAqR,GAAAh3B,EAAA2lB,OAAA3lB,EAAA4lB,SAIA8Z,GAAAvxC,EAAAoK,EAAAtT,EAAA65C,EAAAnZ,EAAAqa,EAAAjB,EAAAC,EAAAE,MAIA,IAAA5xC,EAAA,YAAAxL,EAAA,kCAEAqM,EAAA1E,KAFA,iBAGA8O,EAAAxa,OAAA,IAAAwa,EAAAva,KAHA,4BAMA2F,EAAAnF,OANA,cAgBA,IAPA7B,EAAAN,QAAA07C,EAAAxM,SAAA,SAAAvrB,GAGA1S,GAAA,CAAA0S,EAAA2lB,OAAA3lB,EAAA4lB,KAAA5lB,EAAApI,KAAAoI,EAAAo3B,WAAAp3B,EAAA42B,SAAA34C,KAAA,KAAA,QAGAqP,GAAA,aACAuQ,EAAA,EAAAA,EAAAk6B,EAAAxM,QAAA7uC,OAAAmhB,IAEAvQ,GAAAuQ,EAAA,YAGAvQ,GAAA,aAEA,IAEAypC,EAFAwI,EAAA5Z,EACAyQ,EAAA2B,EAAA4G,QAEAsB,EAAA,EACAC,EAAA,GAEA,GAAApB,IAAAn7C,EAAAnF,OAAA,CACA,KAAA+gD,EAAA,GAEAA,GADAxI,EAAAuH,GAAAiB,EAAAnJ,GAEAW,EAAA,IACAA,EAAA,IAAAX,EAAAW,EAAAA,EAAAj5B,KAAAC,IAAA,GAAAq4B,GACA9oC,GAAAypC,EAAA,IAAAX,EAAA,QAAA0I,EAAA,MACAmB,KAEA7J,IAEAmJ,EAAAxH,EAAApS,OAAAA,EACAyQ,EAAA2B,EAAA4G,QAGA,KAAAY,EAAA,GAEAA,GADAxI,EAAAuH,GAAAiB,EAAAnJ,GAEAW,EAAA,IACAA,EAAA,IAAAX,EAAAW,EAAAA,EAAAj5B,KAAAC,IAAA,GAAAq4B,GACA9oC,GAAAypC,EAAA,IAAAX,EAAA,QAAA4I,EAAA,MAEAr7C,EAAAnF,SAAAwgD,GACAkB,EAAAvmC,KAAA,CACA/B,KAAA,IACAg/B,QAAAqJ,EACAta,OAAAoR,EACAnR,KAAAwQ,EACAU,WAAA,OAAAkI,EAAA,IACA3H,UAAA,IAGA4I,KAEA7J,IAmBA,OAhBA9oC,GAAA,aAAAyxC,GAAA,IAAA,KAGAG,IACAJ,GAAAn7C,EAAAnF,OACA0gD,EAAAvlC,KAAA,wDAAAo+B,EAAA2G,QAAA,iBAAA3G,EAAA4G,SAGAO,EAAAvlC,KAAA,wDAAAo+B,EAAA2G,QAAA,iBAAA3G,EAAA4G,QAAA,8BAEAhiD,EAAAN,QAAA07C,EAAAxM,SAAA,SAAAvrB,GACAk/B,EAAAvlC,KAAA,CAAAqG,EAAA2lB,OAAA3lB,EAAA4lB,KAAA5lB,EAAApI,KAAAoI,EAAAo3B,WAAAp3B,EAAA42B,SAAA34C,KAAA,SAEAihD,EAAAvlC,KAAA,gFAAArM,EAAA,wBAGA3M,EAAAsnB,KAAA3a,EAAArI,GACA9B,MAAA,SAAA0kB,GACA,IAAAs4B,EAAA7yC,EAAAua,EAAA,KACA,OAAA9mB,EAAAuM,GAAAg3B,QAAA,CAAA8b,YAAAD,IACA56C,OAAA,SAAA6B,GACA,IAAAA,GAAAA,EAAAgC,QAAArI,EAAAsI,WAAAugC,qBAIA,MAAAxiC,KAEAjE,MAAA,WACA,OAAAxC,EAAAuE,KAAAlH,KAAAmiD,MAEAh9C,MAAA,SAAAk9C,GAMA,OALA1jD,EAAAN,QAAA6jD,GAAA,SAAAxT,GACAA,EAAA0K,WAAAiJ,EACA3T,EAAA2K,UAAA,EACA3K,EAAA5B,SAAA,KAEA,CACAnF,OAAAhiC,EAAAnF,SAAAsgD,EAAA,EAAAn7C,EAAAnF,SAAAwgD,EAAArZ,EAAAoS,EAAApS,OACAr4B,GAAA6yC,EACAniD,KAAAqiD,EACA9U,QAAA2U,UAMAI,GAAA,SAAAnyC,EAAAlJ,EAAAvC,EAAA8sC,GAGA,GAFA9sC,EAAAA,GAAAiB,EAAAjB,IACA8sC,EAAAA,GAAA7rC,EAAA6rC,UACA9sC,IAAA8sC,EACA,KAAA,CAAArxC,QAAA,4BAEA,GAAAwF,EAAAmM,aAAAkgC,QACA,KAAA,CAAA7xC,QAAA,iCAGA,IAAA2yC,EAAA,YAAAhvC,EAAA,+BAEAqM,EAAA1E,KAFA,aAGA9F,EAAAnF,OAHA,eAIAkE,EAJA,gBAKA8sC,EAAA,KACA,OAAA7uC,EAAAsnB,KAAA6oB,EAAA7rC,GACA9B,MAAA,SAAA0kB,GAGA,OAFAipB,GAAAjpB,EAAA,KACAjhB,QAAAqB,MAAA,6CAAA6oC,EAAA,QACAA,MAsDAzF,GAAA,SAAAkV,GACA,OAAA,WACA,IAAAlV,EAEA,OAAA7qC,EAAAgQ,IAAA,CACAkd,IACAhiB,EAAAsN,WAAA6tB,cAEA1jC,MAAA,SAAAL,GACA,IAAAmC,EAAAnC,EAAA,GACAyV,EAAAzV,EAAA,GAWA,OATAuoC,EAAA,YAAAvpC,EAAA,iCAEAyW,EAAApK,SAFA,aAGAxK,EAAAnF,OAHA,YAIA+Z,EAAAxa,OAAA,IAAAwa,EAAAva,KAJA,kBAKAuiD,EAAA,KAAA,OALA,aAMA58C,EAAAjB,IANA,aAOAiB,EAAA6rC,SAAA,KAEA7uC,EAAAsnB,KAAAojB,EAAApmC,MAEA9B,MAAA,SAAA0kB,GACA,IAAA24B,EAAAnV,EAAAxjB,EAAA,KAEA,OAAA9mB,EAAAiY,WAAAqyB,WAAA,CAAAA,WAAAmV,OAEAr9C,MAAA,WACA,OAAAvD,GAAA,WACA,OAAAoxC,IAAA,KACA,QAIA7tC,KAAA4wC,MA4DAH,GAAA,SAAAzpC,EAAAs2C,IACAt2C,EAAAA,GAAA,IACAyN,KAAAzN,EAAAyN,MAAA,OACAzN,EAAAhM,QAAAgM,EAAAhM,SAAA,GACAgM,EAAA0pC,cAAA1pC,EAAA0pC,eAAA,GACA1pC,EAAA0zC,QAAA1zC,EAAA0zC,SAAA,YACA1zC,EAAAhM,QAAA0H,OAAAnJ,OACA+jD,EAIA98C,EAAAwxC,OAAAt5B,OAAA,EAAA,EAAA1R,GAHAxG,EAAAwxC,OAAAx7B,KAAAxP,GAOAvD,QAAAqB,MAAA,+CAIAy4C,GAAA,SAAA/yB,GACA,IAAAgzB,EAAA7iC,KAAAohB,MAAAvR,EAAAizB,OAAAlkD,OAAA,GACAuK,EAAA0mB,EAAAizB,OAAAjrC,OAAA,EAAAgrC,GACAz5C,EAAAymB,EAAAizB,OAAAjrC,OAAAgrC,GACA,OAAAhgD,EAAAqE,cAAAiC,EAAAC,GACA/D,MAAA,SAAA8B,GAGA,OAFA0oB,EAAAnvB,OAAAmC,EAAAuE,KAAAC,cAAAF,EAAAG,QACAuoB,EAAA1oB,QAAAA,EACA0oB,MAgHAkzB,GAAA,WACA,OAAArgD,EAAAgQ,IAAA,CACAkd,IACAhiB,EAAAwD,QAGA/L,MAAA,SAAAL,GACA,IAAAmC,EAAAnC,EAAA,GACAqL,EAAArL,EAAA,GAEA,OAAAw9C,GAAAnyC,EAAAlJ,GAGA9B,MAAA,SAAA2tC,GACA,IAAAgQ,EAAAhQ,EAAAjrC,OAAAxH,MAAA,MACA0iD,EAAAD,EAAAA,EAAApkD,OAAA,GAEAskD,EAAA,YAAAl/C,EAAA,iCAEAqM,EAAA1E,KAFA,aAGA9F,EAAAnF,OAHA,mBAIAmF,EAAAjB,IAJA,oBAKAiB,EAAA6rC,SALA,oBAMAuR,EAAA,KAIA,OAAApgD,EAAAsnB,KAAA+4B,EAAA/7C,GAGA9B,MAAA,SAAA0kB,GAGA,OAFAm5B,GAAAn5B,EAAA,KACAjhB,QAAAqB,MAAA,+CAAA+4C,EAAA,QACAA,YA+FArD,GAAA,SAAAE,GACAl6C,EAAAwxC,OAAAxxC,EAAAwxC,OAAAtyC,QAAA,SAAAC,EAAAqH,GACA,OAAAA,EAAA0zC,SAAA1zC,EAAA0zC,SAAAA,EAAA/6C,EACAA,EAAAC,OAAAoH,KACA,KAgCAuzC,GAAA,SAAAxwC,EAAAnE,GAQA,OANAmE,EAAAq/B,SAAA0U,UAAA/xB,GAEAvrB,EAAA4oC,SAAA5oC,EAAA4oC,UAAA,GACA5oC,EAAA4oC,SAAA5yB,KAAAzM,IAGAnE,GAAAhJ,QAAAqM,YAAArD,EAAAvC,QAAAuC,EAAAvC,MACAg2C,KAEAh8C,EAAAsH,QAGAy1C,GAAA,SAAAx0C,GAGAA,IAAAA,EAAAw9B,MACA5pC,EAAAN,QAAAsH,EAAA4oC,UAAA,IAAA,SAAAr/B,GACAA,EAAAq5B,UAGA,IAAA2a,EAAAv9C,EAAA4oC,SAAA1wB,OAAA,EAAAlY,EAAA4oC,SAAA7vC,QAGA,OAAAqM,GAAAhJ,QAAAqM,YAAArD,EAAAvC,QAAAuC,EAAAvC,MACAg2C,KAEA0E,GA4BAC,GAAA,SAAA3iD,GACA,OAAA7B,EAAA+L,KAAA/E,EAAA4oC,UAAA,IAAA,SAAAiR,GAAA,OAAAA,EAAA4D,aAAA5iD,OAWAi/C,GAAA,WAEA,IAAA4D,GAAA19C,EAAA4oC,UAAA,IAAA1pC,QAAA,SAAAC,EAAAoK,GACA,OAAA4Q,KAAAO,IAAAvb,EAAAoK,EAAApP,MACA,GAAA,EACA,OAAAwrB,EAAA6kB,SAAAkT,EAAAtgD,IAGAugD,GAAA,WACA,OAAAxF,KACA34C,MAAA,WACA,OAAAQ,EAAA4oC,aA0CAuP,GAAA,SAAA/yC,GACA,OAAAuyC,IACAr5C,IAGAtB,EAAAgmB,IAAA1hB,QAAA8jB,gBAAAplB,EAAAsB,SACA9B,MAAA,SAAA8B,GACA,IAAAmgB,EAAAzkB,EAAAuE,KAAAuf,cAAA9gB,EAAAu3C,cAAA91B,OACA,OAAAzkB,EAAAgmB,IAAAwC,KAAAxlB,EAAAu3C,cAAAvxC,QAAAyb,EAAAngB,EAAA2gB,MAAA3gB,EAAA0gB,UAGAxiB,MAAA,SAAAwG,GACAhG,EAAAu3C,cAAA,KACA,IAAAx2C,EAAA04C,GAAA5d,KAAAx3B,MAAA2B,IASA,QANAZ,GAAAhJ,QAAAqM,YAAArD,EAAAvC,QAAAuC,EAAAvC,QACA9B,EAAAvB,MAAA,WACA,OAAAq5C,QAIA93C,KApBAxC,IAAAiB,KAAA24C,IADAt7C,EAAAsH,QAsFAi0C,GAAA,SAAAwF,GAEA,IAAAC,GADAD,EAAAxhD,QAAAuC,UAAAi/C,GAAAA,EAAAt/C,MACAyR,GAAAA,EAAA9P,aAAA,GAAA8P,EAAA9P,cAAA1C,EAAAY,UAAAgC,uBACA0Q,EAAAsmC,GAAA0G,EAGAhtC,GAEAgtC,GACA56C,QAAAqB,MAAA,oCAAApG,OAAA6R,EAAA9P,eACA62C,EAAAgH,QAAA/tC,EAAA9P,cACA62C,EAAAiH,SAGA5G,IACAl0C,QAAAqB,MAAA,sBACAwyC,EAAAkH,WAEA7G,EAAA0G,GAIAA,GAAA/G,EAAAmH,YAAAluC,EAAA9P,eACAgD,QAAAqB,MAAA,0CAAApG,OAAA6R,EAAA9P,eACA62C,EAAAgH,QAAA/tC,EAAA9P,eAIA29C,GAAA7tC,GAAAA,EAAA9P,cAAA1C,EAAAY,UAAAgC,uBAEAu9B,EAAA9C,IAtrEA,SAsrEA59B,EAAAuE,KAAAC,cAAAxB,EAAAsB,QAAAmD,SAGAoM,GACA6sB,EAAA9C,IA1rEA,SA0rEA,OAIA,SAAAsjB,GAAAnuC,GACA,OAAAA,GAAA,CACAnN,gBAAAmN,EAAAnN,gBACAwM,0BAAAW,EAAAX,0BACArP,WAAAgQ,EAAAhQ,WACAE,aAAA8P,EAAA9P,cAIA,SAAAm1B,GAAA+oB,GACA,IAAAC,EAAAF,GAAAC,GAEA,IADA/hD,QAAAoG,OAAAuN,EAAAquC,IACAruC,EAAA,CAEA,IAAAsuC,GAAAjiD,QAAAoG,OAAAuN,EAAAX,0BAAAgvC,EAAAhvC,2BACAkvC,GAAAliD,QAAAoG,OAAAuN,EAAAnN,gBAAAw7C,EAAAx7C,kBAAAy7C,EACA57C,GAAArG,QAAAoG,OAAAuN,EAAA9P,aAAAm+C,EAAAn+C,cASA,GAPA8P,EAAAquC,EAEA37C,GACA21C,KAIAkG,EAAA,CAGA,GAAAvuC,EAAAnN,gBAMA,OAAAC,KACArD,MAAA,WAGA,GAAAQ,EAAAm5C,cAAA,GAAAkF,GAAAtuC,EAAAX,0BACA,OAAA7Q,EAAA,CAAA+5C,SAAA,EAAAv1C,QAAA,IACAnB,OAAA,SAAA6B,GAEA,GAAA,cAAAA,EAEA,OADAlG,EAAA8U,MAAA,CAAAjD,2BAAA,IACA7R,EAAAsF,QAGA,MAAAY,QAOAjE,KAAAq5C,IAzBAJ,GAAAz4C,EAAAnF,UA8CA,SAAA0jD,KACAvlD,EAAAN,QAAA6a,GAAA,SAAA+H,GACAA,OAEA/H,EAAA,GAQA,SAAAqvB,KACA3/B,QAAAqB,MAAA,wBACAi6C,KACArd,IAGA,SAAA2B,KAEA,OADAD,KACA3mC,EAAAoV,GAAA,KAGA,SAAAA,GAAAjM,IACAA,EAAAA,GAAA,IAEAsM,QAAAtV,QAAAuC,UAAAyG,EAAAsM,SAAAtM,EAAAsM,QAAA,YAAAvX,EAEA8I,QAAAqB,MAAA,wBACA,IAAAqN,EAAAC,KAAAD,MA2BA,OAzBAxD,EAAAtR,EAAAgQ,IAAA,CACAtP,EAAAuU,QACAtS,MAAA,WACAuQ,EAAAmuC,GAAA3gD,EAAAyC,SAEA+H,EAAA+J,QACA1U,EAAA0U,UAIA1M,EAAAsM,UAAAvD,EAAAA,EAAA3O,KAAAkS,KAGAvD,EAAA3O,MAAA,YA5DA,WACA+T,EAAA,CAEAhW,EAAAmT,IAAA1Q,KAAAy1B,GAAA5kB,QAAA1D,EAAAioB,GAAA78B,MAEA6E,EAAAsT,IAAAI,KAAA2kB,GAAAoN,QAAA11B,EAAA01B,GAAAtqC,OAGA4U,EAAAxQ,IAAA,YAAA+7C,GAqDAhjB,GAEAzyB,QAAAqB,MAAA,wBAAAsN,KAAAD,MAAAA,GAAA,MAEAlB,GAAA,EACAtC,EAAA,QAEA3O,MAAA,WACA,OAAAQ,KAGAmO,EA6GA,OAzGAuC,EAAAyB,cAAA,OAAA,QACAzB,EAAAyB,cAAA,OAAA,cACAzB,EAAAyB,cAAA,OAAA,SACAzB,EAAAyB,cAAA,OAAA,QACAzB,EAAAyB,cAAA,OAAA,UACAzB,EAAAyB,cAAA,OAAA,QACAzB,EAAAyB,cAAA,OAAA,UACAzB,EAAAyB,cAAA,OAAA,SACAzB,EAAAyB,cAAA,OAAA,SAEAzB,EAAAyB,cAAA,QAAA,QAGAzB,EAAAyB,cAAA,OAAA,kBACAzB,EAAAyB,cAAA,OAAA,SAEAzB,EAAAyB,cAAA,SAAA,WAIA+uB,GAAA,GAGA,YAAA/mC,IAGA0I,GAAAhG,EAAAsH,KACAuN,GAAA7U,EAAAsH,KACA+zC,GAAAr7C,EAAAsH,MAIAonB,EAAA,CACApxB,GAAAA,EACA6F,KAAAA,EACA8R,MAxFA,WACA,OAAArB,EAAA5T,EAAAsH,OACAgK,GAAAkD,MAuFAA,MAAAA,GACAuxB,KAAAA,GAEAlmC,MAAAA,EACA67C,OAAAA,EACAh6C,KAAAA,EACAm6C,OAAAA,EACAl8C,QAAAA,EACA8B,OAAAA,EACAyrB,WAAAA,EACAmhB,QA5iEA,WACA,QAAAlrC,EAAAnF,SAAAmF,EAAAmM,aAAAg/B,UA4iEAsP,QAAAA,GACAvuC,SAAA,WACA,OAAAlM,EAAAkM,UAEA6rC,aAAAA,GACAL,UAAAA,EACAiB,YAAAA,GACAtB,MAAAA,GACAoG,aA3gEA,SAAA5iD,GACA,OAAA2B,KAAAwD,EAAAnF,SAAAA,GA2gEAunC,QAntDA,WACA,OAAApiC,GAmtDAohC,SAAAA,GACAiZ,YAAAA,GACAD,WAAAA,GAEAoE,SAAA,CACAC,YA/HA,SAAAC,IACAnrC,EAAAA,GAAA,IACAyC,KAAA0oC,IA8HAH,gBAAAA,IAGA17C,MAAAA,GACAg2C,UAAAA,GAEAqC,SAAAA,GACAyD,YAzlCA,SAAAxD,EAAAnZ,EAAAoZ,EAAAjwC,EAAAkwC,GACA,OAAA7+C,IAEA6+C,GAAAF,GAAAE,EAIAtzC,EAAAsN,WAAA6tB,YACA1jC,MAAA,SAAAoV,GAGA,OAFA3R,QAAAqB,MAAA,4EAAAsQ,GAEAsmC,GAAAC,EAAAnZ,EAAAoZ,EAAAjwC,EAAAkwC,EAAAzmC,GACApV,MAAA,WAEA,GAAAQ,EAAA01C,QAAA,GAAA2F,EAEA,OADAp4C,QAAAqB,MAAA,iEAAApG,OAAAm9C,EAAA7/C,UAAA,EAAA,KACA0/C,GAAAG,EAAAr7C,EAAA01C,aAAA/zC,GAAA,EAAA05C,EAAAzmC,SAZA/X,EAAAgf,OAAA,CAAArhB,QAAA,2DAHAqC,EAAAgf,OAAA,CAAArhB,QAAA,4BAylCA0gC,KAj4BA,SAAAn8B,EAAA6/C,GACA,OAAAxhD,EAAAnC,OAAA0oC,QAAA9d,KAAA9mB,GAIAlC,EAAAgQ,IAAA,CACAkd,IACAhiB,EAAAwD,MACAxD,EAAAsN,WAAA6tB,cAGA1jC,MAAA,SAAAL,GACA,IAAAmC,EAAAnC,EAAA,GACAqL,EAAArL,EAAA,GAEA,OADAyV,EAAAzV,EAAA,GACAw9C,GAAAnyC,EAAAlJ,EAAAvC,EAAA6V,EAAAxa,OAAA,IAAAwa,EAAAva,SAIAmF,MAAA,SAAA2tC,GACA,OAAA/vC,EAAAgN,IAAAi9B,IAAA,CAAA8F,SAAAA,OAGA3tC,MAAA,WACA,GAAAo/C,EAEA,OAAAvR,IAAA,GAGA7tC,KAAA4wC,IAGApwC,EAAAjB,IAAAA,EACAiB,EAAA6rC,SAAAj3B,EAAAxa,OAAA,IAAAwa,EAAAva,QAGAuH,OAAA,SAAA6B,GACA,GAAAA,GAAAA,EAAAgC,QAAArI,EAAAsI,WAAA6/B,sBACA,KAAA,CAAA9/B,MAAArI,EAAAsI,WAAA6/B,sBAAA/qC,QAAA,+BAEA,MAAAiJ,KAtCA5G,EAAAgf,OAAA,CAAArhB,QAAA,0BAEA,IAAAoa,GA83BA2yB,OA/jBA,WAMA,OAHAyS,GAAA,cAGAkD,KAEA19C,MAAA,SAAA69C,GACA,OAAAjgD,EAAAgN,IAAAm9B,OAAA,CAAA8V,WAAAA,OAIA79C,MAAA,WAEA,OAAAvD,GAAA,WACA,OAAAoxC,IAAA,KACA,QAIA7tC,KAAA4wC,IAEAxuC,OAAA,SAAA6B,GACA,IAAAA,GAAAA,EAAAgC,OAAArI,EAAAsI,WAAA4/B,8BAKA,MAAA7hC,EAHAwsC,GAAA,CAAAh8B,KAAA,UAAAzZ,QAAA,uCAAA0/C,QAAA,iBAAA,OAsiBA2E,eA7hBA,SAAAxB,GACA,OAAAxgD,EAAAgQ,IAAA,CACAzP,EAAAgN,IAAAm9B,OAAA,CAAA8V,WAAAA,MAGA79C,MAAA,SAAAL,GACA,GAAA3C,IACA,OAAAP,GAAA,WACA,OAAAoxC,IAAA,KACA,KAGA7tC,KAAA4wC,IAEAxuC,OAAA,SAAA6B,GACA,IAAAA,GAAAA,EAAAgC,OAAArI,EAAAsI,WAAA4/B,8BAKA,MAAA7hC,EAHAwsC,GAAA,CAAAh8B,KAAA,UAAAzZ,QAAA,uCAAA0/C,QAAA,iBAAA,MAQAjK,GAAA,CAAAh8B,KAAA,UAAAzZ,QAAA,uCAAA0/C,QAAA,iBAAA,OAqgBA5S,QA3yBA,SAAAvoC,EAAAlE,EAAAoxC,EAAA/nB,EAAAhY,EAAAq/B,GACA,OAAA1uC,EAAAgQ,IAAA,CACAkd,IACAhiB,EAAAwD,MACAxD,EAAAsN,WAAA6tB,cAEA1jC,MAAA,SAAAL,GACA,IAAAmC,EAAAnC,EAAA,GACAqL,EAAArL,EAAA,GACAyV,EAAAzV,EAAA,GAGA,IAAAa,EAAAkM,WAAA5O,EAAAmkC,UACA,KAAA,CAAAjnC,QAAA,6CAIA,IAAA+xC,EAAA,YAAApuC,EAAA,oCAEAqM,EAAA1E,KAFA,aAGA9F,EAAAnF,OAHA,iBAIAA,EAJA,mBAKAkE,EALA,oBAMAktC,EANA,oBAOA/nB,EAPA,oBAQAtP,EAAAxa,OAAA,IAAAwa,EAAAva,KAAA,KAEA,OAAA2C,EAAAsnB,KAAAioB,EAAAjrC,GACA9B,MAAA,SAAA0kB,GACA,IAAA46B,EAAAvS,EAAAroB,EAAA,KACA,OAAA9mB,EAAAgN,IAAAk9B,QAAA,CAAAiF,KAAAuS,OAEAt/C,MAAA,WACA,IAAA+sC,EAAA,CACA1xC,OAAAA,EACAkE,IAAAA,EACAquC,KAAAx4B,EAAAqE,WACA/M,SAAAA,EACAq/B,UAAAA,EACAiB,UAAAhiC,EAAA/M,WAAAwxC,UACA9H,SAAA,EACAvyB,MAAAA,EAAAxa,OACA2H,OAAA,GAMA,OAFA2O,EAAAuvB,OAAArvB,MAAA02B,QAAAiF,GAEAA,SA4vBAwS,eA3pBA,SAAA/0B,GACA,OAtBA,SAAAA,GACA,IAAAg1B,EAAA,4CAEAh1B,EAAAi1B,UACA,WAAAj/C,EAAAnF,OAHA,oBAIAmvB,EAAAvI,MAJA,qBAKAuI,EAAAnvB,OALA,mBAMAmvB,EAAA1mB,KANA,kBAOA0mB,EAAAzmB,IAAA,KAGA,OAAAvG,EAAAsnB,KAAA06B,EAAAh/C,EAAAsB,SAEA9B,MAAA,SAAA0kB,GAGA,OAFA86B,GAAA96B,EAAA,KACAjhB,QAAAqB,MAAA,2CAAA06C,EAAA,QACAA,KAMAE,CAAAl1B,GACAxqB,MAAA,SAAAw/C,GACA,IAAAG,EAAA,IAAAziC,EAAA,CAAAsiC,GAAA,CAAA/qC,KAAA,8BACAk+B,EAAA0E,OAAAsI,EAAA,qBAAAjhD,OAAA8B,EAAAnF,OAAAW,UAAA,EAAA,SAwpBA4jD,aAztBA,SAAAp1B,GACA,OAAA+yB,GAAA/yB,GACAxqB,KAAAxC,EAAAuE,KAAAggB,cACA/hB,MAAA,SAAAiiB,GAEA,OADAuI,EAAAvI,MAAAzkB,EAAAuE,KAAAC,cAAAigB,GACA5kB,EAAAgQ,IAAA,CACA7P,EAAAgmB,IAAAuC,KAAAyE,EAAA1mB,KAAAme,EAAAuI,EAAA1oB,QAAA2gB,MAAA+H,EAAA1oB,QAAA0gB,OACAhlB,EAAAgmB,IAAAuC,KAAAyE,EAAAzmB,IAAAke,EAAAuI,EAAA1oB,QAAA2gB,MAAA+H,EAAA1oB,QAAA0gB,YAGAxiB,MAAA,SAAAL,GAGA,OAFA6qB,EAAA1mB,KAAAnE,EAAA,GACA6qB,EAAAzmB,IAAApE,EAAA,GACA6qB,MA6sBAq1B,UAzsBA,SAAAC,GACA,KAAAA,GAAAA,EAAAC,aAAAD,EAAAE,YAAAF,EAAAG,WACA,KAAA,CAAAjlD,QAAA,6BAEA,IAAAinB,EAAAzkB,EAAAuE,KAAAuf,cAAAw+B,EAAAC,aACA,OAAAxC,GAAAuC,GACA9/C,MAAA,SAAA8/C,GACA,OAAAtiD,EAAAgmB,IAAAwC,KAAA85B,EAAAE,WAAA/9B,EAAA69B,EAAAh+C,QAAA2gB,MAAAq9B,EAAAh+C,QAAA0gB,UAEAxiB,MAAA,SAAA8D,GAEA,OADAg8C,EAAAh8C,KAAAA,EACAtG,EAAAgmB,IAAAwC,KAAA85B,EAAAG,UAAAh+B,EAAA69B,EAAAh+C,QAAA2gB,MAAAq9B,EAAAh+C,QAAA0gB,UAEAxiB,MAAA,SAAA+D,GAEA,OADA+7C,EAAA/7C,IAAAA,EACA+7C,KAEA19C,OAAA,SAAA6B,GAEA,MADAR,QAAAC,KAAA,mDAAAO,GACA,IAAA7I,MAAA,wDAurBA8kD,mBAngBA,WACA,OAAA7iD,EAAAgQ,IAAA,CACA9E,EAAAwD,MACA2xC,OAEA19C,MAAA,SAAAL,GACA,IAAAqL,EAAArL,EAAA,GACAk+C,EAAAl+C,EAAA,GACAwgD,EAAA,IAAAjjC,EAAA,CAAA2gC,GAAA,CAAAppC,KAAA,8BACA,OAAA3G,EAAA,uCAAA,CACAvO,IAAAiB,EAAAjB,IACAyL,SAAAA,EAAA1E,KACAjL,OAAAmF,EAAAnF,SAEA2E,MAAA,SAAAogD,GACAzN,EAAA0E,OAAA8I,EAAAC,UAqfAC,gBAvpBA,SAAA3hD,GACA,OAAAI,IAEAzB,EAAAgQ,IAAA,CACA9E,EAAAwD,MACAtO,EAAAsH,QAAA+kB,gBAAAtpB,EAAAsB,QACA,CACA2S,KAAA/V,EACA+C,SAAA,WAEA,OADA9D,EAAAZ,QAAA+D,OACAjD,EAAAgI,aAAA,CACA5G,MAAA,gDACA6G,SAAA,iDAEA9F,MAAA,SAAAyB,GACA,OAAA9D,EAAAZ,QAAA6E,KAAA,IACA5B,MAAA,WACA,OAAAyB,aAMAzB,MAAA,SAAAL,GACA,IAAAqL,EAAArL,EAAA,GACAuM,EAAAvM,EAAA,GACA,OAAAmO,EAAA,oCAAA,CACA9C,SAAAA,EAAA1E,KACAjL,OAAAmF,EAAAnF,OACAqD,OAAAA,IAEAsB,MAAA,SAAAi3C,GACA,IAAA30C,EAAA,IAAA4a,EAAA,CAAAhR,GAAA,CAAAuI,KAAA,8BACAk+B,EAAA0E,OAAA/0C,EAAA20C,SAhCA55C,EAAAgf,OAAA,2BAupBAq1B,QA1XA,WACA,IAAAlxC,EAAAnF,OAAA,MAAA,IAAAD,MAAA,mBACA,OAAAoF,EAAA4oC,UAAA,IAAA1pC,QAAA,SAAAC,EAAAoK,GACA,OAAAA,EAAAvJ,KAAAnF,OAAAsE,EAAAC,OAAAmK,EAAAvJ,KAAAnF,QAAAsE,IACA,CAAAa,EAAAnF,UAuXAilD,YApXA,SAAAjlD,GACA,IAAAA,EAAA,MAAA,IAAAD,MAAA,+BACA,IAAAoF,EAAAnF,OAAA,MAAA,IAAAD,MAAA,mBACA,OAAAoF,EAAAnF,SAAAA,EAAA0wB,EACAiyB,GAAA3iD,IAiXA6sC,WAAA,CACAqY,OAAArY,IAAA,GACAsY,IAAAtY,IAAA,IAEA8J,OAAA,CACAnK,IAAA4I,GACAgQ,eAAAjG,IAEApR,SAAA,CACAsX,OA9dA,SAAA96C,GACA,IAAAmE,EAAAuwC,KAEA,OADAC,GAAAxwC,EAAAnE,GACAmE,GA4dA89B,IAAA0S,GACAz+B,OA1bA,SAAAnhB,EAAAiL,GACApF,EAAA4oC,SAAA5oC,EAAA4oC,UAAA,GACA,IAAAuX,EAAAnnD,EAAAkjC,UAAAl8B,EAAA4oC,UAAA,SAAAiR,GAAA,OAAAA,EAAA1/C,KAAAA,KACA,IAAA,IAAAgmD,EAEA,MADAl9C,QAAAC,KAAA,2DAAAhF,OAAA/D,IACA,IAAAS,MAAA,iCAAAsD,OAAA/D,IASA,OANA6F,EAAA4oC,SAAA1wB,OAAAioC,EAAA,GAAA,GAGAvd,OAGAx9B,IAAA,IAAAA,EAAAvC,MAGAhG,EAAAsH,OAFA00C,MA4aAttC,IAvaA,SAAApR,GACA,MAAA,YAAAA,GAAAnB,EAAA+L,KAAA/E,EAAA4oC,UAAA,IAAA,SAAAiR,GAAA,OAAAA,EAAA1/C,MAAAA,WAAAwH,GAuaAm+C,YAAAtC,GACA3wC,IAAA8wC,GACAL,UAzfA,SAAA8C,GAEA,IAAA1B,EADAnrC,EAAAA,GAAA,GAEAva,EAAAN,QAAA,CAAA,OAAA,UAAA,SAAAiF,GACA+gD,EAAAhuC,EAAA1Q,KAAAy1B,GAAA93B,GAAAwP,GAAA,SAAAnN,EAAA4kB,GAKA,OAJAA,EAAAA,GAAA/nB,EAAAgoB,QACAu7B,EAAA1vC,IAAA1Q,KAAAoR,aAAAzT,GAAAqC,GACAR,KAAAolB,EAAAhJ,SACAha,MAAAgjB,EAAA/I,QACA+I,EAAA7jB,UACAxI,MACAgb,EAAAyC,KAAA0oC,MAIAA,EAAA0B,EAAA1vC,IAAA1Q,KAAAy1B,GAAAijB,OAAAvrC,GAAA,WACA7O,KAAAo6C,MACAngD,MACAgb,EAAAyC,KAAA0oC,IAweAnkC,MA/ZA,WACA,OAAAne,QAAAuC,UAAAqB,EAAAm5C,eAAAn5C,EAAAm5C,cAAAn5C,EAAA4oC,UAAA5oC,EAAA4oC,SAAA7vC,QAAA,GA+ZAsnD,UApaA,SAAAxlD,GACA,QAAA2iD,GAAA3iD,IAoaA2vC,SAAAsP,GACAwG,aAjYA,WACA,OAAAzjD,EAAAgQ,IAAA,CACA8wC,KACA51C,EAAAwD,QAEA/L,MAAA,SAAAL,GACA,IAAAypC,EAAAzpC,EAAA,GACAqL,EAAArL,EAAA,GACA6G,GAAA4iC,GAAA,IAAA1pC,QAAA,SAAAC,EAAAoK,GACA,OAAApK,EAAA,CAAAoK,EAAAvJ,KAAAnF,OAAA0O,EAAAvJ,KAAAjB,IAAAwK,EAAAvJ,KAAAo3C,WAAA7tC,EAAAvJ,KAAA8F,MAAAxL,KAAA,MAAA,OACA,IACAwH,EAAA,IAAA4a,EAAA,CAAA1W,GAAA,CAAAiO,KAAA,8BACA,OAAA3G,EAAA,sCAAA,CACAzS,OAAAmF,EAAAnF,OACA2P,SAAAA,EAAA1E,OAEAtG,MAAA,SAAAogD,GACAzN,EAAA0E,OAAA/0C,EAAA89C,WAkXAlvC,IAAAA,GAQA,OAHAiV,EAAAsxB,EAAA,UAAA75C,IACAotC,SAAAyM,EAEAtxB,KC18EAvpB,QAAA6Q,OAAA,uBAAA,IAEAszC,SAAA,kBAAA,CACAh3C,OAAA,CACA8C,UAAA,KAIAa,QAAA,SAAA,CAAA,aAAA,aAAA,UAAA,kBAAA,cAAA,SAAAC,EAAA5P,EAAAJ,EAAA6K,EAAA9L,GAcA,SAAAskD,EAAAl4C,EAAAm4C,GAIA,GAHAn4C,EAAAlM,QAAAuC,UAAA2J,GAAAA,EAAA/K,EAAAyC,KAAAiJ,QAAAM,OACAk3C,IAAArkD,QAAAuC,UAAA8hD,IAAAA,IAEAn4C,EAAA,GAAAA,GAAAN,EAAAuB,OAAA8C,WAAA,CAGA,IAAAq0C,EAjBA,SAAAD,EAAAE,GACA,GAAAF,IAAAtzC,EAAAlF,MAAA1K,EAAAyC,KAAAiJ,QAAAF,SAAA5L,EAAA0C,OAAAC,UAAA,CAIA,IAAA4gD,EAAAvzC,EAAAmqB,OAEA,OADAp7B,EAAA,cAAA,CAAAF,OAAA0kD,IACAA,GAUAE,CAAAH,GACA,GAAAC,EAIA,OAFAA,EAAAz4C,KAAAw4C,EAEAC,EAAAr3C,gBAAAf,GAAA,GACA9I,MAAA,SAAA8J,GACAo3C,EAAA9nB,WACA6nB,IACAljD,EAAAyC,KAAAiJ,QAAAM,OAAAD,EACA/L,EAAAsF,aAKA,MAAA,CACA0G,OAAA,CACAtB,KAAA,WACA,OAAAu4C,EAAA,GAAA,IAEAv3C,QAAAu3C,OC/CApkD,QAAA6Q,OAAA,yBAAA,IAEA4zC,SAAA,iBAAA,WAGA,IAAAC,EAAA,GAEAC,EAAA,GAEAxoD,KAAAyoD,4BAAA,SAAAC,GAEA,OADAH,EAAA9qC,KAAAirC,GACA1oD,MAGAA,KAAA2oD,YAAA,SAAAC,EAAAC,GAOA,OANAhlD,QAAAuC,UAAAwiD,IAAA/kD,QAAAuC,UAAAyiD,KACAL,EAAAI,KACAJ,EAAAI,GAAA,IAEAJ,EAAAI,GAAAnrC,KAAAorC,IAEA7oD,MAGAA,KAAA8oD,aAAA,SAAAC,EAAAF,GACA,IAAA9oD,EAAAC,KAIA,OAHA+oD,EAAA5oD,SAAA,SAAAyoD,GACA7oD,EAAA4oD,YAAAC,EAAAC,MAEA7oD,MAGAA,KAAAgpD,KAAA,CAAA,YAAA,SAAA,SAAA9qB,EAAArvB,GAEA,IAAAo6C,EA2BA,MAAA,CACAnwC,MA1BA,WACAyvC,EAAA/nD,OAAA,GACAC,EAAAN,QAAAooD,GAAA,SAAAh7C,GACA2wB,EAAAlrB,IAAAzF,OAwBA27C,WAAA,CACAC,OAAA,CACAC,iBArBA,SAAAC,GAIA,OAHA5oD,EAAAP,KAAAsoD,GAAA7hD,QAAA,SAAAC,EAAAgiD,GACA,OAAA/5C,EAAAy6C,SAAAV,GAAAhiD,EAAAC,OAAA2hD,EAAAI,IAAAhiD,IACA,IACAD,QAAA,SAAAC,EAAAiiD,GACA,OAAAA,EAAAM,QAAAN,EAAAM,OAAAE,GAAAziD,EAAAC,OAAAgiD,EAAAM,OAAAE,IAAAziD,IACA,KAgBA6Z,QAAA,CACAzN,IAVA,WACA,OAAAi2C,GAUA1hC,IAfA,SAAA8hC,GACAJ,EAAAI,YCxDAxlD,QAAA6Q,OAAA,kBAAA,CAEA,0BAEA,2BACA,uBACA,0BACA,sBACA,yBACA,wBACA,wBACA,0BACA,yBACA,2BACA,sBACA,qBACA,yBACA,uBACA,2BClBA7Q,QAAA6Q,OAAA,2BAAA,CAAA,sBAAA,yBAAA,wBAAA,6BAGAC,QAAA,eAAA,CAAA,aAAA,WAAA,cAAA,SAAA,KAAA,aAAA,UAAA,MAAA,cAAA,SAAAC,EAAAlR,EAAAC,EAAAkL,EAAAvK,EAAAyQ,EAAA4kC,EACA90C,EAAAJ,GA+DA,MAAA,CACAwtC,SA7DA,SAAAwN,GAEA,IAAA8J,EAEA,MAAA,CACAzwC,MAAA,WACA,OAAAxU,EAAAsH,QAEAzH,MAAA,WACA,IAAAw+B,EAAA3iC,KACA,OAAA+U,EAAA,4BACA9N,MAAA,SAAA3E,GAEA,GADAinD,EAAAjnD,GACAm9C,GAAAA,EAAAn9C,QAAAinD,EACA,KAAA,CAAAtnD,QAAA,qCAKA,OAHA0gC,EAAAl7B,KAAA,CACAsB,QAAA02C,EAAA12C,SAEA,CACAvC,IAAA,OACAlE,OAAAinD,OAIA5G,SAAA,SAAArgD,EAAAmnC,EAAAiS,GACA,IAAA/Y,EAAA3iC,KACA,OAAA6E,EAAAiY,WAAA2D,UACAxZ,MAAA,SAAAoV,GACA,IAAAjL,EAAA,YAAAvM,EAAAe,UAAAmmC,iBAAA,kCAEA1vB,EAAApK,SAFA,iBAGAoK,EAAAxa,OAAA,IAAAwa,EAAAva,KAHA,4BAMAynD,EANA,cAQA,CAAA9f,EAAAptB,EAAAutB,SAAA,IAAA,gDAAA,GAAA7nC,KAAA,KARA,mCAYA,CAAA0nC,EAAAptB,EAAAutB,SAAA,OAAAtnC,EAAA,KAAAP,KAAA,KAZA,eAaA25C,GAAA,IAAA,KAEA,OAAAj3C,EAAAsnB,KAAA3a,EAAAuxB,EAAAl7B,KAAAsB,SACA9B,MAAA,SAAA0kB,GACA,IAAAs4B,EAAA7yC,EAAAua,EAAA,KACA,OAAAlnB,EAAAuE,KAAAlH,KAAAmiD,GACAh9C,MAAA,SAAAk9C,GACA,OAAA7/C,EAAAsH,KAAA,CACAwF,GAAA6yC,EACAniD,KAAAqiD,oBxB5CAtkD,EAAA4V,UAAA/S,OAAA,CACAmC,IAAA,yBACAmmC,KAAA,YACAC,KAAA,YACAue,WAAA,oGACAC,YAAA,uFACAC,YAAA,6HACAC,iBAAA,wDAEA9pD,EAAA4V,UAAAm0C,MAAA/pD,EAAA4V,UAAA/S,OAEA7C,EAAA4V,UAAA+I,MAAA,WACA,IAAAzD,EAAA/a,KAAA+a,KAAA/a,KAAA8gB,SACA,OAAA/F,EAAA6E,OACA,CAAA5f,KAAAsC,QAAA,UAAAyY,EAAAmF,IAAAnF,EAAA21B,KAAA31B,EAAA41B,KAAA51B,EAAAgG,KAAAhG,EAAAuF,OAAAvF,EAAAf,MAAAjY,KAAA,KAEA,CAAA/B,KAAAsC,QAAA,UAAAyY,EAAA3X,OAAA2X,EAAAf,MAAAjY,KAAA,MAGAlC,EAAA4V,UAAAo0C,WAAA,SAAArN,GACA,IAAAtiC,EAAAla,KACA,CAAA,UAAA,WAAA,MAAA,YAAA,OAAA,SAAA,QAAA,aAAAG,SAAA,SAAAC,GACAo8C,EAAAp8C,GAAA8Z,EAAA9Z,OAIAP,EAAA4V,UAAAq0C,eAAA,SAAAvN,GACA,IAAAriC,EAAAla,KACA,CAAA,UAAA,WAAA,MAAA,YAAA,QAAA,aAAAG,SAAA,SAAAC,GACA8Z,EAAA9Z,GAAAm8C,EAAAn8C,OAIAP,EAAA4V,UAAA3V,KAAA,WACA,IAAAoa,EAAAla,KACAF,EAAA,GAMA,MALA,CAAA,UAAA,WAAA,YAAA,SAAA,QAAA,aAAAK,SAAA,SAAAC,GACAN,EAAAM,GAAA8Z,EAAA9Z,MAEAN,EAAAszB,IAAApzB,KAAAozB,KAAApzB,KAAA+pD,SACAjqD,EAAAwC,OAAAtC,KAAAsC,OACAxC,GAGAD,EAAA4V,UAAAqL,OAAA,WACA,GAAA9gB,KAAA+a,IAAA,OAAA/a,KAAA+a,IACA,IAAAA,EAAA,KACAivC,EAAAhqD,KAAA0C,OAAA8mD,WACAS,EAAAjqD,KAAA0C,OAAA+mD,YAyBA,OAxBAzpD,KAAAK,UAAAF,SAAA,SAAA4d,GACA,IAAAtb,GAAAsY,GAAAivC,EAAApnD,KAAAmb,GACAtb,IACAsY,EAAA,CACAmF,IAAAzd,EAAA,IAAA,GACAiuC,KAAAjuC,EAAA,IAAA,GACAkuC,KAAAluC,EAAA,IAAA,GACAse,KAAAte,EAAA,IAAA,GACA6d,OAAA,KAAA7d,EAAA,GACAmd,QAAA,KAGAnd,GAAAsY,GAAAkvC,EAAArnD,KAAAmb,MAEAhD,EAAA,CACAmF,IAAAzd,EAAA,IAAA,GACAiuC,KAAAjuC,EAAA,IAAA,GACAkuC,KAAAluC,EAAA,IAAA,GACAse,KAAAte,EAAA,IAAA,GACA6d,QAAA,EACAV,QAAA,OAIA7E,GAAA,IAGAlb,EAAA4V,UAAAqK,aAAA,SAAA8pC,GACA,OAAAA,EACA5pD,KAAAK,UAAAsG,QAAA,SAAAC,EAAAmX,GACA,OAAAA,EAAAmqB,MAAA0hB,GAAAhjD,EAAAC,OAAAkX,GAAAnX,IACA,IAHA5G,KAAAK,WAMAR,EAAA4V,UAAAuI,YAAA,SAAA3C,GAEA,IAAA6uC,EAAAlqD,KAAA0C,OAAA2Y,IAAA,IAAAmS,OAAA,IAAAnS,GAEA,QADArb,KAAA8f,aAAAoqC,GACA1pD,QAIAX,EAAA4V,UAAA0K,OAAA,WACA,IAAApF,EAAA/a,KAAA+a,KAAA/a,KAAA8gB,SACA,OAAA/F,EAAAmF,IAAAnF,EAAAmF,IAAA,MAGArgB,EAAA4V,UAAA00C,QAAA,WACA,IAAApvC,EAAA/a,KAAA+a,KAAA/a,KAAA8gB,SACA,OAAA/F,EAAA21B,KAAA31B,EAAA21B,KAAA,MAGA7wC,EAAA4V,UAAA20C,QAAA,WACA,IAAArvC,EAAA/a,KAAA+a,KAAA/a,KAAA8gB,SACA,OAAA/F,EAAA41B,KAAA51B,EAAA41B,KAAA,MAGA9wC,EAAA4V,UAAA+K,QAAA,WACA,IAAAzF,EAAA/a,KAAA+a,KAAA/a,KAAA8gB,SACA,OAAA/F,EAAAgG,KAAAhG,EAAAgG,KAAA,MAGAlhB,EAAA4V,UAAA2K,QAAA,SAAAA,GAEA,OADArF,IAAAqF,GAAApgB,KAAA+a,KAAA/a,KAAA8gB,UACA,KAAA/F,IAAAgG,MAAAhG,IAAAuF,SAAAvF,IAAAmF,IAAAnF,IAAAmF,IACAlgB,KAAAqqD,UAAAtvC,KAAAA,IAAA21B,KACA31B,IAAAmF,IAAAnF,IAAAmF,IACAnF,IAAA41B,KAAA,IAAA51B,IAAA41B,KAAA,IAAA,IAGA9wC,EAAA4V,UAAA60C,OAAA,SAAAvvC,GACAA,EAAAA,GAAA/a,KAAA+a,KAAA/a,KAAA8gB,SACA,IAAA2f,EAAAzgC,KAAAogB,QAAArF,GAEA,OADA,KAAAA,EAAAgG,MAAAhG,EAAAuF,OAAA,QAAA,QACA,MAAAmgB,GAAA1lB,EAAAgG,KAAA,IAAAhG,EAAAgG,KAAA,KAGAlhB,EAAA4V,UAAAwK,UAAA,SAAAlF,GACAA,EAAAA,GAAA/a,KAAA+a,KAAA/a,KAAA8gB,SACA,IAAA2f,EAAAzgC,KAAAogB,QAAArF,GACA,OAAA0lB,GAAAA,GAAA1lB,EAAAgG,KAAA,IAAAhG,EAAAgG,KAAA,KAGAlhB,EAAA4V,UAAA40C,UAAA,SAAAtvC,GACA,SAAAA,EAAA21B,MAEA31B,EAAA21B,KAAAxI,MAAAloC,KAAA0C,OAAAinD,oBAIA9pD,EAAA4V,UAAA80C,YAAA,WACA,QAAAvqD,KAAAigB,aAGApgB,EAAA4V,UAAAqJ,MAAA,WAEA,OADA9e,KAAA+a,KAAA/a,KAAA8gB,UACAR,QAGAzgB,EAAA4V,UAAAsJ,MAAA,WAEA,OADA/e,KAAA+a,KAAA/a,KAAA8gB,UACA/d,QAGAlD,EAAA4V,UAAAoJ,OAAA,WAEA,OADA7e,KAAA+a,KAAA/a,KAAA8gB,UACAvC,SAGA1e,EAAA4V,UAAAmJ,MAAA,WACA,IAAA7D,EAAA/a,KAAA+a,KAAA/a,KAAA8gB,SACA,OAAA/F,EAAAwD,UAAAxD,EAAAhY,QAGAlD,EAAA4V,UAAA+0C,OAAA,WACA,OAAAxqD,KAAAge,YAAA,mCC7IA1d,EAAAmV,UAAA9T,QAAA,WACA,aACA,QAAA3B,KAAAwB,mBACAxB,KAAAsB,qBACAtB,KAAAY,cACAZ,KAAA2pC,UACA3pC,KAAAc,cACAd,KAAAU,iBACAV,KAAAgB,cACAhB,KAAAoB,eACApB,KAAAkB,eAGAZ,EAAAmV,UAAAxJ,UAAA,WACAjM,KAAAW,WAAAX,KAAAyqD,iBAAAzqD,KAAAW,WAAA,CAAA,SAAA,YAAA,OAAA,QACAX,KAAAa,QAAAb,KAAAyqD,iBAAAzqD,KAAAa,QAAA,CAAA,SAAA,YAAA,QAAA,QAAA,QACAb,KAAAe,QAAAf,KAAAyqD,iBAAAzqD,KAAAe,QAAA,CAAA,SAAA,YAAA,QAAA,QAAA,QACAf,KAAAiB,QAAAjB,KAAAyqD,iBAAAzqD,KAAAiB,QAAA,CAAA,SAAA,YAAA,QAAA,QAAA,QACAjB,KAAAmB,QAAAnB,KAAAyqD,iBAAAzqD,KAAAmB,QAAA,CAAA,SAAA,cACAnB,KAAAqB,SAAArB,KAAAyqD,iBAAAzqD,KAAAqB,SAAA,CAAA,WAGArB,KAAAuB,eAAAvB,KAAAyqD,iBAAAzqD,KAAAuB,eAAA,CAAA,OAAA,KAAA,QAAA,cAIAvB,KAAAyB,aAAAzB,KAAA0qD,kBAAA1qD,KAAAyB,qBAEAzB,KAAAozB,KAGA9yB,EAAAmV,UAAAw0B,UAAA,kBACAjqC,KAAAW,kBACAX,KAAAa,eACAb,KAAAe,eACAf,KAAAiB,eACAjB,KAAAmB,eACAnB,KAAAqB,gBACArB,KAAAuB,sBACAvB,KAAAyB,oBAEAzB,KAAAozB,KAGA9yB,EAAAmV,UAAAg1C,iBAAA,SAAAE,EAAAC,GACA,OAAAD,GAAAA,EAAAnqD,OACAmqD,EAAAhkD,QAAA,SAAAC,EAAAwsB,GACA,IAAAlxB,EAAAkxB,EAAAjxB,MAAA,KACA,GAAAD,EAAA1B,QAAAoqD,EAAApqD,OAEA,OADAkK,QAAAqB,MAAA,oEAAApG,OAAAklD,cAAAz3B,EAAAw3B,EAAApqD,SACAoG,EAGA,IADA,IAAAsT,EAAA,GACAyH,EAAA,EAAAA,EAAAipC,EAAApqD,OAAAmhB,IACAzH,EAAA0wC,EAAAjpC,IAAAzf,EAAAyf,GAEA,OAAA/a,EAAAC,OAAAqT,KACA,IAZA,IAmBA5Z,EAAAmV,UAAA/S,OAAA,CACAkrC,eAAA,gCAJA,IAAApgB,OAAA,qCAOAltB,EAAAmV,UAAAi1C,kBAAA,SAAAjpD,GACA,OAAAA,GAAAA,EAAAjB,OACAiB,EAAAkF,QAAA,SAAAC,EAAAwK,GACA,IAAA8I,EAAA,CACAogC,QAAAlpC,EAAAkpC,QACAzF,KAAAzjC,EAAAyjC,MA2CA,OAxCA36B,EAAAsgC,QAAAppC,EAAAopC,QAAA7zC,QAAA,SAAAC,EAAA4pC,GACA,IAAAtuC,EAAAsuC,EAAAruC,MAAA,KACA,GAAA,GAAAD,EAAA1B,OAEA,OADAkK,QAAAqB,MAAA,yEAAApG,OAAA6qC,IACA5pC,EAGA,IAAA6iC,EAAAvnC,EAAA,GACA0nC,EAAA1nC,EAAA,GACA0tC,EAAA1tC,EAAA,GAEAO,EAAAnC,EAAAmV,UAAA/S,OAAAkrC,cAAAhrC,KAAAV,EAAA,IAGA,GAAAO,EAAA,CACA,IAAAH,EAAAG,EAAA,GACA,OAAA2O,EAAAkpC,UAAA,GAAAlpC,EAAAkpC,QAAA76B,QAAAnd,GACAsE,EAAAC,OAAA,CACA4iC,OAAAG,GAAA,EAAAH,EAAAA,EAAA7nB,KAAAC,IAAA,GAAA+nB,GACAA,SAAAA,EACAtnC,OAAAA,IAJAsE,EAWA,OAAAA,EAAAC,OAAA,CACA4iC,OAAAG,GAAA,EAAAH,EAAAA,EAAA7nB,KAAAC,IAAA,GAAA+nB,GACAA,SAAAA,EACAgG,gBAAAA,MAGA,IAGA11B,EAAAhW,OAAAgW,EAAAsgC,QAAAh6C,SACA0Z,EAAA4wC,WAAA,GAGAlkD,EAAAC,OAAAqT,KACA,IAhDA,IC1BAlY,EAAAyT,UAAA/S,OAAA,CACAC,YAAA,uCChFAa,EAAAunD,QAAA,CAAA,SAAA,WAAA,cAAA,YACA1mD,EAAA0mD,QAAA,CAAA,SAAA,WAAA,KAAA,gBAAA,UAAA,cAAA,WAAA,aAAA,UAAA,MAAA,SAAA,WAAA,aAAA,SAAA,cACAv8C,EAAAu8C,QAAA,CAAA,SAAA,cAAA,YACAlnD,QAAA6Q,OAAA,2BAAA,CAAA,oBAEAjG,OAAA,CAAA,iBAAA,SAAAu8C,GAGAA,EACAv2C,MAAA,YAAA,CACAulB,IAAA,SACAd,MAAA,CACA+xB,YAAA,CACA78C,YAAA,2BACAuvB,WAAA,mBAOAA,WAAA,YAAAn6B,GAEAm6B,WAAA,iBAAAt5B,GAEAs5B,WAAA,WAAAnvB,GCzBAI,EAAAm8C,QAAA,CAAA,SAAA,SAAA,WAAA,gBAAA,cACA57C,EAAA47C,QAAA,CAAA,SAAA,WAAA,gBAAA,aAAA,cACAz7C,EAAAy7C,QAAA,CAAA,SAAA,SAAA,UAAA,yBAAA,WAAA,KAAA,gBAAA,UAAA,WAAA,aAAA,aAAA,kBAAA,SAAA,YACAv2C,EAAAu2C,QAAA,CAAA,UACAlnD,QAAA6Q,OAAA,0BAAA,CAAA,oBAEAjG,OAAA,CAAA,iBAAA,SAAAu8C,GAGAA,EAGAv2C,MAAA,gBAAA,CACAulB,IAAA,QACAd,MAAA,CACA+xB,YAAA,CACA78C,YAAA,2BACAuvB,WAAA,mBAKAlpB,MAAA,WAAA,CACAulB,IAAA,eACAd,MAAA,CACA+xB,YAAA,CACA78C,YAAA,gCACAuvB,WAAA,eAKAlpB,MAAA,kBAAA,CACAulB,IAAA,gBACAd,MAAA,CACA+xB,YAAA,CACA78C,YAAA,gCACAuvB,WAAA,kBAUAA,WAAA,WAAA/uB,GAEA+uB,WAAA,gBAAAxuB,GAEAwuB,WAAA,cAAAruB,GAEAquB,WAAA,eAAAnpB,GqBtDA3Q,QAAA6Q,OAAA,mBAAA,IAAAw2C,IAAA,CAAA,iBAAA,SAAAC,GAAAA,EAAA9oB,IAAA,yBAAA,i4QACA8oB,EAAA9oB,IAAA,0BAAA,kvDACA8oB,EAAA9oB,IAAA,0BAAA,6QACA8oB,EAAA9oB,IAAA,qCAAA,saACA8oB,EAAA9oB,IAAA,8BAAA,61LACA8oB,EAAA9oB,IAAA,gDAAA,k1BACA8oB,EAAA9oB,IAAA,0CAAA,6iEACA8oB,EAAA9oB,IAAA,uCAAA,0qEACA8oB,EAAA9oB,IAAA,yCAAA,6hBACA8oB,EAAA9oB,IAAA,0CAAA,iVACA8oB,EAAA9oB,IAAA,2CAAA,svCACA8oB,EAAA9oB,IAAA,wCAAA,ujBACA8oB,EAAA9oB,IAAA,sCAAA,yQACA8oB,EAAA9oB,IAAA,mCAAA,wPACA8oB,EAAA9oB,IAAA,qDAAA,o+CACA8oB,EAAA9oB,IAAA,uCAAA,owXACA8oB,EAAA9oB,IAAA,kDAAA,47BACA8oB,EAAA9oB,IAAA,wDAAA,8gBACA8oB,EAAA9oB,IAAA,4CAAA,4YACA8oB,EAAA9oB,IAAA,mDAAA,uHACA8oB,EAAA9oB,IAAA,qCAAA,uZACA8oB,EAAA9oB,IAAA,wCAAA,4rDACA8oB,EAAA9oB,IAAA,wCAAA,qaACA8oB,EAAA9oB,IAAA,wCAAA,mlEACA8oB,EAAA9oB,IAAA,sCAAA,2lEACA8oB,EAAA9oB,IAAA,uCAAA,2zBACA8oB,EAAA9oB,IAAA,+BAAA,ogBACA8oB,EAAA9oB,IAAA,sCAAA,uMACA8oB,EAAA9oB,IAAA,wCAAA;AACA8oB,EAAA9oB,IAAA,2CAAA,wtLACA8oB,EAAA9oB,IAAA,oCAAA,u4KACA8oB,EAAA9oB,IAAA,sCAAA,yjBACA8oB,EAAA9oB,IAAA,iCAAA,iSACA8oB,EAAA9oB,IAAA,wCAAA,ggCACA8oB,EAAA9oB,IAAA,0CAAA,8aACA8oB,EAAA9oB,IAAA,0CAAA,8zBACA8oB,EAAA9oB,IAAA,2CAAA,wcACA8oB,EAAA9oB,IAAA,8CAAA,sXACA8oB,EAAA9oB,IAAA,uCAAA,+PACA8oB,EAAA9oB,IAAA,2CAAA,24DACA8oB,EAAA9oB,IAAA,wCAAA,61BACA8oB,EAAA9oB,IAAA,2BAAA,i2GACA8oB,EAAA9oB,IAAA,iCAAA,8lBACA8oB,EAAA9oB,IAAA,gCAAA,kUACA8oB,EAAA9oB,IAAA,2BAAA,+yOACA8oB,EAAA9oB,IAAA,gDAAA,qmHACA8oB,EAAA9oB,IAAA,wCAAA,4zYACA8oB,EAAA9oB,IAAA,wCAAA,qhRACA8oB,EAAA9oB,IAAA,wCAAA,stDACA8oB,EAAA9oB,IAAA,kCAAA,giFACA8oB,EAAA9oB,IAAA,mCAAA,m4BACA8oB,EAAA9oB,IAAA,iCAAA,ioCACA8oB,EAAA9oB,IAAA,4CAAA,wgDACA8oB,EAAA9oB,IAAA,mCAAA,koFACA8oB,EAAA9oB,IAAA,wCAAA,mLACA8oB,EAAA9oB,IAAA,mCAAA,osBACA8oB,EAAA9oB,IAAA,uCAAA,qzCACA8oB,EAAA9oB,IAAA,sBAAA,8lSACA8oB,EAAA9oB,IAAA,6BAAA,kgGACA8oB,EAAA9oB,IAAA,2CAAA,gsHACA8oB,EAAA9oB,IAAA,qCAAA,+vDACA8oB,EAAA9oB,IAAA,gDAAA,q8BACA8oB,EAAA9oB,IAAA,uCAAA,mzDACA8oB,EAAA9oB,IAAA,2CAAA,uoBACA8oB,EAAA9oB,IAAA,yCAAA,mgCACA8oB,EAAA9oB,IAAA,2CAAA,6yEACA8oB,EAAA9oB,IAAA,sCAAA,mnHACA8oB,EAAA9oB,IAAA,mCAAA,0iHACA8oB,EAAA9oB,IAAA,0CAAA,2hBACA8oB,EAAA9oB,IAAA,qCAAA,k9CACA8oB,EAAA9oB,IAAA,mCAAA,ktRACA8oB,EAAA9oB,IAAA,gCAAA,uuEACA8oB,EAAA9oB,IAAA,gCAAA,4sBACA8oB,EAAA9oB,IAAA,+CAAA,k1CACA8oB,EAAA9oB,IAAA,yCAAA;AACA8oB,EAAA9oB,IAAA,+CAAA,mqEACA8oB,EAAA9oB,IAAA,2CAAA,+4BACA8oB,EAAA9oB,IAAA,6CAAA,0mCACA8oB,EAAA9oB,IAAA,6CAAA,woCACA8oB,EAAA9oB,IAAA,6CAAA,yrBACA8oB,EAAA9oB,IAAA,0CAAA,ojFACA8oB,EAAA9oB,IAAA,uCAAA,+mOACA8oB,EAAA9oB,IAAA,uCAAA,+mBACA8oB,EAAA9oB,IAAA,qCAAA,g5BACA8oB,EAAA9oB,IAAA,wCAAA,6nEACA8oB,EAAA9oB,IAAA,qCAAA,mpBACA8oB,EAAA9oB,IAAA,uCAAA,gtBACA8oB,EAAA9oB,IAAA,uDAAA,ggEACA8oB,EAAA9oB,IAAA,kDAAA,6nCACA8oB,EAAA9oB,IAAA,kDAAA,s+CACA8oB,EAAA9oB,IAAA,kDAAA,4hBACA8oB,EAAA9oB,IAAA,sDAAA,+1CACA8oB,EAAA9oB,IAAA,+CAAA,4vDACA8oB,EAAA9oB,IAAA,+CAAA,sgDACA8oB,EAAA9oB,IAAA,sCAAA,qyNACA8oB,EAAA9oB,IAAA,kDAAA,y2EACA8oB,EAAA9oB,IAAA,6CAAA,gwEACA8oB,EAAA9oB,IAAA,uCAAA,qrLACA8oB,EAAA9oB,IAAA,oCAAA,84NACA8oB,EAAA9oB,IAAA,wCAAA,giDACA8oB,EAAA9oB,IAAA,2CAAA,+6CACA8oB,EAAA9oB,IAAA,gDAAA,soDACA8oB,EAAA9oB,IAAA,mDAAA,g6DACA8oB,EAAA9oB,IAAA,iCAAA,k8JACA8oB,EAAA9oB,IAAA,+BAAA,gfACA8oB,EAAA9oB,IAAA,4CAAA,orBACA8oB,EAAA9oB,IAAA,4BAAA,sUACA8oB,EAAA9oB,IAAA,kCAAA,kgCACA8oB,EAAA9oB,IAAA,kDAAA,knDACA8oB,EAAA9oB,IAAA,mDAAA,4rBACA8oB,EAAA9oB,IAAA,qCAAA,mhBACA8oB,EAAA9oB,IAAA,sDAAA,mtBACA8oB,EAAA9oB,IAAA,yCAAA,uuHACA8oB,EAAA9oB,IAAA,sCAAA,uuHACA8oB,EAAA9oB,IAAA,mCAAA,i9LClHAx+B,QAAA6Q,OAAA,sBAAA,IAAAjG,OAAA,CAAA,qBAAA,SAAA28C,GACAA,EAAA73B,aAAA,QAAA,CACA83B,OAAA,CACAC,SAAA,SACAC,YAAA,eACAC,UAAA,kBACA3lD,OAAA,aACA4lD,OAAA,SACAC,MAAA,QACAC,OAAA,KACAC,QAAA,MACAC,OAAA,KACAC,SAAA,OACAC,eAAA,iBACAC,qBAAA,WACAC,SAAA,OACAC,aAAA,YACAC,iBAAA,gBACAC,SAAA,OACAC,gBAAA,WACAC,kBAAA,yBACAC,SAAA,OACAC,SAAA,OACAC,WAAA,SACAC,WAAA,SACAC,UAAA,QACAC,UAAA,QACAC,UAAA,UACAC,WAAA,SACAC,gBAAA,cACAC,UAAA,QACAC,SAAA,OACAC,WAAA,SACAC,QAAA,MACAC,WAAA,SACAC,YAAA,UACAC,UAAA,QACAC,UAAA,QACAC,aAAA,WACAC,WAAA,SACAC,eAAA,eACAC,YAAA,UACAC,cAAA,gBACAC,qBAAA,uBACAC,aAAA,WACAC,+BAAA,6BACAC,WAAA,SACAC,YAAA,wCACAC,KAAA,OACAC,oBAAA,kCACAC,iBAAA,kBACAC,QAAA,aACAC,aAAA,gEACAC,UAAA,eACAC,KAAA,OACAC,GAAA,KACAC,KAAA,OACAC,SAAA,WACAC,mBAAA,qBACA1L,GAAA,KACAllB,aAAA,mBACA6wB,kBAAA,aACAC,mBAAA,WACAC,wBAAA,UACAC,kBAAA,UACAC,IAAA,YACAC,OAAA,UACAC,QAAA,WACAC,aAAA,WACAC,cAAA,oBACAC,eAAA,4CACAC,YAAA,yBACAC,sBAAA,UACAC,qBAAA,UACAC,UAAA,YACAC,gBAAA,+BACAC,cAAA,CACAC,MAAA,QACAC,iBAAA,mBACAC,kBAAA,oBACAC,kBAAA,qBACAC,oBAAA,oBAEA1hC,KAAA,CACA2hC,KAAA,QACAC,KAAA,QACAC,KAAA,QACAC,WAAA,kBAGAC,OAAA,CACAC,oBAAA,iBACAC,oBAAA,UACAC,mBAAA,iBAEAC,KAAA,CACAC,KAAA,OACAC,IAAA,WACAvlB,SAAA,WACAwlB,QAAA,aACAC,QAAA,aACAC,SAAA,WACAC,QAAA,UACAC,aAAA,mBAEAC,MAAA,CACArB,MAAA,QACAsB,QAAA,mDACAC,eAAA,8FACAC,cAAA,wFACAC,KAAA,eACAC,kBAAA,qBACAC,WAAA,cACAC,MAAA,SACAC,oBAAA,iCACAC,aAAA,kBACAC,oBAAA,yBAEAjB,KAAA,CACAd,MAAA,SACAgC,QAAA,qCACAC,iBAAA,sEACAC,QAAA,0DACAC,iBAAA,iEACAC,aAAA,2CACAC,UAAA,QACAC,SAAA,OACAC,YAAA,iBACAC,cAAA,gBACAC,QAAA,WACAC,aAAA,eACAZ,aAAA,kBACAa,0BAAA,qFACAC,mBAAA,0BACAC,iBAAA,8LACAC,cAAA,WACAC,UAAA,YACAC,YAAA,UAEA9B,SAAA,CACAlB,MAAA,WACAiD,gBAAA,UACAC,gBAAA,UACAC,iBAAA,UACAC,KAAA,uBACAC,WAAA,eACAC,uBAAA,2BACAC,cAAA,sCACAC,mBAAA,sGACAC,kBAAA,uBACAC,uBAAA,mCACAC,iBAAA,aACAC,uBAAA,kBACAC,4BAAA,yFACAC,eAAA,8BACAC,gBAAA,+BACAC,kBAAA,wBACAC,iBAAA,qBACAC,mBAAA,8BACAC,wBAAA,4BACAC,6BAAA,oDACAC,wBAAA,iBACAC,UAAA,+BACAC,gBAAA,aACAC,eAAA,qDACAC,iBAAA,CACAC,MAAA,uBACAC,QAAA,iCACAC,OAAA,mCACAC,QAAA,mCACAC,KAAA,iCACAC,OAAA,6BAEAC,aAAA,eACAC,kBAAA,2HACAC,YAAA,gBACAC,iBAAA,2FACAC,iBAAA,aACAC,UAAA,yBACAC,YAAA,qBACAC,iBAAA,4BACAC,sBAAA,yBACAC,4BAAA,sBACAC,2BAAA,8DACAC,sBAAA,CACAC,KAAA,WACAzwC,EAAA,gDAEA0wC,WAAA,CACA7F,MAAA,eACA8F,KAAA,UACAC,UAAA,uBACAC,QAAA,WACAC,aAAA,mBACAC,cAAA,gBAGAC,WAAA,CACAC,KAAA,iBACAC,KAAA,CACAC,aAAA,wCACAC,cAAA,gBACAvG,MAAA,kCACAwG,YAAA,cACAC,SAAA,gBACAC,kBAAA,yBACA9nC,QAAA,iBACAwnC,KAAA,gBACAO,wBAAA,4DACAC,MAAA,6BACAC,QAAA,qBACAC,aAAA,yCACAC,aAAA,OACAC,iBAAA,iBACAC,cAAA,UACAC,cAAA,WACAC,mBAAA,0CACAC,cAAA,UACAC,mBAAA,yCACAC,eAAA,mBACAC,oBAAA,6EACAC,cAAA,qBACAC,mBAAA,yCACAC,SAAA,eACAC,WAAA,iBACAC,cAAA,SACAC,4BAAA,oBACAC,mBAAA,CACAC,IAAA,MACAC,GAAA,MAEAhqB,mBAAA,CACAhD,IAAA,gCACAitB,IAAA,sCACAC,IAAA,iBACAC,KAAA,iBAGAC,OAAA,CACApI,MAAA,SACAqI,SAAA,UACAC,YAAA,eACAC,YAAA,YAGA/sB,SAAA,CACA6qB,KAAA,CACArG,MAAA,WACAwI,aAAA,WACAC,QAAA,eACAC,YAAA,UACAC,WAAA,SACAC,2BAAA,iQACAC,sBAAA,gBACAC,cAAA,gBACAC,QAAA,gBACAC,kBAAA,8DACAC,cAAA,QACAC,KAAA,gBACAC,MAAA,cACA9V,GAAA,qBACA+V,SAAA,iBACAC,YAAA,0BACAxC,QAAA,oBACAyC,oBAAA,oBACAC,OAAA,4BACAC,QAAA,+BACAC,UAAA,6CACAC,cAAA,SACAC,gBAAA,4FACAC,gBAAA,uCACAC,aAAA,uDACAC,UAAA,oDACAC,WAAA,0EACAC,WAAA,uDACAC,aAAA,oDACAC,UAAA,4DACAC,YAAA,iDACAC,SAAA,kEACAC,kBAAA,yBACAC,SAAA,6FACAC,iBAAA,2EACAC,SAAA,0EACAC,aAAA,oCACAC,QAAA,UACAC,aAAA,UACAC,kBAAA,qBACAC,iBAAA,eACAC,YAAA,gBAEAxJ,QAAA,CACAtB,MAAA,mBACA/B,aAAA,gBACA8M,gBAAA,4BAGA5J,QAAA,CACAkF,KAAA,CACAgD,YAAA,kBACA2B,cAAA,mBACAC,aAAA,WACAC,SAAA,YACAC,iBAAA,kDACAC,iBAAA,uCACAC,OAAA,cACAC,eAAA,iBACAC,WAAA,wBACAC,UAAA,CACArwB,KAAA,wBACAE,OAAA,eACAD,KAAA,gBACAqwB,YAAA,sBAGAC,KAAA,CACAC,eAAA,8EAGAvI,KAAA,CACAwI,MAAA,QACAC,gBAAA,kBACAC,OAAA,SACAC,QAAA,UACAC,aAAA,eACAC,UAAA,cACAlD,QAAA,UACAmD,aAAA,eACAC,UAAA,YACAC,WAAA,aACAC,IAAA,MACAC,cAAA,UACA1M,qBAAA,SACA2M,QAAA,UACAC,cAAA,gBACAC,cAAA,YACApG,KAAA,CACArG,MAAA,OACA0M,MAAA,YACAC,iBAAA,uBACAC,uBAAA,iCACAtE,YAAA,cACAuE,YAAA,gBACAC,gBAAA,sBACAC,MAAA,CACAC,uBAAA,kDACAC,mBAAA,6BAIAlM,IAAA,CACAmM,YAAA,gCACAC,0BAAA,8GACAC,iBAAA,gBACAC,uBAAA,2BACAC,iBAAA,6BACAC,uBAAA,yBACAC,uBAAA,eACAC,6BAAA,qBACAC,sCAAA,kBACAC,UAAA,UACAC,sBAAA,yBACAC,QAAA,UACAC,OAAA,YACAjC,gBAAA,8BACAkC,iBAAA,8BACAjB,gBAAA,sBACAkB,mBAAA,qBACAC,wBAAA,mEACAvH,kBAAA,iBACAwH,YAAA,UACAC,gBAAA,eACAC,uBAAA,oBACAC,mBAAA,qBACAhI,KAAA,CACAiI,oBAAA,sBAEAlG,OAAA,CACApI,MAAA,WACAuO,UAAA,eACAC,gBAAA,oBACAC,QAAA,yBACAC,cAAA,kCACAC,WAAA,yCACAC,YAAA,iDACAC,cAAA,iBACAC,YAAA,wBACAjP,UAAA,YACAC,gBAAA,+BACAiP,WAAA,4BACAC,aAAA,eAEAC,SAAA,CACAjP,MAAA,YAEAkP,MAAA,CACAlP,MAAA,UAEAmP,eAAA,CACAnP,MAAA,2BACAoP,QAAA,0BACAC,KAAA,qCACAC,aAAA,yBACAC,SAAA,0BACAC,YAAA,qCACAzC,MAAA,mCACA0C,cAAA,oBAEAC,WAAA,CACA1P,MAAA,wBAEA2P,qBAAA,CACA3P,MAAA,gCACAoP,QAAA,sBACAC,KAAA,iCACAC,aAAA,yBACAM,KAAA,sBACAC,QAAA,iCACA9C,MAAA,mCAGA+C,MAAA,CACA9P,MAAA,wCACA+P,iBAAA,yFACAC,iBAAA,qCACAC,eAAA,mCACAC,eAAA,gCACAC,KAAA,oBACAC,UAAA,oBACAC,UAAA,6BACAC,SAAA,WACAC,cAAA,WACAC,YAAA,0BACAlS,oBAAA,6BACAmS,sBAAA,4BACAC,eAAA,oBACAC,oBAAA,wBACAC,aAAA,mBACAC,kBAAA,eACAC,YAAA,gBACAC,iBAAA,mBACAC,qBAAA,UACAC,mBAAA,uDACAC,kBAAA,wBACAC,YAAA,CACAnR,MAAA,cACAkC,QAAA,uGACAkP,YAAA,UACAC,aAAA,uCAEAC,OAAA,CACAC,eAAA,iCACAC,gBAAA,gBACA9yC,KAAA,gBACA1oB,OAAA,0BACAy7D,KAAA,kBAEAC,OAAA,CACAx8C,OAAA,aACAK,QAAA,gBACAo8C,OAAA,cACAC,QAAA,eACAC,QAAA,eACAC,KAAA,iBACA38C,EAAA,YACAC,EAAA,WACAC,EAAA,YAEAqJ,KAAA,CACAqzC,KAAA,0GAGAC,KAAA,CACAhS,MAAA,iDACAiS,SAAA,eACAC,aAAA,gCACAC,kBAAA,yEACAC,qBAAA,qFACAlC,eAAA,6DAEAlP,QAAA,CACAhB,MAAA,aACAqS,QAAA,UACAC,QAAA,gCACAC,gBAAA,kBACAC,MAAA,iBACAC,aAAA,YACAC,YAAA,WACAC,aAAA,qDACAC,WAAA,uBACAC,cAAA,+BACAC,SAAA,2BACAC,cAAA,oBACAC,oBAAA,gCACAC,OAAA,SACAC,cAAA,mUACAC,mBAAA,mDACAC,uBAAA,iOACAC,4BAAA,wTACAC,4BAAA,qGACAC,2BAAA,sKACAC,sBAAA,oJACAC,sCAAA,sLACAC,sBAAA,oKACAC,oBAAA,0BACAC,0BAAA,iBACA9J,UAAA,kCACA+J,kBAAA,UACAC,mCAAA,gCACAC,mBAAA,iCACAC,qBAAA,mBACAC,0BAAA,sBACAC,wBAAA,uBACAC,kBAAA,0BACAC,iBAAA,yBACAC,uBAAA,CACArU,MAAA,gBACAsU,YAAA,qDACAC,iBAAA,kFACAC,cAAA,8BAEAC,IAAA,CACAzU,MAAA,eACA0U,mBAAA,8JACAC,uBAAA,+GACAC,4BAAA,wFACAC,WAAA,gHACAC,kBAAA,wJACAC,uBAAA,qHACAC,oBAAA,wCACAC,eAAA,iBACAC,qBAAA,0BACAC,oBAAA,wFACAC,eAAA,gBACAC,qBAAA,kBACAC,oBAAA,4IACAC,aAAA,0LACAC,iBAAA,+KACAC,eAAA,qPACA3H,OAAA,YACA4H,YAAA,SACAC,aAAA,UACAC,kBAAA,gCACAC,iBAAA,UACAC,sBAAA,uBACAC,cAAA,gBACAC,iBAAA,eACAC,0BAAA,2VACAC,4BAAA,4NACAC,4BAAA,+KACAC,gBAAA,cACAC,iBAAA,8BACAC,qBAAA,kCACAC,aAAA,2FACAC,WAAA,WACAC,mBAAA,wBAEAC,eAAA,CACA1W,MAAA,oBACA+R,KAAA,wDAEA4E,sBAAA,CACA3W,MAAA,qBACA+R,KAAA,+LAEA6E,oBAAA,CACA5W,MAAA,oBAEA6W,YAAA,CACA7W,MAAA,aACA8W,QAAA,eACA7Y,aAAA,oBACA8Y,qBAAA,wBACAC,UAAA,sBACA3Z,WAAA,+BACA4Z,WAAA,oBACAC,gBAAA,sDACAC,WAAA,UACAC,aAAA,CACApX,MAAA,oBACA+R,KAAA,uBACAsF,UAAA,eAEAC,aAAA,CACAtX,MAAA,2BACA+R,KAAA,uHACAwF,aAAA,sDACAC,cAAA,kBAGAC,SAAA,CACAC,aAAA,sBACAC,UAAA,QACAtS,UAAA,QACAuS,gBAAA,yBACAC,qBAAA,sLACAC,iBAAA,gCACAC,sBAAA,wMACAC,iBAAA,mEACAC,cAAA,wBACAC,mBAAA,wLACAC,cAAA,sBACAC,mBAAA,qNACAC,WAAA,wDACAC,MAAA,iBACAC,UAAA,2DACAC,aAAA,8DACAC,WAAA,0DACAC,WAAA,wCACAC,WAAA,oDACAC,WAAA,iDACAC,WAAA,6CACAC,WAAA,6DACAC,WAAA,0CACAC,WAAA,uCACAC,WAAA,4CACAC,YAAA,iDACAC,YAAA,4EACAC,YAAA,kEACAC,YAAA,wCACAC,YAAA,yCACAC,YAAA,qDACAC,YAAA,0DACAC,YAAA,wCACAC,YAAA,iDACAC,YAAA,qCACAC,WAAA,yBACAC,gBAAA,0HACAC,uBAAA,4DACAC,qBAAA,8BACAC,iCAAA,kMACAC,0BAAA,8IACAC,kBAAA,kCACAC,uBAAA,wQACAC,oBAAA,8DACAC,QAAA,yBACAC,aAAA,wLACAC,aAAA,+DACAva,MAAA,uBACAwa,QAAA,CACAC,cAAA,iBACAC,mBAAA,gMACAC,WAAA,6BACAC,gBAAA,6KACAC,YAAA,uCACAC,iBAAA,kIACAC,eAAA,CACA/a,MAAA,0BACA+R,KAAA,+BACAxB,cAAA,cAEAxD,MAAA,CACAxvD,aAAA,iBACAyhB,aAAA,kBAIAg8C,UAAA,oGACAC,QAAA,CACAC,KAAA,OACAC,OAAA,SACA1/B,QAAA,YAGA2/B,SAAA,CACApb,MAAA,WACAqb,UAAA,iBACAC,cAAA,oBACA3c,KAAA,OACAC,GAAA,KACAuc,OAAA,SACAI,YAAA,SACA9/B,QAAA,UACA+/B,aAAA,qBACAvf,SAAA,OACAwf,gBAAA,gBACAC,KAAA,kBACAC,QAAA,KACAC,uBAAA,+DACA1M,MAAA,CACAlP,MAAA,aAGA+M,MAAA,CACA8O,mBAAA,qBACAC,wBAAA,qCACAC,YAAA,QACAC,cAAA,gBACAC,qBAAA,8DACAC,wBAAA,wCACAC,iBAAA,mCACAC,eAAA,2CACAC,eAAA,0BACAC,gBAAA,iCACAC,4BAAA,qDACAC,eAAA,iCACAC,2BAAA,oDACAC,UAAA,yBACAC,UAAA,yBACAC,aAAA,2CACAC,iBAAA,wBACAC,cAAA,0BACAC,gBAAA,yBACAC,uBAAA,gCACAC,mBAAA,kCACAC,qBAAA,kCACAC,0BAAA,8BACAC,+BAAA,yFACAC,wCAAA,4IACAC,gCAAA,gFACAC,aAAA,uBACAC,qBAAA,2BACAC,yBAAA,wCACAC,0BAAA,8CACAC,2BAAA,6CACAC,oBAAA,4BACAC,uBAAA,qCACAC,oBAAA,+CACAC,eAAA,8BACAC,iBAAA;AACAC,mBAAA,qHACAC,wBAAA,4CACAC,0BAAA,oDACAC,uBAAA,mCACAC,sBAAA,8BACAC,oBAAA,yBACAC,YAAA,0BACAC,oBAAA,uBACAC,kBAAA,iBACAC,sBAAA,mDACAC,iBAAA,wBACAC,gBAAA,sBACAC,gBAAA,+BACAC,kBAAA,qBACAC,qBAAA,sCACAC,gBAAA,oEACAC,gBAAA,sCACAC,eAAA,+BACAC,wBAAA,oBACAC,iBAAA,2EACAC,2BAAA,4IACAC,4BAAA,6HACAC,4BAAA,uMACAC,iBAAA,sFACAriC,sBAAA,uIACAsiC,mBAAA,qBACAC,mBAAA,8CACAC,+BAAA,wBACAC,0BAAA,iOACAC,wBAAA,gKACAC,eAAA,qIACAC,mBAAA,iEACAC,cAAA,2BACAC,oBAAA,uDACAC,oBAAA,gCACAC,kBAAA,yBACAC,gBAAA,+BACAC,yBAAA,oIACAC,iCAAA,uJACAC,wBAAA,oBACAC,sBAAA,8BACAC,oBAAA,wCACAC,oCAAA,+DACAC,kDAAA,+EACAC,kCAAA,gFACAC,iBAAA,4BACAC,mBAAA,mCACAC,2BAAA,2CACAC,kBAAA,6CACAC,+BAAA,uCACAC,kBAAA,6BACAC,iBAAA,sBACAC,0BAAA,8CACAC,uBAAA,sDACAC,mBAAA,8CACAC,iBAAA,+HACAC,yBAAA,+EACAC,wBAAA,6BACAC,yBAAA,2FACAC,oBAAA,+HACAC,4BAAA,kCACAC,+BAAA,qCACAC,0BAAA,yCACAC,wBAAA,sCACAC,wBAAA,sCACAC,0BAAA,+GACAC,8BAAA,uCACAC,kBAAA,4BACAC,2BAAA,yCACAC,oBAAA,uBACAC,kBAAA,oDAEA5W,KAAA,CACAqQ,YAAA,cACAwG,mBAAA,+BACAzD,kBAAA,oBACA0D,cAAA,qCACAC,uBAAA,iBACAC,oBAAA,6BACAC,oBAAA,oBACAC,qCAAA,wFACAC,yBAAA,sGACAC,2BAAA,kPACAC,gBAAA,+BACAC,gCAAA,2EACAC,yBAAA,4FACAC,iBAAA,2BAEAC,QAAA,CACApH,YAAA,sBACAqH,oBAAA,iBACAC,6BAAA,iEACAC,wBAAA,kBACAC,cAAA,6VACAC,WAAA,uCACAC,SAAA,0BACArI,SAAA,uPACAsI,aAAA,kUACAC,eAAA,8GACAC,iBAAA,6GACAC,0BAAA,gBACAC,oBAAA,kKACAC,aAAA,4JACAC,eAAA,+EACAC,WAAA,wEACAC,iBAAA,kEACAC,gBAAA,gOACAC,kBAAA,wGACAC,0BAAA,gLACAC,kBAAA,mEACAC,wBAAA,oBACAC,OAAA,mCACAC,kBAAA,uHACAC,mBAAA,8PAEAC,KAAA,CACAC,KAAA,CACAC,MAAA,OACAF,KAAA,qBACAG,sBAAA,iEACAC,UAAA,sHACAC,aAAA,uKAEAC,SAAA,CACAJ,MAAA,QACAF,KAAA,kBACAI,UAAA,2FACAC,aAAA,qNAGAE,SAAA,CACAnJ,YAAA,yBACAoJ,qBAAA,sPAEApT,KAAA,CACA/R,MAAA,cACAolB,KAAA,CACAC,QAAA,OACAlV,KAAA,ggBACAG,SAAA,kbACAxC,OAAA,oWAEAgC,MAAA,CACAuV,QAAA,SACArvE,OAAA,qBACAsvE,WAAA,+dACAhU,OAAA,qBACAiU,WAAA,yhBAEAC,SAAA,CACAH,QAAA,WACAC,WAAA,8IACA1pB,OAAA,SACA6pB,WAAA,uPACAC,eAAA,iBACAC,mBAAA,4gBACAxf,WAAA,aACAyf,eAAA,wRACAC,uBAAA,6jBACA9kB,IAAA,qBACA+kB,QAAA,qHACAC,cAAA,gBACAC,kBAAA,4LAEAC,IAAA,CACAC,kBAAA,0GACAC,aAAA,6EACAC,cAAA,sPACAC,uBAAA,gWACAC,qBAAA,uRACAC,iCAAA,wRACAb,eAAA,4MACAc,iBAAA,sFACAC,mBAAA,oIACAC,cAAA,2NACAC,2BAAA,2NACAC,0BAAA,wQACAC,iBAAA,sGACAC,wBAAA,yFACAC,sBAAA,gFACAC,+BAAA,2EACAC,4BAAA,wEACAC,eAAA,6CACAC,wBAAA,kWACAC,2BAAA,uQACAC,cAAA,2HACAC,YAAA,wCACAC,qBAAA,mFACAC,eAAA,qJACAC,sBAAA,qDACAC,eAAA,sLACAC,kBAAA,2LACAC,iBAAA,qGACAC,YAAA,iHACAC,aAAA,0GACAC,mBAAA,6IACAC,gBAAA,mJACAC,kBAAA,qDACAC,wBAAA,iQACAC,8BAAA,2HACAC,8BAAA,wFACAC,iBAAA,uGACA9E,cAAA,4LACA+E,kBAAA,oLACAC,uBAAA,gDACAC,qBAAA,qTACAC,UAAA,mFACAC,cAAA,8KACAC,aAAA,6FAGAtc,IAAA,CACA7Q,OAAA,CACAotB,SAAA,oBACAC,cAAA,mCACAC,kBAAA,mBACAC,uBAAA,2DACAlmB,iBAAA,0IAEA/B,KAAA,CACAd,MAAA,oDACAkC,QAAA,kLACA8mB,cAAA,kGACAC,WAAA,uBAEA7N,SAAA,CACApb,MAAA,mDACAkpB,YAAA,iBACA9Z,QAAA,iBACA+L,OAAA,UACAgO,aAAA,4BACAC,KAAA,QACApzE,OAAA,+BACAylC,QAAA,mBACA4tC,KAAA,gBACAzE,KAAA,CACAzU,KAAA,OACAG,SAAA,OACAt6D,OAAA,+CACA+7D,KAAA,6MACAuX,gBAAA,8JAEA5d,KAAA,CACA6d,8BAAA,mDACAC,oBAAA,wDACAC,6BAAA,wDACAC,mBAAA,8DAEA3c,MAAA,CACA4c,gBAAA,mBAGAC,IAAA,CACAC,oBAAA,cACAC,YAAA,kBACAC,mBAAA,aACAC,qBAAA,+CACAC,aAAA,WACAC,UAAA,wFACAC,YAAA,2BACAC,iBAAA,qBACAC,aAAA,8CACAC,eAAA,mDACAC,kBAAA,sBACAC,eAAA,QACAC,iBAAA,kBACAC,qBAAA,aACAtP,SAAA,CACApb,MAAA,WACAsU,YAAA,wJACAqW,aAAA,yBACAC,kBAAA,oCACAC,aAAA,SACAC,kBAAA,gCACAC,cAAA,yBACAC,mBAAA,8FACAC,WAAA,iCACAC,gBAAA,uHACAC,mBAAA,kBACAC,wBAAA,gOACAC,iBAAA,mBACAC,sBAAA,mIACAC,qBAAA,yBACAC,0BAAA,wFACAC,cAAA,2BACAC,eAAA,cACAC,4BAAA,iCACAC,6BAAA,eACAC,yBAAA,cACAC,wBAAA,mBACAC,6BAAA,mDACAC,0BAAA,aACAC,+BAAA,sCACAC,yBAAA,OACAC,0BAAA,QACAC,+BAAA,iBACAC,yBAAA,UACAC,4BAAA,eACAC,2BAAA,cACAC,6BAAA,UACAC,6BAAA,yBAOAlxB,EAAA73B,aAAA,KAAA,CACA83B,OAAA,CACAC,SAAA,SACAC,YAAA,eACAC,UAAA,kBACA3lD,OAAA,aACA4lD,OAAA,SACAC,MAAA,QACAC,OAAA,KACAC,QAAA,MACAC,OAAA,KACAC,SAAA,OACAC,eAAA,iBACAC,qBAAA,WACAC,SAAA,OACAC,aAAA,YACAC,iBAAA,gBACAC,SAAA,OACAC,gBAAA,WACAC,kBAAA,yBACAC,SAAA,OACAC,SAAA,OACAC,WAAA,SACAC,WAAA,SACAC,UAAA,QACAC,UAAA,QACAC,UAAA,UACAC,WAAA,SACAC,gBAAA,cACAC,UAAA,QACAC,SAAA,OACAC,WAAA,SACAC,QAAA,MACAC,WAAA,SACAC,YAAA,UACAC,UAAA,QACAC,UAAA,QACAC,aAAA,WACAC,WAAA,SACAC,eAAA,eACAC,YAAA,UACAC,cAAA,gBACAC,qBAAA,uBACAC,aAAA,WACAC,+BAAA,6BACAC,WAAA,SACAC,YAAA,wCACAC,KAAA,OACAC,oBAAA,kCACAC,iBAAA,kBACAC,QAAA,aACAC,aAAA,gEACAC,UAAA,eACAC,KAAA,OACAC,GAAA,KACAC,KAAA,OACAC,SAAA,WACAC,mBAAA,qBACA1L,GAAA,KACAllB,aAAA,mBACA6wB,kBAAA,aACAC,mBAAA,WACAC,wBAAA,UACAC,kBAAA,UACAC,IAAA,YACAC,OAAA,UACAC,QAAA,WACAC,aAAA,WACAC,cAAA,oBACAC,eAAA,4CACAC,YAAA,yBACAC,sBAAA,UACAC,qBAAA,UACAC,UAAA,YACAC,gBAAA,+BACAC,cAAA,CACAC,MAAA,QACAC,iBAAA,mBACAC,kBAAA,oBACAC,kBAAA,qBACAC,oBAAA,oBAEA1hC,KAAA,CACA2hC,KAAA,QACAC,KAAA,QACAC,KAAA,QACAC,WAAA,kBAGAC,OAAA,CACAC,oBAAA,iBACAC,oBAAA,UACAC,mBAAA,iBAEAC,KAAA,CACAC,KAAA,OACAC,IAAA,WACAvlB,SAAA,WACAwlB,QAAA,aACAC,QAAA,aACAC,SAAA,WACAC,QAAA,UACAC,aAAA,mBAEAC,MAAA,CACArB,MAAA,QACAsB,QAAA,mDACAC,eAAA,8FACAC,cAAA,wFACAC,KAAA,eACAC,kBAAA,qBACAC,WAAA,cACAC,MAAA,SACAC,oBAAA,iCACAC,aAAA,kBACAC,oBAAA,yBAEAjB,KAAA,CACAd,MAAA,SACAgC,QAAA,qCACAC,iBAAA,sEACAC,QAAA,0DACAC,iBAAA,iEACAC,aAAA,2CACAC,UAAA,QACAC,SAAA,OACAC,YAAA,iBACAC,cAAA,gBACAC,QAAA,WACAC,aAAA,eACAZ,aAAA,kBACAa,0BAAA,qFACAC,mBAAA,0BACAC,iBAAA,8LACAC,cAAA,WACAC,UAAA,YACAC,YAAA,UAEA9B,SAAA,CACAlB,MAAA,WACAiD,gBAAA,UACAC,gBAAA,UACAC,iBAAA,UACAC,KAAA,uBACAC,WAAA,eACAC,uBAAA,2BACAC,cAAA,sCACAC,mBAAA,sGACAC,kBAAA,uBACAC,uBAAA,mCACAC,iBAAA,aACAC,uBAAA,kBACAC,4BAAA,yFACAC,eAAA,8BACAC,gBAAA,+BACAC,kBAAA,wBACAC,iBAAA,qBACAC,mBAAA,8BACAC,wBAAA,4BACAC,6BAAA,oDACAC,wBAAA,iBACAC,UAAA,+BACAC,gBAAA,aACAC,eAAA,qDACAC,iBAAA,CACAC,MAAA,uBACAC,QAAA,iCACAC,OAAA,mCACAC,QAAA,mCACAC,KAAA,iCACAC,OAAA,6BAEAC,aAAA,eACAC,kBAAA,2HACAC,YAAA,gBACAC,iBAAA,2FACAC,iBAAA,aACAC,UAAA,yBACAC,YAAA,qBACAC,iBAAA,4BACAC,sBAAA,yBACAC,4BAAA,sBACAC,2BAAA,8DACAC,sBAAA,CACAC,KAAA,WACAzwC,EAAA,gDAEA0wC,WAAA,CACA7F,MAAA,eACA8F,KAAA,UACAC,UAAA,uBACAC,QAAA,WACAC,aAAA,mBACAC,cAAA,gBAGAC,WAAA,CACAC,KAAA,iBACAC,KAAA,CACAC,aAAA,wCACAC,cAAA,gBACAvG,MAAA,kCACAwG,YAAA,cACAC,SAAA,gBACAC,kBAAA,yBACA9nC,QAAA,iBACAwnC,KAAA,gBACAO,wBAAA,4DACAC,MAAA,6BACAC,QAAA,qBACAC,aAAA,yCACAC,aAAA,OACAC,iBAAA,iBACAC,cAAA,UACAC,cAAA,WACAC,mBAAA,0CACAC,cAAA,UACAC,mBAAA,yCACAC,eAAA,mBACAC,oBAAA,6EACAC,cAAA,qBACAC,mBAAA,yCACAC,SAAA,eACAC,WAAA,iBACAC,cAAA,SACAC,4BAAA,oBACAC,mBAAA,CACAC,IAAA,MACAC,GAAA,MAEAhqB,mBAAA,CACAhD,IAAA,gCACAitB,IAAA,sCACAC,IAAA,iBACAC,KAAA,iBAGAC,OAAA,CACApI,MAAA,SACAqI,SAAA,UACAC,YAAA,eACAC,YAAA,YAGA/sB,SAAA,CACA6qB,KAAA,CACArG,MAAA,WACAwI,aAAA,WACAC,QAAA,eACAC,YAAA,UACAC,WAAA,SACAC,2BAAA,iQACAC,sBAAA,gBACAC,cAAA,gBACAC,QAAA,gBACAC,kBAAA,8DACAC,cAAA,QACAC,KAAA,gBACAC,MAAA,cACA9V,GAAA,qBACA+V,SAAA,iBACAC,YAAA,0BACAxC,QAAA,oBACAyC,oBAAA,oBACAC,OAAA,4BACAC,QAAA,+BACAC,UAAA,6CACAC,cAAA,SACAC,gBAAA,4FACAC,gBAAA,uCACAC,aAAA,uDACAC,UAAA,oDACAC,WAAA,0EACAC,WAAA,uDACAC,aAAA,oDACAC,UAAA,4DACAC,YAAA,iDACAC,SAAA,kEACAC,kBAAA,yBACAC,SAAA,6FACAC,iBAAA,2EACAC,SAAA,0EACAC,aAAA,oCACAC,QAAA,UACAC,aAAA,UACAC,kBAAA,qBACAC,iBAAA,eACAC,YAAA,gBAEAxJ,QAAA,CACAtB,MAAA,mBACA/B,aAAA,gBACA8M,gBAAA,4BAGA5J,QAAA,CACAkF,KAAA,CACAgD,YAAA,kBACA2B,cAAA,mBACAC,aAAA,WACAC,SAAA,YACAC,iBAAA,kDACAC,iBAAA,uCACAC,OAAA,cACAC,eAAA,iBACAC,WAAA,wBACAC,UAAA,CACArwB,KAAA,wBACAE,OAAA,eACAD,KAAA,gBACAqwB,YAAA,sBAGAC,KAAA,CACAC,eAAA,8EAGAvI,KAAA,CACAwI,MAAA,QACAC,gBAAA,kBACAC,OAAA,SACAC,QAAA,UACAC,aAAA,eACAC,UAAA,cACAlD,QAAA,UACAmD,aAAA,eACAC,UAAA,YACAC,WAAA,aACAC,IAAA,MACAC,cAAA,UACA1M,qBAAA,SACA2M,QAAA,UACAC,cAAA,gBACAC,cAAA,YACApG,KAAA,CACArG,MAAA,OACA0M,MAAA,YACAC,iBAAA,uBACAC,uBAAA,iCACAtE,YAAA,cACAuE,YAAA,gBACAC,gBAAA,sBACAC,MAAA,CACAC,uBAAA,kDACAC,mBAAA,6BAIAlM,IAAA,CACAmM,YAAA,gCACAC,0BAAA,8GACAC,iBAAA,gBACAC,uBAAA,2BACAC,iBAAA,6BACAC,uBAAA,yBACAC,uBAAA,eACAC,6BAAA,qBACAC,sCAAA,kBACAC,UAAA,UACAC,sBAAA,yBACAC,QAAA,UACAC,OAAA,YACAjC,gBAAA,8BACAkC,iBAAA,8BACAjB,gBAAA,sBACAkB,mBAAA,qBACAC,wBAAA,mEACAvH,kBAAA,iBACAwH,YAAA,UACAC,gBAAA,eACAC,uBAAA,oBACAC,mBAAA,qBACAhI,KAAA,CACAiI,oBAAA,sBAEAlG,OAAA,CACApI,MAAA,WACAuO,UAAA,eACAC,gBAAA,oBACAC,QAAA,yBACAC,cAAA,kCACAC,WAAA,yCACAC,YAAA,iDACAC,cAAA,iBACAC,YAAA,wBACAjP,UAAA,YACAC,gBAAA,+BACAiP,WAAA,4BACAC,aAAA,eAEAC,SAAA,CACAjP,MAAA,YAEAkP,MAAA,CACAlP,MAAA,UAEAmP,eAAA,CACAnP,MAAA,2BACAoP,QAAA,0BACAC,KAAA,qCACAC,aAAA,yBACAC,SAAA,0BACAC,YAAA,qCACAzC,MAAA,mCACA0C,cAAA,oBAEAC,WAAA,CACA1P,MAAA,wBAEA2P,qBAAA,CACA3P,MAAA,gCACAoP,QAAA,sBACAC,KAAA,iCACAC,aAAA,yBACAM,KAAA,sBACAC,QAAA,iCACA9C,MAAA,mCAGA+C,MAAA,CACA9P,MAAA,wCACA+P,iBAAA,yFACAC,iBAAA,qCACAC,eAAA,mCACAC,eAAA,gCACAC,KAAA,oBACAC,UAAA,oBACAC,UAAA,6BACAC,SAAA,WACAC,cAAA,WACAC,YAAA,0BACAlS,oBAAA,6BACAmS,sBAAA,4BACAC,eAAA,oBACAC,oBAAA,wBACAC,aAAA,mBACAC,kBAAA,eACAC,YAAA,gBACAC,iBAAA,mBACAC,qBAAA,UACAC,mBAAA,uDACAC,kBAAA,wBACAC,YAAA,CACAnR,MAAA,cACAkC,QAAA,uGACAkP,YAAA,UACAC,aAAA,uCAEAC,OAAA,CACAC,eAAA,iCACAC,gBAAA,gBACA9yC,KAAA,gBACA1oB,OAAA,0BACAy7D,KAAA,kBAEAC,OAAA,CACAx8C,OAAA,aACAK,QAAA,gBACAo8C,OAAA,cACAC,QAAA,eACAC,QAAA,eACAC,KAAA,iBACA38C,EAAA,YACAC,EAAA,WACAC,EAAA,YAEAqJ,KAAA,CACAqzC,KAAA,0GAGAC,KAAA,CACAhS,MAAA,iDACAiS,SAAA,eACAC,aAAA,gCACAC,kBAAA,yEACAC,qBAAA,qFACAlC,eAAA,6DAEAlP,QAAA,CACAhB,MAAA,aACAqS,QAAA,UACAC,QAAA,gCACAC,gBAAA,kBACAC,MAAA,iBACAC,aAAA,YACAC,YAAA,WACAC,aAAA,qDACAC,WAAA,uBACAC,cAAA,+BACAC,SAAA,2BACAC,cAAA,oBACAC,oBAAA,gCACAC,OAAA,SACAC,cAAA,mUACAC,mBAAA,mDACAC,uBAAA,iOACAC,4BAAA,wTACAC,4BAAA,qGACAC,2BAAA,sKACAC,sBAAA,oJACAC,sCAAA,qLACAC,sBAAA,oKACAC,oBAAA,0BACAC,0BAAA,iBACA9J,UAAA,kCACA+J,kBAAA,UACAC,mCAAA,gCACAC,mBAAA,iCACAC,qBAAA,mBACAC,0BAAA,sBACAC,wBAAA,uBACAC,kBAAA,0BACAC,iBAAA,yBACAC,uBAAA,CACArU,MAAA,gBACAsU,YAAA,qDACAC,iBAAA,kFACAC,cAAA,8BAEAC,IAAA,CACAzU,MAAA,eACA0U,mBAAA,8JACAC,uBAAA,+GACAC,4BAAA,wFACAC,WAAA,gHACAC,kBAAA,wJACAC,uBAAA,qHACAC,oBAAA,wCACAC,eAAA,iBACAC,qBAAA,0BACAC,oBAAA,wFACAC,eAAA,gBACAC,qBAAA,kBACAC,oBAAA,4IACAC,aAAA,0LACAC,iBAAA,+KACAC,eAAA,qPACA3H,OAAA,YACA4H,YAAA,SACAC,aAAA,UACAC,kBAAA,gCACAC,iBAAA,UACAC,sBAAA,uBACAC,cAAA,gBACAC,iBAAA,eACAC,0BAAA,2VACAC,4BAAA,4NACAC,4BAAA,+KACAC,gBAAA,cACAC,iBAAA,8BACAC,qBAAA,kCACAC,aAAA,2FACAC,WAAA,WACAC,mBAAA,wBAEAC,eAAA,CACA1W,MAAA,oBACA+R,KAAA,wDAEA4E,sBAAA,CACA3W,MAAA,qBACA+R,KAAA,+LAEA6E,oBAAA,CACA5W,MAAA,oBAEA6W,YAAA,CACA7W,MAAA,aACA8W,QAAA,eACA7Y,aAAA,oBACA8Y,qBAAA,wBACAC,UAAA,sBACA3Z,WAAA,+BACA4Z,WAAA,oBACAC,gBAAA,sDACAC,WAAA,UACAC,aAAA,CACApX,MAAA,oBACA+R,KAAA,uBACAsF,UAAA,eAEAC,aAAA,CACAtX,MAAA,2BACA+R,KAAA,uHACAwF,aAAA,sDACAC,cAAA,kBAGAC,SAAA,CACAC,aAAA,sBACAC,UAAA,QACAtS,UAAA,QACAuS,gBAAA,yBACAC,qBAAA,sLACAC,iBAAA,gCACAC,sBAAA,wMACAC,iBAAA,mEACAC,cAAA,wBACAC,mBAAA,wLACAC,cAAA,sBACAC,mBAAA,qNACAC,WAAA,wDACAC,MAAA,iBACAC,UAAA,2DACAC,aAAA,8DACAC,WAAA,0DACAC,WAAA,wCACAC,WAAA,oDACAC,WAAA,iDACAC,WAAA,6CACAC,WAAA,6DACAC,WAAA,0CACAC,WAAA,uCACAC,WAAA,4CACAC,YAAA,iDACAC,YAAA,4EACAC,YAAA,kEACAC,YAAA,wCACAC,YAAA,yCACAC,YAAA,qDACAC,YAAA,0DACAC,YAAA,wCACAC,YAAA,iDACAC,YAAA,qCACAC,WAAA,yBACAC,gBAAA,0HACAC,uBAAA,4DACAC,qBAAA,8BACAC,iCAAA,kMACAC,0BAAA,8IACAC,kBAAA,kCACAC,uBAAA,wQACAC,oBAAA,8DACAC,QAAA,yBACAC,aAAA,wLACAC,aAAA,+DACAva,MAAA,uBACAwa,QAAA,CACAC,cAAA,iBACAC,mBAAA,gMACAC,WAAA,6BACAC,gBAAA,6KACAC,YAAA,uCACAC,iBAAA,kIACAC,eAAA,CACA/a,MAAA,0BACA+R,KAAA,+BACAxB,cAAA,cAEAxD,MAAA,CACAxvD,aAAA,iBACAyhB,aAAA,kBAIAg8C,UAAA,oGACAC,QAAA,CACAC,KAAA,OACAC,OAAA,SACA1/B,QAAA,YAGA2/B,SAAA,CACApb,MAAA,WACAqb,UAAA,iBACAC,cAAA,oBACA3c,KAAA,OACAC,GAAA,KACAuc,OAAA,SACAI,YAAA,SACA9/B,QAAA,UACA+/B,aAAA,qBACAvf,SAAA,OACAwf,gBAAA,gBACAC,KAAA,kBACAC,QAAA,KACAC,uBAAA,+DACA1M,MAAA,CACAlP,MAAA,aAGA+M,MAAA,CACA8O,mBAAA,qBACAC,wBAAA,qCACAC,YAAA,QACAC,cAAA,gBACAC,qBAAA,8DACAC,wBAAA,wCACAC,iBAAA,mCACAC,eAAA,2CACAC,eAAA,0BACAC,gBAAA,iCACAC,4BAAA,qDACAC,eAAA,iCACAC,2BAAA,oDACAC,UAAA,yBACAC,UAAA,yBACAC,aAAA,2CACAC,iBAAA,wBACAC,cAAA,0BACAC,gBAAA,yBACAC,uBAAA,gCACAC,mBAAA,kCACAC,qBAAA,kCACAC,0BAAA,8BACAC,+BAAA,yFACAC,wCAAA,4IACAC,gCAAA,gFACAC,aAAA,uBACAC,qBAAA,2BACAC,yBAAA,wCACAC,0BAAA,8CACAC,2BAAA,6CACAC,oBAAA,4BACAC,uBAAA,qCACAC,oBAAA,+CACAC,eAAA,8BACAC,iBAAA,kFACAC,mBAAA,qHACAC,wBAAA,4CACAC,0BAAA,oDACAC,uBAAA,mCACAC,sBAAA,8BACAC,oBAAA,yBACAC,YAAA,0BACAC,oBAAA,uBACAC,kBAAA,iBACAC,sBAAA,mDACAC,iBAAA,wBACAC,gBAAA,sBACAC,gBAAA,+BACAC,kBAAA,qBACAC,qBAAA,sCACAC,gBAAA,oEACAC,gBAAA,sCACAC,eAAA,+BACAC,wBAAA,oBACAC,iBAAA,2EACAC,2BAAA,4IACAC,4BAAA,6HACAC,4BAAA,uMACAC,iBAAA,sFACAriC,sBAAA,uIACAsiC,mBAAA,qBACAC,mBAAA,8CACAC,+BAAA,wBACAC,0BAAA,iOACAC,wBAAA,gKACAC,eAAA,qIACAC,mBAAA,iEACAC,cAAA,2BACAC,oBAAA,uDACAC,oBAAA,gCACAC,kBAAA,yBACAC,gBAAA,+BACAC,yBAAA,oIACAC,iCAAA,uJACAC,wBAAA,oBACAC,sBAAA,8BACAC,oBAAA,wCACAC,oCAAA,+DACAC,kDAAA,+EACAC,kCAAA,gFACAC,iBAAA,4BACAC,mBAAA,mCACAC,2BAAA,2CACAC,kBAAA,6CACAC,+BAAA,uCACAC,kBAAA,6BACAC,iBAAA,sBACAC,0BAAA,8CACAC,uBAAA,sDACAC,mBAAA,8CACAC,iBAAA,+HACAC,yBAAA,+EACAC,wBAAA,6BACAC,yBAAA,2FACAC,oBAAA,+HACAC,4BAAA,kCACAC,+BAAA,qCACAC,0BAAA,yCACAC,wBAAA,sCACAC,wBAAA,sCACAC,0BAAA,+GACAC,8BAAA,uCACAC,kBAAA,4BACAC,2BAAA,yCACAC,oBAAA,uBACAC,kBAAA,oDAEA5W,KAAA,CACAqQ,YAAA,cACAwG,mBAAA,+BACAzD,kBAAA,oBACA0D,cAAA,qCACAC,uBAAA,iBACAC,oBAAA,6BACAC,oBAAA,oBACAC,qCAAA,wFACAC,yBAAA,sGACAC,2BAAA,kPACAC,gBAAA,+BACAC,gCAAA,2EACAC,yBAAA,4FACAC,iBAAA,2BAEAC,QAAA,CACApH,YAAA,sBACAqH,oBAAA,iBACAC,6BAAA,iEACAC,wBAAA,kBACAC,cAAA,6VACAC,WAAA,uCACAC,SAAA,0BACArI,SAAA,uPACAsI,aAAA,kUACAC,eAAA,8GACAC,iBAAA,6GACAC,0BAAA,gBACAC,oBAAA,kKACAC,aAAA,4JACAC,eAAA,+EACAC,WAAA,wEACAC,iBAAA,kEACAC,gBAAA,gOACAC,kBAAA,wGACAC,0BAAA,gLACAC,kBAAA,mEACAC,wBAAA,oBACAC,OAAA,mCACAC,kBAAA,uHACAC,mBAAA,8PAEAC,KAAA,CACAC,KAAA,CACAC,MAAA,OACAF,KAAA,qBACAG,sBAAA,iEACAC,UAAA,sHACAC,aAAA,uKAEAC,SAAA,CACAJ,MAAA,QACAF,KAAA,kBACAI,UAAA,2FACAC,aAAA,qNAGAE,SAAA,CACAnJ,YAAA,yBACAoJ,qBAAA,sPAEApT,KAAA,CACA/R,MAAA,cACAolB,KAAA,CACAC,QAAA,OACAlV,KAAA,ggBACAG,SAAA,kbACAxC,OAAA,oWAEAgC,MAAA,CACAuV,QAAA,SACArvE,OAAA,qBACAsvE,WAAA,+dACAhU,OAAA,qBACAiU,WAAA,yhBAEAC,SAAA,CACAH,QAAA,WACAC,WAAA,8IACA1pB,OAAA,SACA6pB,WAAA,uPACAC,eAAA,iBACAC,mBAAA,4gBACAxf,WAAA,aACAyf,eAAA,wRACAC,uBAAA,6jBACA9kB,IAAA,qBACA+kB,QAAA,qHACAC,cAAA,gBACAC,kBAAA,4LAEAC,IAAA,CACAC,kBAAA,0GACAC,aAAA,6EACAC,cAAA,sPACAC,uBAAA,gWACAC,qBAAA,uRACAC,iCAAA,wRACAb,eAAA,4MACAc,iBAAA,sFACAC,mBAAA,oIACAC,cAAA,2NACAC,2BAAA,2NACAC,0BAAA,wQACAC,iBAAA,sGACAC,wBAAA,yFACAC,sBAAA,gFACAC,+BAAA,2EACAC,4BAAA,wEACAC,eAAA,6CACAC,wBAAA,kWACAC,2BAAA,uQACAC,cAAA,2HACAC,YAAA,wCACAC,qBAAA,mFACAC,eAAA,qJACAC,sBAAA,qDACAC,eAAA,sLACAC,kBAAA,2LACAC,iBAAA,qGACAC,YAAA,iHACAC,aAAA,0GACAC,mBAAA,6IACAC,gBAAA,mJACAC,kBAAA,qDACAC,wBAAA,iQACAC,8BAAA,2HACAC,8BAAA,wFACAC,iBAAA,uGACA9E,cAAA,4LACA+E,kBAAA,oLACAC,uBAAA,gDACAC,qBAAA,qTACAC,UAAA,mFACAC,cAAA,8KACAC,aAAA,6FAGAtc,IAAA,CACA7Q,OAAA,CACAotB,SAAA,oBACAC,cAAA,mCACAC,kBAAA,mBACAC,uBAAA,2DACAlmB,iBAAA,0IAEA/B,KAAA,CACAd,MAAA,oDACAkC,QAAA,kLACA8mB,cAAA,kGACAC,WAAA,uBAEA7N,SAAA,CACApb,MAAA,mDACAkpB,YAAA,iBACA9Z,QAAA,iBACA+L,OAAA,UACAgO,aAAA,4BACAC,KAAA,QACApzE,OAAA,+BACAylC,QAAA,mBACA4tC,KAAA,gBACAzE,KAAA,CACAzU,KAAA,OACAG,SAAA,OACAt6D,OAAA,+CACA+7D,KAAA,6MACAuX,gBAAA,8JAEA5d,KAAA,CACA6d,8BAAA,mDACAC,oBAAA,wDACAC,6BAAA,wDACAC,mBAAA,8DAEA3c,MAAA,CACA4c,gBAAA,mBAGAC,IAAA,CACAC,oBAAA,cACAC,YAAA,kBACAC,mBAAA,aACAC,qBAAA,+CACAC,aAAA,WACAC,UAAA,wFACAC,YAAA,2BACAC,iBAAA,qBACAC,aAAA,8CACAC,eAAA,kDACAC,kBAAA,sBACAC,eAAA,QACAC,iBAAA,kBACAC,qBAAA,aACAtP,SAAA,CACApb,MAAA,WACAsU,YAAA,wJACAqW,aAAA,yBACAC,kBAAA,oCACAC,aAAA,SACAC,kBAAA,gCACAC,cAAA,yBACAC,mBAAA,8FACAC,WAAA,iCACAC,gBAAA,uHACAC,mBAAA,kBACAC,wBAAA,gOACAC,iBAAA,mBACAC,sBAAA,mIACAC,qBAAA,yBACAC,0BAAA,wFACAC,cAAA,2BACAC,eAAA,cACAC,4BAAA,iCACAC,6BAAA,eACAC,yBAAA,cACAC,wBAAA,mBACAC,6BAAA,mDACAC,0BAAA,aACAC,+BAAA,sCACAC,yBAAA,OACAC,0BAAA,QACAC,+BAAA,iBACAC,yBAAA,UACAC,4BAAA,eACAC,2BAAA,cACAC,6BAAA,UACAC,6BAAA,yBAOAlxB,EAAA73B,aAAA,QAAA,CACA83B,OAAA,CACAC,SAAA,SACAC,YAAA,eACAC,UAAA,mBACA3lD,OAAA,kBACA4lD,OAAA,SACAC,MAAA,QACAC,OAAA,KACAC,QAAA,MACAC,OAAA,KACAC,SAAA,QACAC,eAAA,gBACAC,qBAAA,UACAC,SAAA,WACAC,aAAA,gBACAC,iBAAA,eACAC,SAAA,OACAC,gBAAA,6BACAC,kBAAA,yBACAC,SAAA,QACAC,SAAA,QACAC,WAAA,UACAC,WAAA,SACAC,UAAA,QACAC,UAAA,QACAC,UAAA,YACAC,WAAA,eACAC,gBAAA,aACAC,UAAA,YACAC,SAAA,SACAC,WAAA,SACAC,QAAA,SACAC,WAAA,QACAC,YAAA,YACAC,UAAA,YACAC,UAAA,UACAC,aAAA,UACAC,WAAA,OACAC,eAAA,eACAC,YAAA,cACAC,cAAA,iBACAC,qBAAA,yBACAC,aAAA,SACAC,+BAAA,0BACAC,WAAA,SACAC,YAAA,oDACAC,KAAA,QACAC,oBAAA,uCACAC,iBAAA,wBACAC,QAAA,sBACAC,aAAA,gFACAC,UAAA,cACAC,KAAA,KACAC,GAAA,KACAC,KAAA,QACAC,SAAA,SACAC,mBAAA,uBACA1L,GAAA,KACAllB,aAAA,iBACA6wB,kBAAA,aACAC,mBAAA,WACAC,wBAAA,UACAC,kBAAA,aACAC,IAAA,aACAC,OAAA,SACAC,QAAA,YACAC,aAAA,WACAC,cAAA,qBACAC,eAAA,6CACAC,YAAA,0BACAC,sBAAA,cACAC,qBAAA,YACAC,UAAA,YACAC,gBAAA,2BACAC,cAAA,CACAC,MAAA,YACAC,iBAAA,uBACAC,kBAAA,wBACAC,kBAAA,yBACAC,oBAAA,wBAEA1hC,KAAA,CACA2hC,KAAA,QACAC,KAAA,QACAC,KAAA,QACAC,WAAA,mBAGAC,OAAA,CACAC,oBAAA,oBACAC,oBAAA,UACAC,mBAAA,kBAEAC,KAAA,CACAC,KAAA,WACAC,IAAA,UACAvlB,SAAA,OACAwlB,QAAA,YACAC,QAAA,eACAC,SAAA,aACAC,QAAA,OACAC,aAAA,eAEAC,MAAA,CACArB,MAAA,OACAsB,QAAA,+CACAC,eAAA,+FACAC,cAAA,wFACAC,KAAA,cACAC,kBAAA,mBACAC,WAAA,iBACAC,MAAA,UACAC,oBAAA,kDACAC,aAAA,mBACAC,oBAAA,yCAEAjB,KAAA,CACAd,MAAA,SACAgC,QAAA,kCACAE,QAAA,yDACAE,aAAA,uCACAC,UAAA,OACAC,SAAA,aACAR,aAAA,SACAa,0BAAA,mFACAC,mBAAA,4BACAC,iBAAA,kMAEA3B,SAAA,CACAlB,MAAA,aACAiD,gBAAA,UACAC,gBAAA,UACAC,iBAAA,OACAC,KAAA,4BACAC,WAAA,oBACAC,uBAAA,yBACAG,kBAAA,0BACAC,uBAAA,qCACAC,iBAAA,eACAC,uBAAA,sBACAC,4BAAA,mGACAC,eAAA,uCACAE,kBAAA,0BACAC,iBAAA,cACAC,mBAAA,qCACAC,wBAAA,qBACAC,6BAAA,+EACAC,wBAAA,cACAC,UAAA,0BACAC,gBAAA,iBACAC,eAAA,yEACAC,iBAAA,CACAC,MAAA,eACAC,QAAA,iCACAC,OAAA,mCACAC,QAAA,mCACAC,KAAA,iCACAC,OAAA,oBAEAC,aAAA,wBACAC,kBAAA,wJACAC,YAAA,cACAC,iBAAA,oFACAC,iBAAA,iBACAC,UAAA,kCACAC,YAAA,8BACAC,iBAAA,gCACAC,sBAAA,sCACAC,4BAAA,yBACAC,2BAAA,0DACAC,sBAAA,CACAC,KAAA,iBACAzwC,EAAA,gDAEA0wC,WAAA,CACA7F,MAAA,eACA8F,KAAA,SACAC,UAAA,6BACAC,QAAA,cACAC,aAAA,gBACAC,cAAA,sBAGAC,WAAA,CACAC,KAAA,mBACAC,KAAA,CACAC,aAAA,wCACAC,cAAA,aACAvG,MAAA,kCACAwG,YAAA,0BACAC,SAAA,6BACAC,kBAAA,oBACA9nC,QAAA,+BACAwnC,KAAA,mBACAO,wBAAA,2DACAC,MAAA,+BACAC,QAAA,uBACAC,aAAA,2CACAC,aAAA,UACAC,iBAAA,kBACAC,cAAA,gBACAC,cAAA,cACAC,mBAAA,wCACAC,cAAA,oBACAC,mBAAA,sCACAC,eAAA,oBACAC,oBAAA,oEACAC,cAAA,sBACAC,mBAAA,wCACAC,SAAA,SACAC,WAAA,YACAC,cAAA,wBACAC,4BAAA,0BACAC,mBAAA,CACAC,IAAA,MACAC,GAAA,MAEAhqB,mBAAA,CACAhD,IAAA,uBACAitB,IAAA,mCACAC,IAAA,cACAC,KAAA,gBAGAC,OAAA,CACApI,MAAA,SACAqI,SAAA,cACAC,YAAA,iBACAC,YAAA,YAGA/sB,SAAA,CACA6qB,KAAA,CACArG,MAAA,OACAwI,aAAA,OACAC,QAAA,eACAC,YAAA,OACAC,WAAA,SACAC,2BAAA,gQACAC,sBAAA,qBACAC,cAAA,kBACAC,QAAA,oBACAC,kBAAA,6BACAC,cAAA,OACAC,KAAA,YACAC,MAAA,kBACA9V,GAAA,uBACA+V,SAAA,gBACAC,YAAA,sBACAxC,QAAA,6CACAyC,oBAAA,qBACAC,OAAA,yBACAC,QAAA,qCACAC,UAAA,iCACAC,cAAA,QACAC,gBAAA,2FACAC,gBAAA,6BACAC,aAAA,gDACAC,UAAA,oDACAC,WAAA,kFACAC,WAAA,iCACAC,aAAA,4CACAC,UAAA,+CACAC,YAAA,yCACAC,SAAA,sFACAC,kBAAA,6BACAC,SAAA,kFACAC,iBAAA,4FACAC,SAAA,6FACAC,aAAA,6BACAC,QAAA,OACAC,aAAA,UACAC,kBAAA,wBACAC,iBAAA,mBACAC,YAAA,gBAEAxJ,QAAA,CACAtB,MAAA,qBACA/B,aAAA,qBACA8M,gBAAA,oCAGA5J,QAAA,CACAkF,KAAA,CACAgD,YAAA,sBACA2B,cAAA,uBACAC,aAAA,UACAC,SAAA,WACAC,iBAAA,0DACAC,iBAAA,uCACAC,OAAA,cACAC,eAAA,gBACAC,WAAA,4BACAC,UAAA,CACArwB,KAAA,6BACAE,OAAA,qBACAD,KAAA,iBACAqwB,YAAA,4BAGAC,KAAA,CACAC,eAAA,8EAGAvI,KAAA,CACAwI,MAAA,QACAC,gBAAA,uBACAC,OAAA,UACAC,QAAA,WACAC,aAAA,eACAC,UAAA,oBACAlD,QAAA,UACAmD,aAAA,eACAC,UAAA,aACAC,WAAA,cACAC,IAAA,MACAC,cAAA,UACA1M,qBAAA,WACA2M,QAAA,cACAC,cAAA,qBACAC,cAAA,gBACApG,KAAA,CACArG,MAAA,OACA0M,MAAA,eACAC,iBAAA,+BACAC,uBAAA,6CACAtE,YAAA,wBACAuE,YAAA,iBACAC,gBAAA,qBACAC,MAAA,CACAC,uBAAA,qFACAC,mBAAA,4CAIAlM,IAAA,CACAmM,YAAA,yCACAC,0BAAA,oHACAC,iBAAA,gBACAC,uBAAA,2BACAC,iBAAA,4BACAC,uBAAA,yBACAC,uBAAA,cACAC,6BAAA,sBACAC,sCAAA,cACAC,UAAA,SACAC,sBAAA,0BACAC,QAAA,YACAC,OAAA,aACAjC,gBAAA,iCACAkC,iBAAA,oCACAjB,gBAAA,qBACAkB,mBAAA,2BACAC,wBAAA,oDACAvH,kBAAA,oBACAwH,YAAA,SACAC,gBAAA,cACAC,uBAAA,gBACAC,mBAAA,qBACAhI,KAAA,CACAiI,oBAAA,sBAEAlG,OAAA,CACApI,MAAA,eACAuO,UAAA,gBACAC,gBAAA,oBACAC,QAAA,yBACAC,cAAA,mCACAC,WAAA,yCACAC,YAAA,kDACAC,cAAA,gBACAC,YAAA,yBACAjP,UAAA,YACAC,gBAAA,2BACAiP,WAAA,8BACAC,aAAA,iBAEAC,SAAA,CACAjP,MAAA,aAEAkP,MAAA,CACAlP,MAAA,cAEAmP,eAAA,CACAnP,MAAA,sBACAoP,QAAA,sBACAC,KAAA,oCACAC,aAAA,iCACAC,SAAA,sBACAC,YAAA,iCACAzC,MAAA,4BACA0C,cAAA,oBAEAC,WAAA,CACA1P,MAAA,oBAEA2P,qBAAA,CACA3P,MAAA,+BACAoP,QAAA,qBACAC,KAAA,mCACAC,aAAA,iCACAM,KAAA,qBACAC,QAAA,gCACA9C,MAAA,6BAGA+C,MAAA,CACA9P,MAAA,4CACA+P,iBAAA,qGACAC,iBAAA,4CACAC,eAAA,uCACAC,eAAA,+BACAC,KAAA,qBACAC,UAAA,qBACAC,UAAA,iCACAC,SAAA,WACAC,cAAA,WACAC,YAAA,gCACAlS,oBAAA,8BACAmS,sBAAA,uBACAC,eAAA,iBACAC,oBAAA,sBACAC,aAAA,sBACAC,kBAAA,mCACAC,YAAA,gBACAC,iBAAA,mBACAC,qBAAA,UACAC,mBAAA,gEACAC,kBAAA,wBACAC,YAAA,CACAnR,MAAA,UACAkC,QAAA,qGACAkP,YAAA,cACAC,aAAA,0CAEAC,OAAA,CACAC,eAAA,kCACAC,gBAAA,kBACA9yC,KAAA,wBACA1oB,OAAA,gCACAy7D,KAAA,kBAEAC,OAAA,CACAx8C,OAAA,mBACAK,QAAA,kBACAo8C,OAAA,kBACAC,QAAA,uBACAC,QAAA,oBACAC,KAAA,uBACA38C,EAAA,YACAC,EAAA,WACAC,EAAA,YAEAqJ,KAAA,CACAqzC,KAAA,8FAGAC,KAAA,CACAhS,MAAA,8CACAiS,SAAA,YACAC,aAAA,qBACAC,kBAAA,qEACAC,qBAAA,2GACAlC,eAAA,gEAEAlP,QAAA,CACAhB,MAAA,YACAqS,QAAA,QACAC,QAAA,4BACAC,gBAAA,cACAC,MAAA,cACAC,aAAA,YACAC,YAAA,aACAC,aAAA,iDACAC,WAAA,8BACAC,cAAA,mCACAC,SAAA,uBACAC,cAAA,wBACAC,oBAAA,4BACAC,OAAA,WACAC,cAAA,8TACAC,mBAAA,0CACAC,uBAAA,0OACAC,4BAAA,sTACAC,4BAAA,8FACAC,2BAAA,wKACAC,sBAAA,yIACAC,sCAAA,0IACAC,sBAAA,2IACAC,oBAAA,sBACAC,0BAAA,YACA9J,UAAA,qBACA+J,kBAAA,WACAC,mCAAA,2BACAC,mBAAA,4BACAC,qBAAA,uBACAC,0BAAA,0BACAC,wBAAA,sBACAC,kBAAA,wBACAC,iBAAA,+BACAC,uBAAA,CACArU,MAAA,eACAsU,YAAA,6CACAC,iBAAA,+EACAC,cAAA,yBAEAC,IAAA,CACAzU,MAAA,kBACA0U,mBAAA,4LACAC,uBAAA,qHACAC,4BAAA,kGACAC,WAAA,mHACAC,kBAAA,yHACAC,uBAAA,sHACAC,oBAAA,mCACAC,eAAA,eACAC,qBAAA,yBACAC,oBAAA,8MACAC,eAAA,gBACAC,qBAAA,mBACAC,oBAAA,wHACAC,aAAA,4LACAC,iBAAA,sLACAC,eAAA,oWACA3H,OAAA,aACA4H,YAAA,aACAC,aAAA,WACAC,kBAAA,oCACAC,iBAAA,WACAC,sBAAA,0BACAC,cAAA,YACAC,iBAAA,gBACAC,0BAAA,8UACAC,4BAAA,iPACAC,4BAAA,wOACAC,gBAAA,cACAC,iBAAA,wBACAC,qBAAA,2BACAC,aAAA,iGACAC,WAAA,cACAC,mBAAA,2BAEAC,eAAA,CACA1W,MAAA,qBACA+R,KAAA,8CAEA4E,sBAAA,CACA3W,MAAA,wBACA+R,KAAA,+LAEA6E,oBAAA,CACA5W,MAAA,uBAEA6W,YAAA,CACA7W,MAAA,eACA8W,QAAA,iBACA7Y,aAAA,mBACA8Y,qBAAA,wBACAC,UAAA,qBACA3Z,WAAA,2BACA4Z,WAAA,oBACAC,gBAAA,wDACAC,WAAA,SACAC,aAAA,CACApX,MAAA,oBACA+R,KAAA,wBACAsF,UAAA,qBAEAC,aAAA,CACAtX,MAAA,mBACA+R,KAAA,mJACAwF,aAAA,+EACAC,cAAA,sBAGAC,SAAA,CACAC,aAAA,+BACAC,UAAA,aACAtS,UAAA,aACAuS,gBAAA,oCACAC,qBAAA,0LACAC,iBAAA,sCACAC,sBAAA,sNACAC,iBAAA,oEACAC,cAAA,iCACAC,mBAAA,oJACAC,cAAA,8BACAC,mBAAA,uMACAC,WAAA,qGACAC,MAAA,qBACAC,UAAA,gEACAC,aAAA,4DACAC,WAAA,uEACAC,WAAA,oCACAC,WAAA,sCACAC,WAAA,yCACAC,WAAA,6DACAC,WAAA,2DACAC,WAAA,uCACAC,WAAA,uCACAC,WAAA,2CACAC,YAAA,gDACAC,YAAA,oFACAC,YAAA,+EACAC,YAAA,yCACAC,YAAA,8BACAC,YAAA,0CACAC,YAAA,qDACAC,YAAA,yCACAC,YAAA,2CACAC,YAAA,oCACAC,WAAA,4BACAC,gBAAA,kIACAE,qBAAA,+BACAC,iCAAA,oPACAC,0BAAA,uJACAC,kBAAA,4BACAC,uBAAA,2QACAC,oBAAA,0DACAC,QAAA,iCACAC,aAAA,6LACAC,aAAA,8DACAva,MAAA,qBACAwa,QAAA,CACAC,cAAA,oBACAC,mBAAA,wPACAC,WAAA,4CACAC,gBAAA,0TACAC,YAAA,uDACAC,iBAAA,4PACAC,eAAA,CACA/a,MAAA,gCACA+R,KAAA,wCACAxB,cAAA,iBAEAxD,MAAA,CACAxvD,aAAA,yBACAyhB,aAAA,2BAIAg8C,UAAA,+FACAC,QAAA,CACAC,KAAA,OACAC,OAAA,OACA1/B,QAAA,YAGA2/B,SAAA,CACApb,MAAA,UACAqb,UAAA,gBACAC,cAAA,uBACA3c,KAAA,KACAC,GAAA,KACAuc,OAAA,OACAI,YAAA,OACA9/B,QAAA,UACA+/B,aAAA,UACAvf,SAAA,QACAwf,gBAAA,kBACAC,KAAA,oBACAC,QAAA,KACAC,uBAAA,oEACA1M,MAAA,CACAlP,MAAA,YAGA+M,MAAA,CACA8O,mBAAA,yBACAC,wBAAA,2CACAC,YAAA,QACAC,cAAA,iBACAC,qBAAA,gEACAC,wBAAA,wDACAC,iBAAA,sCACAC,eAAA,8CACAC,eAAA,eACAC,gBAAA,uBACAC,4BAAA,uDACAC,eAAA,oBACAC,2BAAA,qDACAC,UAAA,4BACAC,UAAA,6BACAC,aAAA,4CACAC,iBAAA,yBACAC,cAAA,0BACAC,gBAAA,qBACAC,uBAAA,8BACAC,mBAAA,wCACAC,qBAAA,mBACAC,0BAAA,sBACAC,+BAAA,0EACAC,wCAAA,6JACAC,gCAAA,wFACAC,aAAA,uBACAC,qBAAA,gCACAC,yBAAA,qDACAC,0BAAA,gDACAC,2BAAA,wCACAC,oBAAA,4CACAC,uBAAA,gDACAC,oBAAA,sDACAC,eAAA,wBACAC,iBAAA,qFACAC,mBAAA,8HACAC,wBAAA,wCACAC,0BAAA,2DACAC,uBAAA,iDACAC,sBAAA,6BACAC,oBAAA,kCACAC,YAAA,oCACAC,oBAAA,mBACAC,kBAAA,sBACAC,sBAAA,yDACAC,iBAAA,0BACAC,gBAAA,2BACAC,gBAAA,6BACAC,kBAAA,kBACAC,qBAAA,uCACAC,gBAAA,gFACAC,gBAAA,gEACAC,eAAA;AACAC,wBAAA,yBACAC,iBAAA,wEACAC,2BAAA,yIACAC,4BAAA,8GACAC,4BAAA,yKACAC,iBAAA,mHACAriC,sBAAA,6LACAsiC,mBAAA,uBACAC,mBAAA,mCACAC,+BAAA,mBACAC,0BAAA,yMACAC,wBAAA,uKACAC,eAAA,oIACAC,mBAAA,mEACAC,cAAA,sBACAC,oBAAA,+EACAC,oBAAA,mCACAC,kBAAA,kCACAC,gBAAA,qDACAC,yBAAA,qHACAC,iCAAA,sIACAC,wBAAA,kBACAC,sBAAA,2CACAC,oBAAA,+CACAC,oCAAA,iEACAC,kDAAA,kFACAC,kCAAA,2FACAC,iBAAA,mCACAC,mBAAA,oCACAC,2BAAA,gDACAC,kBAAA,yBACAC,+BAAA,2CACAC,kBAAA,wCACAC,iBAAA,mCACAC,0BAAA,+DACAC,uBAAA,mEACAC,mBAAA,0DACAC,iBAAA,4HACAC,yBAAA,0EACAC,wBAAA,gDACAC,yBAAA,kFACAC,oBAAA,6IACAC,4BAAA,wCACAE,0BAAA,gDACAC,wBAAA,4CACAC,wBAAA,+CACAC,0BAAA,0HACAC,8BAAA,qCACAC,kBAAA,yBACAC,2BAAA,gDACAC,oBAAA,kCAEA3W,KAAA,CACAqQ,YAAA,UACAwG,mBAAA,mBACAzD,kBAAA,iBACA0D,cAAA,kBACAC,uBAAA,yBACAC,oBAAA,iBACAC,oBAAA,uBACAC,qCAAA,uFACAC,yBAAA,0FACAC,2BAAA,4PACAC,gBAAA,iBACAC,gCAAA,0EACAC,yBAAA,sHACAC,iBAAA,yBAEAC,QAAA,CACApH,YAAA,kBACAqH,oBAAA,gBACAC,6BAAA,oEACAC,wBAAA,iBACAC,cAAA,iYACAC,WAAA,kCACAC,SAAA,sBACArI,SAAA,6PACAsI,aAAA,yUACAC,eAAA,gHACAC,iBAAA,2HACAC,0BAAA,aACAC,oBAAA,2MACAC,aAAA,iKACAC,eAAA,sGACAC,WAAA,oGACAC,iBAAA,oGACAC,gBAAA,qPACAC,kBAAA,2HACAC,0BAAA,0KACAC,kBAAA,wEACAC,wBAAA,yBACAC,OAAA,0CACAC,kBAAA,mHACAC,mBAAA,wRAEAQ,SAAA,CACAnJ,YAAA,4BACAoJ,qBAAA,yPAEApT,KAAA,CACA/R,MAAA,YACAolB,KAAA,CACAC,QAAA,aACAlV,KAAA,ygBACAG,SAAA,8eACAxC,OAAA,mYAEAgC,MAAA,CACAuV,QAAA,UACArvE,OAAA,kCACAsvE,WAAA,qdACAhU,OAAA,kBACAiU,WAAA,2qBAEAC,SAAA,CACAH,QAAA,UACAC,WAAA,qVACA1pB,OAAA,SACA6pB,WAAA,iPACAC,eAAA,qBACAC,mBAAA,mfACAxf,WAAA,uEACAyf,eAAA,sRACAC,uBAAA,kkBACA9kB,IAAA,qBACA+kB,QAAA,6GACAC,cAAA,sBACAC,kBAAA,qOAEAC,IAAA,CACAC,kBAAA,gHACAC,aAAA,wGACAC,cAAA,4OACAC,uBAAA,8UACAC,qBAAA,2PACAC,iCAAA,yRACAb,eAAA,8KACAc,iBAAA,sFACAC,mBAAA,sKACAC,cAAA,oNACAC,2BAAA,gQACAC,0BAAA,+PACAC,iBAAA,6FACAC,wBAAA,8EACAC,sBAAA,uFACAC,+BAAA,+EACAC,4BAAA,8EACAC,eAAA,gDACAC,wBAAA,yWACAC,2BAAA,iQACAC,cAAA,iHACAC,YAAA,sCACAC,qBAAA,+EACAC,eAAA,yGACAC,sBAAA,6DACAC,eAAA,oKACAC,kBAAA,2KACAE,YAAA,6HACAC,aAAA,gHACAC,mBAAA,wIACAC,gBAAA,gLACAC,kBAAA,4DACAC,wBAAA,wPACAC,8BAAA,6GACAC,8BAAA,+GACAC,iBAAA,kGACA9E,cAAA,qKACA+E,kBAAA,6EACAC,uBAAA,yDACAC,qBAAA,gVACAC,UAAA,qHACAC,cAAA,2LAGArc,IAAA,CACA7Q,OAAA,CACAotB,SAAA,kBACAC,cAAA,kCACAC,kBAAA,iBACAC,uBAAA,kEACAlmB,iBAAA,sJAEA/B,KAAA,CACAd,MAAA,kDACAkC,QAAA,qLACA8mB,cAAA,kGACAC,WAAA,uBAEA7N,SAAA,CACApb,MAAA,8CACAkpB,YAAA,YACA9Z,QAAA,qBACA+L,OAAA,QACAgO,aAAA,2BACAC,KAAA,QACApzE,OAAA,mCACAylC,QAAA,yBACA4tC,KAAA,qBACAzE,KAAA,CACAzU,KAAA,OACAG,SAAA,OACAt6D,OAAA,+CACA+7D,KAAA,wMACAuX,gBAAA,8JAEA5d,KAAA,CACA6d,8BAAA,sDACAC,oBAAA,+DACAC,6BAAA,uDACAC,mBAAA,iEAEA3c,MAAA,CACA4c,gBAAA,oBAGAC,IAAA,CACAC,oBAAA,YACAC,YAAA,kBACAC,mBAAA,aACAC,qBAAA,uCACAC,aAAA,QACAC,UAAA,gFACAC,YAAA,gCACAC,iBAAA,2BACAC,aAAA,8CACAC,eAAA,uDACAC,kBAAA,UACAC,eAAA,QACAC,iBAAA,6BACAC,qBAAA,aACAtP,SAAA,CACApb,MAAA,QACAsU,YAAA,iKACAqW,aAAA,kCACAC,kBAAA,2CACAC,aAAA,OACAC,kBAAA,qHACAC,cAAA,yBACAC,mBAAA,qFACAC,WAAA,yCACAC,gBAAA,+IACAC,mBAAA,4BACAC,wBAAA,yOACAC,iBAAA,uBACAC,sBAAA,oLACAC,qBAAA,8BACAC,0BAAA,uGACAC,cAAA,+BACAC,eAAA,cACAC,4BAAA,sCACAC,6BAAA,oBACAC,yBAAA,eACAC,wBAAA,aACAC,6BAAA,uDACAC,0BAAA,gBACAC,+BAAA,4CACAC,yBAAA,QACAC,0BAAA,UACAC,+BAAA,uBACAC,yBAAA,QACAC,4BAAA,kBACAC,2BAAA,iBACAC,6BAAA,aACAC,6BAAA,0BAOAlxB,EAAA73B,aAAA,QAAA,CACA83B,OAAA,CACAC,SAAA,SACAC,YAAA,eACAC,UAAA,mBACA3lD,OAAA,gBACA4lD,OAAA,UACAC,MAAA,SACAC,OAAA,KACAC,QAAA,KACAC,OAAA,KACAC,SAAA,SACAC,eAAA,gBACAC,qBAAA,OACAC,SAAA,UACAC,aAAA,cACAC,iBAAA,gBACAC,SAAA,MACAC,gBAAA,eACAC,kBAAA,yBACAC,SAAA,WACAC,SAAA,YACAC,WAAA,WACAC,WAAA,WACAC,UAAA,SACAC,UAAA,YACAC,UAAA,aACAC,WAAA,cACAC,gBAAA,eACAC,UAAA,YACAC,SAAA,YACAC,WAAA,WACAC,QAAA,SACAC,WAAA,SACAC,YAAA,aACAC,UAAA,mBACAC,UAAA,UACAC,aAAA,YACAC,WAAA,QACAC,eAAA,YACAC,YAAA,WACAC,cAAA,gBACAC,qBAAA,yBACAC,aAAA,YACAC,+BAAA,gCACAC,WAAA,YACAC,YAAA,yDACAC,KAAA,OACAC,oBAAA,6CACAC,iBAAA,8BACAC,QAAA,oBACAC,aAAA,0EACAC,UAAA,uBACAC,KAAA,KACAC,GAAA,IACAC,KAAA,SACAC,SAAA,SACAC,mBAAA,sBACA1L,GAAA,KACAllB,aAAA,mBACA6wB,kBAAA,aACAC,mBAAA,WACAC,wBAAA,UACAC,kBAAA,UACAC,IAAA,YACAC,OAAA,WACAC,QAAA,cACAC,aAAA,cACAC,cAAA,uBACAC,eAAA,6CACAC,YAAA,wCACAC,sBAAA,WACAC,qBAAA,UACAC,UAAA,cACAC,gBAAA,4BACAC,cAAA,CACAC,MAAA,YACAC,iBAAA,uBACAC,kBAAA,wBACAC,kBAAA,yBACAC,oBAAA,wBAEA1hC,KAAA,CACA2hC,KAAA,SACAC,KAAA,QACAC,KAAA,UACAC,WAAA,eAGAC,OAAA,CACAC,oBAAA,oBACAC,oBAAA,UACAC,mBAAA,iBAEAC,KAAA,CACAC,KAAA,SACAC,IAAA,aACAvlB,SAAA,SACAwlB,QAAA,YACAC,QAAA,gBACAC,SAAA,UACAC,QAAA,MACAC,aAAA,qBAEAC,MAAA,CACAU,oBAAA,8BACA/B,MAAA,YACAsB,QAAA,+CACAC,eAAA,iGACAC,cAAA,8FACAC,KAAA,iBACAC,kBAAA,eACAC,WAAA,oBACAC,MAAA,QACAC,oBAAA,kDACAC,aAAA,wBAEAhB,KAAA,CACAkC,YAAA,SACAD,UAAA,WACAD,cAAA,WACA9C,MAAA,SACAgC,QAAA,wCACAE,QAAA,iEACAE,aAAA,qBACAC,UAAA,YACAC,SAAA,iBACAR,aAAA,oBACAa,0BAAA,gFACAC,mBAAA,0BACAC,iBAAA,0MAEA3B,SAAA,CACAlB,MAAA,UACAiD,gBAAA,gBACAC,gBAAA,iBACAC,iBAAA,MACAC,KAAA,6BACAE,uBAAA,oCACAD,WAAA,eACAE,cAAA,mDACAC,mBAAA,iHACAC,kBAAA,kCACAC,uBAAA,iCACAC,iBAAA,gBACAC,uBAAA,oBACAC,4BAAA,2GACAC,eAAA,8BACAE,kBAAA,+BACAC,iBAAA,6BACAC,mBAAA,yBACAC,wBAAA,mCACAC,6BAAA,kFACAC,wBAAA,gBACAC,UAAA,gCACAC,gBAAA,YACAC,eAAA,iCACAC,iBAAA,CACAC,MAAA,4BACAC,QAAA,+CACAC,OAAA,yCACAC,QAAA,0CACAC,KAAA,uCACAC,OAAA,0BAEAC,aAAA,oBACAC,kBAAA,kMACAC,YAAA,aACAC,iBAAA,kGACAC,iBAAA,cACAC,UAAA,oCACAC,YAAA,eACAC,iBAAA,0CACAC,sBAAA,sCACAzB,gBAAA,2CACA0B,4BAAA,uBACAC,2BAAA,qEACAC,sBAAA,CACAC,KAAA,aACAzwC,EAAA,iDAEA0wC,WAAA,CACA7F,MAAA,eACA8F,KAAA,YACAC,UAAA,6BACAC,QAAA,kBACAC,aAAA,gBACAC,cAAA,mBAGAC,WAAA,CACAC,KAAA,iBACAC,KAAA,CACAC,aAAA,yCACAC,cAAA,gBACAvG,MAAA,mCACAwG,YAAA,2BACAC,SAAA,0BACAC,kBAAA,yBACA9nC,QAAA,sBACAwnC,KAAA,iBACAO,wBAAA,oEACAC,MAAA,6BACAC,QAAA,oBACAC,aAAA,8CACAC,aAAA,QACAC,iBAAA,qBACAC,cAAA,kBACAC,cAAA,eACAC,mBAAA,2CACAC,cAAA,qBACAC,mBAAA,0DACAC,eAAA,qBACAC,oBAAA,2EACAC,cAAA,wBACAC,mBAAA,uCACAC,SAAA,gBACAC,WAAA,kBACAC,cAAA,sBACAC,4BAAA,4BACAC,mBAAA,CACAC,IAAA,IACAC,GAAA,KAEAhqB,mBAAA,CACAhD,IAAA,mBACAitB,IAAA,mCACAC,IAAA,oBACAC,KAAA,oBAGAC,OAAA,CACApI,MAAA,UACAqI,SAAA,gBACAC,YAAA,mBACAC,YAAA,cAGA/sB,SAAA,CACA6qB,KAAA,CACArG,MAAA,SACAwI,aAAA,SACAC,QAAA,mBACAC,YAAA,MACAC,WAAA,UACAC,2BAAA,qQACAC,sBAAA,mBACAC,cAAA,sBACAC,QAAA,uBACAC,kBAAA,4BACAC,cAAA,SACAC,KAAA,iBACAC,MAAA,yBACA9V,GAAA,sBACA+V,SAAA,qBACAC,YAAA,+BACAxC,QAAA,wCACAyC,oBAAA,sBACAC,OAAA,+BACAC,QAAA,kCACAC,UAAA,mCACAC,cAAA,QACAC,gBAAA,gGACAC,gBAAA,qCACAC,aAAA,8CACAC,UAAA,mDACAC,WAAA,gFACAC,WAAA,gDACAC,aAAA,iDACAC,UAAA,iDACAC,YAAA,qCACAC,SAAA,wEACAC,kBAAA,gCACAC,SAAA,wDACAC,iBAAA,uEACAC,SAAA,8FACAC,aAAA,iCACAC,QAAA,SACAC,aAAA,QACAC,kBAAA,yBACAC,iBAAA,kBACAC,YAAA,oBAEAxJ,QAAA,CACAtB,MAAA,wBACA/B,aAAA,uBACA8M,gBAAA,uCAGA5J,QAAA,CACAkF,KAAA,CACAgD,YAAA,+BACA2B,cAAA,kBACAC,aAAA,aACAC,SAAA,YACAC,iBAAA,8DACAC,iBAAA,wCACAC,OAAA,MACAC,eAAA,iBACAC,WAAA,mCACAC,UAAA,CACArwB,KAAA,wBACAE,OAAA,mBACAD,KAAA,gBACAqwB,YAAA,0BAGAC,KAAA,CACAC,eAAA,iGAGAvI,KAAA,CACAwI,MAAA,QACAC,gBAAA,0BACAC,OAAA,SACAC,QAAA,SACAC,aAAA,eACAC,UAAA,iBACAlD,QAAA,UACAmD,aAAA,gBACAC,UAAA,kBACAC,WAAA,aACAC,IAAA,MACAC,cAAA,WACA1M,qBAAA,SACA2M,QAAA,iBACAC,cAAA,uBACAC,cAAA,WACApG,KAAA,CACArG,MAAA,OACA0M,MAAA,eACAC,iBAAA,uBACAC,uBAAA,uCACAtE,YAAA,oBACAuE,YAAA,mBACAC,gBAAA,sBACAC,MAAA,CACAC,uBAAA,gEACAC,mBAAA,gDAIAlM,IAAA,CACAmM,YAAA,qCACAC,0BAAA,iIACAC,iBAAA,iBACAC,uBAAA,6BACAC,iBAAA,iCACAC,uBAAA,gCACAC,uBAAA,eACAC,6BAAA,uBACAC,sCAAA,0BACAC,UAAA,SACAC,sBAAA,oCACAC,QAAA,WACAC,OAAA,YACAjC,gBAAA,kCACAkC,iBAAA,kCACAjB,gBAAA,0BACAkB,mBAAA,oBACAC,wBAAA,uEACAvH,kBAAA,yBACAwH,YAAA,aACAC,gBAAA,iBACAC,uBAAA,sBACAC,mBAAA,6BACAhI,KAAA,CACAiI,oBAAA,uBAEAlG,OAAA,CACApI,MAAA,aACAuO,UAAA,mBACAC,gBAAA,qBACAC,QAAA,2BACAC,cAAA,oCACAC,WAAA,2CACAC,YAAA,kDACAC,cAAA,qBACAC,YAAA,yBACAjP,UAAA,cACAC,gBAAA,2BACAiP,WAAA,iCACAC,aAAA,iBAEAC,SAAA,CACAjP,MAAA,aAEAkP,MAAA,CACAlP,MAAA,UAEAmP,eAAA,CACAnP,MAAA,4BACAoP,QAAA,4BACAC,KAAA,2CACAC,aAAA,2CACAC,SAAA,4BACAC,YAAA,wCACAzC,MAAA,sCACA0C,cAAA,qBAEAC,WAAA,CACA1P,MAAA,2BAEA2P,qBAAA,CACA3P,MAAA,qCACAoP,QAAA,2BACAC,KAAA,0CACAC,aAAA,6CACAM,KAAA,2BACAC,QAAA,uCACA9C,MAAA,uCAGA+C,MAAA,CACA9P,MAAA,2CACA+P,iBAAA,8FACAC,iBAAA,iDACAC,eAAA,qCACAC,eAAA,uCACAC,KAAA,wBACAC,UAAA,wBACAC,UAAA,mCACAC,SAAA,aACAC,cAAA,aACAC,YAAA,gBACAlS,oBAAA,yBACAmS,sBAAA,oBACAC,eAAA,mBACAC,oBAAA,0BACAC,aAAA,yBACAC,kBAAA,uCACAC,YAAA,gBACAC,iBAAA,cACAC,qBAAA,UACAC,mBAAA,uDACAC,kBAAA,qBACAC,YAAA,CACAnR,MAAA,cACAkC,QAAA,mIACAkP,YAAA,sBACAC,aAAA,uCAEAC,OAAA,CACAC,eAAA,yBACAC,gBAAA,wBACA9yC,KAAA,oBACA1oB,OAAA,4BACAy7D,KAAA,yBAEAC,OAAA,CACAx8C,OAAA,SACAK,QAAA,iBACAo8C,OAAA,SACAC,QAAA,gBACAC,QAAA,UACAC,KAAA,gBACA38C,EAAA,YACAC,EAAA,WACAC,EAAA,YAEAqJ,KAAA,CACAqzC,KAAA,0FAGA1F,IAAA,CACA7Q,OAAA,CACAqH,iBAAA,wJACA+lB,SAAA,oBACAC,cAAA,qCACAC,kBAAA,kBACAC,uBAAA,+DAEAa,IAAA,CACAI,qBAAA,oCACAM,eAAA,0DACAL,aAAA,SACAC,UAAA,uFACAC,YAAA,uCACAC,iBAAA,iCACAC,aAAA,+CACAR,oBAAA,cACAW,eAAA,WACAD,kBAAA,WACAG,qBAAA,aACAD,iBAAA,mCACAV,mBAAA,aACA3O,SAAA,CACA9G,YAAA,+JACAoX,eAAA,aACAI,wBAAA,iBACAC,6BAAA,wDACAH,6BAAA,uBACAD,4BAAA,uCACAK,0BAAA,kBACAC,+BAAA,4CACAM,2BAAA,cACAD,4BAAA,eACAG,6BAAA,kBACAD,6BAAA,UACAH,yBAAA,UACAR,yBAAA,kBACAK,yBAAA,QACAC,0BAAA,UACAC,+BAAA,uBACAX,cAAA,4BACAZ,aAAA,UACAC,kBAAA,yIACAO,iBAAA,+BACAC,sBAAA,0NACAP,cAAA,0BACAC,mBAAA,4GACAC,WAAA,8CACAC,gBAAA,mIACAK,qBAAA,+BACAC,0BAAA,iHACAb,aAAA,iCACAC,kBAAA,kDACAO,mBAAA,+BACAC,wBAAA,gQACAprB,MAAA,SAEA8pB,YAAA,wBAEAhpB,KAAA,CACAmoB,WAAA,0BACA/mB,QAAA,oNACA8mB,cAAA,kGACAhpB,MAAA,qDAEAob,SAAA,CACAD,OAAA,YACAgO,aAAA,qBACA1tC,QAAA,wCACAmpC,KAAA,CACA0E,gBAAA,mKACAvX,KAAA,mNACAzB,SAAA,OACAt6D,OAAA,+CACAm6D,KAAA,QAEApD,MAAA,CACA4c,gBAAA,oBAEAje,KAAA,CACAge,mBAAA,4DACAD,6BAAA,wDACAD,oBAAA,0DACAD,8BAAA,uDAEAH,KAAA,WACAC,KAAA,uBACArzE,OAAA,mCACAo5D,QAAA,qBACApP,MAAA,kDACAkpB,YAAA,kBAGAlX,KAAA,CACAhS,MAAA,gDACAiS,SAAA,aACAC,aAAA,2BACAC,kBAAA,8EACAC,qBAAA,mHACAlC,eAAA,iEAEAlP,QAAA,CACAhB,MAAA,YACAqS,QAAA,QACAC,QAAA,kCACAC,gBAAA,qBACAC,MAAA,sBACAC,aAAA,cACAC,YAAA,eACAC,aAAA,iDACAO,cAAA,uWACAN,WAAA,2BACAC,cAAA,0BACAC,SAAA,8BACAC,cAAA,oCACAC,oBAAA,sCACAC,OAAA,UACAE,mBAAA,2DACAC,uBAAA,8EACAC,4BAAA,6YACAC,4BAAA,yGACAC,2BAAA,+KACAC,sBAAA,iIACAC,sCAAA,6IACAC,sBAAA,oKACAC,oBAAA,4BACAC,0BAAA,kBACA9J,UAAA,2BACA+J,kBAAA,UACAC,mCAAA,4BACAC,mBAAA,kCACAC,qBAAA,uBACAC,0BAAA,wBACAC,wBAAA,yBACAC,kBAAA,sBACAC,iBAAA,kCACAC,uBAAA,CACArU,MAAA,oBACAsU,YAAA,4DACAC,iBAAA,yFACAC,cAAA,4BAEAC,IAAA,CACAzU,MAAA,cACA0U,mBAAA,uLACAC,uBAAA,wGACAC,4BAAA,6EACAC,WAAA,wHACAC,kBAAA,oIACAC,uBAAA,sGACAC,oBAAA,oCACAC,eAAA,iBACAC,qBAAA,2BACAC,oBAAA,oFACAC,eAAA,kBACAC,qBAAA,0BACAC,oBAAA,+JACAC,aAAA,mNACAC,iBAAA,2LACAC,eAAA,qQACA3H,OAAA,YACA4H,YAAA,YACAC,aAAA,eACAC,kBAAA,yCACAC,iBAAA,eACAC,sBAAA,gCACAC,cAAA,gBACAC,iBAAA,sBACAC,0BAAA,wRACAC,4BAAA,yNACAC,4BAAA,4LACAC,gBAAA,eACAC,iBAAA,8BACAC,qBAAA,4CACAC,aAAA,oEACAC,WAAA,SACAC,mBAAA,sBAEAC,eAAA,CACA1W,MAAA,qBACA+R,KAAA,iDAEA4E,sBAAA,CACA3W,MAAA,yBACA+R,KAAA,yMAEA6E,oBAAA,CACA5W,MAAA,yBAEA6W,YAAA,CACAS,aAAA,CACAvF,KAAA,kIACAyF,cAAA,wBACAxX,MAAA,qBACAuX,aAAA,mFAEAvX,MAAA,gBACA8W,QAAA,qBACA7Y,aAAA,uBACA8Y,qBAAA,0BACAC,UAAA,0BACA3Z,WAAA,mCACA4Z,WAAA,wBACAC,gBAAA,qDACAC,WAAA,WACAC,aAAA,CACApX,MAAA,wBACA+R,KAAA,0BACAsF,UAAA,wBAGAI,SAAA,CACA+C,QAAA,CACAzN,MAAA,CACA/tC,aAAA,wCACAzhB,aAAA,4BAEAs9D,YAAA,qDACAC,iBAAA,mRACAC,eAAA,CACAhJ,KAAA,6BACAxB,cAAA,gBACAvQ,MAAA,6BAEAya,cAAA,iBACAC,mBAAA,yOACAC,WAAA,0CACAC,gBAAA,yTAEAlD,aAAA,gCACAC,UAAA,UACAtS,UAAA,YACAuS,gBAAA,mCACAC,qBAAA,oNACAiC,uBAAA,0EACAhC,iBAAA,gCACAC,sBAAA,4MACAC,iBAAA,kEACAC,cAAA,4BACAC,mBAAA,6KACAC,cAAA,sBACAC,mBAAA,0IACAC,WAAA,qDACAC,MAAA,qBACAC,UAAA,yDACAC,aAAA,0DACAC,WAAA,sDACAC,WAAA,iDACAC,WAAA,mDACAC,WAAA,mDACAC,WAAA,mDACAC,WAAA,+DACAC,WAAA,0CACAC,WAAA,wCACAC,WAAA,6CACAC,YAAA,gDACAC,YAAA,2EACAC,YAAA,iEACAC,YAAA,4CACAC,YAAA,qCACAC,YAAA,wCACAC,YAAA,iDACAC,YAAA,uCACAC,YAAA,uDACAC,YAAA,oCACAC,WAAA,6BACAG,qBAAA,+CACAC,iCAAA,kOACAC,0BAAA,yKACAG,oBAAA,8DACAF,kBAAA,yBACAG,QAAA,2BACAE,aAAA,0DACAva,MAAA,qBACA6Z,gBAAA,yKACAM,uBAAA,8PACAG,aAAA,uMAEAU,UAAA,+FACAC,QAAA,CACAC,KAAA,QACAC,OAAA,WACA1/B,QAAA,eAGA2/B,SAAA,CACApb,MAAA,gBACAqb,UAAA,0BACA1c,KAAA,KACAC,GAAA,IACAuc,OAAA,UACAI,YAAA,UACA9/B,QAAA,aACA+/B,aAAA,aACAvf,SAAA,SACAwf,gBAAA,uBACAC,KAAA,kBACAC,QAAA,IACAC,uBAAA,2EACA1M,MAAA,CACAlP,MAAA,kBAGA+M,MAAA,CACA6U,4BAAA,0CACAM,8BAAA,kCACAD,0BAAA,iIACAN,oBAAA,qKACAI,wBAAA,4CACApB,kDAAA,wFACAyB,2BAAA,yDACAJ,wBAAA,8CACAG,kBAAA,mCACAL,0BAAA,0DACAjG,mBAAA,0BACAC,wBAAA,6DACAC,YAAA,QACAC,cAAA,oBACAC,qBAAA,4EACAC,wBAAA,yCACAC,iBAAA,oCACAC,eAAA,gDACAC,eAAA,qBACAC,gBAAA,yBACAC,4BAAA,uDACAC,eAAA,wBACAC,2BAAA,wDACAC,UAAA,wBACAC,UAAA,wBACAC,aAAA,+CACAC,iBAAA,0BACAC,cAAA,wBACAC,gBAAA,+BACAC,uBAAA,0CACAC,mBAAA,oDACAC,qBAAA,2BACAC,0BAAA,6BACAC,+BAAA,iEACAC,wCAAA,sHACAC,gCAAA,gGACAC,aAAA,oCACAC,qBAAA,kCACAC,yBAAA,qDACAC,0BAAA,kDACAC,2BAAA,wCACAC,oBAAA,0CACAC,uBAAA,oDACAC,oBAAA,8DACAC,eAAA,6BACAC,iBAAA,oGACAC,mBAAA,yIACAC,wBAAA,6CACAC,0BAAA,mEACAC,uBAAA,+CACAC,sBAAA,+BACAC,oBAAA,uCACAC,YAAA,kCACAC,oBAAA,wBACAC,kBAAA,uBACAC,sBAAA,oEACAC,iBAAA,wCACAC,gBAAA,6BACAC,gBAAA,kCACAC,kBAAA,wBACAC,qBAAA,0CACAC,gBAAA,kFACAC,gBAAA,gEACAC,eAAA,iDACAC,wBAAA,iCACAC,iBAAA,gFACAC,2BAAA,iJACAC,4BAAA,sIACAC,4BAAA,gMACAC,iBAAA,+IACAriC,sBAAA,+MACAsiC,mBAAA,0BACAC,mBAAA,mDACAC,+BAAA,wBACAC,0BAAA,6NACAC,wBAAA,6KACAC,eAAA,qIACAC,mBAAA,iFACAC,cAAA,2BACAC,oBAAA,6DACAC,oBAAA,sCACAC,kBAAA,8BACAC,gBAAA,uCACAC,yBAAA,sIACAC,iCAAA,mKACAC,wBAAA,0BACAC,sBAAA,2CACAC,oBAAA,kDACAC,oCAAA,2DACAE,kCAAA,4EACAC,iBAAA,sCACAC,mBAAA,wCACAC,2BAAA,uCACAC,kBAAA,0BACAC,+BAAA,iDACAC,kBAAA,+CACAC,iBAAA,gCACAC,0BAAA,+DACAC,uBAAA,iDACAC,mBAAA,iDACAC,iBAAA,yHACAC,yBAAA,gFACAC,wBAAA,0CACAC,yBAAA,wFACAW,oBAAA,+BACAC,kBAAA,kDAEA5W,KAAA,CACAqQ,YAAA,cACAwG,mBAAA,wBACAzD,kBAAA,uBACA0D,cAAA,wBACAC,uBAAA,kBACAC,oBAAA,oBACAC,oBAAA,iBACAC,qCAAA,kGACAC,yBAAA,wGACAC,2BAAA,qQACAC,gBAAA,qBACAC,gCAAA,2FACAC,yBAAA,2IACAC,iBAAA,gCAEAC,QAAA,CACApH,YAAA,sBACAqH,oBAAA,qBACAC,6BAAA,yEACAC,wBAAA,qBACAC,cAAA,+XACAC,WAAA,iDACAC,SAAA,2BACArI,SAAA,oPACAsI,aAAA,kUACAC,eAAA,2FACAC,iBAAA,qGACAC,0BAAA,mCACAC,oBAAA,sJACAC,aAAA,mIACAC,eAAA,sGACAC,WAAA,wFACAC,iBAAA,mFACAC,gBAAA,oOACAC,kBAAA,sGACAC,0BAAA,kKACAC,kBAAA,kEACAC,wBAAA,yBACAC,OAAA,wBACAC,kBAAA,wHACAC,mBAAA,qTAEAC,KAAA,CACAC,KAAA,CACAC,MAAA,OACAF,KAAA,uBACAG,sBAAA,oEACAC,UAAA,8HACAC,aAAA,6LAEAC,SAAA,CACAJ,MAAA,QACAF,KAAA,sBACAI,UAAA,iHACAC,aAAA,gOAGAE,SAAA,CACAnJ,YAAA,gCACAoJ,qBAAA,8PAEApT,KAAA,CACA/R,MAAA,iBACAolB,KAAA,CACAC,QAAA,cACAlV,KAAA,olBACAG,SAAA,wiBACAxC,OAAA,uYAEAgC,MAAA,CACAuV,QAAA,gBACArvE,OAAA,gBACAsvE,WAAA,koBACAhU,OAAA,2BACAiU,WAAA,oiBAEAC,SAAA,CACAH,QAAA,WACAC,WAAA,sLACA1pB,OAAA,UACA6pB,WAAA,uPACAC,eAAA,sBACAC,mBAAA,8fACAxf,WAAA,kEACAyf,eAAA,kTACAC,uBAAA,woBACA9kB,IAAA,yBACA+kB,QAAA,8HACAC,cAAA,qBACAC,kBAAA,wPAEAC,IAAA,CACAC,kBAAA,6GACAC,aAAA,qGACAC,cAAA,gPACAC,uBAAA,uYACAC,qBAAA,2NACAC,iCAAA,qPACAb,eAAA,iMACAc,iBAAA,qFACAC,mBAAA,6MACAC,cAAA,4PACAC,2BAAA,yPACAC,0BAAA,kQACAC,iBAAA,iGACAC,wBAAA,mFACAC,sBAAA,0FACAC,+BAAA,oFACAC,4BAAA,mFACAC,eAAA,kDACAC,wBACA,yXACAC,2BAAA,gSACAC,cAAA,8HACAC,YAAA,oCACAC,qBAAA,qEACAC,eAAA,qHACAC,sBAAA,oEACAC,eAAA,6LACAC,kBAAA,oLACAE,YAAA,sIACAD,iBAAA,yGACAE,aAAA,sGACAC,mBAAA,+JACAC,gBAAA,uLACAC,kBAAA,oEACAC,wBAAA,uQACAC,8BAAA,gHACAC,8BAAA,kHACAC,iBAAA,oGACA9E,cAAA,wMACA+E,kBAAA,0EACAC,uBAAA,iDACAC,qBAAA,qXACAC,UAAA,iHACAC,cAAA,yLACAC,aAAA,iGAMAptB,EAAA73B,aAAA,QAAA,CACA83B,OAAA,CACAC,SAAA,SACAC,YAAA,eACAC,UAAA,mBACA3lD,OAAA,eACA4lD,OAAA,SACAC,MAAA,OACAC,OAAA,KACAC,QAAA,MACAC,OAAA,MACAC,SAAA,UACAC,eAAA,oBACAC,qBAAA,WACAC,SAAA,cACAC,aAAA,mBACAC,iBAAA,iBACAC,SAAA,OACAC,gBAAA,2BACAC,kBAAA,gCACAC,SAAA,SACAC,SAAA,UACAC,WAAA,WACAC,WAAA,UACAC,UAAA,SACAC,UAAA,YACAC,UAAA,eACAC,WAAA,cACAC,gBAAA,iBACAC,UAAA,WACAC,SAAA,WACAC,WAAA,YACAC,QAAA,UACAC,WAAA,aACAC,YAAA,aACAC,UAAA,cACAC,UAAA,YACAC,aAAA,YACAC,WAAA,QACAC,eAAA,eACAC,YAAA,UACAC,cAAA,gBACAC,qBAAA,sBACAC,aAAA,cACAC,+BAAA,kCACAC,WAAA,WACAC,YAAA,6DACAC,KAAA,QACAC,oBAAA,oDACAC,iBAAA,wBACAC,QAAA,wBACAC,aAAA,8EACAC,UAAA,wBACAC,KAAA,KACAC,GAAA,IACAC,KAAA,SACAC,SAAA,SACAC,mBAAA,sBACA1L,GAAA,KACAllB,aAAA,iBACA6wB,kBAAA,aACAC,mBAAA,WACAC,wBAAA,UACAC,kBAAA,SACAC,IAAA,aACAC,OAAA,SACAC,QAAA,YACAC,aAAA,YACAC,cAAA,sBACAC,eAAA,2CACAC,YAAA,kCACAC,sBAAA,UACAC,qBAAA,UACAC,UAAA,gBACAC,gBAAA,gCACAC,cAAA,CACAC,MAAA,WACAC,iBAAA,uBACAC,kBAAA,wBACAC,kBAAA,yBACAC,oBAAA,wBAEA1hC,KAAA,CACA2hC,KAAA,SACAC,KAAA,SACAC,KAAA,WACAC,WAAA,2BAGAC,OAAA,CACAC,oBAAA,sBACAC,oBAAA,UACAC,mBAAA,iBAEAC,KAAA,CACAC,KAAA,UACAC,IAAA,WACAvlB,SAAA,UACAwlB,QAAA,aACAC,QAAA,oBACAC,SAAA,aACAC,QAAA,SACAC,aAAA,kBAEAC,MAAA,CACArB,MAAA,WACAsB,QAAA,iDACAC,eAAA,qGACAC,cAAA,kGACAC,KAAA,gBACAC,kBAAA,sBACAC,WAAA,kBACAC,MAAA,UACAC,oBAAA,0DACAC,aAAA,uBACAC,oBAAA,kCAEAjB,KAAA,CACAd,MAAA,SACAgC,QAAA,wCACAC,iBAAA,0EACAC,QAAA,iEACAC,iBAAA,2EACAC,aAAA,8CACAC,UAAA,WACAC,SAAA,gBACAC,YAAA,iBACAC,cAAA,iBACAC,QAAA,eACAC,aAAA,mCACAZ,aAAA,WACAa,0BAAA,iGACAC,mBAAA,wBACAC,iBAAA,0MACAC,cAAA,YACAC,UAAA,gBACAC,YAAA,UAEA9B,SAAA,CACAlB,MAAA,aACAiD,gBAAA,YACAC,gBAAA,WACAC,iBAAA,SACAC,KAAA,eACAC,WAAA,eACAC,uBAAA,kCACAC,cAAA,qDACAC,mBAAA,6HACAC,kBAAA,4BACAC,uBAAA,uCACAC,iBAAA,oBACAC,uBAAA,uBACAC,4BAAA,wHACAC,eAAA,0CACAC,gBAAA,6CACAC,kBAAA,6BACAC,iBAAA,iBACAC,mBAAA,qCACAC,wBAAA,6BACAC,6BAAA,0FACAC,wBAAA,mBACAC,UAAA,kCACAC,gBAAA,sBACAC,eAAA,sEACAC,iBAAA,CACAC,MAAA,yBACAC,QAAA,gCACAC,OAAA,kCACAC,QAAA,kCACAC,KAAA,gCACAC,OAAA,0BAEAC,aAAA,uBACAC,kBAAA,yMACAC,YAAA,uBACAC,iBAAA,gGACAC,iBAAA,aACAC,UAAA,mCACAC,YAAA,yBACAC,iBAAA,qCACAC,sBAAA,gCACAC,4BAAA,sBACAC,2BAAA,2DACAC,sBAAA,CACAC,KAAA,cACAzwC,EAAA,+CAEA0wC,WAAA,CACA7F,MAAA,eACA8F,KAAA,UACAC,UAAA,yBACAC,QAAA,aACAC,aAAA,oBACAC,cAAA,qBAGAC,WAAA,CACAC,KAAA,kBACAC,KAAA,CACAC,aAAA,uCACAC,cAAA,eACAvG,MAAA,iCACAwG,YAAA,0BACAC,SAAA,uBACAC,kBAAA,0BACA9nC,QAAA,oBACAwnC,KAAA,eACAO,wBAAA,8DACAC,MAAA,6BACAC,QAAA,sBACAC,aAAA,4CACAC,aAAA,UACAC,iBAAA,sBACAC,cAAA,mBACAC,cAAA,kBACAC,mBAAA,wCACAC,cAAA,mBACAC,mBAAA,8CACAC,eAAA,iBACAC,oBAAA,4EACAC,cAAA,sBACAC,mBAAA,4CACAC,SAAA,eACAC,WAAA,iBACAC,cAAA,sBACAC,4BAAA,0BACAC,mBAAA,CACAC,IAAA,KACAC,GAAA,MAEAhqB,mBAAA,CACAhD,IAAA,uBACAitB,IAAA,qCACAC,IAAA,iBACAC,KAAA,mBAGAC,OAAA,CACApI,MAAA,QACAqI,SAAA,aACAC,YAAA,mBACAC,YAAA,cAGA/sB,SAAA,CACA6qB,KAAA,CACArG,MAAA,UACAwI,aAAA,UACAC,QAAA,qBACAC,YAAA,SACAC,WAAA,QACAC,2BAAA,gRACAC,sBAAA,mBACAC,cAAA,oBACAC,QAAA,oBACAC,kBAAA,iCACAC,cAAA,UACAC,KAAA,kBACAC,MAAA,mBACA9V,GAAA,sBACA+V,SAAA,sBACAC,YAAA,yBACAxC,QAAA,yCACAyC,oBAAA,uBACAC,OAAA,6BACAC,QAAA,gCACAC,UAAA,kCACAC,cAAA,QACAC,gBAAA,+FACAC,gBAAA,iCACAC,aAAA,wDACAC,UAAA,qDACAC,WAAA,0FACAC,WAAA,sDACAC,aAAA,6DACAC,UAAA,wEACAC,YAAA,wDACAC,SAAA,8FACAC,kBAAA,kCACAC,SAAA,kFACAC,iBAAA,4FACAC,SAAA,2FACAC,aAAA,+BACAC,QAAA,SACAC,aAAA,UACAC,kBAAA,+BACAC,iBAAA,kBACAC,YAAA,sBAEAxJ,QAAA,CACAtB,MAAA,wBACA/B,aAAA,yBACA8M,gBAAA,mCAGA5J,QAAA,CACAkF,KAAA,CACAgD,YAAA,yBACA2B,cAAA,2BACAC,aAAA,YACAC,SAAA,WACAC,iBAAA,6DACAC,iBAAA,wCACAC,OAAA,gBACAC,eAAA,cACAC,WAAA,iCACAC,UAAA,CACArwB,KAAA,4BACAE,OAAA,uBACAD,KAAA,iBACAqwB,YAAA,6BAGAC,KAAA,CACAC,eAAA,sFAGAvI,KAAA,CACAwI,MAAA,QACAC,gBAAA,oBACAC,OAAA,SACAC,QAAA,UACAC,aAAA,gBACAC,UAAA,kBACAlD,QAAA,UACAmD,aAAA,gBACAC,UAAA,iBACAC,WAAA,aACAC,IAAA,MACAC,cAAA,SACA1M,qBAAA,SACA2M,QAAA,aACAC,cAAA,mBACAC,cAAA,eACApG,KAAA,CACArG,MAAA,OACA0M,MAAA,eACAC,iBAAA,wBACAC,uBAAA,qCACAtE,YAAA,wBACAuE,YAAA,iBACAC,gBAAA,yBACAC,MAAA,CACAC,uBAAA,qFACAC,mBAAA,uDAIAlM,IAAA,CACAmM,YAAA,qCACAC,0BAAA,8HACAC,iBAAA,aACAC,uBAAA,oBACAC,iBAAA,+BACAC,uBAAA,6BACAC,uBAAA,eACAC,6BAAA,sBACAC,sCAAA,2BACAC,UAAA,aACAC,sBAAA,gCACAC,QAAA,SACAC,OAAA,aACAjC,gBAAA,2BACAkC,iBAAA,4BACAjB,gBAAA,yBACAkB,mBAAA,6BACAC,wBAAA,0EACAvH,kBAAA,0BACAwH,YAAA,YACAC,gBAAA,iBACAC,uBAAA,yBACAC,mBAAA,2BACAhI,KAAA,CACAiI,oBAAA,sBAEAlG,OAAA,CACApI,MAAA,qBACAuO,UAAA,mBACAC,gBAAA,oBACAC,QAAA,0BACAC,cAAA,oCACAC,WAAA,sCACAC,YAAA,kDACAC,cAAA,mBACAC,YAAA,0BACAjP,UAAA,gBACAC,gBAAA,gCACAiP,WAAA,iCACAC,aAAA,iBAEAC,SAAA,CACAjP,MAAA,YAEAkP,MAAA,CACAlP,MAAA,aAEAmP,eAAA,CACAnP,MAAA,2BACAoP,QAAA,wBACAC,KAAA,mCACAC,aAAA,0CACAC,SAAA,wBACAC,YAAA,oCACAzC,MAAA,kCACA0C,cAAA,mBAEAC,WAAA,CACA1P,MAAA,wBAEA2P,qBAAA,CACA3P,MAAA,kCACAoP,QAAA,wBACAC,KAAA,mCACAC,aAAA,0CACAM,KAAA,wBACAC,QAAA,oCACA9C,MAAA,oCAGA+C,MAAA,CACA9P,MAAA,4CACA+P,iBAAA,wGACAC,iBAAA,+CACAC,eAAA,kDACAC,eAAA,wCACAC,KAAA,qBACAC,UAAA,qBACAC,UAAA,kCACAC,SAAA,eACAC,cAAA,eACAC,YAAA,6BACAlS,oBAAA,qCACAmS,sBAAA,6BACAC,eAAA,qBACAC,oBAAA,+BACAC,aAAA,wBACAC,kBAAA,8BACAC,YAAA,kBACAC,iBAAA,wBACAC,qBAAA,WACAC,mBAAA,8DACAC,kBAAA,wBACAC,YAAA,CACAnR,MAAA,cACAkC,QAAA,sHACAkP,YAAA,iBACAC,aAAA,+CAEAC,OAAA,CACAC,eAAA,qCACAC,gBAAA,gBACA9yC,KAAA,uBACA1oB,OAAA,6BACAy7D,KAAA,sBAEAC,OAAA,CACAx8C,OAAA,eACAK,QAAA,kBACAo8C,OAAA,aACAC,QAAA,qBACAC,QAAA,iBACAC,KAAA,sBACA38C,EAAA,YACAC,EAAA,WACAC,EAAA,YAEAqJ,KAAA,CACAqzC,KAAA,2FAGAC,KAAA,CACAhS,MAAA,mDACAiS,SAAA,iBACAC,aAAA,+BACAC,kBAAA,gFACAC,qBAAA,2HACAlC,eAAA,gEAEAlP,QAAA,CACAhB,MAAA,aACAqS,QAAA,QACAC,QAAA,kCACAC,gBAAA,kBACAC,MAAA,qBACAC,aAAA,gBACAC,YAAA,gBACAC,aAAA,sDACAC,WAAA,wCACAC,cAAA,sCACAC,SAAA,6BACAC,cAAA,iCACAC,oBAAA,uCACAC,OAAA,aACAC,cAAA,8WACAC,mBAAA,wDACAC,uBAAA,gQACAC,4BAAA,sXACAC,4BAAA,8GACAC,2BAAA,+KACAC,sBAAA,yJACAC,sCAAA,2JACAC,sBAAA,sKACAC,oBAAA,wBACAC,0BAAA,iBACA9J,UAAA,0BACA+J,kBAAA,YACAC,mCAAA,sCACAC,mBAAA,oCACAC,qBAAA,wBACAC,0BAAA,2BACAC,wBAAA,wBACAC,kBAAA,wBACAC,iBAAA,gCACAC,uBAAA,CACArU,MAAA,qBACAsU,YAAA,yDACAC,iBAAA,oGACAC,cAAA,gCAEAC,IAAA,CACAzU,MAAA,qBACA0U,mBAAA,wNACAC,uBAAA,uIACAC,4BAAA,0FACAC,WAAA,4HACAC,kBAAA,wIACAC,uBAAA,6IACAC,oBAAA,yCACAC,eAAA,gBACAC,qBAAA,8BACAC,oBAAA,6NACAC,eAAA,sBACAC,qBAAA,6BACAC,oBAAA,kJACAC,aAAA,sMACAC,iBAAA,yMACAC,eAAA,0WACA3H,OAAA,aACA4H,YAAA,aACAC,aAAA,eACAC,kBAAA,uCACAC,iBAAA,eACAC,sBAAA,+BACAC,cAAA,iBACAC,iBAAA,qBACAC,0BAAA,kZACAC,4BAAA,+QACAC,4BAAA,2PACAC,gBAAA,kBACAC,iBAAA,wBACAC,qBAAA,4BACAC,aAAA,uGACAC,WAAA,YACAC,mBAAA,wBAEAC,eAAA,CACA1W,MAAA,2BACA+R,KAAA,sDAEA4E,sBAAA,CACA3W,MAAA,0BACA+R,KAAA,8MAEA6E,oBAAA,CACA5W,MAAA,6BAEA6W,YAAA,CACA7W,MAAA,oBACA8W,QAAA,0BACA7Y,aAAA,uBACA8Y,qBAAA,gCACAC,UAAA,gCACA3Z,WAAA,wCACA4Z,WAAA,2BACAC,gBAAA,6DACAC,WAAA,WACAC,aAAA,CACApX,MAAA,2BACA+R,KAAA,4BACAsF,UAAA,uBAEAC,aAAA,CACAtX,MAAA,6BACA+R,KAAA,uLACAwF,aAAA,wFACAC,cAAA,+BAGAC,SAAA,CACAC,aAAA,qCACAC,UAAA,QACAtS,UAAA,gBACAuS,gBAAA,wCACAC,qBAAA,sNACAC,iBAAA,sCACAC,sBAAA,6OACAC,iBAAA,oEACAC,cAAA,kCACAC,mBAAA,2LACAC,cAAA,0BACAC,mBAAA,+OACAC,WAAA,sHACAC,MAAA,qBACAC,UAAA,8DACAC,aAAA,6DACAC,WAAA,wEACAC,WAAA,yDACAC,WAAA,6DACAC,WAAA,wDACAC,WAAA,kEACAC,WAAA,oEACAC,WAAA,2CACAC,WAAA,qDACAC,WAAA,mDACAC,YAAA,sDACAC,YAAA,wFACAC,YAAA,4EACAC,YAAA,yDACAC,YAAA,4CACAC,YAAA,kDACAC,YAAA,kEACAC,YAAA,mDACAC,YAAA,sDACAC,YAAA,6CACAC,WAAA,gCACAC,gBAAA,4JACAC,uBAAA,8EACAC,qBAAA,gCACAC,iCAAA,8PACAC,0BAAA,uLACAC,kBAAA;AACAC,uBAAA,ySACAC,oBAAA,8DACAC,QAAA,kCACAC,aAAA,iNACAC,aAAA,6DACAva,MAAA,qBACAwa,QAAA,CACAC,cAAA,iBACAC,mBAAA,kQACAC,WAAA,yCACAC,gBAAA,yUACAC,YAAA,oDACAC,iBAAA,2QACAC,eAAA,CACA/a,MAAA,+BACA+R,KAAA,wCACAxB,cAAA,kBAEAxD,MAAA,CACAxvD,aAAA,4BACAyhB,aAAA,kCAIAg8C,UAAA,mGACAC,QAAA,CACAC,KAAA,OACAC,OAAA,UACA1/B,QAAA,gBAGA2/B,SAAA,CACApb,MAAA,WACAqb,UAAA,oBACAC,cAAA,kBACA3c,KAAA,KACAC,GAAA,IACAuc,OAAA,UACAI,YAAA,UACA9/B,QAAA,cACA+/B,aAAA,cACAvf,SAAA,UACAwf,gBAAA,yBACAC,KAAA,kBACAC,QAAA,IACAC,uBAAA,0EACA1M,MAAA,CACAlP,MAAA,aAGA+M,MAAA,CACA8O,mBAAA,uBACAC,wBAAA,wCACAC,YAAA,SACAC,cAAA,kBACAC,qBAAA,uFACAC,wBAAA,kDACAC,iBAAA,oCACAC,eAAA,8CACAC,eAAA,oBACAC,gBAAA,qBACAC,4BAAA,oDACAC,eAAA,qBACAC,2BAAA,oDACAC,UAAA,4BACAC,UAAA,4BACAC,aAAA,iDACAC,iBAAA,4BACAC,cAAA,0BACAC,gBAAA,2BACAC,uBAAA,oCACAC,mBAAA,2CACAC,qBAAA,yBACAC,0BAAA,4BACAC,+BAAA,wFACAC,wCAAA,4LACAC,gCAAA,wGACAC,aAAA,+BACAC,qBAAA,sCACAC,yBAAA,oDACAC,0BAAA,qDACAC,2BAAA,kCACAC,oBAAA,6CACAC,uBAAA,qDACAC,oBAAA,qEACAC,eAAA,qBACAC,iBAAA,kGACAC,mBAAA,yIACAC,wBAAA,yCACAC,0BAAA,gEACAC,uBAAA,mDACAC,sBAAA,iCACAC,oBAAA,wCACAC,YAAA,4BACAC,oBAAA,oBACAC,kBAAA,yBACAC,sBAAA,yEACAC,iBAAA,mCACAC,gBAAA,8BACAC,gBAAA,gCACAC,kBAAA,sBACAC,qBAAA,wCACAC,gBAAA,6EACAC,gBAAA,qEACAC,eAAA,6CACAC,wBAAA,8BACAC,iBAAA,0EACAC,2BAAA,2IACAC,4BAAA,+HACAC,4BAAA,mMACAC,iBAAA,2IACAriC,sBAAA,oNACAsiC,mBAAA,wBACAC,mBAAA,sCACAC,+BAAA,uBACAC,0BAAA,qOACAC,wBAAA,8KACAC,eAAA,6IACAC,mBAAA,yEACAC,cAAA,4BACAC,oBAAA,0EACAC,oBAAA,wCACAC,kBAAA,iCACAC,gBAAA,gDACAC,yBAAA,6IACAC,iCAAA,uKACAC,wBAAA,2BACAC,sBAAA,4CACAC,oBAAA,mDACAC,oCAAA,qEACAC,kDAAA,wFACAC,kCAAA,qFACAC,iBAAA,oCACAC,mBAAA,oCACAC,2BAAA,oDACAC,kBAAA,0BACAC,+BAAA,gDACAC,kBAAA,4CACAC,iBAAA,iCACAC,0BAAA,+DACAC,uBAAA,iEACAC,mBAAA,uDACAC,iBAAA,oIACAC,yBAAA,wFACAC,wBAAA,iDACAC,yBAAA,+FACAC,oBAAA,6IACAC,4BAAA,+CACAC,+BAAA,sDACAC,0BAAA,2DACAC,wBAAA,qDACAC,wBAAA,wDACAC,0BAAA,mJACAC,8BAAA,4CACAC,kBAAA,mCACAC,2BAAA,0DACAC,oBAAA,8BACAC,kBAAA,sDAEA5W,KAAA,CACAqQ,YAAA,cACAwG,mBAAA,wBACAzD,kBAAA,qBACA0D,cAAA,kBACAC,uBAAA,8BACAC,oBAAA,sBACAC,oBAAA,yBACAC,qCAAA,iGACAC,yBAAA,uGACAC,2BAAA,6QACAC,gBAAA,qBACAC,gCAAA,yFACAC,yBAAA,iJACAC,iBAAA,+BAEAC,QAAA,CACApH,YAAA,sBACAqH,oBAAA,uBACAC,6BAAA,0EACAC,wBAAA,oBACAC,cAAA,ybACAC,WAAA,0CACAC,SAAA,yBACArI,SAAA,sQACAsI,aAAA,iVACAC,eAAA,oHACAC,iBAAA,qIACAC,0BAAA,qBACAC,oBAAA,uOACAC,aAAA,yKACAC,eAAA,gHACAC,WAAA,+GACAC,iBAAA,wGACAC,gBAAA,oQACAC,kBAAA,kIACAC,0BAAA,2LACAC,kBAAA,8EACAC,wBAAA,iCACAC,OAAA,8CACAC,kBAAA,6HACAC,mBAAA,uSAEAC,KAAA,CACAC,KAAA,CACAC,MAAA,OACAF,KAAA,qBACAG,sBAAA,qEACAC,UAAA,0IACAC,aAAA,8MAEAC,SAAA,CACAJ,MAAA,QACAF,KAAA,kBACAI,UAAA,oHACAC,aAAA,yQAGAE,SAAA,CACAnJ,YAAA,+BACAoJ,qBAAA,qSAEApT,KAAA,CACA/R,MAAA,gBACAolB,KAAA,CACAC,QAAA,cACAlV,KAAA,6hBACAG,SAAA,0fACAxC,OAAA,qbAEAgC,MAAA,CACAuV,QAAA,YACArvE,OAAA,4BACAsvE,WAAA,6hBACAhU,OAAA,wBACAiU,WAAA,quBAEAC,SAAA,CACAH,QAAA,YACAC,WAAA,gYACA1pB,OAAA,SACA6pB,WAAA,iRACAC,eAAA,uBACAC,mBAAA,shBACAxf,WAAA,gEACAyf,eAAA,uSACAC,uBAAA,unBACA9kB,IAAA,2BACA+kB,QAAA,+HACAC,cAAA,oBACAC,kBAAA,2PAEAC,IAAA,CACAC,kBAAA,sHACAC,aAAA,6GACAC,cAAA,wPACAC,uBAAA,6VACAC,qBAAA,yQACAC,iCAAA,2SACAb,eAAA,8LACAc,iBAAA,0FACAC,mBAAA,4LACAC,cAAA,gOACAC,2BAAA,kPACAC,0BAAA,2QACAC,iBAAA,6FACAC,wBAAA,mFACAC,sBAAA,iFACAC,+BAAA,4EACAC,4BAAA,4EACAC,eAAA,iDACAC,wBAAA,+WACAC,2BAAA,6RACAC,cAAA,kIACAC,YAAA,2CACAC,qBAAA,qFACAC,eAAA,oHACAC,sBAAA,gEACAC,eAAA,yMACAC,kBAAA,iMACAC,iBAAA,iHACAC,YAAA,4IACAC,aAAA,6HACAC,mBAAA,iKACAC,gBAAA,qLACAC,kBAAA,6EACAC,wBAAA,kQACAC,8BAAA,mHACAC,8BAAA,6GACAC,iBAAA,0GACA9E,cAAA,6LACA+E,kBAAA,yFACAC,uBAAA,8DACAC,qBAAA,8WACAC,UAAA,mIACAC,cAAA,iNACAC,aAAA,kGAGAtc,IAAA,CACA7Q,OAAA,CACAotB,SAAA,oBACAC,cAAA,sCACAC,kBAAA,oBACAC,uBAAA,iEACAlmB,iBAAA,8IAEA/B,KAAA,CACAd,MAAA,oDACAkC,QAAA,gMACA8mB,cAAA,oGACAC,WAAA,0BAEA7N,SAAA,CACApb,MAAA,sDACAkpB,YAAA,oBACA9Z,QAAA,8BACA+L,OAAA,YACAgO,aAAA,gCACAC,KAAA,QACApzE,OAAA,iCACAylC,QAAA,6BACA4tC,KAAA,oBACAzE,KAAA,CACAzU,KAAA,OACAG,SAAA,OACAt6D,OAAA,+CACA+7D,KAAA,qOACAuX,gBAAA,iKAEA5d,KAAA,CACA6d,8BAAA,2DACAC,oBAAA,8DACAC,6BAAA,2DACAC,mBAAA,+DAEA3c,MAAA,CACA4c,gBAAA,sBAGAC,IAAA,CACAC,oBAAA,cACAC,YAAA,kBACAC,mBAAA,aACAC,qBAAA,4CACAC,aAAA,SACAC,UAAA,+FACAC,YAAA,kCACAC,iBAAA,4BACAC,aAAA,8CACAC,eAAA,2DACAC,kBAAA,WACAC,eAAA,SACAC,iBAAA,iCACAC,qBAAA,aACAtP,SAAA,CACApb,MAAA,YACAsU,YAAA,8LACAqW,aAAA,+BACAC,kBAAA,6CACAC,aAAA,UACAC,kBAAA,gJACAC,cAAA,6BACAC,mBAAA,oGACAC,WAAA,uCACAC,gBAAA,0JACAC,mBAAA,6BACAC,wBAAA,6OACAC,iBAAA,2BACAC,sBAAA,4LACAC,qBAAA,0BACAC,0BAAA,6GACAC,cAAA,qCACAC,eAAA,cACAC,4BAAA,uCACAC,6BAAA,qBACAC,yBAAA,kBACAC,wBAAA,kBACAC,6BAAA,wDACAC,0BAAA,mBACAC,+BAAA,4CACAC,yBAAA,QACAC,0BAAA,UACAC,+BAAA,uBACAC,yBAAA,SACAC,4BAAA,eACAC,2BAAA,cACAC,6BAAA,UACAC,6BAAA,sBAOAlxB,EAAA73B,aAAA,QAAA,CACA83B,OAAA,CACAC,SAAA,SACAC,YAAA,eACAC,UAAA,kBACA3lD,OAAA,iBACA4lD,OAAA,SACAC,MAAA,SACAC,OAAA,KACAC,QAAA,KACAC,OAAA,KACAC,SAAA,UACAC,eAAA,mBACAC,qBAAA,aACAC,SAAA,UACAC,aAAA,cACAC,iBAAA,iBACAC,SAAA,WACAC,gBAAA,2BACAC,kBAAA,wBACAC,SAAA,WACAC,SAAA,SACAC,WAAA,eACAC,WAAA,aACAC,UAAA,WACAC,UAAA,YACAC,UAAA,SACAC,WAAA,UACAC,gBAAA,cACAC,UAAA,cACAC,SAAA,aACAC,WAAA,YACAC,QAAA,aACAC,WAAA,UACAC,YAAA,aACAC,UAAA,YACAC,UAAA,WACAC,aAAA,aACAC,WAAA,SACAC,eAAA,YACAC,YAAA,UACAC,cAAA,2BACAC,qBAAA,0BACAC,aAAA,YACAC,+BAAA,2BACAC,WAAA,aACAC,YAAA,mDACAC,KAAA,SACAC,oBAAA,4CACAC,iBAAA,2BACAC,QAAA,eACAC,aAAA,2EACAC,UAAA,cACAC,KAAA,KACAC,GAAA,IACAC,KAAA,UACAC,SAAA,SACAC,mBAAA,uBACA1L,GAAA,KACAllB,aAAA,mBACA6wB,kBAAA,aACAC,mBAAA,WACAC,wBAAA,UACAC,kBAAA,UACAC,IAAA,aACAC,OAAA,WACAC,QAAA,cACAC,aAAA,aACAC,cAAA,sBACAC,eAAA,4CACAC,YAAA,uCACAC,sBAAA,UACAC,qBAAA,SACAC,UAAA,kBACAC,gBAAA,gCACAC,cAAA,CACAC,MAAA,cACAC,iBAAA,yBACAC,kBAAA,0BACAC,kBAAA,2BACAC,oBAAA,0BAEA1hC,KAAA,CACA2hC,KAAA,QACAC,KAAA,QACAC,KAAA,uBACAC,WAAA,4BAGAC,OAAA,CACAC,oBAAA,qBACAC,oBAAA,WACAC,mBAAA,iBAEAC,KAAA,CACAC,KAAA,OACAC,IAAA,WACAvlB,SAAA,SACAwlB,QAAA,YACAC,QAAA,oBACAC,SAAA,eACAC,QAAA,OACAC,aAAA,kBAEAC,MAAA,CACArB,MAAA,cACAsB,QAAA,mDACAG,KAAA,mBACAC,kBAAA,kBACAC,WAAA,gBACAC,MAAA,SACAC,oBAAA,oDACAC,aAAA,oBAEAhB,KAAA,CACAd,MAAA,SACAgC,QAAA,6BACAC,iBAAA,yEACAC,QAAA,qDACAC,iBAAA,uEACAC,aAAA,8CACAC,UAAA,cACAC,SAAA,QACAC,YAAA,mBACAC,cAAA,gBACAC,QAAA,WACAC,aAAA,iBACAZ,aAAA,mBACAa,0BAAA,yFACAC,mBAAA,4BACAC,iBAAA,oMACAC,cAAA,eACAC,UAAA,eACAC,YAAA,SAEA9B,SAAA,CACAlB,MAAA,eACAiD,gBAAA,UACAC,gBAAA,gBACAC,iBAAA,OACAC,KAAA,yBACAC,WAAA,iBACAC,uBAAA,2CACAC,cAAA,gDACAE,kBAAA,0BACAC,uBAAA,uCACAI,eAAA,8BACAE,kBAAA,2BACAC,iBAAA,YACAC,mBAAA,+BACAG,wBAAA,iBACAC,UAAA,+BACAC,gBAAA,WACAC,eAAA,kEACAC,iBAAA,CACAC,MAAA,uBACAC,QAAA,+BACAC,OAAA,gCACAC,QAAA,iCACAC,KAAA,+BACAC,OAAA,4BAEAG,YAAA,oBACAC,iBAAA,uFACAC,iBAAA,aACAC,UAAA,gCACAC,YAAA,6BACAC,iBAAA,kCACAM,WAAA,CACA7F,MAAA,eACA8F,KAAA,YACAC,UAAA,yBACAC,QAAA,eACAC,aAAA,mBACAC,cAAA,oBAGAC,WAAA,CACAC,KAAA,iBACAC,KAAA,CACAC,aAAA,yCACAC,cAAA,iBACAvG,MAAA,mCACAwG,YAAA,eACAC,SAAA,uBACAC,kBAAA,wBACA9nC,QAAA,uBACAwnC,KAAA,iBACAO,wBAAA,6DACAC,MAAA,+BACAC,QAAA,sBACAC,aAAA,0CACAC,aAAA,OACAC,iBAAA,iBACAC,cAAA,eACAC,cAAA,UACAC,mBAAA,yDACAC,cAAA,GACAC,mBAAA,gDACAC,eAAA,iBACAC,oBAAA,oGACAC,cAAA,oBACAC,mBAAA,mDACAC,SAAA,cACAC,WAAA,iBACAC,cAAA,SACAC,4BAAA,uBACAC,mBAAA,CACAC,IAAA,IACAC,GAAA,KAEAhqB,mBAAA,CACAhD,IAAA,oCACAitB,IAAA,oCACAC,IAAA,eACAC,KAAA,oBAGAC,OAAA,CACApI,MAAA,UACAqI,SAAA,gBACAC,YAAA,kBACAC,YAAA,YAGA/sB,SAAA,CACA6qB,KAAA,CACArG,MAAA,SACAwI,aAAA,SACAC,QAAA,eACAC,YAAA,OACAC,WAAA,UACAC,2BAAA,8PACAC,sBAAA,oBACAC,cAAA,oBACAC,QAAA,mBACAC,kBAAA,8DACAC,cAAA,SACAC,KAAA,kBACAC,MAAA,mBACA9V,GAAA,uBACA+V,SAAA,mBACAC,YAAA,0BACAxC,QAAA,qBACAyC,oBAAA,sBACAC,OAAA,gCACAC,QAAA,iCACAC,UAAA,wCACAC,cAAA,SACAC,gBAAA,2FACAC,gBAAA,wCACAC,aAAA,0DACAC,UAAA,wDACAC,WAAA,gEACAC,WAAA,8DACAC,aAAA,kEACAC,UAAA,qEACAC,YAAA,2DACAC,SAAA,gEACAC,kBAAA,4BACAC,SAAA,oFACAC,iBAAA,qEACAC,SAAA,8FACAC,aAAA,8BACAC,QAAA,UACAC,aAAA,UACAC,kBAAA,4BACAC,iBAAA,mBACAC,YAAA,gBAEAxJ,QAAA,CACAtB,MAAA,kBACA/B,aAAA,oBACA8M,gBAAA,kCAGA5J,QAAA,CACAkF,KAAA,CACAgD,YAAA,kBACA2B,cAAA,qBACAC,aAAA,qBACAC,SAAA,WACAC,iBAAA,6DACAC,iBAAA,0CACAC,OAAA,mBACAC,eAAA,kBACAC,WAAA,6BACAC,UAAA,CACArwB,KAAA,wBACAE,OAAA,uBACAD,KAAA,mBACAqwB,YAAA,sBAGAC,KAAA,CACAC,eAAA,2FAGAvI,KAAA,CACAwI,MAAA,aACAC,gBAAA,qBACAC,OAAA,WACAC,QAAA,WACAC,aAAA,iBACAC,UAAA,kBACAlD,QAAA,SACAmD,aAAA,eACAC,UAAA,gBACAC,WAAA,aACAC,IAAA,MACAC,cAAA,WACA1M,qBAAA,SACA2M,QAAA,WACAC,cAAA,iBACAC,cAAA,gBACApG,KAAA,CACArG,MAAA,OACA0M,MAAA,gBACAC,iBAAA,iCACAC,uBAAA,0CACAtE,YAAA,iBACAuE,YAAA,qBACAC,gBAAA,wBACAC,MAAA,CACAC,uBAAA,mEACAC,mBAAA,0CAIAlM,IAAA,CACAmM,YAAA,qCACAC,0BAAA,wIACAC,iBAAA,oBACAC,uBAAA,6BACAC,iBAAA,gCACAC,uBAAA,8BACAC,uBAAA,eACAC,6BAAA,sBACAC,sCAAA,yCACAC,UAAA,QACAC,sBAAA,kBACAC,QAAA,UACAC,OAAA,aACAjC,gBAAA,+BACAkC,iBAAA,gCACAjB,gBAAA,wBACAkB,mBAAA,mBACAC,wBAAA,0FACAvH,kBAAA,eACAwH,YAAA,cACAC,gBAAA,kBACAC,uBAAA,uBACAC,mBAAA,uBACAhI,KAAA,CACAiI,oBAAA,sBAEAlG,OAAA,CACApI,MAAA,WACAuO,UAAA,gBACAC,gBAAA,mBACAC,QAAA,yBACAC,cAAA,iCACAC,WAAA,yCACAC,YAAA,+CACAC,cAAA,gBACAC,YAAA,yBACAjP,UAAA,gBACAC,gBAAA,gCACAiP,WAAA,mCACAC,aAAA,kBAEAC,SAAA,CACAjP,MAAA,YAEAkP,MAAA,CACAlP,MAAA,WAEAmP,eAAA,CACAnP,MAAA,2BACAoP,QAAA,0BACAC,KAAA,yCACAC,aAAA,0BACAC,SAAA,0BACAC,YAAA,qCACAzC,MAAA,qCACA0C,cAAA,oBAEAC,WAAA,CACA1P,MAAA,wBAEA2P,qBAAA,CACA3P,MAAA,mCACAoP,QAAA,yBACAC,KAAA,wCACAC,aAAA,kBACAM,KAAA,yBACAC,QAAA,oCACA9C,MAAA,sCAGA+C,MAAA,CACA9P,MAAA,yCACA+P,iBAAA,kGACAC,iBAAA,oCACAC,eAAA,0CACAC,eAAA,4CACAC,KAAA,yBACAC,UAAA,yBACAC,UAAA,mCACAC,SAAA,WACAC,cAAA,WACAC,YAAA,8BACAlS,oBAAA,2BACAmS,sBAAA,sBACAC,eAAA,kBACAC,oBAAA,yBACAC,aAAA,2BACAC,kBAAA,mBACAC,YAAA,eACAC,iBAAA,qBACAC,qBAAA,SACAC,mBAAA,kEACAC,kBAAA,uBACAC,YAAA,CACAnR,MAAA,eACAkC,QAAA,sHACAkP,YAAA,SACAC,aAAA,wCAEAC,OAAA,CACAC,eAAA,uCACAC,gBAAA,oBACA9yC,KAAA,uBACA1oB,OAAA,2BACAy7D,KAAA,0BAEAC,OAAA,CACAx8C,OAAA,mBACAK,QAAA,oBACAo8C,OAAA,kBACAC,QAAA,sBACAC,QAAA,mBACAC,KAAA,0BACA38C,EAAA,YACAC,EAAA,WACAC,EAAA,YAEAqJ,KAAA,CACAqzC,KAAA,kGAGAC,KAAA,CACAhS,MAAA,iDACAiS,SAAA,eACAC,aAAA,gBACAC,kBAAA,sEACAC,qBAAA,4FACAlC,eAAA,uEAEAlP,QAAA,CACAhB,MAAA,YACAqS,QAAA,QACAC,QAAA,qBACAC,gBAAA,kBACAC,MAAA,sBACAC,aAAA,kBACAC,YAAA,iBACAC,aAAA,uDACAC,WAAA,uBACAC,cAAA,oCACAC,SAAA,2BACAC,cAAA,sBACAC,oBAAA,qCACAC,OAAA,SACAE,mBAAA,iEACAC,uBAAA,oFACAE,4BAAA,oHACAC,2BAAA,oJACAC,sBAAA,oJACAE,sBAAA,wKACAC,oBAAA,0BACAC,0BAAA,iBACA9J,UAAA,qCACA+J,kBAAA,WACAC,mCAAA,4BACAC,mBAAA,kCACAC,qBAAA,qBACAC,0BAAA,yBACAC,wBAAA,uBACAC,kBAAA,sBACAC,iBAAA,4BACAC,uBAAA,CACArU,MAAA,mBACAsU,YAAA,mDACAC,iBAAA,4FACAC,cAAA,6BAEAC,IAAA,CACAzU,MAAA,gBACA0U,mBAAA,oLACAC,uBAAA,sHACAC,4BAAA,6FACAC,WAAA,2HACAC,kBAAA,uHACAC,uBAAA,6HACAC,oBAAA,8BACAC,eAAA,eACAC,qBAAA,yBACAC,oBAAA,6EACAC,eAAA,uBACAC,qBAAA,wBACAC,oBAAA,0JACAC,aAAA,0LACAC,iBAAA,6KACAC,eAAA,kPACA3H,OAAA,aACA4H,YAAA,SACAC,aAAA,aACAC,kBAAA,sCACAC,iBAAA,aACAC,sBAAA,yBACAC,cAAA,YACAC,iBAAA,gBACAC,0BAAA,sWACAC,4BAAA,sOACAC,4BAAA,oMACAC,gBAAA,4BACAC,iBAAA,yBACAC,qBAAA,2BACAC,aAAA,4FACAC,WAAA,UACAC,mBAAA,sBAEAC,eAAA,CACA1W,MAAA,aACA+R,KAAA,oEAEA4E,sBAAA,CACA3W,MAAA,2BACA+R,KAAA,wLAEA6E,oBAAA,CACA5W,MAAA,6BAEA6W,YAAA,CACA7W,MAAA,yBACA8W,QAAA,wBACAE,UAAA,gCACA3Z,WAAA,wCACA4Z,WAAA,4BACAG,aAAA,CACApX,MAAA,4BACA+R,KAAA,wBACAsF,UAAA,yBAGAI,SAAA,CACAC,aAAA,oCACAC,UAAA,WACAtS,UAAA,QACAuS,gBAAA,4BACAC,qBAAA,yMACAQ,WAAA,sDACAC,MAAA,uBACAC,UAAA,6DACAC,aAAA,6DACAC,WAAA,kEACAC,WAAA,oDACAC,WAAA,mDACAC,WAAA,gDACAC,WAAA,+CACAC,WAAA,4DACAC,WAAA,yCACAC,WAAA,2CACAC,WAAA,gDACAC,YAAA,6CACAC,YAAA,6EACAC,YAAA,0EACAC,YAAA,kDACAC,YAAA,wCACAC,YAAA,qDACAC,YAAA,gDACAC,YAAA,8CACAC,YAAA,oDACAC,YAAA,0BACAC,WAAA,6BACAC,gBAAA,kIACAE,qBAAA,kCACAC,iCAAA,oPACAC,0BAAA,wLACAC,kBAAA,+BACAC,uBAAA,gSACAC,oBAAA,8DACAC,QAAA,8BACAC,aAAA,0MACAC,aAAA,6DACAva,MAAA,qBAEAgb,UAAA,oGACAC,QAAA,CACAC,KAAA,OACAC,OAAA,SACA1/B,QAAA,YAGA2/B,SAAA,CACApb,MAAA,WACAqb,UAAA,mBACA1c,KAAA,KACAC,GAAA,IACAuc,OAAA,UACAI,YAAA,UACA9/B,QAAA,WACA+/B,aAAA,WACAvf,SAAA,UACAwf,gBAAA,wBACAG,uBAAA,mEACA1M,MAAA,CACAlP,MAAA,aAGA+M,MAAA,CACA8O,mBAAA,0BACAE,YAAA,SACAC,cAAA,SACAC,qBAAA,6EACAE,iBAAA,qCACAC,eAAA,iDACAC,eAAA,sBACAC,gBAAA,uBACAC,4BAAA,oDACAC,eAAA,sBACAC,2BAAA,qDACAC,UAAA,0BACAC,UAAA,2BACAC,aAAA,wCACAC,iBAAA,yBACAC,cAAA,uBACAC,gBAAA,4BACAC,uBAAA,iCACAC,mBAAA,6CACAC,qBAAA,sBACAC,0BAAA,0BACAC,+BAAA,wFACAC,wCAAA,sHACAC,gCAAA,0GACAC,aAAA,mBACAC,qBAAA,wCACAC,yBAAA,qDACAC,0BAAA,8BACAC,2BAAA,sCACAC,oBAAA,yCACAC,uBAAA,mDACAC,oBAAA,uDACAC,eAAA,uCACAC,iBAAA,0GACAC,mBAAA,gJACAC,wBAAA,+CACAC,0BAAA,yEACAC,uBAAA,mDACAC,sBAAA,mCACAC,oBAAA,+BACAC,YAAA,wCACAC,oBAAA,2BACAC,kBAAA,mBACAC,sBAAA,qDACAC,iBAAA,6BACAC,gBAAA,sBACAC,gBAAA,mCACAC,kBAAA,sBACAC,qBAAA,yDACAC,gBAAA,6EACAC,gBAAA,6CACAC,eAAA,6CACAC,wBAAA,sBACAC,iBAAA,yEACAC,2BAAA,0IACAC,4BAAA,0IACAC,4BAAA,yNACAC,iBAAA,0HACAriC,sBAAA,mNACAsiC,mBAAA,uBACAC,mBAAA,qCACAC,+BAAA,uBACAC,0BAAA,iPACAC,wBAAA,uKACAC,eAAA,iHACAC,mBAAA,kFACAC,cAAA,6BACAC,oBAAA,uDACAC,oBAAA,wCACAC,kBAAA,kCACAC,gBAAA,4CACAC,yBAAA,6HACAC,iCAAA,+JACAC,wBAAA,0BACAC,sBAAA,uCACAC,oBAAA,mDACAC,oCAAA,mDACAC,kDAAA,qEACAC,kCAAA,kEACAC,iBAAA,iCACAC,mBAAA,mCACAC,2BAAA,qEACAC,kBAAA,uEACAC,+BAAA,8CACAC,kBAAA,qCACAC,iBAAA,+BACAC,0BAAA,yEACAC,uBAAA,oEACAC,mBAAA,4DACAC,iBAAA,6IACAC,yBAAA,0FACAC,wBAAA,6CACAC,yBAAA,mGACAC,oBAAA,sIAEAjW,KAAA,CACAqQ,YAAA,eACAwG,mBAAA,gCACAzD,kBAAA,sBACA0D,cAAA,mCACAC,uBAAA,uBACAC,oBAAA,+BACAC,oBAAA,iBACAC,qCAAA,8FACAG,gBAAA,+BACAC,gCAAA,qFACAC,yBAAA,gHACAC,iBAAA,mCAEAC,QAAA,CACApH,YAAA,kBACAqH,oBAAA,gBACAC,6BAAA,0EACAC,wBAAA,sBACAC,cAAA,8UACAnI,SAAA,2QACAuI,eAAA,yHACAC,iBAAA,4GACAC,0BAAA,uBACAC,oBAAA,qMACAC,aAAA,yKACAC,eAAA,uFACAC,WAAA,wHACAC,iBAAA,+DACAC,gBAAA,gPACAC,kBAAA,4GACAC,0BAAA,mLACAC,kBAAA,kEACAC,wBAAA,wBACAC,OAAA,8CACAC,kBAAA,wHACApC,oBAAA,2BACAC,kBAAA,uDAEAqC,KAAA,CACAC,KAAA,CACAC,MAAA,OACAF,KAAA,wBACAG,sBAAA,mEACAC,UAAA,wJACAC,aAAA,oLAEAC,SAAA,CACAJ,MAAA,QACAF,KAAA,2BACAI,UAAA,yHACAC,aAAA,yOAGAE,SAAA,CACAnJ,YAAA,4CACAoJ,qBAAA,2QAEApT,KAAA,CACA/R,MAAA,eACAolB,KAAA,CACAC,QAAA,qBACAlV,KAAA,ihBACAG,SAAA,saACAxC,OAAA,sYAEAgC,MAAA,CACAuV,QAAA,SACArvE,OAAA,4BACAsvE,WAAA,geACAhU,OAAA,wBACAiU,WAAA,ojBAEAC,SAAA,CACAH,QAAA,YACAC,WAAA,yJACA1pB,OAAA,SACA6pB,WAAA,oPACAC,eAAA,sBACAC,mBAAA,ihBACAxf,WAAA,aACAyf,eAAA,2SACAC,uBAAA,goBAEAI,IAAA,CACAC,kBAAA,iIACAC,aAAA,yFACAC,cAAA,iRACAC,uBAAA,iWACAC,qBAAA,uSACAC,iCAAA,+RACAb,eAAA,mOACAc,iBAAA,8FACAC,mBAAA,yIACAC,cAAA,wMACAC,2BAAA,iOACAC,0BAAA,8QACAC,iBAAA,gHACAC,wBAAA,uGACAC,sBAAA,+EACAC,+BAAA,iFACAC,4BAAA,6EACAC,eAAA,gDACAC,wBAAA,mWACAC,2BAAA,yRACAC,cAAA,2GACAC,YAAA,wBACAC,qBAAA,+DACAC,eAAA,0JACAC,sBAAA,6EACAC,eAAA,0MACAC,kBAAA,sLACAE,YAAA,oIACAC,aAAA,wGACAC,mBAAA,yKACAC,gBAAA,gLACAC,kBAAA,mFACAC,wBAAA,iRACAC,8BAAA,yHACAC,8BAAA,wGACAC,iBAAA,iHACA9E,cAAA,qLACA+E,kBAAA,gKACAC,uBAAA,uDACAC,qBAAA,iTACAC,UAAA,kFACAC,cAAA,kLACAC,aAAA,0FAGAtc,IAAA,CACA7Q,OAAA,CACAotB,SAAA,qBACAC,cAAA,oCACAC,kBAAA,oBACAC,uBAAA,gEAEAjoB,KAAA,CACAd,MAAA,qDACAkC,QAAA,gMACA8mB,cAAA,oGACAC,WAAA,0BAEA7N,SAAA,CACApb,MAAA,sDACAkpB,YAAA,mBACA9Z,QAAA,iCACA+L,OAAA,YACAiO,KAAA,QACApzE,OAAA,+BACAylC,QAAA,6BACAmpC,KAAA,CACAzU,KAAA,OACAG,SAAA,OACAt6D,OAAA,+CACA+7D,KAAA,qOACAuX,gBAAA,iKAEA5d,KAAA,CACA6d,8BAAA,2DACAC,oBAAA,8DACAC,6BAAA,2DACAC,mBAAA,+DAEA3c,MAAA,CACA4c,gBAAA,sBAGAC,IAAA,CACAC,oBAAA,cACAC,YAAA,qBACAC,mBAAA,eACAC,qBAAA,4CACAC,aAAA,UACAC,UAAA,kGACAC,YAAA,6BACAE,aAAA,gDACAC,eAAA,qDACAC,kBAAA,YACAC,eAAA,WACAC,iBAAA,iCACAC,qBAAA,YACAtP,SAAA,CACApb,MAAA,YACAsU,YAAA,2LACAqW,aAAA,mCACAC,kBAAA,kDACAC,aAAA,UACAC,kBAAA,0CACAC,cAAA,2BACAC,mBAAA,+FACAC,WAAA,wCACAC,gBAAA,sJACAC,mBAAA,+BACAC,wBAAA,gOACAC,iBAAA,oCACAC,sBAAA,2LACAG,cAAA,gCACAC,eAAA,eACAC,4BAAA,wCACAC,6BAAA,wBACAC,yBAAA,oBACAC,wBAAA,mBACAC,6BAAA,2DACAC,0BAAA,mBACAC,+BAAA,2CACAC,yBAAA,QACAC,0BAAA,YACAC,+BAAA,sBACAC,yBAAA,UACAC,4BAAA,eACAC,2BAAA,cACAC,6BAAA,UACAC,6BAAA,sBAOAlxB,EAAA73B,aAAA,QAAA,CACA83B,OAAA,CACAC,SAAA,SACAC,YAAA,eACAC,UAAA,kBACA3lD,OAAA,mBACA4lD,OAAA,MACAC,MAAA,OACAC,OAAA,KACAC,QAAA,KACAC,OAAA,MACAC,SAAA,YACAC,eAAA,gBACAC,qBAAA,YACAC,SAAA,UACAC,aAAA,cACAC,iBAAA,eACAC,SAAA,QACAC,gBAAA,eACAC,kBAAA,4BACAC,SAAA,QACAC,SAAA,WACAE,WAAA,WACAC,UAAA,QACAC,UAAA,QACAC,UAAA,YACAC,WAAA,YACAC,gBAAA,kBACAC,UAAA,QACAC,SAAA,WACAC,WAAA,SACAC,QAAA,YACAC,WAAA,SACAC,YAAA,iBACAE,UAAA,WACAC,aAAA,WACAE,eAAA,sBACAC,YAAA,SACAC,cAAA,cACAC,qBAAA,oBACAC,aAAA,aACAC,+BAAA,mCACAC,WAAA,WACAE,KAAA,QACAC,oBAAA,+BACAC,iBAAA,kBACAC,QAAA,iBACAE,UAAA,YACAC,KAAA,MACAC,GAAA,MACAC,KAAA,WACAC,SAAA,OACAC,mBAAA,sBACA1L,GAAA,KACAllB,aAAA,mBACA6wB,kBAAA,aACAC,mBAAA,WACAC,wBAAA,UACAC,kBAAA,SACAC,IAAA,aACAC,OAAA,cACAC,QAAA,gBACAC,aAAA,cACAC,cAAA,sBACAC,eAAA,8CACAC,YAAA,yBACAC,sBAAA,SACAC,qBAAA,UACAC,UAAA,YACAC,gBAAA,+BACAC,cAAA,CACAC,MAAA,QACAC,iBAAA,kBACAC,kBAAA,mBACAC,kBAAA,oBACAC,oBAAA,oBAGAK,OAAA,CACAC,oBAAA,kBACAC,oBAAA,WACAC,mBAAA,iBAEAC,KAAA,CACAC,KAAA,SACAC,IAAA,WACAvlB,SAAA,SACAkxC,WAAA,WACA1rB,QAAA,gBACAE,SAAA,eACAC,QAAA,UACAC,aAAA,oBAEAC,MAAA,CACArB,MAAA,OACAsB,QAAA,+CACAG,KAAA,YACAE,WAAA,iBACAC,MAAA,SACA+qB,YAAA,eACAC,oBAAA,2EACAC,0BAAA,+CACA/qB,aAAA,qBAEAhB,KAAA,CACAd,MAAA,SACAgC,QAAA,mCACAE,QAAA,+DACA4qB,aAAA,WACA1qB,aAAA,gBACAC,UAAA,OACAC,SAAA,OACAR,aAAA,oBACAa,0BAAA,mFACAC,mBAAA,2BACAC,iBAAA,qMAEA3B,SAAA,CACAlB,MAAA,eACAmD,iBAAA,UACAC,KAAA,0BACAE,uBAAA,kCACAG,kBAAA,4BACAC,uBAAA,+BACAI,eAAA,mCACAE,kBAAA,2BACAC,iBAAA,gBACAC,mBAAA,iCACAG,wBAAA,kBACAa,YAAA,cACAC,iBAAA,+DACAC,iBAAA,gBACAC,UAAA,gCACAC,YAAA,iCACAC,iBAAA,oBACAM,WAAA,CACA7F,MAAA,oBACA8F,KAAA,QACAC,UAAA,uBACAC,QAAA,UACAC,aAAA,kBACAC,cAAA,0BAGAC,WAAA,CACAC,KAAA,oBACAC,KAAA,CACAC,aAAA,uCACAC,cAAA,eACAvG,MAAA,iCACAwG,YAAA,8BACAC,SAAA,qBACAC,kBAAA,wBACA9nC,QAAA,gBACAwnC,KAAA,gBACAO,wBAAA,gEACAC,MAAA,oCACAC,QAAA,wBACAC,aAAA,0CACAC,aAAA,WACAC,iBAAA,sBACAC,cAAA,eACAC,cAAA,eACAC,mBAAA,2CACAC,cAAA,YACAC,mBAAA,4CACAC,eAAA,oBACAC,oBAAA,2EACAC,cAAA,2BACAC,mBAAA,2CACAC,SAAA,cACAC,WAAA,kBACAC,cAAA,YACAC,4BAAA,oCACAC,mBAAA,CACAC,IAAA,KACAC,GAAA,MAEAhqB,mBAAA,CACAhD,IAAA,uBACAitB,IAAA,oCACAC,IAAA,cACAC,KAAA,eAGAC,OAAA,CACApI,MAAA,UACAqI,SAAA,YACAC,YAAA,oBACAC,YAAA,YAGA/sB,SAAA,CACAuxC,OAAA,CACA/sB,MAAA,WACA0sB,WAAA,mBACAM,cAAA,0BAEA3mB,KAAA,CACArG,MAAA,SACAwI,aAAA,SACAC,QAAA,cACAC,YAAA,UACAI,cAAA,cACAC,QAAA,WACAC,kBAAA,+CACAC,cAAA,OACAC,KAAA,kBACAC,MAAA,kBACA9V,GAAA,sBACA+V,SAAA,kBACAC,YAAA,kBACAxC,QAAA,8BACAyC,oBAAA,mBACAC,OAAA,UACAC,QAAA,gCACAK,aAAA,iDACAC,UAAA,oDACAC,WAAA,oFACAC,WAAA,wEACAI,SAAA,uDACAC,kBAAA,qBACAG,SAAA,oFAGArJ,QAAA,CACAkF,KAAA,CACAgD,YAAA,kBACA2B,cAAA,iBACAC,aAAA,UACAO,UAAA,CACArwB,KAAA,iBACAE,OAAA,eACAowB,YAAA,kBAGAC,KAAA,CACAC,eAAA,sFAGAvI,KAAA,CACAwI,MAAA,SACAC,gBAAA,mBACAC,OAAA,UACAQ,cAAA,SACAjG,KAAA,CACArG,MAAA,QACA0M,MAAA,qBACAC,iBAAA,sBACAE,YAAA,mBACAC,gBAAA,sBACAC,MAAA,CACAC,uBAAA,wEACAC,mBAAA,yCAIAlM,IAAA,CACAmM,YAAA,mCACAC,0BAAA,kHACAC,iBAAA,cACAC,uBAAA,0BACAC,iBAAA,kCACAC,uBAAA,gCACAC,uBAAA,aACAC,6BAAA,2BACAC,sCAAA,8BACAC,UAAA,WACAC,sBAAA,6BACAC,QAAA,WACAC,OAAA,aACAjC,gBAAA,iCACAkC,iBAAA,iCACAjB,gBAAA,sBACAkB,mBAAA,8BACAC,wBAAA,wGACAvH,kBAAA,wBACAwH,YAAA,eACAC,gBAAA,mBACAC,uBAAA,sBACAC,mBAAA,2BACAhI,KAAA,CACAiI,oBAAA,wBAEAlG,OAAA,CACApI,MAAA,WACAuO,UAAA,gBACAE,QAAA,kBACAE,WAAA,4CACAC,YAAA,8CACAC,cAAA,iBACAC,YAAA,6BACAjP,UAAA,YACAC,gBAAA,gCACAiP,WAAA,oDACAC,aAAA,uCAEAE,MAAA,CACAlP,MAAA,UAEAmP,eAAA,CACAnP,MAAA,0BACAoP,QAAA,0BACAC,KAAA,sCACAC,aAAA,8BACAC,SAAA,0BACAC,YAAA,uCACAzC,MAAA,mCACA0C,cAAA,gBAEAE,qBAAA,CACA3P,MAAA,oCACAoP,QAAA,0BACAC,KAAA,sCACAC,aAAA,8BACAM,KAAA,0BACAC,QAAA,uCACA9C,MAAA,qCAGA+C,MAAA,CACA9P,MAAA,2CACAmQ,KAAA,kBACAC,UAAA,sCACAC,UAAA,0BACAC,SAAA,aACAC,cAAA,6CACAjS,oBAAA,qBACAoS,eAAA,oBACAE,aAAA,wBAEA5P,QAAA,CACAhB,MAAA,gBACAqS,QAAA,QACAC,QAAA,sBACAC,gBAAA,gBACAC,MAAA,mBACAC,aAAA,YACAC,YAAA,WACAC,aAAA,sDACAC,WAAA,4BACAE,SAAA,+BACAC,cAAA,wBACAka,kBAAA,wBACAha,OAAA,iBACAE,mBAAA,+DACAC,uBAAA,4EACAE,4BAAA,4GACAC,2BAAA,sLACAI,oBAAA,uBACAC,0BAAA,gBACA9J,UAAA,sCACA+J,kBAAA,YACAqZ,uBAAA,4BACAlZ,qBAAA,yBACAC,0BAAA,4BACAC,wBAAA,2BACAiZ,uBAAA,2BACAhZ,kBAAA,4BACAC,iBAAA,8BACAgZ,WAAA,kFACA3Y,IAAA,CACAzU,MAAA,cACAqtB,cAAA,wBACAC,cAAA,kBACArY,eAAA,uCACAE,oBAAA,wFACAC,eAAA,yBACAE,oBAAA,gMACAC,aAAA,iNACAC,iBAAA,6MACAC,eAAA,kQACA3H,OAAA,aACA4H,YAAA,SACAC,aAAA,WACAC,kBAAA,8BACAC,iBAAA,WACAC,sBAAA,0BACAC,cAAA,eACAC,iBAAA,gBACAC,0BAAA,iXACAC,4BAAA,iPACAC,4BAAA,wNACAE,iBAAA,2BACAC,qBAAA,0CACAC,aAAA,oFACAC,WAAA,eACAC,mBAAA,iCAEAC,eAAA,CACA1W,MAAA,yBACA+R,KAAA,gEAEAiJ,UAAA,iGACAC,QAAA,CACAC,KAAA,QACAC,OAAA,SACA1/B,QAAA,eAGA2/B,SAAA,CACApb,MAAA,aACAqb,UAAA,kBACA1c,KAAA,MACAC,GAAA,MACAuc,OAAA,SACAI,YAAA,SACA9/B,QAAA,YACA+/B,aAAA,wBACAvf,SAAA,YACAwf,gBAAA,sBACAG,uBAAA,8EACA1M,MAAA,CACAlP,MAAA,gBAGA+M,MAAA,CACAgP,YAAA,QACAC,cAAA,gBACAC,qBAAA,8DACAI,eAAA,0BACAC,gBAAA,qDACAC,4BAAA,iCACAC,eAAA,iCACAC,2BAAA,oDACAG,aAAA,2CACAC,iBAAA,wBACAC,cAAA,0BACAE,uBAAA,gCACAC,mBAAA,8BACAC,qBAAA,kCACAC,0BAAA,8BACAC,+BAAA,yFACAC,wCAAA,4IACAC,gCAAA,gFACAC,aAAA,uBACAC,qBAAA,2BACAC,yBAAA,wCACAC,0BAAA,8CACAC,2BAAA,6CACAC,oBAAA,4BACAC,uBAAA,qCACAC,oBAAA,2BACAC,eAAA,8BACAC,iBAAA,kFACAC,mBAAA,qHACAC,wBAAA,4CACAC,0BAAA,oDACAC,uBAAA,mCACAC,sBAAA,8BACAC,oBAAA,yBACAC,YAAA,0BACAC,oBAAA,uBACAC,kBAAA,iBACAC,sBAAA,mDACAC,iBAAA,wBACAC,gBAAA,sBACAC,gBAAA,+BACAC,kBAAA,qBACAC,qBAAA,sCACAC,gBAAA,oEACAC,gBAAA,sCACAC,eAAA,+BACAK,4BAAA,uMACAC,iBAAA,sFACAriC,sBAAA,uIACAwiC,+BAAA,wBACAC,0BAAA,iOACAC,wBAAA,gKACAE,mBAAA,iEACAM,yBAAA,oIACAC,iCAAA,uJACAC,wBAAA,oBACAC,sBAAA,8BACAC,oBAAA,wCACAC,oCAAA,+DACAE,kCAAA,gFACAW,iBAAA,6HACAC,yBAAA,0FAEA9V,KAAA,CACAqQ,YAAA,aACAwG,mBAAA,gCACAzD,kBAAA,sBACA0D,cAAA,6CACAC,uBAAA,iBACAC,oBAAA,6CACAC,oBAAA,kBACAC,qCAAA,gHACAG,gBAAA,iCACAC,gCAAA,qEACAuK,8BAAA,8OACArK,iBAAA,+BAEAC,QAAA,CACApH,YAAA,qBACAqH,oBAAA,sBACAE,wBAAA,sBACAC,cAAA,6ZACAnI,SAAA,6QACAuI,eAAA,iLACAE,0BAAA,YACAC,oBAAA,6PACAC,aAAA,yKACAC,eAAA,uFACAE,iBAAA,2EACAC,gBAAA,wPACAC,kBAAA,sGACAC,0BAAA,+LACAC,kBAAA,kEACAC,wBAAA,8BACAiJ,QAAA,sEAEAtI,SAAA,CACAnJ,YAAA,6BACAoJ,qBAAA,kRAEApT,KAAA,CACA/R,MAAA,cACAolB,KAAA,CACAC,QAAA,OACAlV,KAAA,qfACAG,SAAA,2aACAxC,OAAA,4VAEA0X,SAAA,CACAH,QAAA,WACAC,WAAA,sJACA1pB,OAAA,SACA6pB,WAAA,uPACAC,eAAA,iBACAC,mBAAA,4gBACAxf,WAAA,aACAyf,eAAA,wRACAC,uBAAA,8jBAEAI,IAAA,CACAC,kBAAA,0GACAC,aAAA,6EACAC,cAAA,sPACAC,uBAAA,gWACAC,qBAAA;AACAC,iCAAA,yOACAb,eAAA,4MACAe,mBAAA,oIACAC,cAAA,2NACAC,2BAAA,gNACAC,0BAAA,0QACAC,iBAAA,sGACAC,wBAAA,yFACAC,sBAAA,gFACAG,eAAA,6CACAC,wBAAA,kWACAC,2BAAA,uQACAE,YAAA,wCACAC,qBAAA,mFACAC,eAAA,qJACAC,sBAAA,qDACAC,eAAA,sLACAC,kBAAA,2LACAG,aAAA,0GACAC,mBAAA,6IACAC,gBAAA,mJACAC,kBAAA,qDACAC,wBAAA,iQACAC,8BAAA,2HACAC,8BAAA,wFACAC,iBAAA,uGACA9E,cAAA,4LACA+E,kBAAA,oLACAC,uBAAA,gDACAC,qBAAA,qTACAC,UAAA,mFACAC,cAAA,gLC/7MA10E,QAAA6Q,OAAA,aAAA,CAAA,QAAA,iBAAA,aAAA,yBAAA,QAAA,gBACA,sBAAA,4BACA,iBAAA,gBAAA,kBAAA,mBAAA,sBAAA,oBAEA,kBAAA,2BAAA,2BAAA,4BAGAjG,OAAA,CAAA,iBAAA,qBAAA,SAAAu8C,EAAAsyB,GAEAtyB,EAEAv2C,MAAA,MAAA,CACAulB,IAAA,OACAujD,UAAA,EACAnvE,YAAA,0BACAuvB,WAAA,YAGAlpB,MAAA,WAAA,CACAulB,IAAA,mCACAd,MAAA,CACA+xB,YAAA,CACA78C,YAAA,0BACAuvB,WAAA,iBAKAlpB,MAAA,MAAA,CACAulB,IAAA,MACAujD,UAAA,EACAnvE,YAAA,0BACAuvB,WAAA,YAGAlpB,MAAA,eAAA,CACAuoB,OAAA,EACAhD,IAAA,kGACAd,MAAA,CACA+xB,YAAA,CACA78C,YAAA,8BACAuvB,WAAA,sBAMA2/C,EAAAE,UAAA,gBAGA7/C,WAAA,UAAA,CAAA,SAAA,SAAA,aAAA,gBAAA,UAAA,SAAA,aAAA,SAAAl6B,EAAAoL,EAAAkG,EAAAxQ,EAAAK,EAAAE,EAAAE,GAIAvB,EAAAuR,QAAAnR,QAAA+I,KAAA5H,EAAAgQ,SAEAvR,EAAAg6E,eAAA,SAAA1uE,GACAA,EAAAmxB,iBACAp7B,EAAA86B,aAGAn8B,EAAA8Q,SAAA,WACA1F,EAAA8D,GAAA,aAGAlP,EAAAi6E,eAAA,SAAAC,GACA5oE,EAAA8C,IAAA8lE,GACAl6E,EAAAm6E,qBACA54E,EAAAyC,KAAAuH,OAAAvO,EAAAiM,UAAAjJ,EAAAuR,QAAA,CAAApT,GAAA+7E,KAKAl6E,EAAAo6E,mBAAA,SAAA5vE,GACArJ,EAAAuJ,QAAAtF,KAAAoF,EAAA,CACAG,YAAA,qCACApB,MAAAvJ,EACA4K,YAAA,EACAC,UAAA,SAAAH,GACA1K,EAAAq6E,eAAA3vE,MAKA1K,EAAAm6E,mBAAA,WACAn6E,EAAAq6E,iBACAr6E,EAAAq6E,eAAA/1E,OACAtE,EAAAq6E,eAAA,UAKAngD,WAAA,aAAA,CAAA,SAAA,aAAA,SAAA,aAAA,OAAA,aAAA,SAAAl6B,EAAAmR,EAAA/F,EAAAkG,EAAAgpE,EAAAvuE,GAGA/L,EAAAO,SAAA,EACAP,EAAAu6E,aAAA,CACA17E,OAAA,+CACAmnC,OAAA,IACAiS,QAAA,YACAnuC,KAAA,iBACA0wE,oBAAA70E,EACA80E,aAAA,kEACAC,WAAA,sDAEA16E,EAAA26E,eAAA,CACAt2C,UAAA1+B,EACAi1E,gBAAA,EACAC,MAAA,CACA,CACAx3E,MAAA,6CAEA,CACAA,MAAA,+CACAo3C,SAAA,gCAEA,CACAp3C,MAAA,8CACAo3C,SAAA,wBAEA,CACAp3C,MAAA,gDACAo3C,SAAA,2BAEA,CACAp3C,MAAA,gDACAo3C,SAAA,kCAGA9pC,MAAA,CACA5D,QAAA,EACA6hB,KAAA,YACAksD,QAAA,UACAC,UAAA,QACAnqD,WAAAjrB,IAGA3F,EAAA26E,eAAAhqE,MAAA5B,KAAA/O,EAAA26E,eAAAE,MAAA,GACA76E,EAAAg7E,gBAAA7pE,EAAA8pE,SAAA7vE,EAAAorB,KAAA,eAAAp2B,QAAA+S,MAAA,GAAAnT,EAAAu6E,aAAA,CACA74E,MAAA,EACA+4E,aAAAtpE,EAAA8pE,SAAA,qDACAP,WAAAvpE,EAAA8pE,SAAA,uCAGAj7E,EAAAqE,MAAA,SAAAiH,EAAA0F,GACAhR,EAAAO,UAEAP,EAAAghB,OAAA,GACAhQ,EAAAxF,aAAAwF,EAAAxF,YAAAme,UACA3pB,EAAAghB,OAAA/I,KAAAjH,EAAAxF,YAAAme,SAEA3Y,EAAAxF,aAAAwF,EAAAxF,YAAAwV,SACAhhB,EAAAghB,OAAAhX,QAAAgH,EAAAxF,YAAAwV,QAEAhQ,EAAAxF,aAAAwF,EAAAxF,YAAAmO,SACA3Z,EAAAghB,OAAA/S,WAAA,GAEA+C,EAAAxF,aAAAwF,EAAAxF,YAAAsJ,OACA9U,EAAAghB,OAAAlM,KAAA9D,EAAAxF,YAAAsJ,MAGA/I,EAAAwD,MACA/L,MAAA,SAAAgL,GACA,OAAA8C,EAAA,+CAAA,CAAA9C,SAAAA,EAAA1E,UAEAtG,MAAA,SAAA03E,GACAl7E,EAAA26E,eAAAhqE,MAAAie,KAAAssD,EACAl7E,EAAAO,SAAA,EAGAP,EAAAm7E,iCAIAn7E,EAAAW,IAAA,mBAAAX,EAAAqE,OAGArE,EAAAm7E,0BAAA,WACA,IAAAn7E,EAAAO,QAAA,CAGA,IAEA8jC,EAFA9N,EAAAplB,EAAA8pE,SAAA7vE,EAAAorB,KAAA,eAAAx2B,EAAAu6E,cAIAv6E,EAAA26E,eAAAhqE,MAAA5D,QAOAs3B,EAAA,YAAA9N,EAAA,gHAEAv2B,EAAA26E,eAAAhqE,MAAAigB,QACAyT,GAAA,cAAArkC,EAAA26E,eAAAhqE,MAAAigB,MAAA,MAEA5wB,EAAA26E,eAAAhqE,MAAAmqE,UACAz2C,GAAA,qBAAArkC,EAAA26E,eAAAhqE,MAAAmqE,QAAA,MAEA96E,EAAA26E,eAAAhqE,MAAAoqE,YACA12C,GAAA,UAAArkC,EAAA26E,eAAAhqE,MAAAoqE,UAAA,MAEA12C,GAAA,OACArkC,EAAA26E,eAAAhqE,MAAA5B,MAAA/O,EAAA26E,eAAAhqE,MAAA5B,KAAA0rC,WACApW,GAAA,iDAAAlzB,EAAA8pE,SAAAj7E,EAAA26E,eAAAhqE,MAAA5B,KAAA0rC,SAAA,QAEApW,GAAA,OAAArkC,EAAA26E,eAAAhqE,MAAAie,KAAA,oBArBAyV,EAAA,YAAA9N,EAAA,mBACAplB,EAAA8pE,SADA,oCA0BAj7E,EAAA26E,eAAAt2C,MAAAA,IACArkC,EAAA26E,eAAAt2C,KAAAA,EACArkC,EAAAo7E,WAAA,+BAGAp7E,EAAAqH,OAAA,eAAArH,EAAAm7E,2BAAA,GACAn7E,EAAAqH,OAAA,uBAAArH,EAAAm7E,2BAAA,MAGAjhD,WAAA,kBAAA,CAAA,SAAA,aAAA,WAAA,cAAA,SAAA,KAAA,aAAA,UAAA,UAAA,gBAAA,MAAA,cAAA,UAAA,WAAA,aAAA,aAAA,aAAA,OAAA,WAAA,eAAA,SAAAl6B,EAAAmR,EAAAlR,EAAAC,EAAAkL,EAAAvK,EAAAyQ,EAAA4kC,EACAn1C,EAAAmuB,EAAA9tB,EAAAJ,EAAAG,EAAAG,EAAAC,EACA85E,EAAAtvE,EAAAgvC,EAAA56C,EAAAm7E,GAIA,IAAAtwE,EAAA1J,EAsJA,SAAAi6E,EAAAC,GACA,OAAA,IAAAC,YAAAD,GAAA,KAAAt1E,OAAAs3B,QAAA,IAAAzT,OAAA,QAAA,MAAA2xD,QAAA,GAtJA1wE,EAAAtJ,QACAsJ,EAAA5K,QAAA+I,KAAA6B,IACAtJ,MAAA,EACAsJ,EAAAC,UAAA,GAIA7K,QAAAC,OAAA9D,KAAA2D,EAAA,WAAA,CAAAF,OAAAA,EAAAsB,SAAA0J,KAEAhL,EAAAO,SAAA,EACAP,EAAAu6E,aAAA,CACAv0C,YAAArgC,EACAg2E,aAAAh2E,EACAsyC,aAAAtyC,EACA9G,YAAA8G,EACAmE,UAAAnE,EACA80E,kBAAA90E,EACA+0E,gBAAA/0E,EACAmP,UAAAnP,GAGA3F,EAAAqE,MAAA,SAAAiH,EAAA0F,GAGA,GAFAG,EAAAyqE,WAAA5qE,EAAAm0C,UAEAnlD,EAAAO,QAAA,CAEA,GAAAyQ,EAAAxF,aAAAwF,EAAAxF,YAAAw6B,OAAA,CACA,IAAAw1C,EAAAxqE,EAAAxF,YAAAw6B,OAAA9/B,OACAy1E,GAAA,IAAAH,EAAAx/D,QAAA,MAAAw/D,EAAA98E,MAAA,OACA,IAAA88E,EAAAx/D,QAAA,MAAAw/D,EAAA98E,MAAA,OACA,IAAA88E,EAAAx/D,QAAA,MAAAw/D,EAAA98E,MAAA,KACAi9E,GACA37E,EAAAu6E,aAAAoB,QAAAA,EAAAz4E,QAAA,SAAAC,EAAAq4E,GACA,IAAAx1C,EAAAu1C,EAAAC,GACA,OAAAx1C,EAAA,EAAA7iC,EAAAC,OAAA4iC,GAAA7iC,IACA,IACA,IAAAnD,EAAAu6E,aAAAoB,QAAA5+E,QACAiD,EAAAu6E,aAAAv0C,OAAAhmC,EAAAu6E,aAAAoB,QAAA,UACA37E,EAAAu6E,aAAAoB,SAGA37E,EAAAu6E,aAAAoB,QAAA3jE,QAIAhY,EAAAu6E,aAAAv0C,OAAAu1C,EAAAC,GAsBA,GAnBAxqE,EAAAxF,aAAAwF,EAAAxF,YAAA3M,SACAmB,EAAAu6E,aAAA17E,OAAAmS,EAAAxF,YAAA3M,QAEAmS,EAAAxF,aAAAwF,EAAAxF,YAAA1B,OACA9J,EAAAu6E,aAAAzwE,KAAAkH,EAAAxF,YAAA1B,MAEAkH,EAAAxF,aAAAwF,EAAAxF,YAAAysC,UACAj4C,EAAAu6E,aAAAtiC,QAAAjnC,EAAAxF,YAAAysC,SAEAjnC,EAAAxF,aAAAwF,EAAAxF,YAAAivE,eACAz6E,EAAAu6E,aAAAE,aAAAzpE,EAAAxF,YAAAivE,cAEAzpE,EAAAxF,aAAAwF,EAAAxF,YAAAkvE,aACA16E,EAAAu6E,aAAAG,WAAA1pE,EAAAxF,YAAAkvE,YAEA1pE,EAAAxF,aAAAwF,EAAAxF,YAAA9J,OACA1B,EAAA0B,MAAA,GAGAsP,EAAAxF,aAAAwF,EAAAxF,YAAAgvE,eAAA,CACA,IAEA39D,EADA,WAAA9b,EAAAqW,SAAAC,SAEAwkE,EAAA7qE,EAAAxF,YAAAgvE,eACAx7E,EAAA,4BAAAG,KAAA08E,GACA78E,IACA6d,EAAA,WAAA7d,EAAA,GACA68E,EAAA78E,EAAA,IAEA,IAAAP,EAAAo9E,EAAAn9E,MAAA,KACA,GAAAD,EAAA1B,QAAA,EAAA,CACA,IAAAugB,EAAA7e,EAAA,KAAAoe,EAAA,IAAA,IAQA,GAPA7c,EAAA8U,KAAA,CACAkoB,KAAAv+B,EAAA,GACA6e,KAAAA,EACAT,OAAAA,GAAA,KAAAS,IAIAtd,EAAA8U,KAAA+H,OAAA,CACA,IAAA/H,EAAA1U,QAAA+I,KAAAnJ,EAAA8U,MACAA,EAAA+H,QAAA,EACA/H,EAAAwI,KAAA,IACA/b,EAAAyC,KAAA83E,cAAAv6E,EAAAyC,KAAA83E,eAAA,GACAv6E,EAAAyC,KAAA83E,cAAA5/D,OAAA,EAAA,EAAApH,SAIA7N,QAAAC,KAAA,iEAAA8J,EAAAxF,YAAAgvE,gBAKA,OAAAx6E,EAAAqV,UAEArV,EAAAW,IAAA,mBAAAX,EAAAqE,OAGArE,EAAAqV,MAAA,WACA,IAAArV,EAAA+7E,SAeA,OAbA/7E,EAAA+7E,UAAA,EACA/7E,EAAAO,SAAA,EAGAP,EAAAS,QAAAT,EAAA8U,MAAA1T,EAAA0T,KAAA81B,KAAA5qC,EAAA8U,QACA7N,QAAAqB,MAAA,sCAAApG,OAAAlC,EAAA8U,KAAAkoB,KAAAh9B,EAAA8U,KAAAwI,OACAlc,EAAAwlC,OACAxlC,EAAA+H,KAAAnJ,EAAA8U,MACA9U,EAAA8U,KAAAmH,OAAA7a,EAAA6a,QAKAo/D,EAAAx0C,UACArjC,KAAAuI,EAAAwD,KACA/L,MAAA,SAAAgL,GACAxO,EAAAwO,SAAAA,EACAxO,EAAA8U,KAAAtG,EAAAsG,KACA9U,EAAAO,SAAA,EACAP,EAAAS,OAAA,EACAT,EAAA+7E,UAAA,EAEA7sD,EAAA2G,gBAGAjwB,OAAA,SAAA6B,GACAR,QAAAxG,MAAAgH,GAAAA,EAAAjJ,SAAAiJ,GACAzH,EAAAS,OAAA,EACAT,EAAAO,SAAA,EACAP,EAAA+7E,UAAA,EAGA,IAAAC,EAAA56E,EAAAsT,IAAAI,KAAA2kB,GAAApkB,MAAArV,GAAA,WACAA,EAAAqV,QACA2mE,WA4FAh8E,EAAAi8E,mBAAA,SAAAC,GACA,OAAA5qE,EAAA,CAAA,YAAA,6BACA9N,MAAA,SAAAssB,GACA,OAAAxe,EAAA,mBAAA,CACAwnC,KAAAojC,EAAAhsE,SAAAgsE,EAAAn5E,IAAAmzC,EAAA,eAAAA,CAAAgmC,EAAAr9E,QACAk6C,GAAA/4C,EAAAu6E,aAAAzwE,MAAAosC,EAAA,eAAAA,CAAAl2C,EAAAu6E,aAAA17E,QACAmnC,OAAAhmC,EAAAu6E,aAAAv0C,OAAA,IACA0Z,KAAAxJ,EAAA,aAAAA,CAAA/kC,EAAA3C,SAAA1E,MACAmuC,QAAAj4C,EAAAu6E,aAAAtiC,SAAA,IAAAj4C,EAAAu6E,aAAAtiC,QAAA/xC,OAAAnJ,OAAAiD,EAAAu6E,aAAAtiC,QAAAnoB,EAAA,iCAGAtsB,KAAArC,EAAA0H,MAAA4rB,UAGAz0B,EAAAm8E,UAAA,SAAAC,GACA,OAAAp8E,EAAAu6E,aAAAE,cAIAz6E,EAAAu6E,aAAAzwE,KAAAwH,EAAA,kDAAAtR,EAAAu6E,cAAAjpE,EAAA,0CACA9N,MAAA,SAAAhF,GACA,OAAA2C,EAAAZ,QAAA6E,KAAA,CAAA2qB,SAAAvxB,OAEAgF,MAAA,WACA,IAAA+yB,EAAAv2B,EAAAu6E,aAAAE,aASA,OAFAlkD,GADAA,GADAA,GADAA,GADAA,GADAA,EAAAA,EAAAiH,QAAA,cAAAx9B,EAAAu6E,aAAA17E,SACA2+B,QAAA,YAAA4+C,EAAA/9E,MAAA,KACAm/B,QAAA,eAAAx9B,EAAAu6E,aAAAtiC,SAAA,KACAza,QAAA,cAAAx9B,EAAAu6E,aAAAv0C,SAAAhmC,EAAAu6E,aAAAv0C,OAAA,KAAAhU,YAAA,KACAwL,QAAA,UAAA6+C,UAAAD,EAAAzuE,MACA6vB,QAAA,YAAA6+C,UAAAj7E,EAAA47B,KAAA,IAAA57B,EAAAkc,OAEAtd,EAAAs8E,cAAA/lD,EAAA,SAjBAp1B,EAAA+zB,MAAA9vB,KAAA,uBAqBApF,EAAAu8E,SAAA,WACA,OAAAv8E,EAAAu6E,aAAAG,YAMA16E,EAAAu6E,aAAAzwE,KAAAwH,EAAA,iDAAAtR,EAAAu6E,cAAAjpE,EAAA,yCACA9N,MAAA,SAAAhF,GACA,OAAA2C,EAAAZ,QAAA6E,KAAA,CAAA2qB,SAAAvxB,OAEAgF,MAAA,WACA,IAAA+yB,EAAAv2B,EAAAu6E,aAAAG,WAMA,OAFAnkD,GADAA,GADAA,EAAAA,EAAAiH,QAAA,cAAAx9B,EAAAu6E,aAAA17E,SACA2+B,QAAA,eAAAx9B,EAAAu6E,aAAAtiC,SAAA,KACAza,QAAA,cAAAx9B,EAAAu6E,aAAAv0C,SAAAhmC,EAAAu6E,aAAAv0C,OAAA,KAAAhU,YAAA,IAEAhyB,EAAAs8E,cAAA/lD,EAAA,UAhBAv2B,EAAA6B,SAAAyF,UAAA3B,OACA3F,EAAA6B,SAAAoD,cAAAU,KAmBA3F,EAAAs8E,cAAA,SAAA/lD,EAAAzpB,GACA,GAAAypB,EAEA,OAAAt2B,GAAA,WAWA,OATA0iB,OAAA65D,KAAA75D,OAAA65D,IAAAplE,SACAuL,OAAA65D,IAAAplE,SAAAof,KAAAD,EAEAkmD,QAAAA,OAAA/sE,UAAA+sE,OAAA/sE,SAAA0H,SACAqlE,OAAA/sE,SAAA0H,SAAAof,KAAAD,EAGA5T,OAAAvL,SAAAslE,OAAAnmD,GAEAp1B,EAAAZ,QAAA+D,SACAwI,GAAA,IAKA9M,EAAAgH,WAjKA,SAAAg1C,GAGA,IAAAA,EAAA,OAAAh8C,EAAAu8E,WAGA,IAAAv8E,EAAAu6E,aAAAv0C,SAAAhmC,EAAAu6E,aAAA17E,OAGA,OAFAmB,EAAA6E,KAAAiE,YAAA,EACA3H,EAAAZ,QAAA+D,OACAzD,EAAAgf,SAIA,IAAA7f,EAAA8rC,QAAA,CACA9rC,EAAA8rC,SAAA,SACA9rC,EAAAu6E,aAAA95E,MAEA,IAAA8M,EAAAvN,EAAA0B,KAAA45E,EAAA9sC,SAAAwN,GAAA77C,EAAAquC,SAAA,MAAAptC,GAEAD,EAAAZ,QAAA6E,OAEAmI,EAAA8H,MAAA,CAAAK,SAAA,IACAlS,MAAA,WACA,OAAA+J,EAAA7M,MAAA,CACA6B,MAAA,EACAy5C,SAAAA,EACAM,SAAA,EACA1Q,SAAA,EACAj+B,GAAA,CAAAZ,QAAA,QAGAvJ,MAAA,SAAA04E,GACA,GAAAA,EAKA,OAHAl8E,EAAAU,OAAA,EAEAS,EAAAZ,QAAA+D,OACAtE,EAAAi8E,mBAAAC,MAEA14E,MAAA,SAAAixB,GACA,GAAAA,EAGA,OAAAtzB,EAAAZ,QAAA6E,OACA5B,MAAA,WACA,IAAAwiC,EAAA3rB,SAAAra,EAAAu6E,aAAAv0C,QACA,OAAAz4B,EAAA2xC,SAAAl/C,EAAAu6E,aAAA17E,OAAAmnC,EAAAhmC,EAAAu6E,aAAAtiC,SAAA,MAEAz0C,MAAA,SAAA44E,GAGA,OADAj7E,EAAAZ,QAAA+D,OACA83E,KAEAx2E,OAAA,SAAA6B,GAEA,OADAtG,EAAA0E,SAAA1E,CAAAsG,IACA,QAGAjE,MAAA,SAAA44E,GACA,GAAAA,EACA,OAAAp8E,EAAAm8E,UAAAC,GAGAp8E,EAAA8rC,SAAA,KAGAlmC,OAAA,SAAA6B,GAEA,GAAAA,GAAA,cAAAA,EACA,OAAAzH,EAAAu8E,WAGA90E,GAAA,UAAAA,EACAzH,EAAA8rC,SAAA,GAGA9rC,EAAA8rC,SAAA,EACA3qC,EAAA0E,SAAA1E,CAAAsG,YAwFAggD,IAAA,CAAA,aAAA,SAAAlmD,GAGAA,EAAAyC,KAAAD,YAAA,EACAxC,EAAAyC,KAAA4C,iBAAA,EAEArF,EAAAyC,KAAAC,aAAA,MC9iBA7D,QAAA6Q,OAAA,oBAAA,IAGA0rE,UAAA,aAAA,WACA,MAAA,CACAC,QAAA,WACAC,KAAA,SAAAtzE,EAAAqG,EAAA9S,EAAAggF,GACAA,GAAAhgF,EAAAigF,YACAD,EAAAE,YAAAD,UAAA,SAAAE,GACA,OAAAA,GAAA1zE,EAAA2zE,MAAApgF,EAAAigF,YAGAxzE,EAAAlC,OAAAvK,EAAAigF,WAAA,WACAD,EAAAK,qBAQAR,UAAA,eAAA,WACA,MAAA,CACAC,QAAA,WACAC,KAAA,SAAAtzE,EAAAqG,EAAA9S,EAAAggF,GACAA,GAAAhgF,EAAAsgF,cACAN,EAAAE,YAAAI,YAAA,SAAAH,GACA,OAAAA,GAAA1zE,EAAA2zE,MAAApgF,EAAAsgF,cAGA7zE,EAAAlC,OAAAvK,EAAAsgF,aAAA,WACAN,EAAAK,qBAOAR,UAAA,eAAA,WACA,IAAAU,EAAA,IAAAtzD,OAAA,yBAEA,MAAA,CACA6yD,QAAA,WACAC,KAAA,SAAAtzE,EAAAqG,EAAA9S,EAAAggF,GACAA,IACAA,EAAAE,YAAAM,YAAA,SAAA1wE,GACA,OAAAkwE,EAAAS,SAAA3wE,IAAAywE,EAAAxzD,KAAAjd,UAOA+vE,UAAA,aAAA,WACA,IAAAa,EAAA,IAAAzzD,OAAA,YACA,MAAA,CACA6yD,QAAA,UACAC,KAAA,SAAAtzE,EAAAqG,EAAA6tE,EAAAX,GACAA,IACAA,EAAAE,YAAAU,UAAA,SAAA9wE,GACA,OAAAkwE,EAAAS,SAAA3wE,IAAA4wE,EAAA3zD,KAAAjd,UAOA+vE,UAAA,SAAA,WACA,IAAAgB,EAAA,IAAA5zD,OAAA,yIACA,MAAA,CACA6yD,QAAA,UACAC,KAAA,SAAAtzE,EAAAqG,EAAA6tE,EAAAX,GACAA,IACAA,EAAAE,YAAAY,MAAA,SAAAhxE,GACA,OAAAkwE,EAAAS,SAAA3wE,IAAA+wE,EAAA9zD,KAAAjd,UAOA+vE,UAAA,cAAA,WACA,MAAA,CACAC,QAAA,WACAC,KAAA,SAAAtzE,EAAAqG,EAAA9S,EAAAggF,GACAA,GAAAhgF,EAAA+gF,aACAf,EAAAE,YAAAc,SAAA,SAAAlxE,GACA,OAAArD,EAAA2zE,MAAApgF,EAAA+gF,cAAAf,EAAAS,SAAA3wE,IAGArD,EAAAlC,OAAAvK,EAAA+gF,YAAA,WACAf,EAAAK,qBAOAR,UAAA,YAAA,WACA,MAAA,CACAC,QAAA,WACAC,KAAA,SAAAtzE,EAAAqG,EAAA9S,EAAAggF,GACAA,IACAA,EAAAE,YAAAe,SAAA,SAAAnxE,GACA,OAAAkwE,EAAAS,SAAA3wE,IAEAxM,QAAAuC,UAAAiK,EAAAoxE,MAAA59E,QAAAuC,UAAAiK,EAAAqxE,MAEA79E,QAAAqM,YAAAG,EAAAoxE,MAAA59E,QAAAqM,YAAAG,EAAAqxE,YAQAtB,UAAA,cAAA,CAAA,UAAA,SAAA,UAAA,SAAA57E,EAAAS,EAAAL,GAEA,MAAA,CACA+8E,SAAA,IACArB,KAAA,SAAAtzE,EAAAqG,EAAA6tE,GACA,IAAAU,EAAA,SAAA3zE,GACA,IAAAoC,EAAA6wE,EAAAW,YACA,GAAAxxE,GAAApL,EAAA4gC,UAAAr1B,OAEAvL,EAAA4gC,UAAAj5B,KAAAyD,GACApJ,MAAA,WACArC,EAAA+zB,MAAA9vB,KAAA,kCAEAQ,MAAAzE,EAAA0E,QAAA,8BAEA,GAAA+G,EAAA,CACA,IAAAypB,EAAAzpB,GAAAA,EAAAoP,QAAA,OAAA,EAAApP,EAAAlO,MAAA,MAAA3B,OAAA,EACAoE,EAAAuJ,QAAAtF,KAAAoF,EAAA,CACAjB,MAAAA,EACAoB,YAAA,qCACAgC,SAAA,CACAC,MAAA6wE,EAAAW,YACA/nD,KAAAA,GAEA1E,WAAA,kBAAA0E,GAAA,EAAA,QAAA,gBAIAzmB,EAAA8f,KAAA,QAAAyuD,GACAvuE,EAAA8f,KAAA,OAAAyuD,QAMAxB,UAAA,gBAAA,CAAA,UAAA,SAAA57E,GAEA,MAAA,CACAm9E,SAAA,IACArB,KAAA,SAAAtzE,EAAAqG,EAAA6tE,GACA7tE,EAAA8f,KAAA,SAAA,WACA3uB,EAAAgxB,eAAAhxB,EAAAgxB,eAAAC,YAAAz1B,KAAAqQ,OACArQ,KAAA01B,kBAAA,EAAA11B,KAAAqQ,MAAA7P,gBAOA4/E,UAAA,aAAA,CAAA,YAAA,SAAA0B,GAEA,MAAA,CACAH,SAAA,IACArB,KAAA,SAAAtzE,EAAAqG,EAAA6tE,EAAAvjD,GACA,IACA3jB,EADA+nE,EAAAb,EAAAc,WAEAd,EAAAe,sBACAjoE,EAAAknE,EAAAe,qBAAAh/E,UAAA,GACA+J,EAAA6N,SAAAinE,EACA90E,EAAAlC,OAAA,mBAAA,SAAAo3E,GACAA,GAAA,IAAAA,EAAAziE,QAAAzF,GACA3G,EAAA8uE,SAAAJ,GAEA1uE,EAAA2iB,YAAA+rD,OAIAb,EAAAjnD,OACAjgB,EAAAknE,EAAAjnD,KAAAh3B,UAAA,GACA+J,EAAA6N,SAAAinE,EACA90E,EAAAlC,OAAA,mBAAA,SAAAo3E,GACAA,GAAAA,GAAAloE,EACA3G,EAAA8uE,SAAAJ,GAEA1uE,EAAA2iB,YAAA+rD,YAUA3B,UAAA,QAAA,CAAA,WAAA,SAAA18E,GACA,MAAA,CACAi+E,SAAA,IACA30E,MAAA,CACAo1E,YAAA,IACAC,SAAA,IACAC,QAAA,IACAC,OAAA,KAEAjC,KAAA,SAAAtzE,EAAAqG,EAAAmvE,GACAnvE,EAAA8f,KAAA,SAAA,SAAApkB,GACA/B,EAAAs1E,SACA5+E,GAAA,WACAsJ,EAAAs1E,gBAIAjvE,EAAA8f,KAAA,QAAA,SAAApkB,GACA/B,EAAAu1E,QACA7+E,GAAA,WACAsJ,EAAAu1E,eAIAlvE,EAAA8f,KAAA,WAAA,SAAApkB,GACA,IAAAA,EAAA0zE,QACAz1E,EAAAo1E,aAAA/uE,EAAA,GAAAqvE,OACA11E,EAAAq1E,UACA3+E,GAAA,WACAsJ,EAAAq1E,uBASAjC,UAAA,cAAA,CAAA,OAAA,WAAA,SAAA,SAAArC,EAAA4E,EAAAC,GACA,MAAA,CACAjB,SAAA,IACAkB,QAAA,SAAAC,EAAAC,GACA,IAAAC,EAAAJ,EAAAG,EAAAE,aACAC,EAAAN,EAAAG,EAAAE,aAAA,SAAA5yE,GACA,OAAAA,GAAA,IAAAolB,cAIA,OAFAktD,EAAAQ,kBAAAL,GAEA,SAAA91E,EAAAqG,EAAAmvE,GACAG,EAAAS,iBAAA/vE,EAAAmvE,EAAAS,aAEAj2E,EAAAlC,OAAAo4E,GAAA,WAGA7vE,EAAAy0B,KAAAi2C,EAAAsF,eAAAtF,EAAAkF,YAAAD,EAAAh2E,MAAA,IACA21E,EAAAtvE,EAAAiwE,WAAAX,CAAA31E,YAUAozE,UAAA,aAAA,CAAA,gBAAA,WAAA,SAAAztD,EAAAjvB,GACA,MAAA,CACAi+E,SAAA,KACArB,KAAA,SAAA78E,EAAA8/E,GACAA,EAAApwD,KAAA,SAAA,WACA1vB,EAAAgH,aACAkoB,EAAA6wD,gBAAA,CACAC,aAAA,EACAC,gBAAA,EACAC,OAAA,MAKAjgF,GAAA,WACAivB,EAAA6wD,gBAAA,CACAC,aAAA,EACAC,gBAAA,MAEA,KACAjgF,EAAAgH,sBAUA21E,UAAA,mBAAA,CAAA,SAAA,WAAA,cAAA,iBAAA,gBAAA,SAAAvxE,EAAA8zE,EAAAh/E,EAAAwnD,EAAAy4B,GAoCA,MAAA,CACAjC,SAAA,IACAkB,QAzBA,SAAAC,EAAAe,GAEA,GAAAhgF,QAAAuC,UAAAy9E,EAAAt2E,MAAA,CACA,IAAAu2E,EAAAF,EAAA16B,WAAAC,OAAAC,iBAAAy6B,EAAAt2E,MACAu2E,EAAAtjF,OAAA,IACAsiF,EAAAh7C,KAAA,IACArnC,EAAAN,QAAA2jF,GAAA,SAAAC,GACAjB,EAAAkB,OAnBA,SAAAD,GACA,IAAAvwD,EAAAuwD,EAAA31E,YAAA+8C,EAAAn4C,IAAA+wE,EAAA31E,aAAA21E,EAAAvwD,SACA,OAAAA,GAIAuwD,EAAApmD,aACAnK,EAAA,iCAAAuwD,EAAApmD,WAAA,KAAAnK,EAAA,UAEAA,IANA9oB,QAAAxG,MAAA,qDAAA6/E,EAAA31E,YAAA21E,EAAA31E,YAAA21E,EAAAvwD,WACA,IAeAywD,CAAAF,QAKA,MAAA,CACAG,IAAA,SAAAl3E,EAAAm3E,EAAAC,GACAR,EAAA16B,WAAAC,OAAA1oC,QAAA8G,IAAA68D,EAAA72E,OAEA+0B,KAAA,WACAshD,EAAA16B,WAAAC,OAAA1oC,QAAA8G,SASAva,MAAA,CACAS,QAAA,SAKA2yE,UAAA,aAAA,CAAA,SAAA,SAAAwC,GACA,MAAA,CACAjB,SAAA,IACA30E,OAAA,EACAszE,KAAA,SAAAtzE,EAAAqG,EAAA6tE,GACA,IAAAmD,EAAAzB,EAAA1B,EAAAoD,YAEAjxE,EAAA6pB,GAAA,UAAA,SAAAqnD,GACA,IAAA1zD,EAAA,IAAAvM,WACAhX,EAAA,CACAC,KAAAvN,KAAAwkF,MAAA,GAAAj3E,KACAC,KAAAxN,KAAAwkF,MAAA,GAAAh3E,KACAkO,KAAA1b,KAAAwkF,MAAA,GAAA9oE,MAGAmV,EAAAtM,OAAA,SAAAkgE,GACAz3E,EAAA03E,aAAA,WACAL,EAAAr3E,EAAA,CACAzD,KAAA,CACAmE,YAAA+2E,EAAAjgE,OAAAC,OACAnX,SAAAA,SAIAujB,EAAAnM,YAAA6/D,EAAAI,YAAAJ,EAAA//D,QAAAggE,MAAA,YAMApE,UAAA,WAAA,CAAA,SAAA,SAAAwC,GACA,MAAA,CACAjB,SAAA,IACA30E,OAAA,EACAszE,KAAA,SAAAtzE,EAAA43E,EAAA1D,GACA,IAAAmD,EAAAzB,EAAA1B,EAAA2D,UACAD,EAAAzxD,KAAA,YAAA,SAAApkB,GACAA,EAAA+1E,kBACA/1E,EAAAmxB,oBAEA0kD,EAAAzxD,KAAA,aAAA,SAAApkB,GACAA,EAAA+1E,kBACA/1E,EAAAmxB,oBAEA0kD,EAAAzxD,KAAA,aAAA,SAAApkB,GACAA,EAAA+1E,kBACA/1E,EAAAmxB,oBAEA0kD,EAAAzxD,KAAA,QAAA,SAAApkB,GACAA,EAAA+1E,kBACA/1E,EAAAmxB,iBACA,IAAA32B,EAAAwF,EAAAg2E,aAAAP,MAAA,GACAl3E,EAAA,CACAC,KAAAhE,EAAAgE,KACAC,KAAAjE,EAAAiE,KACAkO,KAAAnS,EAAAmS,MAGAmV,EAAA,IAAAvM,WACAuM,EAAAtM,OAAA,SAAAkgE,GACAz3E,EAAAg4E,QAAA,WACAX,EAAAr3E,EAAA,CACAzD,KAAA,CACAA,KAAAA,EACAmE,YAAA+2E,EAAAjgE,OAAAC,OACAnX,SAAAA,SAIAujB,EAAAnM,WAAA3V,EAAAg2E,aAAAP,MAAA,YAQApE,UAAA,aAAA,CAAA,SAAA,SAAAwC,GACA,aAEA,MAAA,CACAjB,SAAA,IACA30E,OAAA,EACAwmB,SAAA,8EAEAyxD,YAAA,EACA3E,KAAA,SAAAtzE,EAAAqG,EAAA6tE,GACA,IAAAmD,EAAAzB,EAAA1B,EAAAgE,YAEAC,EAAA9xE,EAAAg9B,SAAA,eAEA6wC,EAAAkE,SACAD,EAAA,GAAAC,OAAAlE,EAAAkE,QAGAD,EAAAjoD,GAAA,UAAA,SAAAqnD,GACA,IAAA1zD,EAAA,IAAAvM,WACA/a,EAAAvJ,KAAAwkF,MAAA,GACAl3E,EAAA,CACAC,KAAAhE,EAAAgE,KACAC,KAAAjE,EAAAiE,KACAkO,KAAAnS,EAAAmS,MAGAmV,EAAAtM,OAAA,SAAAkgE,GACAz3E,EAAA03E,aAAA,WACAL,EAAAr3E,EAAA,CACAzD,KAAA,CACAA,KAAAA,EACAmE,YAAA+2E,EAAAjgE,OAAAC,OACAnX,SAAAA,SAIAujB,EAAAnM,YAAA6/D,EAAAI,YAAAJ,EAAA//D,QAAAggE,MAAA,OAGAnxE,EAAA6pB,GAAA,SAAA,WACAioD,EAAA,GAAAE,gBASAjF,UAAA,mBAAA,CAAA,UAAA,aAAA,WAAA,SAAA57E,EAAAQ,EAAApB,GACA,MAAA,CACA+9E,SAAA,KACArB,KAAA,SAAAjtE,EAAA6tE,IACA18E,EAAA8gF,aAAA9gF,EAAA+gF,kBACA/gF,EAAA8gF,YAAA,WAAA,UAEA,SAAAv2E,GACA,GAAA/J,EAAAyC,MAAAzC,EAAAyC,KAAAC,cAAA1C,EAAAY,UAAAgC,uBACA,OAAAhE,EAAAu8C,iBC3dAt8C,QAAA6Q,OAAA,iBAAA,CAAA,gBAAA,kBAAA,yBAAA,wBAGAC,QAAA,qBAAA,CAAA,aAAA,KAAA,aAAA,aAAA,aAAA,aAAA,WAAA,SAAAC,EAAAtQ,EAAAw6E,EAAA95E,EAAAwK,EAAAuF,EAAArR,GAGA,IAEAkS,EADAsC,GAAA,EAEAnY,EAAAC,KAKA,SAAAwlF,IAEA,OADA96E,QAAAqB,MAAA,iDAAApG,OAAAoP,EAAA8C,QACA9C,EAAA,CAAA,sBAAA,4BAAA,YAAA,gBACA9N,MAAA,SAAAssB,GACAxzB,EAAAi+B,aAAAzK,EAAA,uBACA,wBAAAxzB,EAAAi+B,eACAj+B,EAAAi+B,aAAA,oBAEAj+B,EAAA+uD,mBAAAv7B,EAAA,6BACA,8BAAAxzB,EAAA+uD,qBACA/uD,EAAA+uD,mBAAA,cAEA/uD,EAAAgvD,wBAAAx7B,EAAA,kCACA,mCAAAxzB,EAAAgvD,0BACAhvD,EAAAgvD,wBAAA,UAEAhvD,EAAAmuD,KAAA36B,EAAA,eACA,gBAAAxzB,EAAAmuD,OACAnuD,EAAAmuD,KAAA,QAEAnuD,EAAAmjD,GAAA3vB,EAAA,aACA,cAAAxzB,EAAAmjD,KACAnjD,EAAAmjD,GAAA,SAMA,SAAAuiC,IACA/6E,QAAAqB,MAAA,yDACAhM,EAAA2lF,mBAAAl2E,EAAA/H,KAAAihC,kBAAA3oC,EAAA2lF,mBA2BA,OA5DA3lF,EAAA2lF,mBAAA,KAoCA3lF,EAAAwZ,MAAA,WACA,OAAArB,EAAA5T,EAAAsH,OACAgK,GAAA7V,EAAA+Y,SAGA/Y,EAAA+Y,MAAA,WAUA,OATAlD,EAAAkpE,EAAAvlE,QACAtS,KAAAu+E,GACAv+E,MAAA,WACAw+E,IACAvtE,GAAA,EAEAlT,EAAAmT,IAAAnJ,OAAAkuB,GAAA5kB,QAAA1D,EAAA4wE,EAAAxlF,MACAwP,EAAA2I,IAAA1Q,KAAAy1B,GAAA3jB,MAAA3E,EAAA6wE,EAAAzlF,UAOA0D,GAAA,WACA3D,EAAA+Y,WAGA/Y,KAGAmb,OAAA,iBAAA,WACA,OAAA,SAAAwiC,GACA,OAAAA,EAAAA,EAAA,IAAAhkC,QAAAgkC,GAAA/3C,OAAA,OAAA+T,QAAAgkC,GAAA/3C,OAAA,aAAA,QAIAuV,OAAA,eAAA,CAAA,WAAA,aAAA,aAAA,UAAA,SAAAnW,EAAAC,EAAAwK,EAAAmqC,GACA,IAAAgsC,EAAA,QAAAC,MAAA7gF,EAAAqS,cAAA,GAAArV,KAAA,KAEA8jF,EAAAlsC,EAAA,kBAGAmsC,EAAAH,EAAA,IACAI,EAAA,EAAAnkE,KAAAC,IAAA,IAAA9c,EAAAqS,cAAA,GAAA,GA6BA,OAAA,SAAAsmC,EAAA7wC,GACA,QAAAzD,IAAAs0C,EACA,OAAA7wC,GAAAhJ,QAAAuC,UAAAyG,EAAA+F,aAAA/F,EAAA+F,YAAA5N,EAAAyC,KAAAmL,aA7BA,SAAA8qC,EAAA7wC,GACA,IAAA4G,EAAA5G,GAAAA,EAAA4G,UAAA5G,EAAA4G,UAAAjE,EAAA/H,KAAAgM,UACA,GAAAA,EAAA,CAIA,IAAAg2B,EAAAiU,EAAAjqC,EAOA,OALAg2B,EADA7nB,KAAAokE,IAAAtoC,GAAAqoC,GAAA,IAAAroC,EACA,MAGAhkC,QAAA+vB,GAAA9jC,OAAAmgF,GAEAj5E,GAAAA,EAAAoF,SACAw3B,EAAA,IAAAo8C,EAAAh5E,EAAAoF,UAAA,GAEAw3B,EAbA/+B,QAAAC,KAAA,uCA2BAs7E,CAAAvoC,EAAA7wC,GAXA,SAAA6wC,EAAA7wC,GACA,IAAA48B,EAAA/vB,QAAAgkC,EAAA,KAAA/3C,OAAA+3C,GAAA,KAAAA,EAAA,IA3BA,YA2BAioC,GACA,OAAA94E,GAAAA,EAAAoF,SACAw3B,EAAA,IAAAo8C,EAAAh5E,EAAAoF,UAAA,GAEAw3B,EAOAy8C,CAAAxoC,EAAA7wC,OAIAqO,OAAA,qBAAA,CAAA,WAAA,aAAA,aAAA,UAAA,SAAAnW,EAAAC,EAAAwK,EAAAmqC,GACA,IAAAwsC,EAAA,EAAAvkE,KAAAC,IAAA,GAAA9c,EAAAqS,cAAA,GACAzR,EAAA,QAAAigF,MAAA7gF,EAAAqS,cAAA,GAAArV,KAAA,KACA8jF,EAAAlsC,EAAA,wBA6BA,OAAA,SAAA+D,EAAA7wC,GACA,QAAAzD,IAAAs0C,EACA,OAAA7wC,GAAAhJ,QAAAuC,UAAAyG,EAAA+F,aAAA/F,EAAA+F,YAAA5N,EAAAyC,KAAAmL,aA7BA,SAAA8qC,EAAA7wC,GACA,IAAA4G,EAAA5G,GAAAA,EAAA4G,UAAA5G,EAAA4G,UAAAjE,EAAA/H,KAAAgM,UACA,GAAAA,EAAA,CAIA,IAAAg2B,EAAAiU,EAAAjqC,EAOA,OALAg2B,EADA7nB,KAAAokE,IAAAv8C,GAAA08C,GAAA,IAAAzoC,EACA,MAGAhkC,QAAA+vB,GAAA9jC,OAAAA,GAEAkH,GAAAA,EAAAoF,SACAw3B,EAAA,IAAAo8C,EAAAh5E,EAAAoF,UAAA,GAEAw3B,EAbA/+B,QAAAC,KAAA,uCA2BAs7E,CAAAvoC,EAAA7wC,GAXA,SAAA6wC,EAAA7wC,GACA,IAAA48B,EAAA/vB,QAAAgkC,EAAA,KAAA/3C,OAAA+3C,GAAA,KAAAA,EAAA,IAAA,SAAA,aACA,OAAA7wC,GAAAA,EAAAoF,SACAw3B,EAAA,IAAAo8C,EAAAh5E,EAAAoF,UAAA,GAEAw3B,EAOAy8C,CAAAxoC,EAAA7wC,OAIAqO,OAAA,iBAAA,CAAA,qBAAA,UAAA,aAAA,SAAA0iB,EAAA+b,EAAA30C,GACA,OAAA,SAAA04C,EAAA9qC,GACA,OAAA8qC,GACA75C,QAAAuC,UAAAwM,GAAAA,EAAA5N,EAAAyC,KAAAmL,aACAgrB,EAAAslB,GAAA,QAAAvJ,EAAA,aAAAA,CAAA+D,GAAA,SACA/D,EAAA,aAAAA,CAAA+D,GAHA,OAOAxiC,OAAA,uBAAA,CAAA,qBAAA,UAAA,aAAA,SAAA0iB,EAAA+b,EAAA30C,GACA,OAAA,SAAA04C,EAAA9qC,GACA,OAAA8qC,GACA75C,QAAAuC,UAAAwM,GAAAA,EAAA5N,EAAAyC,KAAAmL,aACAgrB,EAAAslB,GAAA,IAAAvJ,EAAA,aAAAA,CAAA+D,GACA/D,EAAA,aAAAA,CAAA+D,GAHA,OAOAxiC,OAAA,gBAAA,CAAA,WAAA,aAAA,SAAAnW,EAAAyK,GACA,IAAA22E,EAAA,EAAAvkE,KAAAC,IAAA,GAAA9c,EAAAqS,cAAA,GACAzR,EAAA,QAAAigF,MAAA7gF,EAAAqS,cAAA,GAAArV,KAAA,KAEA,OAAA,SAAA27C,GACA,YAAAt0C,IAAAs0C,EAAA,IACAA,IAAA0oC,EAAAA,GAAA1oC,KAAA,EAAA,GACAhzC,QAAAC,KAAA,gEAAA6E,EAAA/H,KAAAgM,WACA,SAEAmO,KAAAokE,IAAAtoC,GAAAyoC,EAAA,MACAzsE,QAAAgkC,GAAA/3C,OAAAA,OAIAuV,OAAA,iBAAA,WACA,OAAA,SAAAwiC,EAAAioC,GACA,YAAAv8E,IAAAs0C,EAAA,IAKA97B,KAAAokE,IAAAtoC,GAAA,KAAA,MACAhkC,QAAAgkC,GAAA/3C,OAAAggF,OAIAzqE,OAAA,aAAA,CAAA,qBAAA,SAAA0iB,GACA,OAAA,SAAA8f,GACA,OAAAA,EAAAlkC,OAAAsrB,KAAAhnB,SAAA4/B,IAAA2oC,QAAA1gF,OAAAi4B,EAAAI,cAAA,oBAAA,OAIA9iB,OAAA,kBAAA,CAAA,qBAAA,SAAA0iB,GACA,OAAA,SAAA8f,GACA,OAAAA,EAAAlkC,OAAAsrB,KAAAhnB,SAAA4/B,IAAA2oC,QAAA1gF,OAAAi4B,EAAAkxB,oBAAA,cAAA,OAIA5zC,OAAA,kBAAA,CAAA,qBAAA,SAAA0iB,GACA,OAAA,SAAA8f,GACA,OAAAA,EAAAlkC,OAAAsrB,KAAAhnB,SAAA4/B,IAAA2oC,QAAA1gF,OAAAi4B,EAAAmxB,yBAAA,UAAA,OAIA7zC,OAAA,oBAAA,CAAA,qBAAA,SAAA0iB,GACA,OAAA,SAAA8f,GACA,OAAAA,EAAAlkC,OAAAsrB,KAAAhnB,SAAA4/B,IAAA2oC,QAAA1gF,OAAAi4B,EAAAixB,mBAAA,cAAA,OAIA3zC,OAAA,cAAA,WACA,OAAA,SAAAwiC,GACA,OAAAA,EAAAlkC,OAAAsrB,KAAAhnB,SAAA4/B,IAAA2oC,QAAA1gF,OAAA,SAAA,OAIAuV,OAAA,iBAAA,WACA,OAAA,SAAAwiC,GACA,OAAAA,EAAAlkC,OAAAsrB,KAAAhnB,SAAA4/B,IAAA4oC,UAAA,OAIAprE,OAAA,uBAAA,CAAA,qBAAA,SAAA0iB,GACA,OAAA,SAAA8f,EAAA7wC,GACA,IAAAmf,EAAA0xB,GAAAlkC,OAAAsrB,KAAAhnB,SAAA4/B,IACA,OAAA1xB,GAAAA,EAAAs6D,WAAAz5E,GAAAA,EAAA05E,WAAA,OAAAv6D,EAAAq6D,QAAA1gF,OAAAi4B,EAAAI,cAAA,qBAAA,OAIA9iB,OAAA,oBAAA,WACA,OAAA,SAAAwiC,GACA,OAAAA,EAAAlkC,OAAAsrB,KAAAtrB,SAAAqrB,MAAAC,OAAAhnB,SAAA4/B,IAAA4oC,UAAA,OAIAprE,OAAA,kBAAA,WACA,OAAA,SAAAwiC,GACA,OAAAA,EAAAlkC,OAAA,GAAA+iC,KAAA/iC,OAAAsrB,KAAAhnB,SAAA4/B,KAAA,GAAA,OAKAxiC,OAAA,qBAAA,CAAA,qBAAA,SAAA0iB,GACA,OAAA,SAAA8f,GACA,IAAAA,EAAA,MAAA,GACA,IAAA3xB,EAAA2xB,GAAAA,EAAA,EAAA,IAAA,IACAA,EAAA97B,KAAAokE,IAAAtoC,GACA,IAAA8oC,EAAA5kE,KAAAiT,MAAA6oB,EAAA,KAAA,IACA+oC,EAAA7kE,KAAAiT,MAAA6oB,EAAA,KAAA,GAAA8oC,GACAzjD,EAAAnhB,KAAAiT,MAAA6oB,EAAA,GAAA,GAAA8oC,EAAA,GAAA,GAAAC,GACA,OAAAD,EAAA,EAAAz6D,EAAAy6D,EAAA,IAAA5oD,EAAAswB,KAAA,IAAAu4B,EAAA,KAAA1jD,EAAA,IACA0jD,EAAA,EAAA16D,EAAA06D,EAAA,KAAA1jD,EAAA,IAAAhX,EAAAgX,EAAA,QAKA7nB,OAAA,oBAAA,WACA,OAAA,SAAAwiC,GACA,OAAAA,EACAA,EAAA,IACAA,EAAA,KACAA,EAAA,IAAA,IACA,OAIAxiC,OAAA,gBAAA,WACA,OAAA,SAAAwiC,GACA,OAAAA,EACAlkC,OAAA,GAAA+iC,KAAA/iC,OAAAsrB,KAAAhnB,SAAA4/B,KAAA,GACAv7C,MAAA,KAAAotB,OAAA,GAAA,GAFA,SAMArU,OAAA,sBAAA,WACA,OAAA,SAAAwiC,GACA,OAAAA,EAAAlkC,OAAAsrB,KAAAhnB,SAAA4/B,GAAAxwB,QAAAo5D,SAAA,GAAA,OAMAprE,OAAA,aAAA,CAAA,qBAAA,SAAA0iB,GACA,OAAA,SAAA8f,GACA,OAAAA,EAAAlkC,OAAAsrB,KAAAhnB,SAAA4/B,GAAA9f,EAAA8nD,oBAAAW,QAAA1gF,OAAAi4B,EAAAI,cAAA,oBAAA,OAIA9iB,OAAA,kBAAA,CAAA,qBAAA,SAAA0iB,GACA,OAAA,SAAA8f,GACA,OAAAA,EAAAlkC,OAAAsrB,KAAAhnB,SAAA4/B,GAAA9f,EAAA8nD,oBAAAW,QAAA1gF,OAAAi4B,EAAAkxB,oBAAA,cAAA,OAKA5zC,OAAA,aAAA,CAAA,qBAAA,SAAA0iB,GACA,OAAA,SAAA8f,GACA,OAAAA,EAAAlkC,OAAAsrB,KAAAhnB,SAAA4/B,GAAA9f,EAAA8nD,oBAAAW,QAAA1gF,OAAA,SAAA,OAIAuV,OAAA,gBAAA,CAAA,qBAAA,SAAA0iB,GACA,OAAA,SAAA8f,GACA,OAAAA,EAAAlkC,OAAAsrB,KAAAhnB,SAAA4/B,GAAA9f,EAAA8nD,oBAAAY,UAAA,OAIAprE,OAAA,qBAAA,CAAA,qBAAA,SAAA0iB,GACA,OAAA,SAAA8f,GACA,OAAAA,EAAAlkC,OAAAsrB,KAAAhnB,SAAA4/B,GAAA9f,EAAA8nD,oBAAAY,SAAA,GAAA,OAIAprE,OAAA,uBAAA,CAAA,qBAAA,SAAA0iB,GACA,OAAA,SAAA8f,EAAA7wC,GACA,IAAAmf,EAAA0xB,GAAAlkC,OAAAsrB,KAAAhnB,SAAA4/B,GAAA9f,EAAA8nD,oBACA,OAAA15D,GAAAA,EAAAs6D,WAAAz5E,GAAAA,EAAA05E,WAAA,OAAAv6D,EAAAq6D,QAAA1gF,OAAAi4B,EAAAI,cAAA,qBAAA,OAOA9iB,OAAA,cAAA,WACA,OAAA,SAAAwiC,GACA,OAAAA,GACAA,EAAAA,EAAAr2C,eACA7G,OAAA,EAAAk9C,EAAAz6C,UAAA,EAAA,GAAA8lB,cAAA20B,EAAAz6C,UAAA,GAAAy6C,EAFA,OAMAxiC,OAAA,cAAA,WACA,IAAAwrE,EAAA,GACA,OAAA,SAAAhpC,GACA,IAAAzrC,EAAAyrC,GAAA,GACA,GAAAgpC,EAAAz0E,GAAA,OAAAy0E,EAAAz0E,GACA,GAAAA,EAAAzR,OAAA,EAAA,CAEA,IADA,IAAA2iD,EAAA,GAAAwjC,EAAA,CAAA,IAAA,IAAA,KACAhlE,EAAA,EAAAA,EAAA1P,EAAAzR,OAAAmhB,IAAA,CACA,IAAAilE,EAAA30E,EAAA0P,GACA,IAAAA,EACAwhC,EAAA,MAAAyjC,GAAA,MAAAA,EAAA,IAAAA,EAEAjlE,EAAA,IAAA,GAAAglE,EAAAlnE,QAAAxN,EAAA0P,EAAA,MACAwhC,GAAAyjC,GAGA30E,EAAAkxC,EAAAp6B,kBAIA,OADA9W,EAAAA,EAAA8W,eACA89D,OAAA,KACA50E,EAAA,KAAAA,EAAAzR,OAAA,EAAAyR,EAAAwH,OAAA,GAAA,KAKA,OADAitE,EAAAhpC,GAAAzrC,EACAA,MAIAiJ,OAAA,SAAA,WACA,OAAA,SAAAwiC,GACA,OAAAA,EACAA,EAAA30B,cADA,OAKA7N,OAAA,gBAAA,WACA,OAAA,SAAAwiC,GACA,OAAAA,EAAAA,EAAAjkC,OAAA,EAAA,GAAA,OAIAyB,OAAA,cAAA,WACA,OAAA,SAAAwiC,GACA,OAAAA,EAAAA,EAAAjkC,OAAA,EAAA,GAAAikC,EAAAjkC,OAAAikC,EAAAl9C,OAAA,GAAA,OAIA0a,OAAA,kBAAA,WACA,OAAA,SAAAwiC,GACA,OAAAA,GAAAA,EAAAl9C,OAAA,GAAAk9C,EAAAjkC,OAAA,EAAA,IAAA,MAAAikC,MAKAxiC,OAAA,cAAA,WACA,OAAA,SAAAwiC,GACA,OAAAA,EAAAv1B,mBAAAu1B,EACAr2C,cACA45B,QAAA,WAAA,IACAA,QAAA,WAAA,IACAA,QAAA,MAAA,MACA,OAKA/lB,OAAA,mBAAA,WACA,OAAA,SAAAwiC,GACA,OAAAA,EAAAv1B,mBAAAu1B,GAAA,OAIAxiC,OAAA,aAAA,WACA,OAAA,SAAAwiC,EAAAlwC,GAEA,OADAA,EAAAA,GAAA,KACAkwC,GAAAA,EAAAl9C,QAAAgN,EAAAkwC,EAAAA,EAAAjkC,OAAA,EAAAjM,GAAA,UAIA0N,OAAA,YAAA,WACA,OAAA,SAAAwiC,EAAAlwC,GACAA,EAAAA,GAAA,GACA,IAAA6E,EAAAqrC,EAAAt7C,WAAA,WAAA,EAAAs7C,EAAAt7C,WAAA,YAAA,EAAA,EAEA,OADAiQ,EAAAqrC,EAAAt7C,WAAA,OAAAiQ,GAAAA,EAAA,EAAAA,GACAqrC,GAAAA,EAAAl9C,OAAA6R,GAAA7E,EAAAkwC,EAAAjkC,OAAApH,GAAAqrC,EAAAjkC,OAAApH,EAAA7E,GAAA,UAIA0N,OAAA,cAAA,CAAA,OAAA,SAAA6iE,GACA,OAAA,SAAAj2C,GACA,OAAAi2C,EAAAkF,YAAAn7C,OxB9bAjkC,QAAA6Q,OAAA,kBAAA,CAAA,SAAA,gBAAA,oBAGAjG,OAAA,CAAA,qBAAA,WAAA,SAAA28C,EAAArmD,GAGAqmD,EACA07B,mBAAA,SACAC,6BAGAC,yBAAA,MACA7xE,iBAAA,CAAApQ,EAAAoQ,iBAAApQ,EAAAoQ,iBAAA,OACA8xE,gBAAA,MAGAx4E,OAAA,CAAA,gBAAA,WAAA,SAAAy4E,EAAAniF,GAIAmiF,EAAAC,SAAA52E,QAAAxL,EAAAwL,QAAAxL,EAAAwL,QAAA,IAGA22E,EAAAC,SAAAC,YAAA,SAGAF,EAAAC,SAAAllD,QAAAolD,OAAA,uBAIA54E,OAAA,CAAA,mBAAA,WAAA,SAAA64E,EAAAviF,GAGAuiF,EAAAC,kBAAA,IAAAxiF,EAAAgH,OAIAu7E,EAAAE,4BAAA,mFAGA/4E,OAAA,CAAA,mBAAA,SAAAg5E,GAGAA,EAAAC,gBAAA,iBAIAj5E,OAAA,CAAA,uBAAA,WAAA,SAAAk5E,EAAA5iF,GAGAlB,QAAAC,OAAA6jF,EAAAR,SAAA,CAEAS,YAAA,IACAC,cAAA,UACAC,SAAA,IAGA1qD,OAAAr4B,EAAAiR,aAAA,IACAsmB,YAAA,cAKA7tB,OAAA,CAAA,4BAAA,SAAAs5E,GAGAA,EAAAt5E,OAAAu5E,MAAA,eAGAv5E,OAAA,CAAA,uBAAA,SAAAw5E,GAIA,IAAAC,EAAAhhF,MAAAC,SAAA6gC,QACAigD,EAAAE,UAAAC,YAAAF,GAGAD,EAAA/uD,MAAAmvD,SAAA,MAGA55E,OAAA,CAAA,eAAA,WAAA,SAAA65E,EAAAvjF,GAGAujF,EAAAC,KAAAxjF,EAAAyjF,YAAA,KACAF,EAAA/3E,QAAAxL,EAAA0jF,eAAA,OAGA9zE,QAAA,oBAAA,CAAA,OAAA,SAAA0wB,GAGA,OAAA,SAAAqjD,EAAAC,GACAA,EAAAtjD,EAAAnhC,MAAAwkF,EAAAC,GACAtjD,EAAAnhC,MAAAwkF,OAKA/zE,QAAA,aAAA,CAAA,aAAA,aAAA,KAAA,SAAA,aAAA,WAAA,UAAA,MAAA,SAAA,SAAA,WAAA,UAAA,aAAA,aAAA,WAAA,SAAAhQ,EAAAiQ,EAAAtQ,EAAAuK,EAAAkG,EAAArR,EAAAkB,EACAC,EAAAI,EAAAyV,EAAA3V,EAAAu7B,EAAAt7B,EAAAwK,EAAA5L,GAGA,IAEAglF,EAEAhzE,EACAoF,EACA6tE,EALAC,EAAA,EAEA5wE,GAAA,EASA,SAAA6wE,IACA,IAAAF,EAAA,CAEA,IAAA9lE,EAAAnO,EAAAxQ,IAAA,qBAAA,SAAA6J,EAAAgC,EAAA+4E,EAAAC,GACAh7E,EAAAC,kBAAA,aAAA+B,EAAA1C,MAAA,iBAAA0C,EAAA1C,OACAU,EAAAiyB,iBACAtqB,EACAA,EAAA3O,MAAA,WACA4H,EAAA8D,GAAA1C,EAAA1C,KAAAy7E,MAIApkF,EAAAZ,QAAA+D,WAMA8gF,EAAA9lE,GAGA,SAAAmmE,IACAL,GAAAA,IACAA,EAAA,KAIA,SAAAM,EAAA3+C,GACA,GAAAA,EAAA,OAAA,EAGAo+C,EAAAA,GAAA5jF,EAAAyC,KAAA8Q,KAEA,IAAA6wE,EAAApkF,EAAAyC,KAAA83E,eAAAuJ,EAAA9jF,EAAAyC,KAAA83E,cAAA/+E,QAAAwE,EAAAyC,KAAA83E,cAAAuJ,KACA,IAAAM,EACA,KAAA,iCAEA,IAAAC,EAAAD,EAAA3oD,MAAA2oD,EAAAroE,MAAA,IAAAqoE,EAAAroE,MAAA,KAAAqoE,EAAAroE,KAAA,GAAA,IAAAqoE,EAAAroE,MAGA,OAAAlc,EAAA0T,KAAA81B,KAAA+6C,IACA1+E,QAAAqB,MAAA,+DAAApG,OAAA0jF,IACAF,KAIAzuE,EAAA1H,IAAAo2E,EAAA3oD,KAAA2oD,EAAAroE,KAAA,gBAAA,KAAAqoE,EAAAroE,MAAAlc,EAAA0T,KAAA2zB,YAAAxxB,GACArR,OAAA,SAAA6B,GACAR,QAAAxG,MAAA,2DAAAyB,OAAA0jF,OAGApiF,MAAA,SAAAL,GACA,IAAAA,EAAA,OAAAuiF,IAGA,IAAAG,EAAA,CAAAC,IAAA1kF,EAAA6a,OAAA8pE,IAAAH,GAUA,OATAC,EAAAC,MAAAD,EAAAE,MACA3kF,EAAAkc,MAAAqoE,EAAAroE,KACAuoE,EAAAE,KAAA,IAAAJ,EAAAroE,KAEA,GAAAlc,EAAAyb,SAAA8oE,EAAA9oE,QAAA,KAAA8oE,EAAAroE,OACAuoE,EAAAE,KAAA,WAIAz0E,EAAA,4BAAAu0E,GACAriF,MAAA,SAAA2hB,GACA,OAAAhkB,EAAA0H,MAAA4rB,QAAAtP,MAEA3hB,MAAA,SAAAixB,GACA,GAAAA,EAWA,OARAlzB,EAAAyC,KAAA8Q,KAAA6wE,EAGApkF,EAAAyC,KAAA8Q,KAAAC,WAAA,EAEAkC,EAAAsiB,MAAAO,QAGA14B,EAAA+H,KAAAw8E,GACAniF,KAAAkiF,SAkDA,SAAA7+C,IAEA,OADA5/B,QAAAqB,MAAA,oCACAs+B,IACApjC,MAAA,WACA,OAAAvD,EAAAoV,EAAA,QAIA,SAAAA,IA0CA,OAvCAiwE,IAGAnzE,EAAAjR,IAEAsC,KAAA3C,EAAAgQ,IAAA,CAEArP,EAAAsU,QAGAvU,EAAAuU,WAIAtS,MAAA,WACA,OAAApC,EAAA0U,QAAAtS,KAAAkiF,MAIAliF,KAAAuI,EAAA+J,OAGAtS,KAAArD,EAAA2V,OAEAtS,MAAA,WACAiiF,IAvDA,WACAluE,EAAA,CAEAnW,EAAAsT,IAAAI,KAAA2kB,GAAAoN,QAAA11B,EAAA01B,EAAAtqC,OAqDAm9B,GACAvnB,EAAA,KACAsC,GAAA,KAEA7O,OAAA,SAAA6B,GAMA,MALA0K,EAAA,KACAsC,GAAA,EACArJ,EAAA4R,QAAAlT,OAAAqH,EAAAyqE,YACAxwE,EAAA8D,GAAAiC,EAAAyqE,WAAA,CAAAn7E,MAAA,SAEAgH,KAMA,SAAAm/B,IACA,OAAAnyB,GAjEAzX,EAAAN,QAAA6a,GAAA,SAAA+H,GACAA,OAEA/H,EAAA,GAiEApX,EAAAymC,OACA76B,EAAA66B,OACAxlC,EAAAwlC,OAEA3mC,GAAA,WACAwlF,IACAhxE,GAAA,EACAtC,EAAA,OACA,MAXAtR,EAAAsH,OAcA,OA3MA7G,EAAAI,MAAA,IAAAJ,EAAAI,MAAA,SAAAJ,EAAAI,OAAA,EACAJ,EAAA2J,UAAA,IAAA3J,EAAA2J,UAAA,SAAA3J,EAAA2J,WAAA,EA0MA,CACAq6E,mBAAAA,EACAlvE,UAnHA,WACA,OAAA3B,GAmHAqB,MA5EA,WACA,OAAArB,EAAA5T,EAAAsH,OACAgK,GAAAkD,KA2EAwxB,QAAAA,EACAxxB,MAAAA,EACAuxB,KAAAA,EACA/mC,QAAA,CACAwuC,OArHA,WACA,IAAA23C,EAAAzkF,EAAAyC,KAAA+O,kBAAAkE,EAAA7O,IAAAC,MAAA9G,EAAAyC,KAAA+O,kBACA,OAAAizE,EACA/uE,EAAAwnB,aAAAunD,EAAAhpD,KAAA,WAAAgpD,EAAA3uE,SAAA,IAAA2uE,EAAA1oE,KAAA,IAAA0oE,EAAAroD,cAAAh4B,EAAAk3B,EAAA16B,UAAAu2B,KAAAzhB,GACAzT,MAAA,SAAAnH,GACA,GAAAA,GAAAA,EAAAyN,MAAAzN,EAAAkyC,UAAAlyC,EAAAiyC,SACA,MAAA,CACAzuC,QAAAxD,EAAAyN,KACAysB,IAAAl6B,EAAAiyC,SACA23C,QAAAhvE,EAAApX,QAAAyhC,QAAAhgC,EAAAzB,QAAAxD,EAAAyN,MAAA,MAIAlE,OAAA,SAAA6B,GAEAR,QAAAxG,MAAA,iDAAAgH,MAIA5G,EAAAsH,aAuGAs/C,IAAA,CAAA,aAAA,SAAA,UAAA,aAAA,aAAA,iBAAA,gBAAA,SAAA,UAAA,eAAA,gBAAA,aAAA,WAAA,aAAA,WAAA,aAAA,SAAAt2C,EAAA/F,EAAArK,EAAAmlF,EAAAhlF,EAAA2tB,EAAAK,EACA1tB,EAAAL,EAAA8tB,EAAAkxD,EAAA9E,EAAAl7E,EAAAoB,EAAAD,EAAAyK,GAIAoF,EAAAnG,OAAA1J,EACA6P,EAAA4C,SAAAxS,EAAAyC,KACAmN,EAAA3C,SAAAzC,EAAA/H,KACAmN,EAAAg1E,OAAA3kF,EACA2P,EAAAyqE,WAAA,WACAzqE,EAAAse,YAAAtuB,EAAA0C,OAAAC,UAGA,IAAAsiF,EAAArlF,EAAAqW,SAAAof,KAAAxa,QAAA,KACA7K,EAAA8pE,UAAA,IAAAmL,EAAArlF,EAAAqW,SAAAof,KAAAxgB,OAAA,EAAAowE,GAAArlF,EAAAqW,SAAAof,KACAvvB,QAAAqB,MAAA,uBAAA6I,EAAA8pE,SAAA,MAIA,IAAA35E,EAAA2R,WAAA,QAAA3R,EAAA2R,WAAA,UAAA3R,EAAA2R,WACA,WAAAlS,EAAAqW,SAAAC,UACAlG,EAAAxQ,IAAA,qBAAA,SAAA6J,EAAAgC,EAAA+4E,EAAAC,GACA,IAAAjvE,EAAA,QAAApF,EAAA8pE,SAAAjlE,OAAA,GAAA5K,EAAAorB,KAAAhqB,EAAA+4E,GACAjkF,EAAA+kF,eACAp/E,QAAAqB,MAAA,6CAAAiO,GAIAxV,EAAAqW,SAAAof,KAAAjgB,KAOArV,IAAAsC,MAAA,WAoDA,OAjDAhC,EAAA+hC,SAAAx2B,SAGAvL,EAAA+hC,SAAA+iD,0BAAA,GAIA7iF,MAAAC,SAAA6gC,SACA/iC,EAAA+hC,SAAAgjD,eAAA,IAKA,MAAA9iF,MAAAC,SAAAC,MAAAC,gBACAqD,QAAAkY,KAAA,6DAAA1b,MAAAC,SAAAC,MAAA,KACAxC,EAAAq0B,YAAA,IAIA7S,OAAA6jE,WACAv/E,QAAAqB,MAAA,kCAIA+yE,EAAAx7E,QAAAwuC,SACA7qC,MAAA,SAAAijF,GACAA,GAAAA,EAAAR,SACAh/E,QAAAkY,KAAA,mCAAAjd,OAAAukF,EAAA5mF,UACAsR,EAAAu1E,WAAAD,GAGAx/E,QAAAkY,KAAA,oDAAAjd,OAAAZ,EAAAzB,aAKAgvB,EAAA83D,0BAAA,SAAAn8E,GACA,OAAA0kB,EAAA03D,WACA13D,EAAA23D,UAEAr8E,EAAAiyB,iBACAt7B,EAAA0H,MAAA4rB,QAAA,oBACAjxB,MAAA,SAAAixB,GACAA,GACAhxB,MAAAC,SAAAojF,gBAEA,KAGAzL,EAAAvlE,cAMA,mBAAA/D,OAAAC,UAAArT,aACAsI,QAAAqB,MAAA,wEACAyJ,OAAAC,UAAArT,WAAA,SAAAI,EAAAiQ,GACA,OAAA,IAAAzS,KAAAyf,QAAAjd,EAAAiQ,KAKA,mBAAA+C,OAAAC,UAAA9L,KAAA,CACAe,QAAAqB,MAAA,kEAEA,IAAAy+E,EAAA,qCACAh1E,OAAAC,UAAA9L,KAAA,WACA,OAAA3J,KAAAihC,QAAAupD,EAAA,KAKA5oE,MAAA,mBAAAA,KAAAiT,QACAnqB,QAAAqB,MAAA,uDACA6V,KAAAiT,MAAA,SAAAhzB,GACA,OAAAic,UAAAjc,EAAA,IAAAs9E,aAKA,mBAAA3pE,OAAAC,UAAA9P,SACA+E,QAAAqB,MAAA,oEACAyJ,OAAAC,UAAA9P,OAAA,WACA,IAAA8kF,EAAAC,UACA,OAAA1qF,KAAAihC,QAAA,YAAA,SAAAiH,EAAArmC,GACA,YAAA,IAAA4oF,EAAA5oF,GAAA4oF,EAAA5oF,GAAAqmC","file":"../../dist_js/cesium-api.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","\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","\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.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","\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 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","//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","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","angular.module('cesium.api.demo.services', ['cesium.bma.services', 'cesium.crypto.services', 'cesium.utils.services', 'cesium.settings.services'])\n\n\n .factory('csDemoWallet', ['$rootScope', '$timeout', '$controller', '$state', '$q', '$translate', '$filter', 'BMA', 'CryptoUtils', function($rootScope, $timeout, $controller, $state, $q, $translate, $filter,\n BMA, CryptoUtils) {\n 'ngInject';\n\n function factory(authData) {\n\n var demoPubkey;\n\n return {\n start: function() {\n return $q.when();\n },\n login: function() {\n var self = this;\n return $translate('API.TRANSFER.DEMO.PUBKEY')\n .then(function(pubkey) {\n demoPubkey = pubkey;\n if (!authData || authData.pubkey != demoPubkey) {\n throw {message: 'API.TRANSFER.DEMO.BAD_CREDENTIALS'};\n }\n self.data = {\n keypair: authData.keypair\n };\n return {\n uid: 'Demo',\n pubkey: demoPubkey\n };\n });\n },\n transfer: function(pubkey, amount, comment) {\n var self = this;\n return BMA.blockchain.current()\n .then(function(block) {\n var tx = 'Version: '+ BMA.constants.PROTOCOL_VERSION +'\\n' +\n 'Type: Transaction\\n' +\n 'Currency: ' + block.currency + '\\n' +\n 'Blockstamp: ' + block.number + '-' + block.hash + '\\n' +\n 'Locktime: 0\\n' + // no lock\n 'Issuers:\\n' +\n demoPubkey + '\\n' +\n 'Inputs:\\n' +\n [amount, block.unitbase, 'T', 'FakeId27jQMAf3jqL2fr75ckZ6Jgi9TZL9fMf9TR9vBvG', 0].join(':')+ '\\n' +\n 'Unlocks:\\n' +\n '0:SIG(0)\\n' +\n 'Outputs:\\n' +\n [amount, block.unitbase, 'SIG(' + pubkey + ')'].join(':')+'\\n' +\n 'Comment: '+ (comment||'') + '\\n';\n\n return CryptoUtils.sign(tx, self.data.keypair)\n .then(function(signature) {\n var signedTx = tx + signature + \"\\n\";\n return CryptoUtils.util.hash(signedTx)\n .then(function(txHash) {\n return $q.when({\n tx: signedTx,\n hash: txHash\n });\n });\n });\n });\n }\n };\n }\n\n return {\n instance: factory\n };\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","// 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-api', ['ionic', 'ionic-material', 'ngMessages', 'pascalprecht.translate', 'ngApi', 'angular-cache',\n 'angular.screenmatch', 'angular-fullscreen-toggle',\n 'cesium.filters', 'cesium.config', 'cesium.platform', 'cesium.templates', 'cesium.translations', 'cesium.directives',\n // API dependencies :\n 'cesium.services', 'cesium.api.demo.services', 'cesium.login.controllers', 'cesium.help.controllers'\n])\n\n .config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider) {\n 'ngInject';\n $stateProvider\n\n .state('app', {\n url: \"/app\",\n abstract: true,\n templateUrl: \"templates/api/menu.html\",\n controller: 'ApiCtrl'\n })\n\n .state('app.home', {\n url: \"/home?result&service&cancel&node\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/api/home.html\",\n controller: 'ApiDocCtrl'\n }\n }\n })\n\n .state('api', {\n url: \"/v1\",\n abstract: true,\n templateUrl: \"templates/api/menu.html\",\n controller: 'ApiCtrl'\n })\n\n .state('api.transfer', {\n cache: false,\n url: \"/payment/:pubkey?name&amount&udAmount&comment&preferred_node&redirect_url&cancel_url&demo&error\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/api/transfer.html\",\n controller: 'ApiTransferCtrl'\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 .controller('ApiCtrl', ['$scope', '$state', '$translate', '$ionicPopover', 'UIUtils', 'Modals', 'csSettings', function ($scope, $state, $translate, $ionicPopover, UIUtils, Modals, csSettings){\n 'ngInject';\n\n // Fill locales\n $scope.locales = angular.copy(csSettings.locales);\n\n $scope.showAboutModal = function(e) {\n e.preventDefault(); // avoid to open link href\n Modals.showAbout();\n };\n\n $scope.showHome = function() {\n $state.go('app.home') ;\n };\n\n $scope.changeLanguage = function(langKey) {\n $translate.use(langKey);\n $scope.hideLocalesPopover();\n csSettings.data.locale = _.findWhere($scope.locales, {id: langKey});\n };\n\n /* -- show/hide locales popup -- */\n\n $scope.showLocalesPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'templates/api/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\n .controller('ApiDocCtrl', ['$scope', '$rootScope', '$state', '$translate', '$sce', 'csCurrency', function ($scope, $rootScope, $state, $translate, $sce, csCurrency){\n 'ngInject';\n\n $scope.loading = true;\n $scope.transferData = {\n pubkey: 'G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU',\n amount: 100,\n comment: 'REFERENCE',\n name: 'www.domain.com',\n preferred_node: undefined,\n redirect_url: 'http://www.domain.com/payment?ref={comment}&tx={tx}&node={node}',\n cancel_url: 'http://www.domain.com/payment?ref={comment}&cancel'\n };\n $scope.transferButton = {\n html: undefined,\n showParameters: false, // hide integration parameters, by default\n icons: [\n {\n label: 'API.DOC.TRANSFER.EXAMPLE_BUTTON_ICON_NONE'\n },\n {\n label: 'API.DOC.TRANSFER.EXAMPLE_BUTTON_ICON_DUNITER',\n filename: '../img/logo_duniter_32px.png'\n },\n {\n label: 'API.DOC.TRANSFER.EXAMPLE_BUTTON_ICON_CESIUM',\n filename: '../img/logo_32px.png'\n },\n {\n label: 'API.DOC.TRANSFER.EXAMPLE_BUTTON_ICON_G1_COLOR',\n filename: '../img/logo_g1_32px.png'\n },\n {\n label: 'API.DOC.TRANSFER.EXAMPLE_BUTTON_ICON_G1_BLACK',\n filename: '../img/logo_g1_32px_black.png'\n }\n ],\n style: {\n enable: false,\n text: 'Ğ1 pubkey',\n bgColor: '#fbc14c',\n fontColor: 'black',\n width: undefined\n }\n };\n $scope.transferButton.style.icon = $scope.transferButton.icons[1/*Duniter icon*/];\n $scope.transferDemoUrl = $rootScope.rootPath + $state.href('api.transfer', angular.merge({}, $scope.transferData, {\n demo: true,\n redirect_url: $rootScope.rootPath + '#/app/home?service=payment&result={tx}&node={node}',\n cancel_url: $rootScope.rootPath + '#/app/home?service=payment&cancel'\n }));\n\n $scope.enter = function(e, state) {\n if (!$scope.loading) return; // already enter\n\n $scope.result = {};\n if (state.stateParams && state.stateParams.service) {\n $scope.result.type = state.stateParams.service;\n }\n if (state.stateParams && state.stateParams.result) {\n $scope.result.content = state.stateParams.result;\n }\n if (state.stateParams && state.stateParams.cancel) {\n $scope.result.cancelled = true;\n }\n if (state.stateParams && state.stateParams.node) {\n $scope.result.node = state.stateParams.node;\n }\n\n csCurrency.get()\n .then(function(currency) {\n return $translate('API.DOC.TRANSFER.EXAMPLE_BUTTON_DEFAULT_TEXT', {currency: currency.name});\n })\n .then(function(buttonText) {\n $scope.transferButton.style.text = buttonText;\n $scope.loading = false;\n\n // compute HTML button\n $scope.computeTransferButtonHtml();\n });\n\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n // watch from update\n $scope.computeTransferButtonHtml = function() {\n if ($scope.loading) return; // skip if loading\n\n // Compute URL\n var url = $rootScope.rootPath + $state.href('api.transfer', $scope.transferData);\n\n var html;\n // Compute HTML: simple button\n if (!$scope.transferButton.style.enable){\n html = '<a href=\"'+url+'\">\\n'+\n ' <img src=\"'+$rootScope.rootPath + '../img/duniter_button.svg\">\\n'+\n '</a>';\n }\n // Compute HTML: advanced button\n else {\n html = '<a href=\"'+url+'\">\\n'+\n ' <div style=\"border-radius: 5px; min-height: 42px; text-align: center; padding: 5px; line-height: 30px; ';\n if ($scope.transferButton.style.width) {\n html += 'max-width: '+$scope.transferButton.style.width+'; ';\n }\n if ($scope.transferButton.style.bgColor) {\n html += 'background-color: '+$scope.transferButton.style.bgColor+'; ';\n }\n if ($scope.transferButton.style.fontColor) {\n html += 'color: '+$scope.transferButton.style.fontColor+'; ';\n }\n html += '\">\\n';\n if ($scope.transferButton.style.icon && $scope.transferButton.style.icon.filename) {\n html += ' <img style=\"vertical-align: middle;\" src=\"'+$rootScope.rootPath + $scope.transferButton.style.icon.filename+'\">\\n';\n }\n html += ' ' + $scope.transferButton.style.text + '\\n' +\n ' </div>\\n' +\n '</a>';\n }\n\n if ($scope.transferButton.html != html) {\n $scope.transferButton.html = html;\n $scope.$broadcast('$$rebind::transferButton'); // force rebind\n }\n };\n $scope.$watch('transferData', $scope.computeTransferButtonHtml, true);\n $scope.$watch('transferButton.style', $scope.computeTransferButtonHtml, true);\n }])\n\n .controller('ApiTransferCtrl', ['$scope', '$rootScope', '$timeout', '$controller', '$state', '$q', '$translate', '$filter', '$window', '$ionicHistory', 'BMA', 'CryptoUtils', 'UIUtils', 'csConfig', 'csSettings', 'csPlatform', 'csCurrency', 'csTx', 'csWallet', 'csDemoWallet', function($scope, $rootScope, $timeout, $controller, $state, $q, $translate, $filter,\n $window, $ionicHistory, BMA, CryptoUtils, UIUtils, csConfig, csSettings,\n csPlatform, csCurrency, csTx, csWallet, csDemoWallet) {\n 'ngInject';\n\n // WARN: Disable demo mode, on the API (a non-blocking warn message will be display later)\n var config = csConfig;\n if (config.demo) {\n config = angular.copy(config);\n config.demo = false;\n config.readonly = false;\n }\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('AuthCtrl', {$scope: $scope, csConfig: config}));\n\n $scope.loading = true;\n $scope.transferData = {\n amount: undefined,\n amounts: undefined,\n comment: undefined,\n pubkey: undefined,\n name: undefined,\n redirect_url: undefined,\n cancel_url: undefined,\n node: undefined\n };\n\n $scope.enter = function(e, state) {\n $rootScope.errorState = state.stateName;\n\n if (!$scope.loading) return; // already enter\n\n if (state.stateParams && state.stateParams.amount) {\n var amountStr = state.stateParams.amount.trim();\n var amounts = ((amountStr.indexOf('|') !== -1) && amountStr.split('|')) ||\n ((amountStr.indexOf(' ') !== -1) && amountStr.split(' ')) ||\n ((amountStr.indexOf(';') !== -1) && amountStr.split(';'));\n if (amounts) {\n $scope.transferData.amounts = amounts.reduce(function(res, amountStr) {\n var amount = normalizeAmount(amountStr);\n return amount > 0 ? res.concat(amount) : res;\n }, []);\n if ($scope.transferData.amounts.length === 1) {\n $scope.transferData.amount = $scope.transferData.amounts[0];\n delete $scope.transferData.amounts;\n }\n else {\n $scope.transferData.amounts.sort();\n }\n }\n else {\n $scope.transferData.amount = normalizeAmount(amountStr);\n }\n }\n if (state.stateParams && state.stateParams.pubkey) {\n $scope.transferData.pubkey = state.stateParams.pubkey;\n }\n if (state.stateParams && state.stateParams.name) {\n $scope.transferData.name= state.stateParams.name;\n }\n if (state.stateParams && state.stateParams.comment) {\n $scope.transferData.comment = state.stateParams.comment;\n }\n if (state.stateParams && state.stateParams.redirect_url) {\n $scope.transferData.redirect_url = state.stateParams.redirect_url;\n }\n if (state.stateParams && state.stateParams.cancel_url) {\n $scope.transferData.cancel_url = state.stateParams.cancel_url;\n }\n if (state.stateParams && state.stateParams.demo) {\n $scope.demo = true;\n }\n\n if (state.stateParams && state.stateParams.preferred_node) {\n var\n isHttpsMode = $window.location.protocol === 'https:',\n useSsl = isHttpsMode,\n preferredNode = state.stateParams.preferred_node;\n var matches = /^(?:(http[s]?:)\\/\\/)(.*)$/.exec(preferredNode);\n if (matches) {\n useSsl = matches[1] === 'https:';\n preferredNode = matches[2];\n }\n var parts = preferredNode.split(':');\n if (parts.length >= 1) {\n var port = parts[1] || (useSsl ? 443 : 80);\n $scope.node = {\n host: parts[0],\n port: port,\n useSsl: useSsl || (port == 443)\n };\n\n // Add a fallback node that use SSL\n if (!$scope.node.useSsl) {\n var node = angular.copy($scope.node);\n node.useSsl = true;\n node.port = 443;\n csSettings.data.fallbackNodes = csSettings.data.fallbackNodes || [];\n csSettings.data.fallbackNodes.splice(0,0,node);\n }\n }\n else {\n console.warn(\"[api] Invalid preferred node address: {0}. Using default node.\" + state.stateParams.preferred_node);\n }\n }\n\n // Start\n return $scope.start();\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n\n $scope.start = function() {\n if ($scope.starting) return;\n\n $scope.starting = true;\n $scope.loading = true;\n\n // Set BMA node\n if (!$scope.error && $scope.node && !BMA.node.same($scope.node)) {\n console.debug(\"[api] Using preferred node: {0}:{1}\".format($scope.node.host, $scope.node.port));\n BMA.stop();\n BMA.copy($scope.node);\n $scope.node.server = BMA.server;\n }\n\n // Start platform (or restart) platform\n // This will start the BMA node\n return csPlatform.restart()\n .then(csCurrency.get)\n .then(function(currency) {\n $scope.currency = currency;\n $scope.node = currency.node;\n $scope.loading = false;\n $scope.error = false;\n $scope.starting = false;\n // Reset history cache\n $ionicHistory.clearCache();\n })\n // Error during load (BMA not alive ?)\n .catch(function(err) {\n console.error(err && err.message || err);\n $scope.error = true;\n $scope.loading = false;\n $scope.starting = false;\n\n // Make sure to retry if user choose a fallback node\n var unsubscribe = BMA.api.node.on.start($scope, function() {\n $scope.start();\n unsubscribe();\n });\n })\n ;\n };\n\n function normalizeAmount(amountStr) {\n return parseFloat((amountStr||'0').trim().replace(new RegExp('[.,]'), '.')).toFixed(2) * 100;\n }\n\n function onLogin(authData) {\n\n // User cancelled\n if (!authData) return $scope.onCancel();\n\n // Make sure amount require fields\n if (!$scope.transferData.amount || !$scope.transferData.pubkey) {\n $scope.form.$submitted=true;\n UIUtils.loading.hide();\n return $q.reject();\n }\n\n // Avoid multiple click\n if ($scope.sending) return;\n $scope.sending = true;\n delete $scope.transferData.error;\n\n var wallet = $scope.demo ? csDemoWallet.instance(authData) : csWallet.instance('api', BMA);\n\n UIUtils.loading.show();\n\n wallet.start({restore: false/*skip restore from local storage*/})\n .then(function() {\n return wallet.login({\n auth: true,\n authData: authData,\n minData: true,\n sources: true,\n tx: {enable: false}\n });\n })\n .then(function(walletData) {\n if (!walletData) return;\n\n $scope.login = true;\n\n UIUtils.loading.hide();\n return $scope.askTransferConfirm(walletData);\n })\n .then(function(confirm) {\n if (!confirm) return;\n\n // sent transfer\n return UIUtils.loading.show()\n .then(function(){\n var amount = parseInt($scope.transferData.amount); // remove 2 decimals on quantitative mode\n return wallet.transfer($scope.transferData.pubkey, amount, $scope.transferData.comment, false /*always quantitative mode*/);\n })\n .then(function(txRes) {\n\n UIUtils.loading.hide();\n return txRes;\n })\n .catch(function(err) {\n UIUtils.onError()(err);\n return false;\n });\n })\n .then(function(txRes) {\n if (txRes) {\n return $scope.onSuccess(txRes);\n }\n else {\n $scope.sending = false;\n }\n })\n .catch(function(err){\n // when user cancel\n if (err && err === 'CANCELLED') {\n return $scope.onCancel();\n }\n // When wallet is empty\n if (err && err === 'RETRY') {\n $scope.sending = false;\n return;\n }\n $scope.sending = false;\n UIUtils.onError()(err);\n });\n }\n\n\n $scope.askTransferConfirm = function(walletData) {\n return $translate(['COMMON.UD', 'COMMON.EMPTY_PARENTHESIS'])\n .then(function(translations) {\n return $translate('CONFIRM.TRANSFER', {\n from: walletData.isMember ? walletData.uid : $filter('formatPubkey')(walletData.pubkey),\n to: $scope.transferData.name || $filter('formatPubkey')($scope.transferData.pubkey),\n amount: $scope.transferData.amount / 100,\n unit: $filter('abbreviate')($rootScope.currency.name),\n comment: (!$scope.transferData.comment || $scope.transferData.comment.trim().length === 0) ? translations['COMMON.EMPTY_PARENTHESIS'] : $scope.transferData.comment\n });\n })\n .then(UIUtils.alert.confirm);\n };\n\n $scope.onSuccess = function(txRes) {\n if (!$scope.transferData.redirect_url) {\n return UIUtils.toast.show('INFO.TRANSFER_SENT');\n }\n\n return ($scope.transferData.name ? $translate('API.TRANSFER.INFO.SUCCESS_REDIRECTING_WITH_NAME', $scope.transferData) : $translate('API.TRANSFER.INFO.SUCCESS_REDIRECTING'))\n .then(function(message){\n return UIUtils.loading.show({template: message});\n })\n .then(function() {\n var url = $scope.transferData.redirect_url;\n // Make replacements\n url = url.replace(/\\{pubkey\\}/g, $scope.transferData.pubkey);\n url = url.replace(/\\{hash\\}/g, txRes.hash||'');\n url = url.replace(/\\{comment\\}/g, $scope.transferData.comment||'');\n url = url.replace(/\\{amount\\}/g, $scope.transferData.amount && ($scope.transferData.amount/100).toString() || '');\n url = url.replace(/\\{tx\\}/g, encodeURI(txRes.tx));\n url = url.replace(/\\{node\\}/g, encodeURI(BMA.host+':'+BMA.port));\n\n return $scope.redirectToUrl(url, 2500);\n });\n };\n\n $scope.onCancel = function() {\n if (!$scope.transferData.cancel_url) {\n $scope.formData.salt = undefined;\n $scope.formData.password = undefined;\n return; // nothing to do\n }\n\n return ($scope.transferData.name ? $translate('API.TRANSFER.INFO.CANCEL_REDIRECTING_WITH_NAME', $scope.transferData) : $translate('API.TRANSFER.INFO.CANCEL_REDIRECTING'))\n .then(function(message){\n return UIUtils.loading.show({template: message});\n })\n .then(function() {\n var url = $scope.transferData.cancel_url;\n // Make replacements - fix #548\n url = url.replace(/\\{pubkey\\}/g, $scope.transferData.pubkey);\n url = url.replace(/\\{comment\\}/g, $scope.transferData.comment||'');\n url = url.replace(/\\{amount\\}/g, $scope.transferData.amount && ($scope.transferData.amount/100).toString() || '');\n\n return $scope.redirectToUrl(url, 1500);\n });\n };\n\n $scope.redirectToUrl = function(url, timeout) {\n if (!url) return;\n\n return $timeout(function() {\n // if iframe: send to parent\n if (window.top && window.top.location) {\n window.top.location.href = url;\n }\n else if (parent && parent.document && parent.document.location) {\n parent.document.location.href = url;\n }\n else {\n window.location.assign(url);\n }\n return UIUtils.loading.hide();\n }, timeout||0);\n };\n\n /* -- methods need by Login controller -- */\n\n $scope.closeModal = onLogin;\n\n }])\n\n .run(['csSettings', function(csSettings) {\n 'ngInject';\n\n csSettings.data.rememberMe = false;\n csSettings.data.useLocalStorage = false;\n // Force auth idle to 30s\n csSettings.data.keepAuthIdle = 30;\n\n //csPlatform.start();\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"]}