astrXbian/www/FULLJS/gchange-web/dist_js/gchange.js

14 lines
1.2 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.

/* minified */
function e(e,n){"use strict";var t=this;n&&n.length?_.forEach(n,(function(n){t[n]=e[n]})):["currency","issuer","medianTime","number","version","powMin","dividend","membersCount","hash","identities","joiners","actives","leavers","revoked","excluded","certifications","transactions"].forEach((function(n){t[n]=e[n]})),t.identitiesCount=t.identities?t.identities.length:0,t.joinersCount=t.joiners?t.joiners.length:0,t.activesCount=t.actives?t.actives.length:0,t.leaversCount=t.leavers?t.leavers.length:0,t.revokedCount=t.revoked?t.revoked.length:0,t.excludedCount=t.excluded?t.excluded.length:0,t.certificationsCount=t.certifications?t.certifications.length:0,t.transactionsCount=t.transactions?t.transactions.length:0,t.empty=t.isEmpty()}function n(e,n){e.extensionPoint=n.extensions.points.current.get()}function t(e,n,t,a,i,o,s,r,l,c,d,u,p,m,E,g,f,h){e.walletData=p.data,e.search={},e.login=p.isLogin(),e.motion=d.motion.default,e.fullscreen=d.screen.fullscreen.isEnabled(),e.showHome=function(){return s.nextViewOptions({historyRoot:!0}),t.go("app.home").then(d.loading.hide)},e.createHelptipScope=function(t,a){if(t||!n.tour&&n.settings.helptip.enable&&!d.screen.isSmall()){a=a||"HelpTipCtrl";var i=e.$new();return r(a,{$scope:i}),i}},e.startHelpTour=function(t,a){if(t&&t.defaultPrevented)return!1;if(n.tour=!0,!a)return s.clearHistory(),s.clearCache().then((function(){e.startHelpTour(null,!0)}));var i=e.createHelptipScope(!0);return i.startHelpTour().then((function(){i.$destroy(),delete n.tour})).catch((function(e){delete n.tour}))},e.disableHelpTour=function(e){e&&(e.preventDefault(),e.stopPropagation()),g.data.helptip&&g.data.helptip.enable&&(n.settings.helptip.enable=!1,g.store())},e.isLogin=function(){return e.login},e.loadWalletData=function(e){return e=e||{},p.loadData(e).then((function(e){if(!e)throw"CANCELLED";return e}))},e.loadWallet=function(n){return c.isStarted()?(n=n||{},p.isLogin()?p.data.loaded?i.when(p.data):p.loadData(n):e.showLoginModal(n).then((function(e){if(e)return n&&n.minData&&(n.minData=!1),p.loadData(n)})).then((function(e){if(e)return e;throw"CANCELLED"}))):c.ready().then((function(){return e.loadWallet(n)}))},e.loginAndGo=function(n,a){if(e.closeProfilePopover(),n=n||"app.view_wallet",p.isLogin())return t.go(n,a);if(f.httpsMode&&l.location&&"https:"!==l.location.protocol){var i=l.location.href,o=i.indexOf("#"),s=-1!==o?i.substr(0,o):i;if(i=(s="https"+s.substr(4))+t.href(n),!f.httpsModeDebug)return void(l.location.href=i);console.debug("[httpsMode] --- Should redirect to: "+i)}return e.showLoginModal().then((function(e){if(e)return t.go(n,a).then(d.loading.hide)}))},e.showLoginModal=function(t){return(t=t||{}).templateUrl=t.templateUrl||f.login&&f.login.templateUrl,t.controller=t.controller||f.login&&f.login.controller,E.showLogin(t).then((function(e){if(e)return g.data.rememberMe!==e.rememberMe&&(g.data.rememberMe=e.rememberMe,g.data.useLocalStorage=!!g.data.rememberMe||g.data.useLocalStorage,g.store()),p.login(e.username,e.password)})).then((function(e){return e&&(n.walletData=e),e})).catch((function(n){if("RETRY"===n)return d.loading.hide(),e.showLoginModal(t);d.onError("ERROR.CRYPTO_UNKNOWN_ERROR")(n)}))},e.logout=function(n){return!(n=n||{}).force&&e.profilePopover?e.profilePopover.hide().then((function(){return n.force=!0,e.logout(n)})):n.askConfirm?d.alert.confirm("CONFIRM.LOGOUT").then((function(t){if(t)return n.askConfirm=!1,e.logout(n)})):(d.loading.show(),p.logout().then((function(){return a.isOpenLeft()&&a.toggleLeft(),s.clearHistory(),s.clearCache().then((function(){return e.showHome()}))})).catch(d.onError()))},e.isUserPubkey=function(e){return p.isUserPubkey(e)},p.api.data.on.login(e,(function(n,t){return e.login=!0,t?t.resolve():i.when()})),p.api.data.on.logout(e,(function(){e.login=!1})),e.showTransferModal=function(e){},e.showAboutModal=function(){return E.showAbout()},e.showJoinModal=function(){return e.closeProfilePopover(),E.showJoin()},e.showSettings=function(){return e.closeProfilePopover(),t.go("app.settings")},e.showHelpModal=function(e){return E.showHelp(e)},e.showProfilePopover=function(n){return d.popover.show(n,{templateUrl:"templates/common/popover_profile.html",scope:e,afterShow:function(n){e.profilePopover=n,o((function(){d.ink({selector:"#profile-popover .ink, #profile-popover .ink-dark"})}),100)}})},e.closeProfilePopover=function(){e.profilePopover&&e.profilePopover.isShown()&&o((function(){e.profilePopover.hide()}))},e.showPeerInfoPopover=function(n){return d.popover.show(n,{templateUrl:"templates/network/popover_peer_info.html",scope:e.$new(!0)})},n.openLink=function(e,n,a){if(e.stopPropagation(),e.preventDefault(),n&&n.startsWith("@")){var i=n.substr(1);if(u.regexp.USER_ID.test(i))return t.go("app.user_identity_name",{name:i}),!1}return(a=a||{}).onError=function(){return d.popover.copy(e,n)},h.uri.open(n,a),!1},e.handleUri=function(e,n){if(!e)return i.when();console.info("[app] Trying to parse as uri: ",e);var a=t.current&&"app.home"===t.current.name;return u.uri.parse(e).then((function(n){if(!n)throw{message:"ERROR.UNKNOWN_URI_FORMAT"};return n.name?t.go("app.user_identity_name",angular.merge({name:n.name,action:n.params&&n.params.amount?"transfer":void 0},n.params),{reload:!0}):(console.warn("[app] TODO implement state redirection from URI result: ",n,e),t.go("app.user_lookup",{q:e},{reload:!0}))})).then((function(){if(a)return o((function(){s.backView()&&s.removeBackView()}),500)})).catch((function(t){if(!n)return console.error("[home] Error while handle uri {"+e+"': ",t),d.onError(e)(t);n(t)}))},e.registerProtocolHandlers=function(){_.each(["web+gchange"],(function(e){console.debug("[app] Registering protocol '{0}'...".format(e));try{navigator.registerProtocolHandler(e,"#/app/home?uri=%s","Cesium")}catch(n){console.error("[app] Error while registering protocol '{0}'".format(e),n)}}))},e.showFab=function(e,n){d.motion.toggleOn({selector:"#"+e+".button-fab"},n)},e.hideFab=function(e,n){d.motion.toggleOff({selector:"#"+e+".button-fab"},n)},e.doMotion=function(n){return e.motion.show(n)},e.askFullscreen=function(){if(!e.fullscreen&&d.screen.isSmall()&&m.isWeb())return d.alert.confirm("CONFIRM.FULLSCREEN",void 0,{cancelText:"COMMON.BTN_NO",okText:"COMMON.BTN_YES"}).then((function(n){n&&e.toggleFullscreen()}))},e.toggleFullscreen=function(){e.fullscreen=!d.screen.fullscreen.isEnabled(),d.screen.fullscreen.toggleAll()},e.askFullscreen(),e.registerProtocolHandlers()}function a(e,n,t,a,i,o,s,r,l,c,d,u,p,m){e.loading=!0,e.locales=angular.copy(m.locales),e.bgImage=function(){var e;if(Math.random()<.5)e="service";else{var n=moment().format("D"),t=moment().format("M");e=t<3||3==t&&n<21||12==t&&n>=21?"winter":3==t&&n>=21||t<6||6==t&&n<21?"spring":6==t&&n>=21||t<9||9==t&&n<21?"summer":"autumn"}var a={service:12,spring:7,summer:11,autumn:7,winter:5}[e],i=Math.floor(Math.random()*a)+1;return"./img/bg/{0}-{1}.jpg".format(e,i)}(),e.enter=function(n,t){if(ionic.Platform.isIOS()&&window.StatusBar&&(StatusBar.overlaysWebView(!1),StatusBar.overlaysWebView(!0)),t&&t.stateParams&&t.stateParams.uri)return e.handleUri(t.stateParams.uri).then((function(){e.loading=!1}));t&&t.stateParams&&t.stateParams.error?(e.error=t.stateParams.error,e.node=p.data.node,e.loading=!1,e.cleanLocationHref(t)):u.ready().then((function(){e.loading=!1,e.loadFeeds()})).catch((function(n){e.node=p.data.node,e.loading=!1,e.error=n}))},e.$on("$ionicView.enter",e.enter),e.reload=function(){e.loading=!0,delete e.error,t(e.enter,200)},e.loadFeeds=function(){var n=m.getFeedUrl();if(n&&"string"==typeof n){var t=c.feed&&c.feed.maxContentLength||650,a=Date.now();console.debug("[home] Loading feeds from {0}...".format(n)),i.get(n,{timeout:m.data.timeout,responseType:"json",cache:d.get(null,d.constants.LONG)}).success((function(n){console.debug("[home] Feeds loaded in {0}ms".format(Date.now()-a)),n&&n.items&&n.items.length&&(n.items=n.items.reduce((function(e,a){if(!a||!a.title&&!a.content_text&&!a.content_html)return e;if(a.date_published&&(a.time=moment.utc(a.date_published).unix()),a.content_html?a.content=a.content_html:a.content=(a.content_text||"").replace(/\n/g,"<br/>"),-1!==t&&a.content&&a.content.length>t){var i=Math.max(a.content.lastIndexOf(" ",t),a.content.lastIndexOf("<",t));a.content=a.content.substr(0,i)+" (...)",a.truncated=!0}return a.author=a.author||n.author,e.concat(a)}),[]),e.feed=n)})).error((function(n,t){console.error("[home] Failed to load feeds."),e.feed=null}))}},e.doQuickFix=function(e){"settings"===e&&(a.nextViewOptions({historyRoot:!0}),n.go("app.settings"))},e.changeLanguage=function(n){o.use(n),e.hideLocalesPopover(),m.data.locale=_.findWhere(e.locales,{id:n}),m.store(),e.loadFeeds()},e.showLocalesPopover=function(n){l.popover.show(n,{templateUrl:"templates/common/popover_locales.html",scope:e,afterShow:function(n){e.localesPopover=n}})},e.hideLocalesPopover=function(){e.localesPopover&&(e.localesPopover.hide(),e.localesPopover=null)},e.cleanLocationHref=function(e){if(e&&e.stateParams){var t=angular.copy(e.stateParams);return delete t.uri,delete t.error,r.search(t).replace(),a.nextViewOptions({disableAnimate:!0,disableBack:!1,historyRoot:!1}),n.go(e.stateName,t,{reload:!1,inherit:!0,notify:!1})}}}function i(e,n){e((function(){n.showJoin()}),100)}function o(e,n,t,a,i,o,s,r,l){e.formData={pseudo:""},e.slides={slider:null,options:{loop:!1,effect:"slide",speed:500}},e.isLastSlide=!1,e.search={looking:!0},e.showUsername=!1,e.showPassword=!1,e.smallscreen=t.screen.isSmall(),e.userIdPattern=l.constants.regex.USER_ID,e.slidePrev=function(){e.slides.slider.unlockSwipes(),e.slides.slider.slidePrev(),e.slides.slider.lockSwipes(),e.isLastSlide=!1},e.slideNext=function(){e.slides.slider.unlockSwipes(),e.slides.slider.slideNext(),e.slides.slider.lockSwipes(),e.isLastSlide=4===e.slides.slider.activeIndex},e.showAccountPubkey=function(){e.formData.computing=!0,a.scryptKeypair(e.formData.username,e.formData.password).then((function(n){e.formData.pubkey=a.util.encode_base58(n.signPk),e.formData.computing=!1})).catch((function(n){e.formData.computing=!1,console.error(">>>>>>>",n),t.alert.error("ERROR.CRYPTO_UNKNOWN_ERROR")}))},e.formDataChanged=function(){e.formData.computing=!1,e.formData.pubkey=null},e.doNext=function(n){if(console.debug("[join] form "+n+" OK. index="+e.slides.slider.activeIndex),n||(n=1===e.slides.slider.activeIndex?"passwordForm":2===e.slides.slider.activeIndex?"pseudoForm":n),n){if(e[n].$submitted=!0,!e[n].$valid)return;"passwordForm"===n?(e.slideNext(),e.showAccountPubkey()):(e.slideNext(),"pseudoForm"===n&&e.showAccountPubkey())}},e.doNewAccount=function(a){if(!a)return t.alert.confirm("ACCOUNT.NEW.CONFIRMATION_WALLET_ACCOUNT").then((function(n){n&&e.doNewAccount(!0)}));t.loading.show(),s.login(e.formData.username,e.formData.password).then((function(t){e.closeModal(),i.data.wallet=i.data.wallet||{},i.data.wallet.alertIfUnusedWallet=!1,r.setDefaultProfile({title:e.formData.pseudo}),n.go("app.view_wallet")})).catch((function(e){t.loading.hide(),console.error(">>>>>>>",e),t.alert.error("ERROR.CRYPTO_UNKNOWN_ERROR")}))},e.showHelpModal=function(n){n||(n=1==e.slides.slider.activeIndex?"join-salt":2==e.slides.slider.activeIndex?"join-password":"join-pseudo"),o.showHelp({anchor:n})}}function s(e,n,t,a,i,o,s){e.computing=!1,e.pubkey=null,e.formData={rememberMe:o.data.rememberMe},e.showSalt=o.data.showLoginSalt,e.showPubkeyButton=!1,e.autoComputePubkey=!1,s.ready().then((function(){e.autoComputePubkey="a"===ionic.Platform.grade.toLowerCase()&&!a.screen.isSmall()})),e.doLogin=function(){e.form.$valid&&(a.loading.show(),e.closeModal(e.formData))},e.formDataChanged=function(){e.computing=!1,e.pubkey=null,e.autoComputePubkey&&e.formData.username&&e.formData.password?e.showPubkey():e.showPubkeyButton=e.formData.username&&e.formData.password},e.$watch("formData.username",e.formDataChanged,!0),e.$watch("formData.password",e.formDataChanged,!0),e.showPubkey=function(){e.computing=!0,e.showPubkeyButton=!1,e.pubkey="",n((function(){var n=e.formData.username,i=e.formData.password;t.scryptKeypair(n,i).then((function(a){n!==e.formData.username||i!==e.formData.password?e.showPubkey():(e.pubkey=t.util.encode_base58(a.signPk),e.computing=!1)})).catch((function(n){e.pubkey="",e.computing=!1,a.loading.hide(),console.error(">>>>>>>",n),a.alert.error("ERROR.CRYPTO_UNKNOWN_ERROR")}))}),500)},e.showJoinModal=function(){e.closeModal(),n((function(){i.showJoin()}),300)},e.showAccountSecurityModal=function(){e.closeModal(),n((function(){i.showAccountSecurity()}),300)}}function r(e,n,t,a,i){e.$on("$ionicView.enter",(function(o){e.locale=i.data.locale.id,n.stateParams&&n.stateParams.anchor&&t((function(){a(n.stateParams.anchor)}),100)}))}function l(e,n,t,a,i){e.locale=a.data.locale.id,i&&i.anchor&&n((function(){t(i.anchor)}),100)}function c(e,n,t,a,i,o,s,r,l,c,d,u,p,m){e.tour=!1,e.continue=!0,e.executeStep=function(n,t,a){if((a=angular.isDefined(a)?a:0)>=t.length)return s.when(!0);var i=t[a];if("function"!=typeof i)throw new Error("[helptip] Invalid step at index {0} of '{1}' tour: step must be a function".format(a,n));var o=i();return"boolean"==typeof o&&(o=s.when(o)),o.then((function(i){return angular.isUndefined(i)?(e.continue=!1,a):i&&a!==t.length-1?e.executeStep(n,t,a+1):i?-1:a+1})).catch((function(t){return t&&"transition prevented"==t.message?console.error("ERROR: in help tour [{0}], in step [{1}] -> use large if exists, to prevent [transition prevented] error".format(n,a)):console.error("ERROR: in help tour [{0}], in step [{1}] : {2}".format(n,a,t)),e.continue=!1,a}))},e.showHelpTip=function(n,t){return(t=t||{}).bindings=t.bindings||{},t.bindings.value=t.bindings.value||"",t.bindings.hasNext=!angular.isDefined(t.bindings.hasNext)||t.bindings.hasNext,t.timeout=t.timeout||(p.enable?900:500),t.autoremove=!0,t.bindings.tour=e.tour,t.backdropClickToClose=!e.tour,l.popover.helptip(n,t)},e.showHelpModal=function(e){Modals.showHelp({anchor:e})},e.startHelpTour=function(){return e.tour=!0,e.continue=!0,e.startCurrencyTour(0,!0).then((function(n){return!(!n||e.cancelled)&&(d.data.helptip.currency=n,d.store(),e.continue)})).then((function(n){return!!n&&e.startNetworkTour(0,!0).then((function(n){return!(!n||e.cancelled)&&(d.data.helptip.network=n,d.store(),e.continue)}))})).then((function(n){return!!n&&e.startWotTour(0,!0).then((function(n){return!(!n||e.cancelled)&&(d.data.helptip.wot=n,d.store(),e.continue)}))})).then((function(n){return!!n&&e.startWotCertTour(0,!0).then((function(n){return!!n&&(d.data.helptip.wotCerts=n,d.store(),e.continue)}))})).then((function(n){return!!n&&e.startWalletNoLoginTour(0,!0)})).then((function(n){return!!n&&(!m.isLogin()||e.startWalletTour(0,!0).then((function(n){return!!n&&(d.data.helptip.wallet=n,d.store(),e.continue)})))})).then((function(n){return!!n&&(!m.isLogin()||e.startWalletCertTour(0,!0).then((function(n){return!!n&&(d.data.helptip.walletCerts=n,d.store(),e.continue)})))})).then((function(n){return!!n&&(!m.isLogin()||e.startTxTour(0,!0).then((function(n){return!!n&&(d.data.helptip.tx=n,d.store(),e.continue)})))})).then((function(n){return!!n&&e.startHeaderTour(0,!0)})).then((function(n){return!!n&&e.startSettingsTour(0,!0)})).then((function(n){return!!n&&e.finishTour()}))},e.startCurrencyTour=function(n,a){var o,s=[function(){return i.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-currency",{bindings:{content:"HELP.TIP.MENU_BTN_CURRENCY",icon:{position:"left"}}})},function(){return i.isOpen()&&i.toggleLeft(!1),t.go(l.screen.isSmall()?"app.currency":"app.currency_view_lg").then((function(){return e.showHelpTip("helptip-currency-mass-member",{bindings:{content:"HELP.TIP.CURRENCY_MASS",icon:{position:"center"}}})}))},function(){return!d.data.useRelative||e.showHelpTip("helptip-currency-mass-member-unit",{bindings:{content:"HELP.TIP.CURRENCY_UNIT_RELATIVE",contentParams:o,icon:{position:l.screen.isSmall()?"right":"center"}}})},function(){return!d.data.useRelative||e.showHelpTip("helptip-currency-change-unit",{bindings:{content:"HELP.TIP.CURRENCY_CHANGE_UNIT",contentParams:o,icon:{position:l.screen.isSmall()?"right":"center"}}})},function(){return!!d.data.useRelative||e.showHelpTip("helptip-currency-change-unit",{bindings:{content:"HELP.TIP.CURRENCY_CHANGE_UNIT_TO_RELATIVE",contentParams:o,icon:{position:l.screen.isSmall()?"right":"center"}}})},function(){return l.screen.isSmall()&&r("helptip-currency-rules-anchor"),e.showHelpTip("helptip-currency-rules",{bindings:{content:"HELP.TIP.CURRENCY_RULES",icon:{position:"center",glyph:"ion-information-circled"}}})},function(){return t.is("app.currency.tab_parameters")&&t.go("app.currency.tab_wot"),e.showHelpTip("helptip-currency-newcomers",{bindings:{content:"HELP.TIP.CURRENCY_WOT",icon:{position:"center"}},timeout:1200})}];return u.default().then((function(t){return o=t.parameters,e.executeStep("currency",s,n)}))},e.startNetworkTour=function(n,s){var r=function(){t.is("app.currency")&&o((function(){var e=a.document.querySelectorAll("ion-tabs .tabs a");e&&3==e.length&&angular.element(e[2]).triggerHandler("click")}),100)},p=[function(){return!!l.screen.isSmall()||(i.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-network",{bindings:{content:"HELP.TIP.MENU_BTN_NETWORK",icon:{position:"left"}}}))},function(){return i.isOpen()&&i.toggleLeft(!1),t.go(l.screen.isSmall()?"app.currency.tab_network":"app.network").then((function(){return r(),e.showHelpTip("helptip-network-peers",{bindings:{content:"HELP.TIP.NETWORK_BLOCKCHAIN",icon:{position:"center",glyph:"ion-information-circled"}},timeout:1200})}))},function(){return r(),e.showHelpTip("helptip-network-peer-0",{bindings:{content:"HELP.TIP.NETWORK_PEERS",icon:{position:l.screen.isSmall()?void 0:"center"}},timeout:1e3,retry:20})},function(){return r(),e.showHelpTip("helptip-network-peer-0-block",{bindings:{content:"HELP.TIP.NETWORK_PEERS_BLOCK_NUMBER",icon:{position:l.screen.isSmall()?void 0:"center"}}})},function(){r();var n=d.data.locale.id;return e.showHelpTip("helptip-network-peers",{bindings:{content:"HELP.TIP.NETWORK_PEERS_PARTICIPATE",contentParams:{installDocUrl:c.helptip&&c.helptip.installDocUrl?c.helptip.installDocUrl[n]?c.helptip.installDocUrl[n]:c.helptip.installDocUrl:"http://duniter.org"},icon:{position:"center",glyph:"ion-information-circled"},hasNext:s}})}];return u.default().then((function(t){return t.parameters,e.executeStep("network",p,n)}))},e.startWotTour=function(s,r){var c,d=[function(){return i.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-wot",{bindings:{content:"HELP.TIP.MENU_BTN_WOT",icon:{position:"left"}},onError:"continue"})},function(){return i.isOpen()&&i.toggleLeft(!1),t.go("app.user_lookup").then((function(){return e.showHelpTip("helptip-wot-search-text",{bindings:{content:l.screen.isSmall()?"HELP.TIP.WOT_SEARCH_TEXT_XS":"HELP.TIP.WOT_SEARCH_TEXT",icon:{position:"center"}}})}))},function(){return e.showHelpTip("helptip-wot-search-result-0",{bindings:{content:"HELP.TIP.WOT_SEARCH_RESULT",icon:{position:"center"}},timeout:700,retry:15})},function(){var n=a.document.getElementById("helptip-wot-search-result-0");return!n||(o((function(){angular.element(n).triggerHandler("click")})),e.showHelpTip("helptip-wot-view-certifications",{bindings:{content:"HELP.TIP.WOT_VIEW_CERTIFICATIONS"},timeout:2500}))},function(){return e.showHelpTip("helptip-wot-view-certifications",{bindings:{content:"HELP.TIP.WOT_VIEW_CERTIFICATIONS_COUNT",contentParams:c,icon:{position:"center",glyph:"ion-information-circled"}}})},function(){return e.showHelpTip("helptip-wot-view-certifications-count",{bindings:{content:"HELP.TIP.WOT_VIEW_CERTIFICATIONS_CLICK",icon:{position:"center"},hasNext:r}})}];return u.default().then((function(t){return(c=t.parameters).currentUD=n.walletData.currentUD,e.executeStep("wot",d,s)}))},e.startWotCertTour=function(n,i){var s=[function(){if(t.is("app.user_identity")){var n=a.document.getElementById("helptip-wot-view-certifications");if(!n)return!0;o((function(){angular.element(n).triggerHandler("click")}))}return e.showHelpTip(l.screen.isSmall()?"fab-certify":"helptip-certs-certify",{bindings:{content:"HELP.TIP.WOT_VIEW_CERTIFY",icon:{position:l.screen.isSmall()?"bottom-right":"center"}},timeout:l.screen.isSmall()?2e3:1e3,retry:10})},function(){return e.showHelpTip(l.screen.isSmall()?"fab-certify":"helptip-certs-certify",{bindings:{content:"HELP.TIP.CERTIFY_RULES",icon:{position:"center",glyph:"ion-alert-circled"},hasNext:i}})}];return e.executeStep("certs",s,n)},e.startWalletNoLoginTour=function(t,a){if(m.isLogin())return s.when(!0);var o=[function(){return i.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-account",{bindings:{content:n.walletData.isMember?"HELP.TIP.MENU_BTN_ACCOUNT_MEMBER":"HELP.TIP.MENU_BTN_ACCOUNT",icon:{position:"left"},hasNext:a}})}];return e.executeStep("wallet-no-login",o,t)},e.startWalletTour=function(a,o){if(!m.isLogin())return s.when(!0);var c=[function(){return i.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-account",{bindings:{content:n.walletData.isMember?"HELP.TIP.MENU_BTN_ACCOUNT_MEMBER":"HELP.TIP.MENU_BTN_ACCOUNT",icon:{position:"left"}}})},function(){return i.isOpen()&&i.toggleLeft(!1),t.go("app.view_wallet").then((function(){return e.showHelpTip(l.screen.isSmall()?"helptip-wallet-options-xs":"helptip-wallet-options",{bindings:{content:"HELP.TIP.WALLET_OPTIONS",icon:{position:l.screen.isSmall()?"right":"center"}}})}))},function(){return r("helptip-wallet-pubkey"),e.showHelpTip("helptip-wallet-pubkey",{bindings:{content:"HELP.TIP.WALLET_PUBKEY",icon:{position:"bottom-center"}},timeout:l.screen.isSmall()?2e3:500,retry:10})},function(){return r("helptip-wallet-certifications"),e.showHelpTip("helptip-wallet-certifications",{bindings:{content:l.screen.isSmall()?"HELP.TIP.WALLET_RECEIVED_CERTIFICATIONS":"HELP.TIP.WALLET_CERTIFICATIONS",icon:{position:"center"}},timeout:500,onError:"continue",hasNext:o})}];return u.default().then((function(t){return t.parameters.currentUD=n.walletData.currentUD,e.executeStep("wallet",c,a)}))},e.startWalletCertTour=function(n,i){if(!m.isLogin())return s.when(!0);var r=!1,c=[function(){if(t.is("app.view_wallet")){var n=a.document.getElementById("helptip-wallet-certifications");if(!n)return r=!0,!0;o((function(){angular.element(n).triggerHandler("click")}))}return!l.screen.isSmall()||e.showHelpTip("helptip-received-certs",{bindings:{content:"HELP.TIP.WALLET_RECEIVED_CERTS"}})},function(){return!(!r&&l.screen.isSmall())||t.go("app.view_wallet").then((function(){return e.showHelpTip("helptip-wallet-given-certifications",{bindings:{content:"HELP.TIP.WALLET_GIVEN_CERTIFICATIONS",icon:{position:"center"}},timeout:500})}))},function(){if(r)return!0;if(t.is("app.view_wallet")){var n=a.document.getElementById("helptip-wallet-given-certifications");if(!n)return r=!0,!0;o((function(){angular.element(n).triggerHandler("click")}),500)}return e.showHelpTip(l.screen.isSmall()?"fab-select-certify":"helptip-certs-select-certify",{bindings:{content:"HELP.TIP.WALLET_CERTIFY",icon:{position:l.screen.isSmall()?"bottom-right":"center"}},timeout:l.screen.isSmall()?2e3:500,retry:10})},function(){return e.tour||r?i:e.showHelpTip("helptip-certs-stock",{bindings:{content:"HELP.TIP.CERTIFY_RULES",icon:{position:"center",glyph:"ion-alert-circled"},hasNext:i}})}];return u.default().then((function(t){return t.parameters,e.executeStep("certs",c,n)}))},e.startTxTour=function(a,o){if(!m.isLogin())return s.when(!0);var r,l=[function(){return i.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-tx",{bindings:{content:n.walletData.isMember?"HELP.TIP.MENU_BTN_TX_MEMBER":"HELP.TIP.MENU_BTN_TX",icon:{position:"left"}}})},function(){return i.isOpen()&&i.toggleLeft(!1),t.go("app.view_wallet_tx").then((function(){return e.showHelpTip("helptip-wallet-balance",{bindings:{content:d.data.useRelative?"HELP.TIP.WALLET_BALANCE_RELATIVE":"HELP.TIP.WALLET_BALANCE",contentParams:r,icon:{position:"center"}},retry:20})}))},function(){return e.showHelpTip("helptip-wallet-balance",{bindings:{content:"HELP.TIP.WALLET_BALANCE_CHANGE_UNIT",contentParams:r,icon:{position:"center",glyph:"ion-information-circled"}}})}];return u.default().then((function(t){return(r=t.parameters).currentUD=n.walletData.currentUD,e.executeStep("tx",l,a)}))},e.startHeaderTour=function(n,t){if(l.screen.isSmall())return s.when(!0);function r(){var e=a.document.querySelectorAll("#helptip-header-bar-btn-profile");return e&&e.length?_.find(e,(function(e){return e.offsetWidth>0})):null}var c=[function(){if(l.screen.isSmall())return!0;var n=r();return!n||e.showHelpTip(n,{bindings:{content:"HELP.TIP.HEADER_BAR_BTN_PROFILE",icon:{position:"right"}}})},function(){if(l.screen.isSmall())return i.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-settings",{bindings:{content:"HELP.TIP.MENU_BTN_SETTINGS",icon:{position:"left"},hasNext:t},timeout:1e3});var n=r();return!n||(o((function(){angular.element(n).triggerHandler("click")})),e.showHelpTip("helptip-popover-profile-btn-settings",{bindings:{content:"HELP.TIP.MENU_BTN_SETTINGS",icon:{position:"center"},hasNext:t},timeout:1e3}).then((function(n){return e.closeProfilePopover(),n})))}];return e.executeStep("header",c,n)},e.startSettingsTour=function(n,a){var o,s=[function(){return!l.screen.isSmall()||(i.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-settings",{bindings:{content:"HELP.TIP.MENU_BTN_SETTINGS",icon:{position:"left"}},timeout:1e3}))},function(){return i.isOpen()&&i.toggleLeft(!1),t.go("app.settings").then((function(){return e.showHelpTip("helptip-settings-btn-unit-relative",{bindings:{content:"HELP.TIP.SETTINGS_CHANGE_UNIT",contentParams:o,icon:{position:"right",style:"margin-right: 60px"},hasNext:a},timeout:1e3})}))}];return u.default().then((function(t){return o=t.parameters,e.executeStep("settings",s,n)}))},e.finishTour=function(){return i.isOpen()&&i.toggleLeft(!1),m.isLogin()?t.go("app.view_wallet").then((function(){return e.showHelpTip("helptip-wallet-certifications",{bindings:{content:"HELP.TIP.END_LOGIN",hasNext:!1}})})):s.all([e.showHome(),u.default().then((function(e){n=e}))]).then((function(){return e.showHelpTip("helptip-home-logo",{bindings:{content:"HELP.TIP.END_NOT_LOGIN",contentParams:n,hasNext:!1}})}));var n}}function d(e){e.$on("$ionicView.enter",(function(n,t){e.startHelpTour()}))}function u(e,n,t,a,i,o,s,r,l,c,d){e.loading=!0,e.settings=c.data,e.qrcodeId="qrcode-wallet-"+e.$id,e.toggleQRCode=!1,e.likeData={views:{},likes:{},follows:{},abuses:{},stars:{}},e.enter=function(n,t){if(e.loading=e.loading||t.stateParams&&t.stateParams.refresh,e.loading)return e.cleanLocationHref(t),e.load();o.loading.hide(10),a(e.updateView,300),e.$broadcast("$recordView.enter",t)},e.$on("$ionicView.enter",e.enter),e.load=function(){return e.loadWallet().then((function(n){e.formData=n,e.loading=!1,e.updateView(),e.addListeners(),o.loading.hide(10)})).catch((function(n){"CANCELLED"!==n?o.onError("ERROR.LOAD_WALLET_DATA_ERROR")(n):e.showHome()}))},e.updateView=function(){e.motion.show({selector:"#wallet .item"}),e.$broadcast("$$rebind::rebind")},e.setRegisterForm=function(n){e.registerForm=n},e.onWalletLogout=function(){e.hideQRCode(),e.removeListeners(),delete e.formData,e.loading=!0},e.addListeners=function(){e.listeners=[s.api.data.on.logout(e,e.onWalletLogout),e.$watchCollection("formData.events",(function(n,t){!t||e.loading||angular.equals(n,t)||e.updateView()}))]},e.removeListeners=function(){_.forEach(e.listeners,(function(e){e()})),e.listeners=[]},e.doUpdate=function(n){return console.debug("[wallet] Updating wallet..."),(n?s.refreshData():o.loading.show().then(s.refreshData).then(o.loading.hide)).then(e.updateView).catch(o.onError("ERROR.REFRESH_WALLET_DATA"))},e.doQuickFix=function(e){alert("TODO doQuickFix:",e)},e.startWalletTour=function(){return e.hideActionsPopover(),e.showHelpTip(0,!0)},e.showHelpTip=function(n,t){if(n=angular.isDefined(n)?n:c.data.helptip.wallet,t=!!angular.isDefined(t)&&t,!(n<0)){var a=e.createHelptipScope(t);if(a)return a.tour=t,a.startWalletTour(n,!1).then((function(e){a.$destroy(),t||(c.data.helptip.wallet=e,c.store())}))}},e.showQRCode=function(n,t,a){if(e.qrcodeId){var i=angular.element(document.querySelector("#"+e.qrcodeId+" .content"));if(i)return s.loadQrCode().then((function(n){i.html(n),o.motion.toggleOn({selector:"#"+e.qrcodeId},a||1100)}));console.error("[wallet-controller] Cannot found div #{0} for the QRCode. Skipping.".format(e.qrcodeId))}},e.hideQRCode=function(){e.qrcodeId&&angular.element(document.querySelector("#"+e.qrcodeId))&&o.motion.toggleOff({selector:"#"+e.qrcodeId})},e.showActionsPopover=function(n){e.actionsPopover?e.actionsPopover.show(n):r.fromTemplateUrl("templates/wallet/popover_actions.html",{scope:e}).then((function(t){e.actionsPopover=t,e.$on("$destroy",(function(){e.actionsPopover.remove()})),e.actionsPopover.show(n)}))},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null)},e.showSharePopover=function(n){e.hideActionsPopover();var t=e.formData.name||e.formData.pubkey,a=d.getUrl("/user/profile/"+e.formData.pubkey+"/_share");o.screen.isSmall()&&(n=angular.element(document.querySelector("#wallet-share-anchor"))||n),o.popover.share(n,{bindings:{url:a,titleKey:"WOT.VIEW.POPOVER_SHARE_TITLE",titleValues:{title:t},postMessage:t}})},e.showSecurityModal=function(){e.hideActionsPopover(),l.showAccountSecurity()},e.cleanLocationHref=function(e){e&&e.stateParams&&e.stateParams.refresh&&a((function(){var n=angular.copy(e.stateParams);delete n.refresh,$location.search(n).replace()}),300)}}function p(e,n,t,a,i,o,s,r,l,c,d,u,p,m,E){e.search={text:"",loading:!0,type:null,results:[]},e._source=["issuer","title","city","time","avatar._content_type"],e.entered=!1,e.wotSearchTextId="wotSearchText",e.enableFilter=!0,e.allowMultiple=!1,e.selection=[],e.showResultLabel=!0,e.parameters={},e.enter=function(n,i){e.entered||(i.stateParams&&i.stateParams.q?(e.search.text=i.stateParams.q,t((function(){e.doSearch()}),100)):i.stateParams&&i.stateParams.hash?(e.search.text="#"+i.stateParams.hash,t((function(){e.doSearch()}),100)):t((function(){"newcomers"!==i.stateParams.type&&(r.initPhase||i.stateParams.type)||e.doGetNewcomers(0,void 0,!0)}),100),a(e.wotSearchTextId),e.entered=!0,t(s.ink,100),e.showHelpTip())},e.$on("$ionicView.enter",e.enter),e.resetWotSearch=function(){e.search={text:null,loading:!1,type:"newcomers",results:[]}},e.updateLocationHref=function(){var t={q:void 0,hash:void 0,type:void 0};if("text"===e.search.type){var a=e.search.text.trim();a.match(/^#[\wḡĞǦğàáâãäåçèéêëìíîïðòóôõöùúûüýÿ]+$/)?t.hash=a.substr(1):t.q=a}else t.type=e.search.type;o.nextViewOptions({disableAnimate:!0,disableBack:!0,historyRoot:!0}),n.go("app.user_lookup",t,{reload:!1,inherit:!0,notify:!1})},e.doSearchText=function(){e.doSearch(),e.updateLocationHref()},e.doSearch=function(n,t){var a=e.search.text.trim();if(s.screen.isSmall()&&a.length<3||!a.length)return e.search.results=[],e.search.type="none",$q.when();e.search.loading=!0;var i={from:n||0,size:t||10,_source:e._source};return e.search.type="text",E.searchText(a,i).then((function(i){"text"===e.search.type&&e.search.text.trim()===a&&(i&&i.length||!u.regexp.PUBKEY.test(a)?e.doDisplayResult(i,n,t):e.doDisplayResult([{pubkey:a}]))})).catch(s.onError("ERROR.WOT_LOOKUP_FAILED"))},e.doGetNewcomers=function(n,t,a){n=n||0,(t=t||10)<10&&(t=10),e.hideActionsPopover(),e.search.loading=0===n,e.search.type="newcomers",n||a||e.updateLocationHref();var i={index:"user",type:"profile",from:n,size:t,sort:{creationTime:"desc"}};return E.search(i).then((function(a){return"newcomers"===e.search.type&&(e.doDisplayResult(a,n,t),!0)})).catch((function(t){e.search.loading=!1,e.search.results=n>0?e.search.results:[],e.search.hasMore=!1,s.onError("ERROR.LOAD_NEWCOMERS_FAILED")(t)}))},e.showMore=function(){var n=e.search.results?e.search.results.length:0;return e.search.loadingMore=!0,("newcomers"===e.search.type?e.doGetNewcomers:e.doGetPending)(n).then((function(n){n&&(e.search.loadingMore=!1,e.$broadcast("scroll.infiniteScrollComplete"))})).catch((function(n){console.error(n),e.search.loadingMore=!1,e.search.hasMore=!1,e.$broadcast("scroll.infiniteScrollComplete")}))},e.select=function(e){p.isUserPubkey(e.pubkey)?n.go("app.view_wallet"):n.go("app.user_identity",{pubkey:e.pubkey,name:e.name})},e.next=function(){alert("Selected identities:",e.selection)},e.toggleCheck=function(n,t){var a=e.search.results[n];a.checked?e.addToSelection(a):e.removeSelection(a,t)},e.toggleSelect=function(e){e.selected=!e.selected},e.addToSelection=function(n){var t=angular.copy(n);t.name&&(t.name=t.name.replace("<em>","").replace("</em>","")),e.selection.push(t)},e.removeSelection=function(n,t){var a=_.findWhere(e.selection,{id:n.id});if(a&&e.selection.splice(e.selection.indexOf(a),1),!e.search.loading){var i=_.findWhere(e.search.results,{id:n.id});i&&i.checked&&(i.checked=!1)}},e.scanQrCode=function(){d.barcode.enable&&d.barcode.scan().then((function(n){n&&u.uri.parse(n).then((function(t){t.pubkey?e.search.text=t.pubkey:n.name?e.search.text=t.name:e.search.text=n,e.doSearch()}))})).catch(s.onError("ERROR.SCAN_FAILED"))},e.showHelpTip=function(){if(e.isLogin()){var n=angular.isDefined(n)?n:c.data.helptip.wot;if(!(n<0)){0===n&&(n=1);var t=e.createHelptipScope();if(t)return t.startWotTour(n,!1).then((function(e){t.$destroy(),c.data.helptip.wot=e,c.store()}))}}},e.doDisplayResult=function(n,t,a){n=n||{},e.allowMultiple&&n.length&&e.selection.length&&_.forEach(e.selection,(function(e){var t=_.findWhere(n,{id:e.id});t&&(t.checked=!0)})),e.search.results=t?e.search.results.concat(n):n||[],e.search.loading=!1,e.search.hasMore=n.length&&e.search.results.length>=t+a,e.smallscreen=s.screen.isSmall(),e.search.results.length&&n.length>0&&e.motion&&e.motion.show({selector:".lookupForm .list .item",ink:!0})},e.showActionsPopover=function(n){e.actionsPopover?e.actionsPopover.show(n):i.fromTemplateUrl("templates/wot/lookup_popover_actions.html",{scope:e}).then((function(t){e.actionsPopover=t,e.$on("$destroy",(function(){e.actionsPopover.remove()})),e.actionsPopover.show(n)}))},e.hideActionsPopover=function(){e.actionsPopover&&e.actionsPopover.hide()}}function m(e,n,t,a){angular.extend(this,n("WotLookupCtrl",{$scope:e})),a=a||{},e.search.loading=!1,e.enableFilter=!!angular.isDefined(a.enableFilter)&&a.enableFilter,e.allowMultiple=!!angular.isDefined(a.allowMultiple)&&a.allowMultiple,e.parameters=a,e.showResultLabel=!1,e.wotSearchTextId="wotSearchTextModal",e.allowMultiple&&a.selection&&(e.selection=a.selection),e.cancel=function(){e.closeModal()},e.select=function(n){e.closeModal({pubkey:n.pubkey,name:n.name&&n.name.replace(/<\/?em>/gi,"")})},e.next=function(){e.closeModal(e.selection)},e.updateLocationHref=function(){},e.showHelpTip=function(){},t(e.wotSearchTextId)}function E(e,n,t,a,i,o,s,r,l,c){e.formData={hasSelf:!0},e.loading=!0,e.load=function(n,t,a){return l.load(n,t,a).then((function(n){if(!n)return i.onError("ERROR.IDENTITY_NOT_FOUND")().then(e.showHome);e.formData=n,e.loading=!1,e.updateView(),i.loading.hide(10)})).catch((function(n){e.loading=!1,i.onError("ERROR.LOAD_IDENTITY_FAILED")(n)}))},e.refresh=function(){if(!e.loading&&e.formData.pubkey)return e.load(e.formData.pubkey,!1)},e.updateView=function(){e.$broadcast("$$rebind::rebind")},e.removeActionParamInLocationHref=function(e){if(e&&e.stateParams&&e.stateParams.action){var n=angular.copy(e.stateParams);n.action=null,a.nextViewOptions({disableAnimate:!0,disableBack:!1,historyRoot:!1}),t.go(e.stateName,n,{reload:!1,inherit:!0,notify:!1})}},e.showSharePopover=function(n){var t=e.formData.name||e.formData.name||e.formData.pubkey,a=s.getUrl("/user/profile/"+e.formData.pubkey+"/_share");i.screen.isSmall()&&(n=angular.element(document.querySelector("#wot-share-anchor-"+e.formData.pubkey))||n),i.popover.share(n,{bindings:{url:a,titleKey:"WOT.VIEW.POPOVER_SHARE_TITLE",titleValues:{title:t},postMessage:t}})}}function g(e,n,t,a,i,o){angular.extend(this,t("WotIdentityAbstractCtrl",{$scope:e})),e.motion=i.motion.fadeSlideInRight,e.options=e.options||{},e.options.like={kinds:["VIEW","LIKE","ABUSE","FOLLOW","STAR"],index:"user",type:"profile"},e.likeData={views:{},likes:{},follows:{},abuses:{},stars:{}},e.enter=function(n,t){var i=function(){t.stateParams&&t.stateParams.action&&(a((function(){e.doAction(t.stateParams.action.trim())}),100),e.removeActionParamInLocationHref(t),e.likeData.id=e.formData.pubkey)};if(t.stateParams&&t.stateParams.pubkey&&t.stateParams.pubkey.trim().length>0){if(e.loading)return e.load(t.stateParams.pubkey.trim(),!0,t.stateParams.name).then(i)}else if(t.stateParams&&t.stateParams.name&&t.stateParams.name.trim().length>0){if(e.loading)return e.load(null,!0,t.stateParams.name).then(i)}else if(o.isLogin()){if(e.loading)return e.load(o.data.pubkey,!0,o.data.name).then(i)}else e.showHome()},e.$on("$ionicView.enter",e.enter),e.updateView=function(){console.debug("[identity] Updating view"),e.motion.show({selector:".view-identity .list .item"}),e.$broadcast("$csExtension.motion"),e.$broadcast("$$rebind::rebind")}}function f(e,n,t,a,i,o,s,r,l,c,d,u,p,m){e.formData=angular.copy(p.data),e.popupData={},e.loading=!0,e.nodePopup={},e.bma=c,e.$on("$ionicView.enter",(function(){p.ready().then(e.load)})),e.setPopupForm=function(n){e.popupForm=n},e.load=function(){return e.loading=!0,e.locales=angular.copy(p.locales),angular.merge(e.formData,p.data),e.formData.locale=p.data.locale&&p.data.locale.id&&_.findWhere(e.locales,{id:p.data.locale.id})||_.findWhere(e.locales,{id:p.defaultSettings.locale.id}),o((function(){e.loading=!1,r.ink({selector:".item"}),e.showHelpTip()}),100)},e.reset=function(){e.actionsPopover&&e.actionsPopover.hide(),e.pendingSaving=!0,p.reset().then(m.restart).then((function(){e.load(),e.pendingSaving=!1}))},e.changeLanguage=function(e){s.use(e)},e.changeNode=function(n){var t=e.formData.node.port&&80!=e.formData.node.port&&443!=e.formData.node.port?e.formData.node.port:void 0;n=n||{host:e.formData.node.host,port:t,useSsl:angular.isDefined(e.formData.node.useSsl)?e.formData.node.useSsl:443==e.formData.node.port},e.showNodePopup(n).then((function(n){if(n.host!==e.formData.node.host||n.port!==e.formData.node.port||n.useSsl!==e.formData.node.useSsl||e.formData.node.temporary){r.loading.show();var t=c.instance(n.host,n.port,n.useSsl,!0);t.isAlive().then((function(i){return i?(r.loading.hide(),angular.merge(e.formData.node,n),delete e.formData.node.temporary,c.copy(t),e.bma=c,m.restart(),a.clearCache()):(r.loading.hide(),r.alert.error("ERROR.INVALID_NODE_SUMMARY").then((function(){e.changeNode(n)})))}))}}))},e.showNodeList=function(){var n=!!("true"===u.httpsMode||!0===u.httpsMode||"force"===u.httpsMode||t.location&&"https:"===t.location.protocol);return i._popupStack[0].responseDeferred.promise.close(),l.showNetworkLookup({enableFilter:!0,bma:!0,ssl:!!n||void 0}).then((function(e){if(e){var n=e.getBMA();return{host:n.dns?n.dns:e.hasValid4(n)?n.ipv4:n.ipv6,port:n.port||80,useSsl:n.useSsl||443==n.port}}})).then((function(n){e.changeNode(n)}))},e.showNodePopup=function(t){return n((function(n,a){e.popupData.newNode=t.port?[t.host,t.port].join(":"):t.host,e.popupData.useSsl=t.useSsl,e.popupForm&&e.popupForm.$setPristine(),s(["SETTINGS.POPUP_PEER.TITLE","COMMON.BTN_OK","COMMON.BTN_CANCEL"]).then((function(t){i.show({templateUrl:"templates/settings/popup_node.html",title:t["SETTINGS.POPUP_PEER.TITLE"],scope:e,buttons:[{text:t["COMMON.BTN_CANCEL"]},{text:t["COMMON.BTN_OK"],type:"button-positive",onTap:function(n){if(e.popupForm.$submitted=!0,e.popupForm.$valid&&e.popupForm.newNode)return{server:e.popupData.newNode,useSsl:e.popupData.useSsl};n.preventDefault()}}]}).then((function(e){if(e){var t=e.server.split(":");t[1]=t[1]?t[1]:e.useSsl?443:80,n({host:t[0],port:t[1],useSsl:e.useSsl})}else r.loading.hide()}))}))}))},e.save=function(){return e.loading||e.pendingSaving?n.when():e.saving?(e.pendingSaving=!0,o((function(){return e.pendingSaving=!1,e.save()}),500)):(e.saving=!0,o((function(){return e.cleanupHelpTip(),p.apply(e.formData),p.store()}),100).then((function(){e.saving=!1})))},e.onDataChanged=function(t,a,i){return e.loading||e.pendingSaving?n.when():e.saving?(e.pendingSaving=!0,o((function(){return e.pendingSaving=!1,e.onDataChanged(t,a,i)}),500)):void(i!==e||angular.equals(t,a)||e.save())},e.$watch("formData",e.onDataChanged,!0),e.getServer=function(){return e.formData.node&&e.formData.node.host?d.getServer(e.formData.node.host,e.formData.node.port):""},e.cleanupHelpTip=function(){if(e.formData.helptip.enable!==p.data.helptip.enable){var n=e.formData.helptip.enable;e.formData.helptip=angular.merge({},p.defaultSettings.helptip),e.formData.helptip.enable=n}},e.showActionsPopover=function(n){r.popover.show(n,{templateUrl:"templates/settings/popover_actions.html",scope:e,afterShow:function(n){e.actionsPopover=n}})},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null)},e.startSettingsTour=function(){return e.hideActionsPopover(),e.showHelpTip(0,!0)},e.showHelpTip=function(n,t){if((e.isLogin()||t)&&!((n=angular.isDefined(n)?n:p.data.helptip.settings)<0)){0===n&&(n=1);var a=e.createHelptipScope(t);if(a)return a.startSettingsTour(n,!1).then((function(e){a.$destroy(),p.data.helptip.settings=e,p.store()}))}}}function h(e){var n=this;Object.keys(e).forEach((function(t){n[t]=e[t]})),n.endpoints=n.endpoints||[]}function T(e,n){var t,a,i={user:"EVENT.USER.",page:"EVENT.PAGE.",market:"EVENT.MARKET."},o=this;function s(e){return e?e.substr(0,4)+e.substr(e.length-4):""}return e=e||{},o.id=e.id||""+Date.now(),o.type=e.type&&e.type.toLowerCase(),o.time=e.time,o.hash=e.hash,o.read=!!e.read_signature,o.message=e.reference&&i[e.reference.index]?i[e.reference.index]+e.code:"EVENT."+e.code,o.params=e.params,n&&"function"==typeof n&&(o.markAsReadCallback=n),o.markAsRead=function(){o.markAsReadCallback&&o.markAsReadCallback(o)},e.code=e.code||"",e.code.startsWith("MEMBER_")?(o.avatarIcon="ion-person",o.icon="ion-information-circled positive",o.state="app.view_wallet",o.medianTime=o.time):e.code.startsWith("TX_")?(o.avatarIcon="ion-card",o.icon="TX_SENT"===e.code?"ion-paper-airplane dark":"ion-archive balanced",o.medianTime=o.time,(t=e.params.length>0?e.params[0]:null)&&-1==t.indexOf(",")&&(o.pubkey=t),o.state="app.view_wallet_tx",o.stateParams={refresh:!0}):e.code.startsWith("CERT_")?(o.avatarIcon="CERT_RECEIVED"===e.code?"ion-ribbon-b":"ion-ribbon-a",o.icon="CERT_RECEIVED"===e.code?"ion-ribbon-b balanced":"ion-ribbon-a gray",o.pubkey=e.params.length>0?e.params[0]:null,o.medianTime=o.time,o.state="app.wallet_cert",o.stateParams={type:"CERT_RECEIVED"===e.code?"received":"given"}):e.code.startsWith("MESSAGE_")?(o.avatarIcon="ion-email",o.icon="ion-email dark",(t=e.params.length>0?e.params[0]:null)&&-1===t.indexOf(",")&&(o.pubkey=t),o.id=e.reference.id):e.reference&&"user"===e.reference.index&&"profile"===e.reference.type?(o.pubkey=e.params.length>0?e.params[0]:null,o.state="app.user_identity",o.stateParams={pubkey:o.pubkey,name:e.params&&e.params[3]},e.code.startsWith("LIKE_")?(o.avatarIcon="ion-person",o.icon="ion-ios-heart positive"):e.code.startsWith("STAR_")?(o.avatarIcon="ion-person",o.icon="ion-star gray"):e.code.startsWith("FOLLOW_")?(o.avatarIcon="ion-person",o.icon="ion-ios-people gray"):e.code.startsWith("ABUSE_")&&(o.avatarIcon="ion-person",o.icon="ion-android-warning assertive"),e.code.startsWith("MODERATION_")?(o.state="app.user_identity",o.stateParams={pubkey:e.reference.id,name:e.params&&e.params[3]},o.avatarIcon="ion-alert-circled",o.icon="ion-alert-circled energized",a=e.params&&e.params[4]||0,"MODERATION_RECEIVED"===e.code&&5==a&&(o.message="EVENT.USER.DELETION_RECEIVED",o.icon="ion-trash-a assertive")):(o.icon="ion-person dark",o.state="app.view_wallet")):e.reference&&"page"===e.reference.index?(o.pubkey=e.params.length>0?e.params[0]:null,o.avatarIcon="ion-social-buffer",e.reference.anchor?(o.icon="ion-ios-chatbubble-outline dark",o.state="app.view_page_anchor",o.stateParams={id:e.reference.id,title:e.params[1],anchor:s(e.reference.anchor)}):(o.icon="ion-social-buffer dark",o.state="app.view_page",o.stateParams={id:e.reference.id,title:e.params[1]}),e.code.startsWith("LIKE_")?(o.icon="ion-ios-heart positive",o.state="app.user_identity",o.stateParams={pubkey:o.pubkey,name:e.params&&e.params[3]}):e.code.startsWith("FOLLOW_")?(o.avatarIcon="ion-person",o.state="app.user_identity",o.stateParams={pubkey:o.pubkey,name:e.params&&e.params[3]}):e.code.startsWith("ABUSE_")?(o.icon="ion-alert-circled energized",o.state="app.user_identity",o.stateParams={pubkey:o.pubkey,name:e.params&&e.params[3]}):e.code.startsWith("MODERATION_")&&(o.avatarIcon="ion-alert-circled",o.icon="ion-alert-circled energized",a=e.params&&e.params[4]||0,"MODERATION_RECEIVED"===e.code&&5==a&&(o.message="EVENT.PAGE.DELETION_RECEIVED",o.icon="ion-trash-a assertive"))):e.reference&&"market"===e.reference.index?(o.avatarIcon="ion-speakerphone",o.pubkey=e.params.length>0?e.params[0]:null,e.reference.anchor?(o.icon="ion-ios-chatbubble-outline dark",o.state="app.market_view_record_anchor",o.stateParams={id:e.reference.id,title:e.params[2],anchor:s(e.reference.anchor)}):(o.icon="ion-speakerphone dark",o.state="app.market_view_record",o.stateParams={id:e.reference.id,title:e.params[2]}),e.code.startsWith("LIKE_")?o.icon="ion-ios-heart positive":e.code.startsWith("FOLLOW_")?o.avatarIcon="ion-person":e.code.startsWith("ABUSE_")?o.icon="ion-alert-circled energized":e.code.startsWith("MODERATION_")&&(o.avatarIcon="ion-alert-circled",o.icon="ion-alert-circled energized","MODERATION_RECEIVED"===e.code&&5==a&&(o.message="EVENT.MARKET.DELETION_RECEIVED",o.icon="ion-trash-a assertive"))):"INFO"===e.type?(o.avatarIcon="ion-information",o.icon="ion-information-circled positive"):"WARN"===e.type?(o.avatarIcon="ion-alert-circled",o.icon="ion-alert-circled energized"):"ERROR"===e.type&&(o.avatarIcon="ion-close",o.icon="ion-close-circled assertive"),o}function b(e,n){var t=this;t.id=e,t.message=null,t.html=null,t.issuer=null,t.time=null,t.creationTime=null,t.reply_to=null,t.replyCount=0,t.parent=null,t.replies=[],t.onRemoveListeners=[],t.copy=function(e){t.message=e.message,t.html=e.html,t.issuer=e.issuer,t.time=e.time,t.creationTime=e.creationTime||t.time,t.id=e.id||t.id,t.reply_to=e.reply_to||t.reply_to,t.name=e.name||t.name,t.avatarStyle=e.avatarStyle||t.avatarStyle,e.parent&&(t.parent=e.parent),e.replies&&t.setReplies(e.replies)},t.copyFromJson=function(e){t.message=e.message,t.issuer=e.issuer,t.time=e.time,t.creationTime=e.creationTime||t.time,t.reply_to=e.reply_to},t.addOnRemoveListener=function(e){e&&"function"==typeof e&&t.onRemoveListeners.push(e)},t.cleanAllListeners=function(){t.onRemoveListeners=[]},t.setReplies=function(e){t.removeAllReplies(),t.addReplies(e)},t.addReplies=function(e){e&&e.length&&(e=e.sort((function(e,n){return e.time-n.time})),_.forEach(e,(function(e){e.parent=t,t.replies.push(e)})),t.replyCount+=e.length)},t.containsReply=function(e){return-1!=t.replies.indexOf(e)},t.addReply=function(e){t.replyCount+=1,t.replies.push(e),t.replies=t.replies.sort((function(e,n){return e.time-n.time})),e.parent=t},t.removeAllReplies=function(){if(t.replyCount){var e=t.replies.splice(0,t.replies.length);t.replyCount=0,_.forEach(e,(function(e){e.remove()}))}},t.removeReply=function(e){var n=_.findIndex(t.replies,{id:e});-1!=n&&(t.replyCount--,delete t.replies.splice(n,1)[0].parent)},t.remove=function(){t.parent&&(t.parent.removeReply(t.id),delete t.parent),t.onRemoveListeners.length&&(_.forEach(t.onRemoveListeners,(function(e){e(t)})),t.issuer=null,t.message=null,t.cleanAllListeners())},n&&"object"==typeof n&&t.copyFromJson(n)}function v(e,n,t,a){e.selectNewPicture=function(n){if(a.enable)e.openPicturePopup();else{var t=angular.element(document.querySelector(n||"#pictureFile"));t&&t.length>0&&t[0].click()}},e.openPicturePopup=function(){a.camera.getPicture().then((function(n){e.pictures.push({src:"data:image/png;base64,"+n,isnew:!0})})).catch(n.onError("ERROR.TAKE_PICTURE_FAILED"))},e.onFileChanged=function(t){if(t&&t.file){n.loading.show();var a=t.file;return n.image.resizeFile(a).then((function(t){e.pictures.push({src:t,isnew:!0}),n.loading.hide(100)})).catch((function(e){console.error(e),n.loading.hide()}))}},e.removePicture=function(n){e.pictures.splice(n,1)},e.favoritePicture=function(n){if(n>0){var t=e.pictures[n];e.pictures.splice(n,1),e.pictures.splice(0,0,t)}},e.rotatePicture=function(t){var a=e.pictures[t];n.image.rotateSrc(a.src).then((function(e){a.src=e}))}}function O(e,n,t,a){e.loading=!0,e.allCategories=[],e.categories=[],this.searchText="",this.title=a&&a.title,e.afterLoad=function(a){e.categories=a,e.allCategories=a,e.loading=!1,t((function(){n.ink()}),10)},this.doSearch=function(){var n=this.searchText.toLowerCase().trim();n.length>1?(e.loading=!0,e.categories=e.allCategories.reduce((function(e,t){return t.parent&&-1!=t.name.toLowerCase().search(n)?e.concat(t):e}),[]),e.loading=!1):e.categories=e.allCategories},a&&a.categories?e.afterLoad(a.categories):a&&a.load&&a.load().then((function(n){e.afterLoad(n)}))}function R(e,n,t,a,i,o,s){e.loading=!0,e.defaultCommentSize=5,e.formData={},e.comments={},e.$on("$recordView.enter",(function(n,t){e.loading?e.anchor=t&&t.stateParams.anchor:e.id&&e.load(e.id,{animate:!1})})),e.$on("$recordView.load",(function(n,t,a){e.id=t||e.id,e.service=a.comment||e.service,e.service?(console.debug("[ES] [comment] Will use {"+e.service.index+"} service"),e.id&&e.load(e.id).then((function(){if(e.anchor)return i(e.scrollToAnchor,500)}))):console.error("[ES] [comment] Missing service in the emitted event '$recordView.load' !")})),e.load=function(n,t){return(t=t||{}).from=t.from||0,t.size=t.size||e.anchor&&-1,t.size=t.size||e.defaultCommentSize,t.animate=!angular.isDefined(t.animate)||t.animate,t.loadAvatarAllParent=!angular.isDefined(t.loadAvatarAllParent)||t.loadAvatarAllParent,e.loading=!0,e.service.load(n,t).then((function(a){!t.animate&&a.result.length&&_.forEach(a.result,(function(e){e.isnew=!0})),e.comments=a,e.comments.hasMore=a.total>a.result.length,e.loading=!1,e.service.changes.start(n,a,e),e.motion.show({selector:".comments .item",ink:!1})}))},e.$on("$recordView.beforeLeave",(function(){if(e.comments){if(!e.service)return void console.error("[comment] Comment controller has no service ! Unable to listen changes...");e.service.changes.stop(e.comments)}})),e.scrollToAnchor=function(){if(e.anchor){var n=document.getElementsByName(e.anchor);if(!n||!n.length)return i(e.scrollToAnchor,500);for(var t=0;t<n.length-1;t++)angular.element(n[t]).remove();o(e.anchor),i((function(){e.anchor=null}),1500)}},e.showMore=function(){e.load(e.id,{from:0,size:-1,loadAvatarAllParent:!1}).then((function(){e.motion.show({selector:".card-avatar"})}))},e.onKeypress=function(n){n&&10==n.charCode&&n.ctrlKey&&(e.save(),n.preventDefault())},e.save=function(){e.formData.message&&e.formData.message.length&&e.loadWallet({minData:!0,auth:!0}).then((function(){s.loading.hide();var n=e.formData;return e.formData={},e.focusNewComment(),e.service.save(e.id,e.comments,n)})).then((function(){e.comments.total++})).catch(s.onError("COMMENTS.ERROR.FAILED_SAVE_COMMENT"))},e.share=function(a,i){var o,r=angular.copy(t.params);r.anchor?(r.anchor=n("formatHash")(i.id),o=t.href(t.current.name,r,{absolute:!0})):o=t.href(t.current.name,r,{absolute:!0})+"/"+n("formatHash")(i.id);var l=_.findIndex(e.comments.result,{id:i.id}),c=o+"?u="+(i.name||n("formatPubkey")(i.issuer));s.popover.show(a,{templateUrl:"templates/common/popover_share.html",scope:e,bindings:{titleKey:"COMMENTS.POPOVER_SHARE_TITLE",titleValues:{number:l?l+1:1},date:i.creationTime,value:c,postUrl:o,postMessage:i.message},autoselect:".popover-share input"})},e.edit=function(n){var t=new b;t.copy(n),e.formData=t},e.remove=function(n){n&&(n.remove(),e.comments.total--)},e.reply=function(n){n&&n.id&&(e.formData={parent:n},e.focusNewComment(!0))},e.cancel=function(){e.formData={},e.focusNewComment()},e.focusNewComment=function(e){s.screen.isSmall()?e&&a("comment-form-input"):a("comment-form-textarea")},e.removeParentLink=function(){delete e.formData.parent,delete e.formData.reply_to,e.focusNewComment()},e.toggleExpandedReplies=function(e,n){e.expandedReplies=e.expandedReplies||{},e.expandedReplies[n]=!e.expandedReplies[n]},e.toggleExpandedParent=function(e,n){e.expandedParent=e.expandedParent||{},e.expandedParent[n]=!e.expandedParent[n]}}function I(e,n,t,a,i){e.socialData={url:null,reorder:!1},e.addSocialNetwork=function(){if(e.socialData.url&&0!==e.socialData.url.trim().length){e.formData.socials=e.formData.socials||[];var o=e.socialData.url.trim();if(_.findWhere(e.formData.socials,{url:o}))e.socialData.url="";else{var s=i.get(o);if(!s)return a.alert.error("PROFILE.ERROR.INVALID_SOCIAL_NETWORK_FORMAT"),void n("socialUrl");e.formData.socials.push(s),e.socialData.url="",e.motion.show({selector:"#social-"+t("formatSlug")(s.url),startVelocity:1e4})}}},e.editSocialNetwork=function(t){var a=e.formData.socials[t];e.formData.socials.splice(t,1),e.socialData.url=a.url,n("socialUrl")},e.reorderSocialNetwork=function(n,t,a){n&&t!==a&&(e.formData.socials.splice(t,1),e.formData.socials.splice(a,0,n))},e.filterFn=function(e){return!e.recipient||e.valid}}function N(e){e.openSocial=function(n,t){return n.stopPropagation(),e.openLink(n,t.url,{type:t.type})},e.filterFn=function(e){return!e.recipient||e.valid}}function S(e,n){e.formData={initCrop:!1,imageCropStep:0,imgSrc:void 0,result:void 0,resultBlob:void 0},e.onFileChanged=function(t){if(t&&t.file){var a=new FileReader;a.readAsDataURL(t.file),a.onload=function(t){var a=this.result;e.$applyAsync((function(){e.formData.imgSrc=n.getTrustedHtml(a)}))}}},e.doNext=function(){2===e.formData.imageCropStep?e.doCrop():3===e.formData.imageCropStep&&e.closeModal(e.formData.result)},e.doPrevious=function(){e.formData.imageCropStep-=1,1===e.formData.imageCropStep&&(e.formData.imgSrc=void 0)},e.doCrop=function(){e.formData.initCrop=!0},e.clear=function(){e.formData={initCrop:!1,imageCropStep:1,imgSrc:void 0,result:void 0,resultBlob:void 0}}}function A(e,n,t,a){var i=n.plugins&&n.plugins.es&&n.plugins.es.defaultCountry,o=!1;e.options=e.options||{},e.options.position=e.options.position||{showCheckbox:!0,required:!1},e.formPosition={loading:!1,enable:!!angular.isDefined(e.options.position.required)&&e.options.position.required},e.searchModalOpened=!1,e.tryToLocalize=function(){if(!e.formPosition.loading&&!o){var n=e.getAddressToSearch();return n?(e.formPosition.loading=!0,t.point.searchByAddress(n).then((function(t){return t&&1===t.length?e.updateGeoPoint(t[0]):e.openSearchLocationModal({text:n,results:t||[],forceFallback:!t||!t.length})})).then((function(){e.formPosition.loading=!1})).catch((function(n){console.error(n),e.formPosition.loading=!1}))):(o=!0,t.point.current().then(e.updateGeoPoint).then((function(){o=!1})).catch((function(e){console.error(e),o=!1})))}},e.onCityChanged=function(){if(!e.loading)return e.formPosition.enable?(e.formData.geoPoint&&(e.formData.geoPoint.lat=void 0,e.formData.geoPoint.lon=void 0),e.tryToLocalize()):void 0},e.onUseGeopointChanged=function(){e.loading||(e.formPosition.enable?e.tryToLocalize():e.formData.geoPoint&&(e.formData.geoPoint.lat=void 0,e.formData.geoPoint.lon=void 0,e.dirty=!0))},e.onGeopointChanged=function(){e.loading&&(e.formPosition.enable=e.formData.geoPoint&&!!e.formData.geoPoint.lat&&!!e.formData.geoPoint.lon)},e.$watch("formData.geoPoint",e.onGeopointChanged),e.getAddressToSearch=function(){return e.formData.address&&e.formData.city?[e.formData.address.trim(),e.formData.city.trim()].join(", "):e.formData.city||e.formData.address||e.formData.location},e.updateGeoPoint=function(n){if(n&&n.lat&&n.lon&&(e.dirty=!0,e.formData.geoPoint=e.formData.geoPoint||{},e.formData.geoPoint.lat=parseFloat(n.lat),e.formData.geoPoint.lon=parseFloat(n.lon),n.address&&n.address.city)){var t=[n.address.city];n.address.postcode&&t.push(n.address.postcode),n.address.country!==i&&t.push(n.address.country),e.formData.city=t.join(", ")}},e.openSearchLocationModal=function(n){if(!e.searchModalOpened){e.searchModalOpened=!0;var t={text:(n=n||{}).text||e.getAddressToSearch(),results:n.results,fallbackText:n.fallbackText||e.formData.city,forceFallback:angular.isDefined(n.forceFallback)?n.forceFallback:void 0};return a.show("plugins/es/templates/common/modal_location.html","ESSearchPositionModalCtrl",t,{focusFirstInput:!0}).then((function(n){e.searchModalOpened=!1,e.updateGeoPoint(n)})).catch((function(n){console.error(n),e.searchModalOpened=!1}))}}}function D(e,n,t,a,i){var o=t.plugins&&t.plugins.es&&t.plugins.es.defaultCountry,s=!1;e.geoDistanceLabels=[5,10,20,50,100,250,500].reduce((function(e,n){return e[n]={labelKey:"LOCATION.DISTANCE_OPTION",labelParams:{value:n}},e}),{}),e.geoDistances=_.keys(e.geoDistanceLabels),e.searchPosition=function(t){if(s)return n.when();s=!0;var i=t?a.point.searchByAddress(t).then((function(n){return n&&1===n.length?(n[0].exact=!0,n[0]):e.openSearchLocationModal({text:t,results:n||[],forceFallback:!n||!n.length}).then((function(e){if(e&&e.address&&e.address.city){var n=[e.address.city];e.address.postcode&&n.push(e.address.postcode),e.address.country!==o&&n.push(e.address.country),e.shortName=n.join(", ")}return e}))})):a.point.current();return i.then((function(e){if(s=!1,e&&e.lat&&e.lon)return{lat:parseFloat(e.lat),lon:parseFloat(e.lon),name:e.shortName,exact:e.exact}})).catch((function(e){console.error(e),s=!1})),i},e.openSearchLocationModal=function(n){var t={text:(n=n||{}).text||e.getAddressToSearch(),results:n.results,fallbackText:n.fallbackText||e.search.location,forceFallback:angular.isDefined(n.forceFallback)?n.forceFallback:void 0};return i.show("plugins/es/templates/common/modal_location.html","ESSearchPositionModalCtrl",t,{focusFirstInput:!0})}}function C(e,n,t,a,i,o){var s=i.plugins&&i.plugins.es&&i.plugins.es.defaultCountry,r=!1;e.locations=void 0,e.selectLocationIndex=-1,e.onKeydown=function(n){switch(n.keyCode){case 27:e.hideDropdown();break;case 13:e.locations&&e.locations.length&&e.onEnter();break;case 38:e.onArrowUpOrDown(-1),n.preventDefault();break;case 40:e.onArrowUpOrDown(1),n.preventDefault();break;case 8:case 45:case 46:break;case 37:case 39:case 16:case 17:case 35:case 36:break;default:e.showDropdown()}},e.onEnter=function(){e.selectLocationIndex>-1?e.selectLocation(e.locations[e.selectLocationIndex]):e.selectLocation(e.locations[0])},e.onArrowUpOrDown=function(n){e.locations&&(e.selectLocationIndex+=n,e.selectLocationIndex>=e.locations.length&&(e.selectLocationIndex=0),e.selectLocationIndex<0&&(e.selectLocationIndex=e.locations.length-1),_.forEach(e.locations||[],(function(n,t){n.selected=t===e.selectLocationIndex})))},e.onLocationChanged=function(){r||e.search.loading||(e.search.geoPoint=void 0,e.showDropdown())},e.showDropdown=function(){var n=e.search.location&&e.search.location.trim();if(!n||n.length<3)return e.hideDropdown(!0);var t=e.requestId&&e.requestId+1||1;return e.requestId=t,r=!0,o.point.searchByAddress(n).then((function(n){e.requestId===t&&(r=!1,e.locations=n||[],e.license=n&&n.length&&n[0].license)})).catch((function(n){throw e.hideDropdown(),n}))},e.hideDropdown=function(t){return t?(e.locations=void 0,e.selectLocationIndex=-1,e.license=void 0,void(r=!1)):n((function(){r||(e.locations=void 0,e.license=void 0,r=!1)}),500)},e.selectLocation=function(n,t){if(r=!0,n)if(e.search.geoPoint=e.search.geoPoint||{},e.search.geoPoint.lat=parseFloat(n.lat),e.search.geoPoint.lon=parseFloat(n.lon),t)e.search.geoPoint.exact=!0;else if(n&&n.address&&n.address.city){var a=[n.address.city];n.address.postcode&&a.push(n.address.postcode),n.address.country!==s&&a.push(n.address.country),e.search.location=a.join(", ")}e.hideDropdown(!0)},e.openSearchLocationModal=function(n){var t={text:(n=n||{text:e.search.location}).text||e.search.location};return a.show("plugins/es/templates/common/modal_location.html","ESSearchPositionModalCtrl",t,{focusFirstInput:!0}).then(e.selectLocation)},e.showDistancePopover=function(n){t.popover.show(n,{templateUrl:"plugins/es/templates/common/popover_distances.html",scope:e,autoremove:!0,afterShow:function(n){e.actionsPopover=n}})},e.selectDistance=function(n){e.search.geoDistance=n,e.actionsPopover&&e.actionsPopover.hide()}}function P(e,n,t,a,i){e.search={text:i.text||"",fallbackText:i.fallbackText||void 0,forceFallback:!!angular.isDefined(i.forceFallback)&&i.forceFallback,loading:!1,results:i.results||void 0},e.$on("modal.shown",(function(){e.doSearch(!0)})),e.doSearch=function(i){var o=e.search.text&&e.search.text.trim();if(!o)return n.when();e.search.loading=!0;var s=i&&e.search.fallbackText&&e.search.fallbackText.trim();return s=s&&s!==o?s:void 0,(i&&e.search.forceFallback&&e.search.results?n.when(e.search.results):a.point.searchByAddress(o)).then((function(e){return e&&e.length||!s?e:n.all([t("LOCATION.MODAL.ALTERNATIVE_RESULT_DIVIDER",{address:s}),a.point.searchByAddress(s)]).then((function(e){var n=e[0];return(e=e[1])&&e.length?[{name:n}].concat(e):e}))})).then((function(n){e.search.loading=!1,e.search.results=n||[],e.license=n&&n.length&&n[0].license})).catch((function(n){throw e.search.loading=!1,e.search.results=[],e.license=void 0,n}))}}function y(e,n,t,a,i,o,s,r,l){e.entered=!1,e.abuseData={},e.abuseLevels=[{value:1,label:"LOW"},{value:2,label:"LOW"}],e.staring=!1,e.options=e.options||{},e.options.like=e.options.like||{kinds:l.constants.KINDS,index:void 0,type:void 0,id:void 0},e.$on("$recordView.enter",(function(n,t){e.entered?e.likeData.id&&e.loadLikes(e.likeData.id):e.entered=!1})),e.$on("$recordView.load",(function(n,t){e.likeData.id=t||e.likeData.id,e.likeData.id&&e.loadLikes(e.likeData.id)})),e.initLikes=function(){if(!e.likeData)throw Error("Missing 'likeData' in scope. Cannot load likes counter");if(!e.options.like.service){if(!e.options.like.index||!e.options.like.type)throw Error("Missing 'options.like.index' or 'options.like.type' in scope. Cannot load likes counter");e.options.like.service=l.instance(e.options.like.index,e.options.like.type)}e.options.like.kinds||(e.options.like.kinds=_.filter(l.constants.KINDS,(function(n){var t=n.toLowerCase()+"s";return angular.isDefined(e.likeData[t])})))},e.loadLikes=function(t){if(!e.likeData.loading){t=t||e.likeData.id,e.initLikes();var a=e.options.like.kinds||[];if(a.length){e.likeData.loading=!0;var i=Date.now();return console.debug("[ES] Loading counter of {0}... ({1})".format(t.substring(0,8),a)),n.all(_.map(a,(function(n){var a=n.toLowerCase()+"s";return e.options.like.service.count(t,{issuer:s.isLogin()?s.data.pubkey:void 0,kind:n}).then((function(n){e.likeData[a]&&angular.merge(e.likeData[a],n)}))}))).then((function(){e.likeData.id=t,console.debug("[ES] Loading counter of {0} [OK] in {1}ms".format(t.substring(0,8),Date.now()-i)),_.contains(a,"VIEW")&&!e.canEdit&&e.markAsView(),e.$parent&&(console.debug("[ES] [likes] Adding data and functions to parent scope"),e.$parent.toggleLike=e.toggleLike,e.$parent.reportAbuse=e.reportAbuse),e.likeData.loading=!1})).catch((function(n){console.error(n&&n.message||n),e.likeData.loading=!1}))}}},e.markAsView=function(){if(e.likeData&&e.likeData.views&&!e.likeData.views.wasHit&&!(e.canEdit||e.formData&&s.isUserPubkey(e.formData.issuer))){var n=t((function(){s.isLogin()&&e.options.like.service.add(e.likeData.id,{kind:"view"}).then((function(){e.likeData.views.total=(e.likeData.views.total||0)+1})),n=null}),3e3);e.$on("$destroy",(function(){n&&t.cancel(n)}))}},e.toggleLike=function(a,i){if(e.initLikes(),!e.likeData.id)throw Error("Missing 'likeData.id' in scope. Cannot apply toggle");(i=i||{}).kind=i.kind&&i.kind.toUpperCase()||"LIKE";var r=i.kind.toLowerCase()+"s";return e.likeData[r]=e.likeData[r]||{},!0===e.likeData[r].loading||e.likeData.loading?(a.preventDefault(),n.reject()):"LIKE"===i.kind&&e.dislikes&&e.dislikes.wasHit?e.toggleLike(a,{kind:"dislike"}).then((function(){e.toggleLike(a,i)})):"DISLIKE"===i.kind&&e.likes&&e.likes.wasHit?e.toggleLike(a,{kind:"LIKE"}).then((function(){e.toggleLike(a,i)})):(e.likeData[r].loading=!0,(s.isLogin()?n.when():e.loadWallet({minData:!0})).then((function(){return e.options.like.service.toggle(e.likeData.id,i)})).then((function(n){o.loading.hide(),0!==n&&(e.likeData[r].total=(e.likeData[r].total||0)+n,e.likeData[r].wasHit=n>0),t((function(){e.likeData[r].loading=!1}),1e3)})).catch((function(n){console.error(n),e.likeData[r].loading=!1,o.loading.hide(),a.preventDefault()})))},e.setAbuseForm=function(n){e.abuseForm=n},e.showAbuseCommentPopover=function(n){return a(["COMMON.REPORT_ABUSE.TITLE","COMMON.REPORT_ABUSE.SUB_TITLE","COMMON.BTN_SEND","COMMON.BTN_CANCEL"]).then((function(n){return o.loading.hide(),i.show({templateUrl:"plugins/es/templates/common/popup_report_abuse.html",title:n["COMMON.REPORT_ABUSE.TITLE"],subTitle:n["COMMON.REPORT_ABUSE.SUB_TITLE"],cssClass:"popup-report-abuse",scope:e,buttons:[{text:n["COMMON.BTN_CANCEL"],type:"button-stable button-clear gray"},{text:n["COMMON.BTN_SEND"],type:"button button-positive ink",onTap:function(n){if(e.abuseForm.$submitted=!0,e.abuseForm.$valid&&e.abuseData.comment)return e.abuseData;n.preventDefault()}}]})})).then((function(n){if(e.abuseData={},n&&n.comment)return n;o.loading.hide()}))},e.reportAbuse=function(t,a){if(!(e.likeData&&e.likeData.abuses&&e.likeData.abuses.wasHit))return(a=a||{}).comment?(a.kind="ABUSE",e.toggleLike(t,a).then((function(){o.toast.show("COMMON.REPORT_ABUSE.CONFIRM.SENT")}))):(s.isLogin()?n.when():e.loadWallet({minData:!0})).then((function(){return e.showAbuseCommentPopover(t)})).then((function(n){if(n&&n.comment)return a.comment=n.comment,a.level=n.level||n.delete&&5||void 0,e.reportAbuse(t,a)}))},e.addStar=function(n){if(e.starsPopover)return e.starsPopover.hide().then((function(){e.starsPopover=null,e.addStar(n)}));if(!e.likeData.loading&&e.likeData.stars&&!e.likeData.stars.loading){if(!s.isLogin())return e.loadWallet({minData:!0}).then((function(t){if(t)return o.loading.show(),e.options.like.service.count(e.likeData.id,{issuer:t.pubkey,kind:"STAR"}).then((function(t){angular.merge(e.stars,t),e.addStar(n)}))})).catch((function(e){}));e.likeData.stars.loading=!0;var a=angular.merge({total:0,levelAvg:0,levelSum:0,level:0,wasHit:!1,wasHitId:void 0},e.likeData.stars),i=function(){a.wasHit=!0,a.level=n,a.levelAvg=Math.floor(10*(a.levelSum/a.total+.5))/10-.5,angular.merge(e.likeData.stars,a),o.loading.hide()};return a.wasHitId?(console.debug("[ES] Deleting previous star level... "+a.wasHitId),e.options.like.service.remove(a.wasHitId).catch((function(e){if(!e||404!==e.ucode)throw e})).then((function(){return console.debug("[ES] Deleting previous star level [OK]"),a.levelSum=a.levelSum-a.level+n,i(),t((function(){return console.debug("[ES] Sending new star level..."),e.options.like.service.add(e.likeData.id,{kind:"star",level:n||1})}),2e3)})).then((function(n){return a.wasHitId=n,console.debug("[ES] Star level successfully sent... "+n),o.loading.hide(),t((function(){e.likeData.stars.loading=!1}),1e3)})).catch((function(n){console.error(n&&n.message||n),e.likeData.stars.loading=!1,o.onError("MARKET.WOT.ERROR.FAILED_STAR_PROFILE")(n),e.loadLikes()}))):e.options.like.service.add(e.likeData.id,{kind:"star",level:n||1}).then((function(t){a.levelSum+=n,a.wasHitId=t,a.total+=1,i(),console.debug("[ES] Star level successfully sent... "+t),e.likeData.stars.loading=!1,o.loading.hide()})).catch((function(n){console.error(n&&n.message||n),e.likeData.stars.loading=!1,o.onError("MARKET.WOT.ERROR.FAILED_STAR_PROFILE")(n)}))}},e.removeStar=function(n){e.starsPopover&&e.starsPopover.hide(),e.likeData.loading||(e.likeData.stars.level=void 0,e.toggleLike(n,{kind:"star"}).then((function(){return t((function(){e.loadLikes()}),1e3)})))},e.showStarPopover=function(n){e.initLikes(),e.likeData.stars.loading||(angular.isUndefined(e.likeData.stars.level)&&(e.likeData.stars.level=0),o.popover.show(n,{templateUrl:"plugins/es/templates/common/popover_star.html",scope:e,autoremove:!0,afterShow:function(n){e.starsPopover=n}}))},s.api.data.on.reset(e,(function(){_.forEach(e.options.like.kinds||[],(function(n){var t=n.toLowerCase()+"s";e.likeData[t]&&(e.likeData[t].wasHit=!1,e.likeData[t].wasHitId=void 0,e.likeData[t].level=void 0)})),e.$broadcast("$$rebind::like")}),this)}function k(e,n,t){e.extensionPoint=t.extensions.points.current.get(),e.enable=!0}function M(e,n,t){e.extensionPoint=t.extensions.points.current.get(),e.enable=!0}function w(e,n,t,a,i){e.extensionPoint=t.extensions.points.current.get(),e.enable=a.isEnable(),e.showRegistryLookupView=function(){n.go(i.screen.isSmall()?"app.registry_lookup":"app.registry_lookup_lg")},e.showNotificationsPopover=function(n){return i.popover.show(n,{templateUrl:"plugins/es/templates/notification/popover_notification.html",scope:e,autoremove:!1})},e.showMessagesPopover=function(n){return i.popover.show(n,{templateUrl:"plugins/es/templates/message/popover_message.html",scope:e,autoremove:!1})},e.showInvitationsPopover=function(n){return i.popover.show(n,{templateUrl:"plugins/es/templates/invitation/popover_invitation.html",scope:e,autoremove:!1})},a.api.state.on.changed(e,(function(n){e.enable=n}))}function U(e,n,t,a){e.updateView=function(){e.enable=a.isLogin()&&(t.data.plugins&&t.data.plugins.es?t.data.plugins.es.enable:!!t.data.plugins.host)},e.showEditUserProfile=function(){e.closeProfilePopover(),n.go("app.user_edit_profile")},t.api.data.on.changed(e,e.updateView),t.api.data.on.ready(e,e.updateView),a.api.data.on.login(e,(function(n,t){return t=t||$q.defer(),e.updateView(),t.resolve(),t.promise})),a.api.data.on.logout(e,e.updateView),e.updateView()}function x(e,n,t,a,i,o,s,r,l,c,d,u,p){e.hasWindowNotification=!!("Notification"in window),e.formData={},e.popupData={},e.loading=!0,e.enter=function(n,t){e.load()},e.$on("$ionicView.enter",e.enter),e.load=function(n){e.loading=!0;var t=e.formData.enable;e.formData=c.data.plugins&&c.data.plugins.es?angular.copy(c.data.plugins.es):{enable:!1,host:void 0,port:void 0},n&&t&&(e.formData.enable=t),e.isFallbackNode=e.formData.enable&&d.node.isFallback(),e.server=e.getServer(d),e.loading=!1},u.api.state.on.changed(e,(function(n){e.load(!0)})),e.setPopupForm=function(n){e.popupForm=n},e.changeEsNode=function(n){n=n||{host:e.formData.host,port:e.formData.port&&80!=e.formData.port&&443!=e.formData.port?e.formData.port:void 0,useSsl:angular.isDefined(e.formData.useSsl)?e.formData.useSsl:443==e.formData.port},e.showNodePopup(n).then((function(n){if(n.host!=e.formData.host||n.port!=e.formData.port||n.useSsl!=e.formData.useSsl){o.loading.show();var t=d.instance(n.host,n.port,n.useSsl);return t.isAlive().then((function(a){return a?(e.formData.host=t.host,e.formData.port=t.port,e.formData.useSsl=t.useSsl,d.copy(t)):(o.loading.hide(),o.alert.error("ERROR.INVALID_NODE_SUMMARY").then((function(){e.changeEsNode(n)})))})).then((function(){e.server=e.getServer(d),e.isFallbackNode=!1,o.loading.hide()}))}o.loading.hide()}))},e.showNodePopup=function(n){return t((function(t,s){var r=[n.host];n.port&&80!=n.port&&r.push(n.port),e.popupData.newNode=r.join(":"),e.popupData.useSsl=angular.isDefined(n.useSsl)?n.useSsl:443==n.port,e.popupForm&&e.popupForm.$setPristine(),a(["ES_SETTINGS.POPUP_PEER.TITLE","ES_SETTINGS.POPUP_PEER.HELP","COMMON.BTN_OK","COMMON.BTN_CANCEL"]).then((function(n){i.show({templateUrl:"templates/settings/popup_node.html",title:n["ES_SETTINGS.POPUP_PEER.TITLE"],subTitle:n["ES_SETTINGS.POPUP_PEER.HELP"],scope:e,buttons:[{text:n["COMMON.BTN_CANCEL"]},{text:n["COMMON.BTN_OK"],type:"button-positive",onTap:function(n){if(e.popupForm.$submitted=!0,e.popupForm.$valid&&e.popupForm.newNode)return{server:e.popupData.newNode,useSsl:e.popupData.useSsl};n.preventDefault()}}]}).then((function(e){if(e){var n=e.server.split(":");n[1]=n[1]?n[1]:e.useSsl?443:80,t({host:n[0],port:n[1],useSsl:e.useSsl})}else o.loading.hide()}))}))}))},e.showNodeList=function(){var t=!!("true"===l.httpsMode||!0===l.httpsMode||"force"===l.httpsMode||n.location&&"https:"===n.location.protocol);return i._popupStack[0].responseDeferred.promise.close(),p.showNetworkLookup({enableFilter:!0,endpoint:d.constants.GCHANGE_API,ssl:!!t||void 0}).then((function(e){if(e){var n=e.getEndpoints().reduce((function(e,n){var t=d.node.parseEndPoint(n);return t?e.concat(t):e}),[]);if(n.length){var t=n[0];return{host:t.dns?t.dns:e.hasValid4(t)?t.ipv4:t.ipv6,port:t.port||80,useSsl:t.useSsl||443==t.port}}}})).then((function(n){e.changeEsNode(n)}))},e.onFormChanged=function(){e.loading||(e.formData.notifications=e.formData.notifications||{},e.hasWindowNotification&&e.formData.notifications.emitHtml5!==("granted"===window.Notification.permission)?window.Notification.requestPermission((function(n){e.formData.notifications.emitHtml5="granted"===n,e.onFormChanged()})):(e.loading=!0,c.data.plugins=c.data.plugins||{},c.data.plugins.es=c.data.plugins.es?angular.merge(c.data.plugins.es,e.formData):e.formData,delete c.data.plugins.es.newNode,c.store().then((function(){e.loading=!1}))))},e.$watch("formData",e.onFormChanged,!0),e.getServer=function(n){if((n=n||e.formData).host)return r.getServer(n.host,n.port)}}function F(e,n,t,a,i){angular.extend(this,n("ESExtensionCtrl",{$scope:e})),e.showNewPageModal=function(e){return i.showNewPage(e)}}function H(e,n,t,a,i){e.options=e.options||{},e.options.like=e.options.like||{index:"user",type:"profile",service:i.like},e.canEdit=!0,angular.extend(this,n("ESLikesCtrl",{$scope:e})),angular.extend(this,n("ESExtensionCtrl",{$scope:e})),e.$watch("formData.pubkey",(function(n){n&&e.loadLikes(n)}))}function B(e,n,t,a,i,o,s,r,l){e.options=e.options||{},e.options.like=e.options.like||{kinds:r.constants.KINDS,index:"user",type:"profile",service:s.like},e.smallscreen=angular.isDefined(e.smallscreen)?e.smallscreen:a.screen.isSmall(),angular.extend(this,n("ESLikesCtrl",{$scope:e})),angular.extend(this,n("ESExtensionCtrl",{$scope:e})),e.showNewMessageModal=function(n){return e.loadWallet({minData:!0}).then((function(){return a.loading.hide(),!(!n&&!e.formData.profile)||a.alert.confirm("MESSAGE.CONFIRM.USER_HAS_NO_PROFILE").then((function(e){if(e)return!0}))})).then((function(n){return!!n&&l.showMessageCompose({destPub:e.formData.pubkey,destUid:e.formData.name||e.formData.uid}).then((function(e){e&&a.toast.show("MESSAGE.INFO.MESSAGE_SENT")}))}))},e.$watch("formData.pubkey",(function(n){n&&e.loadLikes(n)})),e.showActionsPopover=function(n){a.popover.show(n,{templateUrl:"plugins/es/templates/wot/view_popover_actions.html",scope:e,autoremove:!0,afterShow:function(n){e.actionsPopover=n}})},e.hideActionsPopover=function(){return e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null),!0},"buttons-top-fab"===e.extensionPoint&&e.$on("$csExtension.motion",(function(n){e.formData.profile&&e.showFab("fab-compose-"+e.formData.pubkey)}))}function V(e,n,t,a,i,o,s,r,l,c,d,u,p,m,E){e.formData={title:null,description:null,socials:[],geoPoint:{}},e.loading=!0,e.dirty=!1,e.walletData=null,e.avatar=null,e.existing=!1,e.socialData={url:null},e.socialReorder=!0,e.pubkeyPattern=d.regexp.PUBKEY,e.enter=function(n,t){e.loadWallet().then(e.load).catch((function(n){if("CANCELLED"===n)return c.loading.hide(10),void e.cancel();c.onError("PROFILE.ERROR.LOAD_PROFILE_FAILED")(n)}))},e.$on("$ionicView.enter",e.enter),e.$on("$stateChangeStart",(function(n,t,a,o){if(e.dirty&&!e.saving&&!n.defaultPrevented)return n.preventDefault(),e.loading?void 0:(e.loading=!0,c.alert.confirm("CONFIRM.SAVE_BEFORE_LEAVE","CONFIRM.SAVE_BEFORE_LEAVE_TITLE",{cancelText:"COMMON.BTN_NO",okText:"COMMON.BTN_YES_SAVE"}).then((function(n){return e.loading=!1,n?(e.form.$submitted=!0,e.save(!1,!0).then((function(n){return n&&(e.dirty=!1),n}))):(e.dirty=!1,!0)})).then((function(e){e&&(l.nextViewOptions({historyRoot:!0}),i.go(t.name,a))})).catch((function(e){})))})),e.load=function(n){return e.loading=!0,p.get(n.pubkey,{raw:!0}).then((function(t){return t?(e.avatar=u.image.fromAttachment(t.source.avatar),e.existing=!0,e.updateView(n,t.source)):(e.avatar=void 0,e.existing=!1,e.updateView(n,{})),c.loading.hide(),a((function(){e.loading=!1}),1e3)})).then((function(){o("profile-name")})).catch(c.onError("PROFILE.ERROR.LOAD_PROFILE_FAILED"))},e.setForm=function(n){e.form=n},e.updateView=function(n,t){e.walletData=n,e.formData=t,t.avatar&&(e.avatarStyle={"background-image":'url("'+e.avatar.src+'")'}),e.formData.geoPoint=e.formData.geoPoint||{},e.motion.show()},e.onFormDataChanged=function(){e.loading||(e.dirty=!0)},e.$watch("formData",e.onFormDataChanged,!0),e.save=function(i,o){if(e.form.$invalid||!n.walletData||e.saving&&!o)return t.reject();if(!o)return console.debug("[ES] [profile] Waiting debounce end, before saving..."),e.saving=!0,a((function(){return e.save(i,!0)}),650);console.debug("[ES] [profile] Saving user profile...");var r=function(n){return function(t){e.saving=!1,c.onError(n)(t)}},l=function(n){n&&(e.walletData.name=n.title,e.avatar?e.walletData.avatar=e.avatar:delete e.walletData.avatar,e.walletData.profile=angular.copy(n),e.walletData.profile.description=u.util.parseAsHtml(n.description))},d=function(){if(!i)return s("PROFILE.INFO.PROFILE_SAVED").then((function(e){c.toast.show(e)}))},m=function(t){return t.socials&&t.socials.length&&(t.socials=_.uniq(t.socials,!1,(function(e){return e.url}))),t.position&&(t.position=null),t.geoPoint&&t.geoPoint.lat&&t.geoPoint.lon?(t.geoPoint.lat=parseFloat(t.geoPoint.lat),t.geoPoint.lon=parseFloat(t.geoPoint.lon)):t.geoPoint=null,e.existing?p.update(t,{id:n.walletData.pubkey}).then((function(){return console.info("[ES] Profile successfully updated."),e.saving=!1,e.dirty=!1,l(t),d(),!0})).catch(r("PROFILE.ERROR.SAVE_PROFILE_FAILED")):p.add(t).then((function(){return console.info("[ES] [profile] Successfully created."),e.existing=!0,e.saving=!1,e.dirty=!1,l(t),d(),!0})).catch(r("PROFILE.ERROR.SAVE_PROFILE_FAILED"))};return e.avatar&&e.avatar.src?c.image.resizeSrc(e.avatar.src,!0).then((function(n){return e.formData.avatar=u.image.toAttachment({src:n}),m(e.formData)})):(delete e.formData.avatar,m(e.formData))},e.saveAndClose=function(){return e.save().then((function(n){n&&e.close()}))},e.submitAndSaveAndClose=function(){e.form.$submitted=!0,e.saveAndClose()},e.cancel=function(){return e.dirty=!1,i.go("app.view_wallet")},e.close=function(){return i.go("app.view_wallet",{refresh:!0})},e.showAvatarModal=function(){return E.camera.enable?E.camera.getPicture().then((function(n){n&&(e.avatar={src:"data:image/png;base64,"+n},e.avatarStyle={"background-image":'url("'+n+'")'},e.dirty=!0)})).catch(c.onError("ERROR.TAKE_PICTURE_FAILED")):m.show("plugins/es/templates/common/modal_edit_avatar.html","ESAvatarModalCtrl",{}).then((function(n){n&&(e.avatar={src:n},e.avatarStyle={"background-image":'url("'+n+'")'},e.dirty=!0)}))},e.rotateAvatar=function(){if(e.avatar&&e.avatar.src&&!e.rotating)return e.rotating=!0,c.image.rotateSrc(e.avatar.src).then((function(n){e.avatar.src=n,e.avatarStyle={"background-image":'url("'+n+'")'},e.dirty=!0,e.rotating=!1})).catch((function(n){console.error(n),e.rotating=!1}))},e.removeProfile=function(){return e.hideActionsPopover(),e.existing&&e.loadWallet({minData:!0}).then((function(n){c.loading.hide(),c.alert.confirm("PROFILE.CONFIRM.DELETE",void 0,{okText:"COMMON.BTN_DELETE"}).then((function(t){if(t)return console.debug("[ES] [profile] Deleting user profile..."),p.remove(n.pubkey).then((function(){return n.name=null,n.profile=null,n.avatar=null,console.debug("[ES] [profile] Successfully deleted"),e.dirty=!1,e.close()})).then((function(){return a((function(){c.toast.show("PROFILE.INFO.PROFILE_REMOVED")}),750)})).catch(c.onError("PROFILE.ERROR.REMOVE_PROFILE_FAILED"))}))}))},e.showActionsPopover=function(n){c.popover.show(n,{templateUrl:"plugins/es/templates/user/edit_popover_actions.html",scope:e,autoremove:!0,afterShow:function(n){e.actionsPopover=n}})},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null)}}function G(e,n,t,a,i,o,s,r,l,c){e.loading=!0,e.messages=[],e.$on("$ionicView.enter",(function(t,i){e.loadWallet({minData:!0}).then((function(){e.entered||(e.entered=!0,e.type=i.stateParams&&i.stateParams.type||"inbox",e.load()),e.showFab("fab-add-message-record")})).catch((function(e){"CANCELLED"===e&&(a.nextViewOptions({historyRoot:!0}),n.go("app.home"))}))})),e.refresh=function(n){return e.load(void 0,void 0,n)},e.load=function(n,t,a){var i={};return i.from=t||0,i.size=n||20,i.type=e.type,e.loading=!a,c.load(i).then((function(n){e.messages=n,r.loading.hide(),e.loading=!1,n.length>0&&e.motion.show({selector:".view-messages .list .item"})})).catch((function(n){r.onError("MESSAGE.ERROR.LOAD_MESSAGES_FAILED")(n),e.messages=[],e.loading=!1}))},e.setType=function(n){e.type=n,e.load()},e.markAllAsRead=function(){e.hideActionsPopover(),e.messages&&e.messages.length&&r.alert.confirm("MESSAGE.CONFIRM.MARK_ALL_AS_READ").then((function(n){n&&c.markAllAsRead().then((function(){_.forEach(e.messages,(function(e){e.read=!0}))})).catch(r.onError("MESSAGE.ERROR.MARK_ALL_AS_READ_FAILED"))}))},e.delete=function(n){var t=e.messages[n];t&&r.alert.confirm("MESSAGE.CONFIRM.REMOVE").then((function(a){a&&c.remove(t.id,e.type).then((function(){e.messages.splice(n,1),r.toast.show("MESSAGE.INFO.MESSAGE_REMOVED")})).catch(r.onError("MESSAGE.ERROR.REMOVE_MESSAGE_FAILED"))}))},e.deleteAll=function(){e.hideActionsPopover(),e.messages&&e.messages.length&&r.alert.confirm("MESSAGE.CONFIRM.REMOVE_ALL").then((function(n){n&&c.removeAll(e.type).then((function(){e.messages.splice(0,e.messages.length),r.toast.show("MESSAGE.INFO.All_MESSAGE_REMOVED")})).catch(r.onError("MESSAGE.ERROR.REMOVE_All_MESSAGES_FAILED"))}))},e.showNewMessageModal=function(n){return e.loadWallet({minData:!0}).then((function(){return r.loading.hide(),s.showMessageCompose(n).then((function(e){e&&r.toast.show("MESSAGE.INFO.MESSAGE_SENT")}))}))},e.showReplyModal=function(n){var a=e.messages[n];a&&t("MESSAGE.REPLY_TITLE_PREFIX").then((function(e){var n=a.content?a.content.replace(/^/g," > "):null;return n=(n=n?n.replace(/\n/g,"\n > "):null)?n+"\n":null,s.showMessageCompose({destPub:a.issuer,destUid:a.name,title:e+a.title,content:n,isReply:!0})})).then((function(e){e&&r.toast.show("MESSAGE.INFO.MESSAGE_SENT")}))},e.showActionsPopover=function(n){e.actionsPopover?e.actionsPopover.show(n):i.fromTemplateUrl("plugins/es/templates/message/lookup_popover_actions.html",{scope:e}).then((function(t){e.actionsPopover=t,e.$on("$destroy",(function(){e.actionsPopover.remove()})),e.actionsPopover.show(n)}))},e.hideActionsPopover=function(){e.actionsPopover&&e.actionsPopover.hide()},e.onMessageDelete=function(n){var t=_.findIndex(e.messages,(function(e){return e.id==n}));t&&e.messages.splice(t,1)},c.api.data.on.delete(e,e.onMessageDelete),e.onNewOutboxMessage=function(n){if("outbox"==e.type)return e.loading=!0,o((function(){return c.get(n,{type:e.type,summary:!0})}),500).then((function(n){e.messages.splice(0,0,n),e.loading=!1,e.motion.show({selector:".view-messages .list .item"})})).catch((function(){e.loading=!1}))},c.api.data.on.sent(e,e.onNewOutboxMessage),e.onNewInboxMessage=function(n){if("inbox"==e.type&&e.entered)return e.loading=!0,c.get(n.id,{type:e.type,summary:!0}).then((function(n){e.messages.splice(0,0,n),e.loading=!1,e.motion.show({selector:".view-messages .list .item"})})).catch((function(){e.loading=!1}))},c.api.data.on.new(e,e.onNewInboxMessage),e.onUnauth=function(){e.messages=void 0,e.loading=!1,e.entered=!1},l.api.data.on.unauth(e,e.onUnauth)}function W(e,n,t){angular.extend(this,n("ESMessageComposeModalCtrl",{$scope:e,parameters:{}})),e.$on("$ionicView.enter",(function(n,a){a.stateParams&&(a.stateParams.pubkey&&(e.formData.destPub=a.stateParams.pubkey,a.stateParams.name?(e.destUid=a.stateParams.name,e.destPub=""):(e.destUid="",e.destPub=e.formData.destPub)),a.stateParams.title&&(e.formData.title=a.stateParams.title),a.stateParams.content&&(e.formData.content=a.stateParams.content)),e.loadWallet({minData:!0}).then((function(){t.loading.hide()})).catch((function(n){"CANCELLED"===n&&e.showHome()}))})),e.cancel=function(){e.showHome()},e.setForm=function(n){e.form=n},e.closeModal=function(){e.showHome()}}function Y(e,n,t,a,i,o,s){e.formData={title:s?s.title:null,content:s?s.content:null,destPub:s?s.destPub:null},e.destUid=s?s.destUid:null,e.destPub=s&&!s.destUid?s.destPub:null,e.isResponse=!!s&&s.isResponse,e.doSend=function(n){if(e.form.$submitted=!0,e.form.$valid){if(!(n||e.formData.content&&e.formData.content.trim().length))return t.alert.confirm("MESSAGE.COMPOSE.CONTENT_CONFIRMATION").then((function(n){n&&e.doSend(!0)}));t.loading.show();var s={issuer:a.data.pubkey,recipient:e.formData.destPub,title:e.formData.title,content:e.formData.content,time:i.date.now()};o.send(s).then((function(n){e.id=n,t.loading.hide(),e.closeModal(n)})).catch(t.onError("MESSAGE.ERROR.SEND_MSG_FAILED"))}},e.showWotLookupModal=function(){n.showWotLookup().then((function(n){n&&(n.name?(e.destUid=n.name,e.destPub=""):(e.destUid="",e.destPub=n.pubkey),e.formData.destPub=n.pubkey)}))},e.cancel=function(){e.closeModal()}}function $(e,n,t,a,i,o,s,r,l){e.formData={},e.id=null,e.loading=!0,e.$on("$ionicView.enter",(function(a,i){i.stateParams&&i.stateParams.id?(e.loading&&(e.type=i.stateParams.type||"inbox",e.load(i.stateParams.id,e.type).then((function(n){e.loading=!1,s.loading.hide(),n&&(e.id=n.id,e.formData=n,e.canDelete=!0,e.motion.show({selector:".view-message .list .item"}),n.read||t((function(){e.id===n.id&&l.markAsRead(n,e.type).then((function(){console.debug("[message] marked as read")})).catch(s.onError("MESSAGE.ERROR.MARK_AS_READ_FAILED"))}),2e3))}))),e.showFab("fab-view-message-reply")):n.go("app.user_message")})),e.load=function(t,a){return a=a||"inbox",e.loadWallet({minData:!0}).then((function(){return l.get(t,{type:a})})).catch(s.onError("MESSAGE.ERROR.LOAD_MESSAGE_FAILED")).then((function(t){return t.valid?t:s.alert.error(e.isUserPubkey(t.recipient)?"MESSAGE.ERROR.NOT_AUTHENTICATED_MESSAGE":"MESSAGE.ERROR.USER_NOT_RECIPIENT","MESSAGE.ERROR.MESSAGE_NOT_READABLE").then((function(){n.go("app.user_message",{type:a})}))}))},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null)},e.delete=function(){e.hideActionsPopover(),setTimeout((function(){return s.alert.confirm("MESSAGE.CONFIRM.REMOVE").then((function(t){if(t)return l.remove(e.id,e.type).then((function(){i.nextViewOptions({historyRoot:!0}),n.go("app.user_message",{type:e.type}),s.toast.show("MESSAGE.INFO.MESSAGE_REMOVED")})).catch(s.onError("MESSAGE.ERROR.REMOVE_MESSAGE_FAILED"))}))}),100)},e.showActionsPopover=function(n){e.actionsPopover?e.actionsPopover.show(n):o.fromTemplateUrl("plugins/es/templates/message/view_popover_actions.html",{scope:e}).then((function(t){e.actionsPopover=t,e.$on("$destroy",(function(){e.actionsPopover.remove()})),e.actionsPopover.show(n)}))},e.hideActionsPopover=function(){e.actionsPopover&&e.actionsPopover.hide()},e.showReplyModal=function(){var n="inbox"===e.type?"issuer":"recipient";a("MESSAGE.REPLY_TITLE_PREFIX").then((function(t){var a=e.formData.content?e.formData.content.replace(/^/g," > "):null;return a=(a=a?a.replace(/\n/g,"\n > "):null)?a+"\n":null,r.showMessageCompose({destPub:e.formData[n],destUid:e.formData.name,title:t+e.formData.title,content:a,isReply:!0})})).then((function(e){e&&s.toast.show("MESSAGE.INFO.MESSAGE_SENT").then((function(){i.goBack()}))}))}}function j(e,n,t,a,i,o,s,r){e.search={loading:!0,results:null,hasMore:!1,loadingMore:!1,limit:40},e.$on("popover.shown",(function(){e.search.loading&&e.load()})),e.load=function(t,a){var i={};return i.from=t||0,i.size=a||40,s.notifications.load(i).then((function(n){e.search.results=t?e.search.results.concat(n):n,e.search.loading=!1,e.search.hasMore=e.search.results&&e.search.results.length>=e.search.limit,e.updateView()})).catch((function(a){e.search.loading=!1,t||(e.search.results=[]),e.search.hasMore=!1,n.onError("MESSAGE.ERROR.LOAD_NOTIFICATIONS_FAILED")(a)}))},e.updateView=function(){e.motion&&e.search.results&&e.search.results.length&&e.motion.show({selector:".popover-notification .item"})},e.showMore=function(){e.search.limit=e.search.limit||40,e.search.limit=2*e.search.limit,e.search.limit<40&&(e.search.limit=40),e.search.loadingMore=!0,e.load(e.search.results.length,e.search.limit).then((function(){e.search.loadingMore=!1,e.$broadcast("scroll.infiniteScrollComplete")}))},e.onNewMessageNotification=function(n){e.search.loading||e.search.loadingMore||(e.search.results.splice(0,0,n),e.updateView())},e.select=function(n){n.read||(n.read=!0),t.go("app.user_view_message",{id:n.id,type:"inbox"}),e.closePopover(n)},e.resetData=function(){e.search.loading||(console.debug("[ES] [messages] Resetting data (settings or account may have changed)"),e.search.hasMore=!1,e.search.results=[],e.search.loading=!0,delete e.search.limit)},e.showNewMessageModal=function(t){e.closePopover(),a((function(){r.showMessageCompose(t).then((function(e){e&&n.toast.show("MESSAGE.INFO.MESSAGE_SENT")}))}),500)},i.api.data.on.logout(e,e.resetData),o.api.node.on.stop(e,e.resetData),o.api.node.on.start(e,e.load),s.api.data.on.new(e,e.onNewMessageNotification)}function K(e,n,t,a,i,o,s,r,l,c){e.search={loading:!0,results:null,hasMore:!1,loadingMore:!1,limit:40,options:{codes:{excludes:c.constants.EXCLUDED_CODES}}},e.$on("$ionicView.enter",(function(){e.search.loading&&(e.load(),i((function(){e.resetUnreadCount()}),1e3))})),e.load=function(n,t){var a=angular.copy(e.search.options);return a.from=a.from||n||0,a.size=a.size||t||40,e.search.loading=!0,c.load(l.data.pubkey,a).then((function(t){n?t&&(e.search.results=e.search.results.concat(t)):e.search.results=t||[],e.search.loading=!1,e.search.hasMore=e.search.results.length>=e.search.limit,e.updateView()})).catch((function(t){e.search.loading=!1,n||(e.search.results=[]),e.search.hasMore=!1,o.onError("COMMON.NOTIFICATIONS.LOAD_NOTIFICATIONS_FAILED")(t)}))},e.updateView=function(){e.motion&&e.motion.ionListClass&&e.search.results.length&&e.motion.show({selector:".view-notification .item"})},e.markAllAsRead=function(){e.hideActionsPopover(),e.search.results.length&&o.loading.show().then((function(){n.walletData.notifications.unreadCount=0;var t=e.search.results[0];return n.walletData.notifications.readTime=t?t.time:0,_.forEach(e.search.results,(function(e){e.markAsRead&&"function"==typeof e.markAsRead&&e.markAsRead()})),o.loading.hide()}))},e.resetUnreadCount=function(){if(l.data.notifications.unreadCount&&e.search.results&&e.search.results.length){l.data.notifications.unreadCount=0;var n=e.search.results[0],t=n.time?n.time:0;!t||r.data.wallet&&r.data.wallet.notificationReadTime==t||(r.data.wallet=r.data.wallet||{},r.data.wallet.notificationReadTime=t,r.store())}},e.select=function(e){e.markAsRead&&"function"==typeof e.markAsRead&&e.markAsRead(),e.state&&a.go(e.state,e.stateParams)},e.showMore=function(){e.search.limit=e.search.limit||40,e.search.limit+=40,e.search.limit<40&&(e.search.limit=40),e.search.loadingMore=!0,e.load(e.search.results.length,e.search.limit).then((function(){e.search.loadingMore=!1,e.$broadcast("scroll.infiniteScrollComplete")}))},e.onNewNotification=function(n){if(!e.search.loading&&!e.search.loadingMore){var t=_.findIndex(e.search.results,(function(e){return n.time>e.time}));t<0&&(t=0),e.search.results.splice(t,0,n),e.updateView()}},e.resetData=function(){e.search.loading||(console.debug("[ES] [notifications] Resetting data (settings or account may have changed)"),e.search.hasMore=!1,e.search.results=[],e.search.loading=!0,delete e.search.limit)},e.showActionsPopover=function(n){e.actionsPopover?e.actionsPopover.show(n):t.fromTemplateUrl("plugins/es/templates/notification/popover_actions.html",{scope:e}).then((function(t){e.actionsPopover=t,e.$on("$destroy",(function(){e.actionsPopover.remove()})),e.actionsPopover.show(n)}))},e.hideActionsPopover=function(){e.actionsPopover&&e.actionsPopover.hide()},l.api.data.on.logout(e,e.resetData),s.api.node.on.stop(e,e.resetData),s.api.node.on.start(e,e.load),c.api.data.on.new(e,e.onNewNotification)}function q(e,n,t,a,i){angular.extend(this,t("NotificationsCtrl",{$scope:e})),e.motion=null,e.$on("popover.shown",(function(){e.search.loading&&e.load()})),e.updateView=function(){e.search.results.length&&n((function(){a.ink({selector:".popover-notification .item.ink"})}),100)},e.$on("popover.hidden",e.resetUnreadCount),e.select=function(n){n&&(n.markAsRead&&"function"==typeof n.markAsRead&&n.markAsRead(),n.state&&i.go(n.state,n.stateParams),e.closePopover(n))}}function z(e,n,t,a,i,o,s,r){var l;e.loading=!0,e.popupData={},e.search={results:[],loading:!0},e.emailFrequencies=[{id:"daily",label:"daily"},{id:"weekly",label:"weekly"}],e.enter=function(n,a){if(e.loading){if(!(l=a.stateParams&&a.stateParams.id?i.children.get(a.stateParams.id):i))return o.alert.error("ERROR.UNKNOWN_WALLET_ID"),e.showHome();e.loadWallet({wallet:l,auth:!0,minData:!0}).then((function(){return o.loading.hide(),e.load()})).then((function(){e.showFab("fab-add-subscription-record")})).catch((function(n){if("CANCELLED"===n)return o.loading.hide(10),e.loading=!0,void t.goBack();o.onError("SUBSCRIPTION.ERROR.LOAD_SUBSCRIPTIONS_FAILED")(n)}))}},e.$on("$ionicView.enter",e.enter),e.load=function(){return e.loading=!0,r.record.load(l.data.pubkey,l.data.keypair).then((function(e){var n=_.groupBy(e||[],(function(e){return[e.type,e.recipient].join("|")}));return _.keys(n).reduce((function(e,t){var a=t.split("|");return e.concat({type:a[0],recipient:a[1],items:n[t]})}),[])})).then((function(e){return a.extendAll(e,"recipient")})).then(e.updateView).catch((function(n){o.loading.hide(10),n&&404==n.ucode?(e.updateView([]),e.existing=!1):o.onError("PROFILE.ERROR.LOAD_PROFILE_FAILED")(n)}))},e.updateView=function(n){n&&(e.search.results=n),e.search.results&&e.search.results.length&&e.motion.show(),e.search.loading=!1},e.addSubscription=function(){e.showCategoryModal().then((function(n){if(n){if("email"===n.id)return e.showEmailModal();o.alert.notImplemented()}})).then((function(n){n&&(o.loading.show(),r.record.add(n,l).then(e.addToUI).then((function(){l.data.subscriptions=l.data.subscriptions||{count:0},l.data.subscriptions.count++,o.loading.hide(),e.updateView()})).catch(o.onError("SUBSCRIPTION.ERROR.ADD_SUBSCRIPTION_FAILED")))}))},e.editSubscription=function(n){var t,a=angular.copy(n);if("email"===n.type&&(t=e.showEmailModal(n)),t)return t.then((function(t){if(t)return o.loading.show(),n.id=a.id,r.record.update(n,l).then((function(){if(a.type!==n.type||a.recipient!==n.recipient)return e.removeFromUI(a),e.addToUI(n)})).then((function(){o.loading.hide(),e.updateView()})).catch(o.onError("SUBSCRIPTION.ERROR.UPDATE_SUBSCRIPTION_FAILED"))}))},e.deleteSubscription=function(n,t){if(n&&n.id){if(!t)return o.alert.confirm("SUBSCRIPTION.CONFIRM.DELETE_SUBSCRIPTION").then((function(t){if(t)return e.deleteSubscription(n,t)}));o.loading.show(),r.record.remove(n.id,{wallet:l}).then((function(){l.data.subscriptions=l.data.subscriptions||{count:1},l.data.subscriptions.count--,e.removeFromUI(n),o.loading.hide()})).catch(o.onError("SUBSCRIPTION.ERROR.DELETE_SUBSCRIPTION_FAILED"))}},e.removeFromUI=function(n){var t=_.findWhere(e.search.results,{type:n.type,recipient:n.recipient}),a=_.findIndex(t.items,n);a>=0&&t.items.splice(a,1),t.items.length||(a=_.findIndex(e.search.results,t),e.search.results.splice(a,1))},e.addToUI=function(t){e.search.results=e.search.results||[];var i=_.findWhere(e.search.results,{type:t.type,recipient:t.recipient});return i?(i.items.push(t),n.when(t)):(i={type:t.type,recipient:t.recipient,items:[]},a.extendAll([i],"recipient").then((function(){return i.items.push(t),e.search.results.push(i),t})))},e.showCategoryModal=function(){return r.category.all().then((function(e){return s.show("plugins/es/templates/common/modal_category.html","ESCategoryModalCtrl as ctrl",{categories:e},{focusFirstInput:!0})})).then((function(e){if(e&&e.parent)return e}))},e.showEmailModal=function(e){return s.show("plugins/es/templates/subscription/modal_email.html","ModalEmailSubscriptionsCtrl",e,{focusFirstInput:!0})}}function X(e,n,t,a,i,o,s){e.frequencies=[{id:"daily",label:"daily"},{id:"weekly",label:"weekly"}],e.formData=s||{},e.formData.content=e.formData.content||{},e.formData.content.frequency=e.formData.content.frequency||e.frequencies[0].id,e.recipient={},e.$on("modal.shown",(function(){return e.formData.recipient?(e.recipient={pubkey:e.formData.recipient},i.extendAll([e.recipient])):a.network.peering.self().then((function(n){if(n)return e.formData.recipient=n.pubkey,e.recipient={pubkey:e.formData.recipient},i.extendAll([e.recipient])}))})),e.doSubmit=function(){if(e.form.$submitted=!0,e.form.$valid&&e.formData.content.email&&e.formData.content.frequency){var n={type:"email",recipient:e.formData.recipient,content:{email:e.formData.content.email,locale:t.data.locale.id,frequency:e.formData.content.frequency}};e.closeModal(n)}},e.cancel=function(){e.closeModal()},e.subscriptionForm&&e.subscriptionForm.$setPristine(),e.showNetworkLookup=function(){return o.showNetworkLookup({enableFilter:!0,endpointFilter:a.constants.ES_SUBSCRIPTION_API}).then((function(n){n&&(e.recipient=n,e.formData.recipient=n.pubkey)}))}}function Q(e,n,t,a,i,o,s,r,l){e.search=e.search||{loading:!0,hasMore:!1,text:void 0,index:"invitation",type:"certification",results:[],sort:"time",asc:!1,loadingMore:!1},e.entered=!1,e.searchTextId="documentSearchText",e.ionItemClass="item-border-large",e.defaultSizeLimit=e.defaultSizeLimit||(s.screen.isSmall()?50:100),e.helptipPrefix="helptip-document",e.compactMode=!angular.isDefined(e.compactMode)||e.compactMode,e._source=e._source||["issuer","hash","time","creationTime","title","message"],e.enter=function(n,t){e.entered||(e.entered=!0,e.search.index=t.stateParams&&t.stateParams.index||e.search.index,e.search.type=t.stateParams&&t.stateParams.type||e.search.type,e.search.text=t.stateParams&&t.stateParams.q||e.search.text,e.search.last=!e.search.text,e.load()),e.expertMode=angular.isDefined(e.expertMode)?e.expertMode:!s.screen.isSmall()&&i.data.expertMode},e.$on("$ionicView.enter",e.enter),e.computeOptions=function(n,t){var a={index:e.search.index,type:e.search.type,from:n||0,size:t||e.defaultSizeLimit};return e.search.sort?(a.sort={},a.sort[e.search.sort]=e.search.asc?"asc":"desc"):a.sort={time:"desc"},a._source=a._source||e._source,a},e.load=function(n,t,a){if(!e.search.error){var i=e.computeOptions(n,t);return e.search.loading=!a,(e.search.last?l.search(i):l.searchText(e.search.text||"",i)).then((function(t){n?e.search.results=e.search.results.concat(t.hits):(e.search.results=t.hits,e.search.took=t.took),e.search.total=t.total,s.loading.hide(),e.search.loading=!1,e.search.hasMore=t.hits&&t.hits.length>0&&t.total>e.search.results.length,e.updateView()})).catch((function(n){e.search.results=[],e.search.loading=!1,e.search.error=!0,e.search.hasMore=!1,s.onError("DOCUMENT.ERROR.LOAD_DOCUMENTS_FAILED")(n).then((function(){e.search.error=!1}))}))}},e.updateView=function(){e.motion&&e.search.results&&e.search.results.length&&e.motion.show({selector:".list .item.item-document"}),e.$broadcast("$$rebind::rebind")},e.doSearchText=function(){return e.search.last=!e.search.text,e.load().then((function(){t.search({q:e.search.text}).replace()}))},e.doSearchLast=function(){return e.search.last=!0,e.search.text=void 0,e.load()},e.removeAll=function(){if(e.hideActionsPopover(),e.search.results&&e.search.results.length)return s.alert.confirm("DOCUMENT.CONFIRM.REMOVE_ALL").then((function(n){if(n)return s.loading.show(),l.removeAll(e.search.results).then((function(){return e.search.loading=!1,a((function(){return s.toast.show("DOCUMENT.INFO.REMOVED"),e.load()}),1e3)})).catch(s.onError("DOCUMENT.ERROR.REMOVE_ALL_FAILED"))}))},e.remove=function(n,t){var a=e.search.results[t];a&&!n.defaultPrevented&&(n.stopPropagation(),s.alert.confirm("DOCUMENT.CONFIRM.REMOVE").then((function(n){if(n)return l.remove(a).then((function(){e.search.results.splice(t,1),e.$broadcast("$$rebind::rebind"),s.toast.show("DOCUMENT.INFO.REMOVED")})).catch(s.onError("MESSAGE.ERROR.REMOVE_FAILED"))})))},e.selectDocument=function(n,t){console.debug("Selected document: ",t,r);var a=r.getUrl("/{0}/{1}/_search?pretty&q=_id:{2}".format(t.index,t.type,t.id));return e.openLink(n,a)},e.toggleCompactMode=function(){e.compactMode=!e.compactMode,e.updateView(),!e.search.hasMore&&e.search.results.length&&"last"==e.search.type&&a((function(){e.search.hasMore=!0}),500)},e.toggleSort=function(n){e.search.sort!==n||e.search.asc?(e.search.asc=e.search.sort!==n||!e.search.asc,e.search.sort=n):(e.search.asc=void 0,e.search.sort=void 0),e.load()},e.showMore=function(){e.search.loading||(e.search.loadingMore=!0,e.load(e.search.results.length,e.defaultSizeLimit,!0).then((function(){e.search.loadingMore=!1,e.$broadcast("scroll.infiniteScrollComplete")})))},e.startListenChanges=function(){var n=Date.now(),t=e.search.index+"/"+e.search.type,a=r.websocket.changes(t);return a.open().then((function(){console.debug("[ES] [document] Websocket opened in {0} ms".format(Date.now()-n)),a.on((function(n){e.search.last&&n&&l.fromHit(n).then((function(t){"DELETE"===n._operation?e.onDeleteDocument(t):e.onNewDocument(t)}))}))}))},e.onNewDocument=function(n){if(e.search.last&&!e.search.loading){console.debug("[ES] [document] Detected new document: ",n);var t=_.findIndex(e.search.results,{id:n.id,index:n.index,type:n.type});t<0?(e.search.total++,e.search.results.splice(0,0,n)):(n.updated=!0,a((function(){n.updated=!1}),2e3),e.search.results.splice(t,1,n)),e.updateView()}},e.onDeleteDocument=function(n){e.search.last&&!e.search.loading&&a((function(){var t=_.findIndex(e.search.results,{id:n.id,index:n.index,type:n.type});t<0||(console.debug("[ES] [document] Detected document deletion: ",n),e.search.results.splice(t,1),e.search.total--,e.updateView())}),750)},e.showActionsPopover=function(n){s.popover.show(n,{templateUrl:"plugins/es/templates/document/lookup_popover_actions.html",scope:e,autoremove:!0,afterShow:function(n){e.actionsPopover=n}})},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null)},e.resetData=function(){e.search.loading||(console.debug("[ES] [document] Resetting data (settings or account may have changed)"),e.search.results=[],e.search.loading=!1,e.search.total=void 0,e.search.loadingMore=!1,e.entered=!1,delete e.search.limit)},o.api.data.on.logout(e,e.resetData)}function J(e,n,t,a){e.search={loading:!0,hasMore:!0,text:void 0,index:"user,page,group",type:"profile,record,comment",results:void 0,sort:"time",asc:!1},e.expertMode=!1,e.defaultSizeLimit=20,e._source=["issuer","hash","time","creationTime","title","avatar._content_type","city","message","record"],angular.extend(this,n("ESDocumentLookupCtrl",{$scope:e})),e.$on("$ionicParentView.enter",e.enter),e.selectDocument=function(e,n){var t;n&&e&&!e.defaultPrevented&&(e.stopPropagation(),"user"===n.index&&"profile"===n.type?a.go("app.user_identity",{pubkey:n.pubkey,name:n.name}):"page"===n.index&&"record"===n.type?a.go("app.view_page",{title:n.title,id:n.id}):"page"===n.index&&"comment"===n.type?(t=$filter("formatHash")(n.id),a.go("app.view_page_anchor",{title:n.title,id:n.record,anchor:t})):"group"===n.index&&"record"===n.type?a.go("app.view_group",{title:n.title,id:n.id}):"group"===n.index&&"comment"===n.type?(t=$filter("formatHash")(n.id),a.go("app.view_group_anchor",{title:n.title,id:n.record,anchor:t})):console.warn("Click on this kind of document not implement yet!",n))};var i=e.computeOptions;e.computeOptions=function(n,t){var a=i(n,t);if(!a.sort||a.sort.time){var o=a.sort&&a.sort.time||o;a.sort=[{time:o}]}return a._source=a._source||e._source,a.getTimeFunction=function(e){return e.time=e.creationTime||e.time,e.time},a},t((function(){e.startListenChanges()}),1e3)}function Z(e,n,t,a,i,o,s,r,l,c,d,u,p){e.networkStarted=!1,e.ionItemClass="",e.expertMode=c.data.expertMode&&!r.screen.isSmall(),e.isHttps="https:"===i.location.protocol,e.search={text:"",loading:!0,online:!0,results:[],endpointFilter:s.constants.GCHANGE_API,sort:void 0,asc:!0},e.listeners=[],e.helptipPrefix="helptip-network",e.enableLocationHref=!0,e.removeListeners=function(){e.listeners.length&&(console.debug("[ES] [network] Closing listeners"),_.forEach(e.listeners,(function(e){e()})),e.listeners=[])},e.enter=function(n,t){e.networkStarted||(e.networkStarted=!0,e.search.loading=!0,d.get().then((function(n){n&&(e.node=s.node.same(n.node.host,n.node.port)?s:s.instance(n.node.host,n.node.port),t&&t.stateParams&&("true"==t.stateParams.online&&(e.search.online=!0),t.stateParams.expert&&(e.expertMode="true"==t.stateParams.expert)),e.load())})).catch((function(n){r.onError("ERROR.GET_CURRENCY_FAILED")(n),e.networkStarted=!1})))},e.$on("$ionicParentView.enter",e.enter),e.leave=function(){e.networkStarted&&(e.removeListeners(),u.close(),e.networkStarted=!1,e.search.loading=!0)},e.$on("$ionicView.beforeLeave",e.leave),e.$on("$ionicParentView.beforeLeave",e.leave),e.$on("$destroy",e.leave),e.computeOptions=function(){return{filter:{member:!e.search.type||"member"===e.search.type,mirror:!e.search.type||"mirror"===e.search.type,endpointFilter:angular.isDefined(e.search.endpointFilter)?e.search.endpointFilter:null,online:e.search.online&&!0},sort:{type:e.search.sort,asc:e.search.asc},expertMode:e.expertMode,timeout:l.timeout&&(e.expertMode?l.timeout/10:l.timeout/100)}},e.load=function(){e.search.loading&&(u.start(e.node,e.computeOptions()),e.refreshing=!1,e.listeners.push(u.api.data.on.changed(e,(function(n){e.refreshing||(e.refreshing=!0,p.extendAll(n.peers).then((function(){e.networkStarted&&e.updateView(n),e.refreshing=!1})))}))))},e.updateView=function(n){console.debug("[peers] Updating UI"),e.search.results=n.peers,e.search.memberPeersCount=n.memberPeersCount,e.search.loading=!e.networkStarted||u.isBusy(),e.motion&&e.search.results&&e.search.results.length>0&&e.motion.show({selector:".item-peer"}),e.loading||e.$broadcast("$$rebind::rebind")},e.refresh=function(){return e.search.loading=!0,u.loadPeers()},e.sort=function(){e.search.loading=!0,e.refreshing=!0,u.sort(e.computeOptions()),e.updateView(u.data)},e.toggleOnline=function(n){e.hideActionsPopover(),e.search.online=!1!==n,u.close(),e.search.loading=!0,e.load(),e.enableLocationHref&&t.search({online:e.search.online}).replace()},e.toggleSearchEndpoint=function(n){e.hideActionsPopover(),e.search.endpointFilter===n||null===n?e.search.endpointFilter=null:e.search.endpointFilter=n,e.sort()},e.toggleSort=function(n){e.search.sort!==n||e.search.asc?(e.search.asc=e.search.sort!==n||!e.search.asc,e.search.sort=n):(e.search.asc=void 0,e.search.sort=void 0),e.sort()},e.selectPeer=function(e){if(e.online){var t={server:e.getServer()};e.isSsl()&&(t.ssl=!0),e.isTor()&&(t.tor=!0),n.go("app.view_es_peer",t)}},e.$on("csView.action.refresh",(function(n,t){"peers"===t&&e.refresh()})),e.$on("csView.action.showActionsPopover",(function(n,t){e.showActionsPopover(t)})),e.showActionsPopover=function(n){e.actionsPopover?e.actionsPopover.show(n):a.fromTemplateUrl("templates/network/lookup_popover_actions.html",{scope:e}).then((function(t){e.actionsPopover=t,e.$on("$destroy",(function(){e.actionsPopover.remove()})),e.actionsPopover.show(n)}))},e.hideActionsPopover=function(){e.actionsPopover&&e.actionsPopover.hide()},e.showEndpointsPopover=function(e,n,t){var a=n.getEndpoints(t);(a=(a||[]).reduce((function(e,t){var a=s.node.parseEndPoint(t);return e.concat({label:"NETWORK.VIEW.NODE_ADDRESS",value:n.getServer()+(a.path||"")})}),[])).length&&(r.popover.show(e,{templateUrl:"templates/network/popover_endpoints.html",bindings:{titleKey:"NETWORK.VIEW.ENDPOINTS."+t,items:a}}),e.stopPropagation())},e.showWs2pPopover=function(e,n){return e.stopPropagation(),o("NETWORK.VIEW.PRIVATE_ACCESS").then((function(t){r.popover.show(e,{templateUrl:"templates/network/popover_endpoints.html",bindings:{titleKey:"NETWORK.VIEW.ENDPOINTS.WS2P",valueKey:"NETWORK.VIEW.NODE_ADDRESS",items:[{label:"NETWORK.VIEW.NODE_ADDRESS",value:n.bma.private?t:n.getServer()+(n.bma.path||"")},{label:"NETWORK.VIEW.WS2PID",value:n.bma.ws2pid},{label:"NETWORK.VIEW.POW_PREFIX",value:n.powPrefix}]}})}))}}function ee(e,n,t){angular.extend(this,n("ESNetworkLookupCtrl",{$scope:e})),t=t||{},e.enableFilter=!angular.isDefined(t.enableFilter)||t.enableFilter,e.search.type=angular.isDefined(t.type)?t.type:e.search.type,e.search.endpointFilter=angular.isDefined(t.endpointFilter)?t.endpointFilter:e.search.endpointFilter,e.expertMode=angular.isDefined(t.expertMode)?t.expertMode:e.expertMode,e.ionItemClass=t.ionItemClass||"item-border-large",e.enableLocationHref=!1,e.helptipPrefix="",e.selectPeer=function(n){e.closeModal(n)},e.$on("modal.hidden",(function(){e.leave()})),e.showHelpTip=function(){},e.enter()}function ne(e,n){angular.extend(this,n("NetworkLookupCtrl",{$scope:e}));var t=t||{};e.enableFilter=!angular.isDefined(t.enableFilter)||t.enableFilter,e.search.type=angular.isDefined(t.type)?t.type:e.search.type,e.search.endpointFilter=angular.isDefined(t.endpointFilter)?t.endpointFilter:e.search.endpointFilter,e.expertMode=angular.isDefined(t.expertMode)?t.expertMode:e.expertMode,e.ionItemClass=t.ionItemClass||"item-border-large",e.helptipPrefix="",e.selectPeer=function(n){e.closePopover(n)},e.$on("popover.hidden",(function(){e.leave()})),e.showHelpTip=function(){},e.enter()}function te(e,n,t,a,i,o){e.loading=!0,e.formData={},e.load=function(){return e.loading=!0,e.formData={},n.all([a.blockchain.current().then((function(n){e.formData.number=n.number,e.formData.medianTime=n.medianTime,e.formData.powMin=n.powMin,e.formData.useSsl=o.useSsl})).catch((function(){delete e.formData.number,delete e.formData.medianTime,delete e.formData.powMin,delete e.formData.useSsl})),o.node.summary().then((function(n){e.formData.version=n&&n.duniter&&n.duniter.version,e.formData.software=n&&n.duniter&&n.duniter.software})).catch((function(){delete e.formData.version,delete e.formData.software})),o.version.latest().then((function(n){e.formData.latestRelease=n})).catch((function(){delete e.formData.latestRelease}))]).then((function(){if(e.formData.latestRelease&&"duniter"==e.formData.software){var n=i.version.compare(e.formData.version,e.formData.latestRelease.version);e.formData.isPreRelease=n>0,e.formData.hasNewRelease=n<0}else e.formData.isPreRelease=!1,e.formData.hasNewRelease=!1;e.loading=!1,e.$broadcast("$$rebind::rebind")}))},a.api.data.on.newBlock(e,(function(n){e.loading||(console.debug("[peer info] Received new block. Reload content"),e.load())})),t.api.data.on.changed(e,(function(n){e.loading||(console.debug("[peer info] Peer settings changed. Reload content"),e.load())})),e.load()}function ae(e,n,t,a,i,o,s,r,l){e.node={},e.loading=!0,e.isHttps="https:"===t.location.protocol,e.isReachable=!0,e.options={document:{index:l.data.plugins.es&&l.data.plugins.es.document&&l.data.plugins.es.document.index||"user",type:l.data.plugins.es&&l.data.plugins.es.document&&l.data.plugins.es.document.type||"profile"}},e.$on("$ionicView.beforeEnter",(function(e,n){n.enableBack=!!i.screen.isSmall()||n.enableBack})),e.$on("$ionicView.enter",(function(n,t){var a=!t.stateParams||!t.stateParams.server,i=t.stateParams&&t.stateParams.server||s.server,o=t.stateParams&&"true"==t.stateParams.ssl||!!a&&s.useSsl,r="true"==t.stateParams.tor||!!a&&s.useTor;return e.load(i,o,r).then((function(){return e.$broadcast("$csExtension.enter",n,t)})).then((function(){e.loading=!1}))})),e.load=function(t,a,l){var c={server:t,host:t,useSsl:a,useTor:l},d=t.split(":");return 2==d.length&&(c.host=d[0],c.port=d[1]),c.url=r.getUrl(c.host,c.port,void 0,c.useSsl),angular.merge(e.node,l?s.lightInstance(c.host+".to",443,443,!0,6e4):s.lightInstance(c.host,c.port,c.useSsl),c),e.isReachable=!e.isHttps||a,e.isReachable?n.all([e.node.network.peering.self().then((function(n){e.node.pubkey=n.pubkey,e.node.currency=n.currency})),e.node.record.count(e.options.document.index,e.options.document.type).then((function(n){e.node.docCount=n})),e.node.network.peers().then((function(n){var t=n.peers.reduce((function(e,n){var t=new h(n);return t.hasEndpoint("GCHANGE_API")?(t.online="UP"===n.status,t.blockNumber=t.block.replace(/-.+$/,""),t.ep=s.node.parseEndPoint(t.getEndpoints("GCHANGE_API")[0]),t.dns=t.getDns(),t.id=t.keyID(),t.server=t.getServer(),e.concat(t)):e}),[]);return o.extendAll([e.node].concat(t)).then((function(){e.peers=_.sortBy(t,(function(e){var n=1;return n+=1e4*(e.online?1:0),n+=1e3*(e.hasMainConsensusBlock?1:0),-(n+=100*(e.name?1:0))})),e.motion.show({selector:".item-peer"})}))})),e.node.blockchain.current().then((function(n){e.current=n}))]).catch(i.onError(l?"PEER.VIEW.ERROR.LOADING_TOR_NODE_ERROR":"PEER.VIEW.ERROR.LOADING_NODE_ERROR")):s.network.peers().then((function(n){var t=(n&&n.peers||[]).reduce((function(e,n){var t=new h(n);if(!t.hasEndpoint("GCHANGE_API"))return e;var a=s.node.parseEndPoint(t.getEndpoints("GCHANGE_API")[0]);return a.dns!=c.host&&a.ipv4!=c.host&&a.ipv6!=c.host||a.port!=c.port?e:(t.ep=a,e.concat(t))}),[]),a=t.length&&t[0];if(a)return e.node.pubkey=a.pubkey,e.node.currency=a.currency,o.extend(e.node);console.warn("Could not get peer from /network/peers")}))},e.selectPeer=function(e){if(e.online){var n={server:e.getServer()};e.isSsl()&&(n.ssl=!0),e.isTor()&&(n.tor=!0),a.go("app.view_es_peer",n)}},e.openRawPeering=function(n){return e.openLink(n,e.node.url+"/network/peering?pretty")},e.openRawCurrentBlock=function(n){return e.openLink(n,e.node.url+"/network/peering?pretty")}}function ie(e,n,t,a,i,o,s,r,l,c,d,u,p,m,E,g,f){angular.extend(this,i("ESLookupPositionCtrl",{$scope:e})),e.search={text:"",results:[],loading:!0,lastRecords:!0,type:null,category:null,location:null,advanced:null,issuer:null,geoDistance:isNaN(p.data.plugins.es.geoDistance)?20:p.data.plugins.es.geoDistance,sortAttribute:null,sortDirection:"desc",compactMode:p.data.plugins.market&&p.data.plugins.market.compactMode},e.searchTextId="registrySearchText",e.enableFilter=!0,e.smallscreen=angular.isDefined(e.smallscreen)?e.smallscreen:c.screen.isSmall(),e.options=angular.merge(e.options||{},{location:{show:!0,help:"REGISTRY.SEARCH.LOCATION_HELP"},description:{show:!e.search.compactMode}}),e.enter=function(t,a){if(!e.entered||!e.search.results||0===e.search.results.length){if(!e.geoUnit)return s("LOCATION.DISTANCE_UNIT").then((function(n){return e.geoUnit=n,e.enter(t,a)}));var i=function(){e.searchTextId&&n(e.searchTextId),e.entered=!0,e.doSearch()};if(a.stateParams&&a.stateParams.q&&"string"==typeof a.stateParams.q&&(e.search.text=a.stateParams.q),a.stateParams&&a.stateParams.hash&&(e.search.text="#"+a.stateParams.hash),a.stateParams&&a.stateParams.location)e.search.location=a.stateParams.location,a.stateParams.lat&&a.stateParams.lon&&(e.search.geoPoint={lat:parseFloat(a.stateParams.lat),lon:parseFloat(a.stateParams.lon)}),a.stateParams.d&&(e.search.geoDistance=a.stateParams.d);else{var o=p.data.plugins.es.registry&&p.data.plugins.es.registry.defaultSearch;if(o&&(o.location?angular.merge(e.search,p.data.plugins.es.registry.defaultSearch):o=void 0),!o&&m.isLogin()&&m.data.profile){if(!m.isDataLoaded())return c.loading.show(),m.loadData().then((function(){return c.loading.hide(),e.enter(t,a)}));e.search.geoPoint=m.data.profile.geoPoint,e.search.location=m.data.profile.city||(m.data.profile.geoPoint?s.instant("LOCATION.PROFILE_POSITION"):void 0)}}a.stateParams&&(a.stateParams.type||a.stateParams.last)?a.stateParams.last||"last"===a.stateParams.type?(e.search.lastRecords=!0,e.search.type=void 0):e.search.type=a.stateParams.type:e.search.lastRecords=!1,a.stateParams&&a.stateParams.issuer&&(e.search.issuer=a.stateParams.issuer),a.stateParams&&a.stateParams.category?g.category.get({id:a.stateParams.category}).then((function(n){e.search.category=n,i()})).catch(c.onError("REGISTRY.ERROR.LOAD_CATEGORY_FAILED")):i()}e.showFab("fab-add-registry-record")},e.$on("$ionicView.enter",(function(n,t){return e.enter(n,t)})),e.updateSettings=function(n){var a=!1;p.data.plugins.market=p.data.plugins.market||{},p.data.plugins.market.defaultSearch=p.data.plugins.market.defaultSearch||{};var i=e.search.location&&e.search.location.trim(),o=p.data.plugins.market.defaultSearch.location;o&&o===i||(p.data.plugins.market.defaultSearch=angular.merge(p.data.plugins.market.defaultSearch,{location:i,geoPoint:i&&e.search.geoPoint?angular.copy(e.search.geoPoint):void 0,geoShape:i&&e.search.geoShape?angular.copy(e.search.geoShape):void 0}),a=!0);var s=p.data.plugins.es.geoDistance;s&&s===e.search.geoDistance||(p.data.plugins.es.geoDistance=e.search.geoDistance,a=!0);var r=p.data.plugins.market.compactMode;if(void 0!==r&&r==e.search.compactMode||(p.data.plugins.market.compactMode=e.search.compactMode,a=!0),a)return console.debug("[market] [search] Storing search location to local settings..."),n?p.store():t(p.store,100)},e.leave=function(){var n=!1;p.data.plugins.es.registry=p.data.plugins.es.registry||{},p.data.plugins.es.registry.defaultSearch=p.data.plugins.es.registry.defaultSearch||{};var a=e.search.location&&e.search.location.trim(),i=p.data.plugins.es.registry.defaultSearch.location;i&&i===a||(p.data.plugins.es.registry.defaultSearch={location:a,geoPoint:a&&e.search.geoPoint?angular.copy(e.search.geoPoint):void 0},n=!0);var o=p.data.plugins.es.geoDistance;o&&o===e.search.geoDistance||(p.data.plugins.es.geoDistance=e.search.geoDistance,n=!0),n&&t((function(){p.store()}))},e.$on("$ionicView.leave",(function(){return e.leave()})),e.onGeoPointChanged=function(){e.search.loading||e.search.geoPoint&&e.search.geoPoint.lat&&e.search.geoPoint.lon&&!e.search.geoPoint.exact&&(e.doSearch(),e.updateLocationHref())},e.$watch("search.geoPoint",e.onGeoPointChanged,!0),e.resolveLocationPosition=function(){if(!e.search.loadingPosition)return e.search.loadingPosition=!0,e.searchPosition(e.search.location).then((function(n){if(!n)throw e.search.loading=!1,e.search.results=void 0,e.search.total=0,e.search.loadingPosition=!1,e.search.geoPoint=void 0,"CANCELLED";e.search.geoPoint=n,n.shortName&&!n.exact&&(e.search.location=n.shortName),e.search.loadingPosition=!1}))},e.doGetLastRecords=function(n){return e.hidePopovers(),e.search.text=void 0,e.doSearch(n)},e.doSearchText=function(){e.doSearch()},e.doSearch=function(n){if(e.search.loading=!n,e.search.location&&e.search.location.length>=3&&!e.search.geoPoint)return e.resolveLocationPosition().then((function(){return e.doSearch(n)}));var t=e.search.text&&e.search.text.trim()||"";e.search.lastRecords=!t||!t.length;var a=[],i=[];if(t&&t.length)if(u.regexp.PUBKEY.test(t))i.push({term:{pubkey:t}});else{var o=(t=t.toLowerCase())?f.util.parseTags(t):void 0;a.push({multi_match:{query:t,fields:["title","description","city","address"],type:"phrase_prefix"}}),a.push({match:{title:{query:t,boost:2}}}),a.push({prefix:{title:t}}),a.push({match:{description:t}}),a.push({nested:{path:"category",query:{bool:{filter:{match:{"category.name":t}}}}}}),o&&o.length&&i.push({terms:{tags:o}})}else e.search.issuer&&i.push({term:{issuer:e.search.issuer}});e.search.type&&i.push({term:{type:e.search.type}}),e.search.category&&i.push({nested:{path:"category",query:{bool:{filter:{term:{"category.id":e.search.category.id}}}}}});var s=e.search.location&&e.search.location.trim().toLowerCase();if(e.search.geoPoint&&e.search.geoPoint.lat&&e.search.geoPoint.lon)if(s&&s.length){var r=s.split(",")[0];i.push({or:[{and:[{not:{exists:{field:"geoPoint"}}},{match_phrase:{city:r}}]},{geo_distance:{distance:e.search.geoDistance+e.geoUnit,geoPoint:{lat:e.search.geoPoint.lat,lon:e.search.geoPoint.lon}}}]})}else i.push({geo_distance:{distance:e.search.geoDistance+e.geoUnit,geoPoint:{lat:e.search.geoPoint.lat,lon:e.search.geoPoint.lon}}});var l={highlight:{fields:{title:{},description:{},tags:{}}},from:n};a.length>0&&(l.query=l.query||{bool:{}},l.query.bool.should=a,l.query.bool.minimum_should_match=1),i.length>0&&(l.query=l.query||{bool:{}},l.query.bool.filter=i),e.search.lastRecords&&(l.sort={creationTime:"desc"});var c=e.queryId&&e.queryId+1||0;return e.queryId=c,e.updateLocationHref(),e.doRequest(l,(function(){return e.queryId==c}))},e.doRequest=function(n,t){return(n=n||{}).from=n.from||0,n.size=n.size||10,
n.size<10&&(n.size=10),e.search.loading=0===n.from,g.record.search(n).then((function(i){if(!t||t()){if(!i||!i.hits||!i.hits.length)return e.search.results=n.from>0?e.search.results:[],e.search.total=n.from>0?e.search.total:0,e.search.loading=!1,void(e.search.hasMore=!1);var o=a("formatSlug");_.forEach(i.hits,(function(e){e.urlTitle=o(e.title)})),n.from?e.search.results=e.search.results.concat(i.hits):(e.search.results=i.hits,e.search.total=i.total),e.search.hasMore=e.search.results.length<i.total,e.search.loading=!1,e.motion.show({selector:".list .item",ink:!0})}})).catch((function(t){e.search.loading=!1,e.search.results=n.from>0?e.search.results:[],e.search.total=n.from>0?e.search.total:0,e.search.hasMore=!1,c.onError("REGISTRY.ERROR.LOOKUP_RECORDS_FAILED")(t)}))},e.showMore=function(){var n=e.search.results?e.search.results.length:0;return e.search.loadingMore=!0,(e.search.lastRecords?e.doGetLastRecords:e.doSearch)(n).then((function(){e.search.loadingMore=!1,e.$broadcast("scroll.infiniteScrollComplete")})).catch((function(n){console.error(n),e.search.loadingMore=!1,e.search.hasMore=!1,e.$broadcast("scroll.infiniteScrollComplete")}))},e.removeText=function(){e.search.text=null,e.doSearch(),e.updateLocationHref()},e.removeType=function(){e.search.type=null,e.doSearch(),e.updateLocationHref()},e.removeCategory=function(){e.search.category=null,e.category=null,e.doSearch(),e.updateLocationHref()},e.removeLocation=function(){e.search.location=null,e.search.geoPoint=null,e.doSearch(),e.updateLocationHref()},e.updateLocationHref=function(n){n||t((function(){var n=e.search.text&&e.search.text.trim(),t=e.search.location&&e.search.location.trim(),a={location:t&&t.length?t:void 0,category:e.search.category?e.search.category.id:void 0,last:!!e.search.lastRecords||void 0,type:e.search.type?e.search.type:void 0,lat:e.search.geoPoint&&e.search.geoPoint.lat||void 0,lon:e.search.geoPoint&&e.search.geoPoint.lon||void 0,d:e.search.geoPoint&&e.search.geoDistance||void 0};n&&n.match(/^#\w+$/)?a.hash=n.substr(1):n&&n.length&&(a.q=n),o.search(a).replace()}))},e.onToggleAdvanced=function(){e.search.entered&&!e.search.lastRecords&&(e.doSearch(),e.updateLocationHref())},e.$watch("search.advanced",e.onToggleAdvanced,!0),e.toggleAdvanced=function(){e.search.advanced=!e.search.advanced,t(e.hidePopovers,200)},e.toggleCompactMode=function(){e.search.compactMode=!e.search.compactMode,e.options.description.show=!e.search.compactMode,e.updateSettings()},e.showRecordTypeModal=function(n){e.hidePopovers(),t((function(){n.isDefaultPrevented()||d.show("plugins/es/templates/registry/modal_record_type.html").then((function(n){n&&(e.search.type=n,e.doSearch(),e.updateLocationHref())}))}),350)},e.showCategoryModal=function(n){t((function(){n.isDefaultPrevented()||g.category.all().then((function(e){return d.show("plugins/es/templates/common/modal_category.html","ESCategoryModalCtrl as ctrl",{categories:e},{focusFirstInput:!0})})).then((function(n){n&&n.parent&&(e.search.category=n,e.doSearch(),e.updateLocationHref())}))}),350)},e.showNewPageModal=function(){return e.hidePopovers(),e.loadWallet().then((function(e){if(c.loading.hide(),e)return E.showNewPage()}))},e.showActionsPopover=function(n){e.actionsPopover?e.actionsPopover.show(n):r.fromTemplateUrl("plugins/es/templates/registry/lookup_popover_actions.html",{scope:e}).then((function(t){e.actionsPopover=t,e.$on("$destroy",(function(){e.actionsPopover.remove()})),e.actionsPopover.show(n)}))},e.hideActionsPopover=function(){e.actionsPopover&&e.actionsPopover.hide()},e.showFiltersPopover=function(n){e.filtersPopover?e.filtersPopover.show(n):r.fromTemplateUrl("plugins/es/templates/registry/lookup_popover_filters.html",{scope:e}).then((function(t){e.filtersPopover=t,e.$on("$destroy",(function(){e.filtersPopover.remove()})),e.filtersPopover.show(n)}))},e.hideFiltersPopover=function(){e.filtersPopover&&e.filtersPopover.hide()},e.hidePopovers=function(){e.hideActionsPopover(),e.hideFiltersPopover()}}function oe(e,n,t,a,i){angular.extend(this,n("ESRegistryLookupCtrl",{$scope:e})),e.searchTextId=void 0,e.enter=function(n,i){return e.entered?i.stateParams&&i.stateParams.refresh?t(e.doSearch,2e3):void 0:e.loadWallet({minData:!0}).then((function(n){a.loading.hide(),e.search.issuer=n.pubkey,e.search.advanced=!0,t(e.doSearch,100),e.showFab("fab-wallet-add-registry-record")}))},e.doUpdate=function(){if(i.isLogin())return e.search.issuer=i.data.pubkey,e.search.advanced=!0,e.doSearch()}}function se(e,n,t,a,i,o,s,r,l,c,d,u,p,m){e.formData={},e.id=null,e.category={},e.pictures=[],e.canEdit=!1,e.loading=!0,e.motion=p.motion.fadeSlideIn,e.$on("$ionicView.beforeEnter",(function(e,n){n.enableBack=!!p.screen.isSmall()||n.enableBack})),e.$on("$ionicView.enter",(function(n,a){a.stateParams&&a.stateParams.id?((e.loading||a.stateParams.refresh)&&e.load(a.stateParams.id,a.stateParams.anchor),e.$broadcast("$recordView.enter",a)):t.go("app.registry_lookup")})),e.$on("$ionicView.beforeLeave",(function(n,t){e.$broadcast("$recordView.beforeLeave",t)})),e.load=function(n,o){return n=n||e.id,e.loading=!0,a.all([u.record.load(n).then((function(n){e.id=n.id,e.formData=n.record,e.canEdit=d.isUserPubkey(e.formData.issuer),e.issuer=n.issuer,e.avatar=e.formData.avatar,e.avatarStyle=e.formData.avatar&&{"background-image":'url("'+e.avatar.src+'")'},p.loading.hide(),e.loading=!1,e.motion.show({selector:".list > .item, .list > ng-if > .item"})})).catch((function(i){e.secondTry?(e.loading=!1,i&&404===i.ucode?(p.toast.show("REGISTRY.ERROR.RECORD_NOT_EXISTS"),t.go("app.registry_lookup")):p.onError("REGISTRY.ERROR.LOAD_RECORD_FAILED")(i)):(e.secondTry=!0,a((function(){e.load(n)}),100))})),u.record.picture.all({id:n}).then((function(n){e.pictures=n._source.pictures&&n._source.pictures.reduce((function(e,n){return e.concat(m.image.fromAttachment(n.file))}),[]),e.pictures.length>0&&e.motion.show({selector:".lazy-load .item.card-gallery",startVelocity:3e3})})).catch((function(){e.pictures=[]})),i((function(){return e.$broadcast("$recordView.load",n,u.record)}))]).then((function(){e.motion.show({selector:".lazy-load .item",startVelocity:3e3}),o&&i((function(){l(o)}),1e3)}))},e.edit=function(){p.loading.show(),t.go("app.registry_edit_record",{id:e.id})},e.delete=function(){var n;e.hideActionsPopover(),r(["REGISTRY.VIEW.REMOVE_CONFIRMATION","REGISTRY.INFO.RECORD_REMOVED"]).then((function(e){return n=e,p.alert.confirm(e["REGISTRY.VIEW.REMOVE_CONFIRMATION"])})).then((function(a){a&&u.record.remove(e.id).then((function(){d.data.pages&&d.data.pages.count&&d.data.pages.count--,s.nextViewOptions({historyRoot:!0}),t.go("app.wallet_pages",{refresh:!0}),p.toast.show(n["REGISTRY.INFO.RECORD_REMOVED"])})).catch(p.onError("REGISTRY.ERROR.REMOVE_RECORD_FAILED"))}))},e.showActionsPopover=function(n){e.actionsPopover?e.actionsPopover.show(n):o.fromTemplateUrl("plugins/es/templates/registry/view_popover_actions.html",{scope:e}).then((function(t){e.actionsPopover=t,e.$on("$destroy",(function(){e.actionsPopover.remove()})),e.actionsPopover.show(n)}))},e.hideActionsPopover=function(){e.actionsPopover&&e.actionsPopover.hide()},e.showSharePopover=function(n){e.hideActionsPopover();var t=e.formData.title,a=m.getUrl("/page/record/"+e.id+"/_share");p.screen.isSmall()&&(n=angular.element(document.querySelector("#registry-share-anchor-"+e.id))||n),p.popover.share(n,{bindings:{url:a,titleKey:"REGISTRY.VIEW.POPOVER_SHARE_TITLE",titleValues:{title:t},time:e.formData.time,postMessage:t}})}}function re(e,n,t,a,i,o,s,r,l,c,d,u,p,m){angular.extend(this,r("ESPositionEditCtrl",{$scope:e})),e.formData={title:null,description:null,socials:[],geoPoint:null},e.loading=!0,e.dirty=!1,e.walletData=null,e.id=null,e.avatar=null,e.pictures=[],e.setForm=function(n){e.form=n},e.$on("$ionicView.enter",(function(n,t){e.loadWallet({minData:!0}).then((function(n){e.walletData=n,t.stateParams&&t.stateParams.id?e.load(t.stateParams.id):t.stateParams&&t.stateParams.type&&e.updateView({record:{type:t.stateParams.type}}),o("registry-record-title")}))})),e.$on("$stateChangeStart",(function(n,a,o,s){if(e.dirty&&!e.saving&&!n.defaultPrevented)return n.preventDefault(),e.loading?void 0:(e.loading=!0,c.alert.confirm("CONFIRM.SAVE_BEFORE_LEAVE","CONFIRM.SAVE_BEFORE_LEAVE_TITLE",{cancelText:"COMMON.BTN_NO",okText:"COMMON.BTN_YES_SAVE"}).then((function(n){return e.loading=!1,n?(e.form.$submitted=!0,e.save(!1,!0).then((function(n){return n&&(e.dirty=!1),n}))):(e.dirty=!1,!0)})).then((function(e){e&&(i.nextViewOptions({historyRoot:!0}),t.go(a.name,o))})).catch((function(e){})))})),e.load=function(n){e.loading=!0,m.record.load(n,{raw:!0}).then((function(n){n&&n.record?e.updateView(n):e.updateView({record:{}})})).catch((function(n){c.loading.hide(10),e.loading=!1,c.onError("REGISTRY.ERROR.LOAD_RECORD_FAILED")(n)}))},e.updateView=function(t){e.formData=t.record||{},e.id=t.id,e.avatar=e.formData.avatar,e.avatar?(e.avatarStyle=e.avatar&&{"background-image":'url("'+e.avatar.src+'")'},e.avatarClass={}):(e.avatarStyle=void 0,e.avatarClass={},e.avatarClass["cion-page-"+e.formData.type]=!e.avatar),e.pictures=t.record&&t.record.pictures||[],delete t.record.pictures,e.motion.show({selector:".animate-ripple .item, .card-gallery",startVelocity:3e3}),c.loading.hide(),n((function(){e.loading=!1}),1e3)},e.onFormDataChanged=function(){e.loading||(e.dirty=!0)},e.$watch("formData",e.onFormDataChanged,!0),e.needCategory=function(){return e.formData.type&&("company"==e.formData.type||"shop"==e.formData.type)},e.save=function(o,r){return e.form.$submitted=!0,!e.saving&&e.form.$valid&&("shop"!==e.formData.type&&"company"!==e.formData.type||e.formData.category&&e.formData.category.id)?r?(e.saving=!0,console.debug("[ES] [page] Saving record..."),a.when().then((function(){var n=e.formData;return e.needCategory()||delete n.category,n.time=p.date.now(),n.geoPoint&&n.geoPoint.lat&&n.geoPoint.lon?(n.geoPoint.lat=parseFloat(n.geoPoint.lat),n.geoPoint.lon=parseFloat(n.geoPoint.lon)):n.geoPoint=null,n.socials&&n.socials.length&&(n.socials=_.uniq(n.socials,!1,(function(e){return e.url}))),n.picturesCount=e.pictures.length,n.picturesCount>0?n.pictures=e.pictures.reduce((function(e,n){return e.concat({file:p.image.toAttachment(n)})}),[]):n.pictures=[],e.avatar&&e.avatar.src?c.image.resizeSrc(e.avatar.src,!0).then((function(e){return n.avatar=p.image.toAttachment({src:e}),n})):(n.avatar={_content:"",_content_type:""},n)})).then((function(n){return e.id?m.record.update(n,{id:e.id}):m.record.add(n)})).then((function(n){return console.info("[ES] [page] Record successfully saved."),!e.id&&u.data.pages&&u.data.pages.count&&u.data.pages.count++,e.id=e.id||n,e.saving=!1,e.dirty=!1,o||s("REGISTRY.INFO.RECORD_SAVED").then((function(e){c.toast.show(e)})),i.clearCache(i.currentView().stateId),i.nextViewOptions({historyRoot:!0}),t.go("app.view_page",{id:e.id,refresh:!0})})).catch((function(n){e.saving=!1,c.onError("REGISTRY.ERROR.SAVE_RECORD_FAILED")(n)}))):(console.debug("[ES] [page] Waiting debounce end, before saving..."),n((function(){return e.save(o,!0)}),650)):a.reject()},e.openPicturePopup=function(){l.camera.getPicture().then((function(n){n&&e.pictures.push({src:"data:image/png;base64,"+n})})).catch(c.onError("ERROR.TAKE_PICTURE_FAILED"))},e.rotateAvatar=function(){if(e.avatar&&e.avatar.src&&!e.rotating)return e.rotating=!0,c.image.rotateSrc(e.avatar.src).then((function(n){e.avatar.src=n,e.avatarStyle={"background-image":'url("'+n+'")'},e.dirty=!0,e.rotating=!1})).catch((function(n){console.error(n),e.rotating=!1}))},e.fileChanged=function(n){return c.loading.show(),a((function(t,a){var i=n.target.files[0];c.image.resizeFile(i).then((function(n){e.pictures.push({src:n}),c.loading.hide(),t()}))}))},e.removePicture=function(n){e.pictures.splice(n,1)},e.favoritePicture=function(n){if(n>0){var t=e.pictures[n];e.pictures.splice(n,1),e.pictures.splice(0,0,t)}},e.cancel=function(){i.goBack()},e.showAvatarModal=function(){return l.camera.enable?l.camera.getPicture().then((function(n){n&&(e.avatar={src:"data:image/png;base64,"+n},e.avatarStyle={"background-image":'url("'+n+'")'},e.dirty=!0,e.avatarClass={})})).catch(c.onError("ERROR.TAKE_PICTURE_FAILED")):d.show("plugins/es/templates/common/modal_edit_avatar.html","ESAvatarModalCtrl",{}).then((function(n){n&&(e.avatar={src:n},e.avatarStyle={"background-image":'url("'+n+'")'},e.dirty=!0,e.avatarClass={})}))},e.showRecordTypeModal=function(){d.show("plugins/es/templates/registry/modal_record_type.html").then((function(n){n&&(e.formData.type=n,e.avatar||(e.avatarClass["cion-page-"+n]=!0))}))},e.showCategoryModal=function(n){m.category.all().then((function(e){return d.show("plugins/es/templates/common/modal_category.html","ESCategoryModalCtrl as ctrl",{categories:e},{focusFirstInput:!0})})).then((function(n){n&&n.parent&&(e.formData.category=n)}))}}function le(e,n){e.extensionPoint=n.extensions.points.current.get()}function ce(e,n,t,a,i){e.smallscreen=t.screen.isSmall(),e.start=function(){e.smallscreen?e.loading=!1:(angular.extend(this,n("MkListCategoriesCtrl",{$scope:e})),e.onCategoryClick=function(e){return i.go("app.market_lookup",{category:e&&e.id,location:void 0})},e.load())},a.ready().then(e.start)}function de(e,n,t,a,i,o,s,r,l,c,d,u,p){angular.extend(this,a("MkLookupCtrl",{$scope:e})),e.smallscreen=angular.isDefined(e.smallscreen)?e.smallscreen:c.screen.isSmall(),e.options=e.options||angular.merge({type:{show:!0},location:{show:!0,prefix:void 0}},d.plugins&&d.plugins.market&&d.plugins.market.record||{}),e.enter=function(n,t){if(!u.isStarted())return u.ready().then((function(){return e.enter(n,t)}));var a=u.data.plugins.market.defaultSearch;return a&&(console.info("[market] [search] Restoring last search from settings",a),angular.merge(e.search,a)),e.entered?void 0:(console.debug("[market] [home] Init home buttons"),e.init().then((function(){e.entered=!0,e.search.loading=!1,e.doGetLastRecords()})))},e.$on("$ionicParentView.enter",e.enter);var m=e.doRequest;e.doRequest=function(n,t){return e.smallscreen?r.when():((n=n||{}).size=0,m(n,t).then((function(){e.$broadcast("$$rebind::total")})))},e.openSearch=function(a){var i={},o=(e.search.text||"").trim();if(o.length&&(i.q=o),!e.search.geoPoint&&!e.search.geoShape)return e.searchPosition(e.search.location).then((function(n){if(n)return e.search.geoPoint=n,e.search.location?e.openSearch():(e.search.geoPoint.exact=!0,s("MARKET.COMMON.AROUND_ME").then((function(n){return e.openSearch(n)})))})).catch((function(e){return console.error(e),t.go("app.market_lookup",i)}));var r=a||e.search.location&&e.search.location.split(", ")[0];return r&&e.search.geoPoint?(n.geoPoints=n.geoPoints||{},n.geoPoints[r]=e.search.geoPoint,i=angular.merge(i,{lat:e.search.geoPoint&&e.search.geoPoint.lat,lon:e.search.geoPoint&&e.search.geoPoint.lon,location:r,dist:e.search.geoDistance})):e.search.geoPoint=void 0,e.updateSettings(),t.go("app.market_lookup",i)},e.showNewRecordModal=function(){return e.loadWallet({minData:!0}).then((function(){return c.loading.hide()})).then((function(){return!e.options.type.show&&e.options.type.default?e.options.type.default:l.show("plugins/market/templates/record/modal_record_type.html")})).then((function(e){e&&t.go("app.market_add_record",{type:e})}))},e.updateLocationHref=function(e){},e.$parent.showJoinModal=p.showJoin,e.$parent.showLoginModal=p.showLogin,e.$parent.showHelpModal=p.showHelp}function ue(e,n){angular.extend(this,n("LoginModalCtrl",{$scope:e}))}function pe(e,n,t,a,i,o){angular.extend(this,n("LoginModalCtrl",{$scope:e}));var s="^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,6}$";e.usernamePattern=s+"|^[0-9]{9,10}$",e.onWalletLogin=function(n,i){i=i||t.defer();var r=a.plugins&&a.plugins.market&&a.plugins.market.defaultAdminPubkeys;if(r&&r.length){console.error("[market] [login] Storing username into user profile socials");var l=new RegExp(s).test(e.formData.username),c={url:e.formData.username,type:l?"email":"phone"},d=[angular.merge({recipient:n.pubkey},c)];d=(r||[]).reduce((function(e,n){return e.concat(angular.merge({recipient:n},c))}),d),o.setDefaultProfile({socials:d})}return i.resolve(n),i.promise},i.api.data.on.login(e,e.onWalletLogin,this)}function me(e,n,t,a,i,o,s,r,l,c,d,u,p,m,E,g,f,h){angular.extend(this,s("ESLookupPositionCtrl",{$scope:e})),e.search={text:"",type:null,lastRecords:!0,results:[],loading:!0,category:null,location:null,geoPoint:null,geoShape:null,options:null,loadingMore:!1,showClosed:!1,showOld:!1,geoDistance:isNaN(u.data.plugins.es.geoDistance)?50:u.data.plugins.es.geoDistance,sortAttribute:null,sortDirection:"desc",compactMode:u.data.plugins.market&&u.data.plugins.market.compactMode},e.options=e.options||angular.merge({type:{show:!0},category:{show:!0,withOld:!1,withStock:!0},description:{show:!e.search.compactMode},location:{show:!0,prefix:void 0},fees:{show:!0},filter:{lastRecords:!0}},d.plugins&&d.plugins.market&&d.plugins.market.record||{}),e.$watch("search.showOld+search.showClosed",(function(){!e.search.loading&&e.entered&&e.doRefresh()}),!0),e.init=function(){return a.all([h.currencies().then((function(n){e.currencies=n})),o("LOCATION.DISTANCE_UNIT").then((function(n){e.geoUnit="LOCATION.DISTANCE_UNIT"!==n?n:"km"}))]).then((function(){r((function(){l.ink({selector:".item"}),l.loading.hide(10)}),200)}))},e.toggleAdType=function(n){n===e.search.type?e.search.type=void 0:e.search.type=n,e.doSearch()},e.doSearch=function(n,t){if(n=n||0,t=t||{withCache:!0},e.search.loading=!n,e.search.advanced||(e.search.advanced=!1),e.search.sortAttribute=e.search.sortAttribute||"creationTime",e.search.sortDirection=e.search.sortDirection||("creationTime"===e.search.sortAttribute?"desc":"asc"),e.search.location&&!e.search.geoPoint&&!e.search.geoShape)return e.searchPosition(e.search.location).then((function(a){return a?(e.search.geoPoint=a,e.search.location=a.name&&a.name.split(",")[0]||e.search.location,e.doSearch(n,t)):(e.search.loading=!1,l.alert.error("MARKET.ERROR.GEO_LOCATION_NOT_FOUND"))}));var a=e.search.text&&e.search.text.trim();if(e.search.lastRecords=!a||0===a.length,!n){var i=a?E.util.parseTags(a):void 0,o=i&&i.join(" ");_.forEach(i||[],(function(e){a=a.replace("#"+e,"").trim()})),e.updateLocationHref({q:a||void 0,hash:o,last:!!e.search.lastRecords||void 0,category:e.search.category&&e.search.category.id||void 0,type:e.search.type,location:e.search.location&&e.search.location.trim()||void 0,lat:e.search.geoPoint&&e.search.geoPoint.lat,lon:e.search.geoPoint&&e.search.geoPoint.lon,dist:e.search.geoPoint&&e.search.geoPoint.lat&&e.search.geoDistance||void 0,shape:e.search.geoShape&&(e.search.geoShape.id||e.search.geoShape.properties&&e.search.geoShape.properties.id),old:!!e.search.showOld||void 0,closed:!!e.search.showClosed||void 0})}var s=f.record.createSearchRequest(angular.merge({},e.search,{from:n,geoDistance:e.search.geoDistance+e.geoUnit}));return e.doRequest(s,t)},e.updateLocationHref=function(e){console.debug("[market] [search] Update location href"),i.search(e).replace()},e.doGetLastRecords=function(){return e.hideActionsPopover(),e.text=void 0,e.doSearch()},e.doRefresh=function(n){return e.doSearch(0,n)},e.refresh=function(){return e.doRefresh({withCache:!1})},e.showMore=function(){var n=e.search.results?e.search.results.length:0;return e.search.loadingMore=!0,e.doSearch(n).then((function(){e.search.loadingMore=!1,e.$broadcast("scroll.infiniteScrollComplete")})).catch((function(n){console.error(n),e.search.loadingMore=!1,e.search.hasMore=!1,e.$broadcast("scroll.infiniteScrollComplete")}))},e.doRequest=function(n,a){return(n=n||{}).from=n.from||0,n.size=isNaN(n.size)?10:n.size,e.search.loading=0===n.from,f.record.search(n,a).then((function(a){if(!a||!a.hits||!a.hits.length)return e.search.results=n.from>0?e.search.results:[],e.search.total=n.from>0?e.search.total:a.total||0,void(e.search.hasMore=!1);var i=t("formatSlug");return _.forEach(a.hits,(function(e){e.urlTitle=i(e.title)})),m.fillAvatars(a.hits,"issuer").then((function(t){n.from?e.search.results=e.search.results.concat(t):(e.search.results=t,e.search.total=a.total),e.search.hasMore=e.search.results.length<e.search.total}))})).then((function(){e.search.loading=!1,e.search.results.length>0&&e.motion&&e.motion.show()})).catch((function(t){e.search.loading=!1,e.search.results=n.from>0?e.search.results:[],e.search.total=n.from>0?e.search.total:0,e.search.hasMore=!1,l.onError("MARKET.ERROR.LOOKUP_RECORDS_FAILED")(t)}))},e.showCategoryModal=function(){return g.all().then((function(e){return c.show("plugins/es/templates/common/modal_category.html","ESCategoryModalCtrl as ctrl",{categories:e},{focusFirstInput:!0})})).then((function(n){n&&n.parent&&(e.search.category=n,e.doSearch())}))},e.showNewRecordModal=function(){return e.loadWallet({minData:!0}).then((function(){return l.loading.hide()})).then((function(){return!e.options.type.show&&e.options.type.default?e.options.type.default:c.show("plugins/market/templates/record/modal_record_type.html")})).then((function(e){e&&n.go("app.market_add_record",{type:e})}))},e.showRecord=function(t,a){if(!t.defaultPrevented){var i=e.search.results[a];i&&n.go("app.market_view_record",{id:i.id,title:i.title})}},e.showActionsPopover=function(n,t){return l.popover.show(n,{templateUrl:t=t||"plugins/market/templates/search/lookup_actions_popover.html",scope:e,afterShow:function(n){e.actionsPopover=n}})},e.hideActionsPopover=function(){e.actionsPopover&&e.actionsPopover.hide()},e.showSortPopover=function(n){e.showActionsPopover(n,"plugins/market/templates/search/lookup_sort_popover.html")},e.toggleSort=function(n,t){e.hideActionsPopover(),t="desc"===t?"desc":"asc",this.search.sortAttribute===n&&this.search.sortDirection===t||(this.search.sortAttribute=n,this.search.sortDirection=t,e.doSearch())},e.toggleShowClosed=function(){e.hideActionsPopover(),e.search.showClosed=!e.search.showClosed},e.toggleShowOld=function(){e.hideActionsPopover(),e.search.showOld=!e.search.showOld},e.toggleCompactMode=function(){e.search.compactMode=!e.search.compactMode,e.options.description.show=!e.search.compactMode}}function Ee(e,n,t,a,i,o,s,r,l,c,d,u){angular.extend(this,t("MkLookupAbstractCtrl",{$scope:e})),e.search.sortAttribute="creationTime",e.search.sortDirection="desc",e.enter=function(n,t){if(!e.entered||!e.search.results||0===e.search.results.length){var a=!1,i=[];if(e.search.compactMode=d.data.plugins.market.compactMode,e.options.description.show=!e.search.compactMode,t.stateParams){t.stateParams.q?(e.search.text=t.stateParams.q,e.search.lastRecords=!1):t.stateParams.last&&(e.search.lastRecords=!0),t.stateParams.type&&(e.search.type=t.stateParams.type);var o=t.stateParams.location&&t.stateParams.location.trim();if(t.stateParams.lat&&t.stateParams.lon)e.search.geoPoint={lat:parseFloat(t.stateParams.lat),lon:parseFloat(t.stateParams.lon)},e.search.location=o;else if(t.stateParams.shape)i.push(u.get(t.stateParams.shape).then((function(n){e.search.geoShape=n,e.search.location=o})));else{var s=d.data.plugins.market&&d.data.plugins.market.defaultSearch;s&&(console.info("[market] [search] Restoring last search from settings",s),angular.merge(e.search,s))}t.stateParams.dist&&(e.search.geoDistance=parseInt(t.stateParams.dist)),t.stateParams.hash&&(e.search.lastRecords=!1,e.search.text?e.search.text="#"+t.stateParams.hash+" "+e.search.text:e.search.text="#"+t.stateParams.hash),angular.isDefined(t.stateParams.closed)&&(e.search.showClosed=!0,a=!0),angular.isDefined(t.stateParams.old)&&(e.search.showOld=!0,a=!0)}var c=t.stateParams&&(t.stateParams.category||t.stateParams.cat);if(c){var p,m=c.split(":");m.length>1&&(c=m[0],p=m[1]),i.push(l.get({id:c}).catch((function(e){return console.error(e&&e.message||e),{id:c,name:p||c}})).then((function(n){e.search.category=n})))}return(i.length?r.all(i):r.when()).then(e.init).then((function(){return e.finishEnter(a)}))}},e.$on("$ionicView.enter",e.enter),e.finishEnter=function(n){e.search.advanced=!!n||e.search.advanced,e.doSearch().then((function(){e.showFab("fab-add-market-record")})),a("marketSearchText"),e.entered=!0},e.updateSettings=function(n){var t=!1;d.data.plugins.market=d.data.plugins.market||{},d.data.plugins.market.defaultSearch=d.data.plugins.market.defaultSearch||{};var a=e.search.location&&e.search.location.trim(),o=d.data.plugins.market.defaultSearch.location,s=d.data.plugins.market.defaultSearch.geoDistance;o&&o===a&&s&&s===e.search.geoDistance||(d.data.plugins.market.defaultSearch=angular.merge(d.data.plugins.market.defaultSearch,{location:a,geoPoint:a&&e.search.geoPoint?angular.copy(e.search.geoPoint):void 0,geoShape:a&&e.search.geoShape?angular.copy(e.search.geoShape):void 0,geoDistance:a&&e.search.geoPoint?e.search.geoDistance:void 0}),d.data.plugins.es.geoDistance=e.search.geoDistance,t=!0);var r=d.data.plugins.market.compactMode;if(void 0!==r&&r==e.search.compactMode||(d.data.plugins.market.compactMode=e.search.compactMode,t=!0),t)return console.debug("[market] [search] Storing search location to local settings..."),n?d.store():i(d.store,100)},e.leave=function(){return e.updateSettings(!0)},e.$on("$ionicView.beforeLeave",(function(){return e.leave()})),e.onGeoPointChanged=function(){e.search.loading||e.search.geoPoint&&e.search.geoPoint.lat&&e.search.geoPoint.lon&&!e.search.geoPoint.exact&&e.doSearch()},e.$watch("search.geoPoint",e.onGeoPointChanged,!0),e.onLocationChanged=function(){e.search.loading||e.search.location||e.removeLocation()},e.$watch("search.location",e.onLocationChanged,!0),e.onGeoDistanceChanged=function(){!e.search.loading&&e.entered&&e.search.location&&e.doRefresh()},e.$watch("search.geoDistance",e.onGeoDistanceChanged,!0),e.onCategoryClick=function(n){n&&(e.search.category=n,e.options.category.show=!0,e.search.showCategories=!1,e.doSearch())},e.removeText=function(){e.search.text=null,e.doSearch()},e.removeCategory=function(){e.search.category=null,e.category=null,e.doSearch()},e.removeLocation=function(){e.search.location=null,e.search.geoPoint=null,e.search.geoShape=null,e.updateSettings(),e.doSearch()},e.showActionPopover=function(n,t){t=t||"plugins/market/templates/search/lookup_actions_popover.html",e.actionsPopoverUrl&&e.actionsPopoverUrl!==t&&(e.actionsPopover.hide(),e.actionsPopover=null),e.actionsPopoverUrl=t,e.actionsPopover?e.actionsPopover.show(n):o.fromTemplateUrl(t,{scope:e}).then((function(t){e.actionsPopover=t,e.$on("$destroy",(function(){e.actionsPopover.remove()})),e.actionsPopover.show(n)}))},e.hideActionsPopover=function(){e.actionsPopover&&e.actionsPopover.hide()},e.showSortPopover=function(n){e.showActionsPopover(n,"plugins/market/templates/search/lookup_sort_popover.html")},e.toggleSort=function(n,t){e.hideActionsPopover(),t="desc"===t?"desc":"asc",this.search.sortAttribute===n&&this.search.sortDirection===t||(this.search.sortAttribute=n,this.search.sortDirection=t,e.doSearch())},e.toggleCompactMode=function(){e.search.compactMode=!e.search.compactMode,e.options.description.show=!e.search.compactMode,e.updateSettings()}}function ge(e,n,t,a,i,o,s,r,l,c,d){angular.extend(this,a("ESLookupPositionCtrl",{$scope:e})),e.entered=!1,e.categories=[],e.activeCategoryIndex=void 0,e.activePictureIndex=void 0,e.options=e.options||angular.merge({location:{show:!0,prefix:""},category:{filter:void 0},slideDuration:1e4},r.plugins&&r.plugins.market&&r.plugins.market.record||{}),e.search=e.search||angular.merge({loading:!1,text:null,location:null,geoPoint:null,geoShape:null,showClosed:!1,showOld:!1,geoDistance:l.data.plugins.market&&l.data.plugins.market,from:0,hasMore:!0},e.search),e.search.size=10,e.search.type="all",e.slideDurationLabels={3e3:{labelKey:"MARKET.GALLERY.SLIDE_DURATION_OPTION",labelParams:{value:3}},5e3:{labelKey:"MARKET.GALLERY.SLIDE_DURATION_OPTION",labelParams:{value:5}},1e4:{labelKey:"MARKET.GALLERY.SLIDE_DURATION_OPTION",labelParams:{value:10}},15e3:{labelKey:"MARKET.GALLERY.SLIDE_DURATION_OPTION",labelParams:{value:15}},2e4:{labelKey:"MARKET.GALLERY.SLIDE_DURATION_OPTION",labelParams:{value:20}}},e.slideDurations=_.keys(e.slideDurationLabels),e.adTypeLabels={all:"MARKET.GALLERY.ALL_AD_TYPES",offer:"MARKET.TYPE.OFFER_SHORT",need:"MARKET.TYPE.NEED_SHORT",crowdfunding:"MARKET.TYPE.CROWDFUNDING_SHORT"},e.adTypes=_.keys(e.adTypeLabels),e.enter=function(n,t){var a=l.data.plugins.market&&l.data.plugins.market.defaultSearch;a&&!a.geoShape&&(console.info("[market] [gallery] Restoring last search from settings",a),angular.merge(e.search,a)),e.entered||(t&&t.stateParams&&t.stateParams.q&&(e.search.text=t.stateParams.q.trim()),e.entered=!0)},e.$on("$ionicView.enter",e.enter),e.start=function(n){if(void 0!==e.activeCategoryIndex)return e.openSlideShowModal(e.activeCategoryIndex,e.activePictureIndex);e.stop(),(n=n||{}).filter=n.filter||e.options&&e.options.category&&e.options.category.filter,n.withStock=!e.options||!e.options.showClosed,n.withOld=e.options&&e.options.showOld,n.text=e.search&&e.search.text,e.search.loading=!0;var t={q:n.text};return i.search(t).replace(),d.category.stats(n).then((function(n){return e.categories=_.filter(n,(function(e){return e.count>0&&e.children&&e.children.length})),e.fetchNextPictures()})).then((function(n){var t=n&&n[0];if(t){var a=_.findIndex(e.categories,(function(e){return e.id===t.id}));return e.openSlideShowModal(a,0)}})).catch((function(n){"END"===n?console.info("All pictures displayed"):console.error(n),e.search.loading=!1})).then((function(){e.search.loading=!1}))},e.stop=function(){delete e.activeCategoryIndex,delete e.categories,delete e.activeCategoryIndex,e.search.loading=!1},e.removeLocation=function(){e.search.location=null,e.search.geoPoint=null,e.search.geoShape=null},e.openSlideShowModal=function(n,t,a){e.activeCategoryIndex=n||0,e.activePictureIndex=t||0;var i=e.categories[n];console.info("Opening slide show on category "+i.id+" on picture "+e.activePictureIndex);var o=!0;return c.show("plugins/market/templates/gallery/modal_slideshow.html","MkGallerySlideModalCtrl",{category:i,activeSlide:t,slideDuration:e.options.slideDuration,started:!0!==a,lastSlideCallback:function(){return e.fetchNextPictures().then((function(n){var t=n&&n[0],a=n&&n[1]||0;t&&(o=!1,e.openSlideShowModal(e.activeCategoryIndex,a,!1))}))}}).then((function(n){o&&void 0!==n&&(console.info("User closed, on picture index: "+n),e.activePictureIndex=n)}))},e.fetchNextPictures=function(t){if(!e.categories||!e.categories.length)return n.when();e.search.size=e.search.size||0,e.activeCategoryIndex>=e.categories.length-1&&(e.activeCategoryIndex=void 0),void 0===e.activeCategoryIndex?(e.activeCategoryIndex=0,e.search.from=0):t||!1===e.search.hasMore?(e.activeCategoryIndex++,e.search.from=0):e.search.from+=e.search.size;var a=e.categories[e.activeCategoryIndex],i=Date.now();console.info("Loading pictures for category : "+a.id+"...");var o={categories:_.pluck(a.children,"id"),text:e.search.text,type:"all"===e.search.type?void 0:e.search.type,withStock:!e.search.showClosed,withOld:!e.search.showOld,from:e.search.from,size:e.search.size,location:e.search.location,geoPoint:e.search.geoPoint,geoShape:e.search.geoShape};return e.search.loading=0===o.from,d.record.pictures(o).then((function(n){var t=n&&n.hits||[];if(e.categories)return t.length?(o.from?a.pictures=a.pictures.concat(t):(a.pictures=t,e.search.total=n.total),e.search.hasMore=a.pictures.length<e.search.total,console.info("[market] [category] "+a.pictures.length+"/"+e.search.total+" pictures fetched in "+(Date.now()-i)+"ms"),[a,o.from]):(console.info("No pictures found in category "+a.id+". Skipping"),a.pictures=[],e.search.total=o.from>0?e.search.total:n.total||0,e.search.hasMore=!1,e.fetchNextPictures(!0))}))},e.isLoadedCategory=function(e){return e.pictures&&e.pictures.length>0}}function fe(e,n,t,a,i,o,s){e.zoomMin=1,e.activeSlide=s&&s.activeSlide||0,e.category=s&&s.category||{},e.lastSlideCallback=s&&s.lastSlideCallback||void 0,e.started=s&&!1!==s.started,e.motion=o.motion.fadeSlideInRight,e.options={slideDuration:s&&s.slideDuration||5e3},e.shown=function(){e.started&&e.startTimer()},e.$on("modal.shown",e.shown),e.startTimer=function(){e.interval&&t.cancel(e.interval),console.debug("[market] [gallery] Start slideshow ("+e.options.slideDuration+"ms)"),e.interval=t((function(){e.nextSlide()}),e.options.slideDuration),e.showDescription()},e.stopTimer=function(){e.interval&&(console.debug("[market] [gallery] Stop slideshow"),t.cancel(e.interval),delete e.interval)},e.slideChanged=function(n){e.activeSlide=n,e.showDescription()},e.nextSlide=function(){if(e.category&&e.category.pictures&&e.category.pictures.length&&e.activeSlide!==e.category.pictures.length-1)e.activeSlide++,console.debug("[market] [gallery] Slide index="+e.activeSlide),e.showDescription();else{if("function"==typeof e.lastSlideCallback)return e.loading=!0,e.stopTimer(),e.lastSlideCallback().then((function(){return i(e.closeModal,500)}));e.closeModal(),e.showDescription()}},e.showDescription=function(){var n=e.category.pictures[e.activeSlide];n&&n.description&&!n.showDescription&&i((function(){n.showDescription=!0}),500)},e.updateSlideStatus=function(n){$ionicScrollDelegate.$getByHandle("scroll"+n).getScrollPosition().zoom===e.zoomMin?a.enableSlide(!0):a.enableSlide(!1)},e.stopAndCloseModal=function(){e.stopTimer(),e.closeModal(e.activeSlide)}}function he(e,n,t,a,i,o,s,r,l,c,d,u,p,m,E,g,f,h,_,T,b,v,O){function R(n,t){return t=t||s.defer(),e.updateButtons(),e.loadLikes(),t.resolve(),t.promise}e.formData={},e.id=null,e.category={},e.pictures=[],e.canEdit=!1,e.maxCommentSize=10,e.loading=!0,e.motion=u.motion.fadeSlideInRight,e.smallscreen=u.screen.isSmall(),e.moreAdMotion=u.motion.default,e.smallpictures=!1,e.options=e.options||angular.merge({type:{show:!0},category:{show:!0},location:{show:!0,prefix:void 0},like:{kinds:["VIEW","LIKE","FOLLOW","ABUSE"],index:"market",type:"record",service:v.record.like}},E.plugins&&E.plugins.market&&E.plugins.market.record||{}),e.likeData={views:{},likes:{},follows:{},abuses:{}},e.search={type:null,results:[],total:0,loading:!0},angular.extend(this,r("ESLikesCtrl",{$scope:e})),e.enter=function(n,t){t.stateParams&&t.stateParams.id?(e.loading||t.stateParams.refresh?e.load(t.stateParams.id):(u.loading.hide(),e.updateButtons(),e.updatePaymentData()),e.$broadcast("$recordView.enter",t)):i.go("app.market_lookup")},e.$on("$ionicView.enter",e.enter),e.$on("$ionicView.beforeLeave",(function(n,t){e.$broadcast("$recordView.beforeLeave",t)})),e.refresh=function(){return e.loading||!e.formData.id?s.when():e.load(e.formData.id)},e.load=function(n){n=n||e.formData.id,e.loading=!0,e.formData={};var t=v.record.load(n,{fetchPictures:!1,convertPrice:!0,html:!0}).then((function(n){e.formData=n.record,e.formData.feesCurrency=n.record.feesCurrency||n.record.currency,delete e.formData.useRelative,e.id=n.id,e.issuer=n.issuer,e.loadIssuerStars(e.issuer.issuer),e.smallscreen||e.loadMoreLikeThis(n),e.loading=!1,e.updateView(),u.loading.hide(10)})).catch((function(t){e.secondTry?(e.loading=!1,u.loading.hide(),t&&404===t.ucode?(u.toast.show("MARKET.ERROR.RECORD_NOT_EXISTS"),i.go("app.market_lookup")):u.onError("MARKET.ERROR.LOAD_RECORD_FAILED")(t)):(e.secondTry=!0,l((function(){e.load(n)}),100))}));return l((function(){e.loadPictures(n),e.$broadcast("$recordView.load",n,v.record)})),t},e.loadPictures=function(n){return n=n||e.id,v.record.picture.all({id:n}).then((function(n){n._source.pictures&&(e.pictures=n._source.pictures.reduce((function(e,n){return e.concat(b.image.fromAttachment(n.file))}),[]),e.pictures.length&&e.motion.show({selector:".lazy-load .item.card-gallery",ink:!1}))})).catch((function(){e.pictures=[]}))},e.loadMoreLikeThis=function(n){return v.record.moreLikeThis(n.id,{category:n.record.category.id,type:n.record.type,city:n.record.city}).then((function(n){n&&n.total&&(e.search.results=n.hits,e.search.total=n.total,e.search.loading=!1,e.motion.show({selector:".list.list-more-record .item",ink:!0}))}))},e.loadIssuerStars=function(n){this.canEdit||h.isLogin()&&h.isUserPubkey(n)||T.like.count(n,{kind:"star",issuer:h.isLogin()?h.data.pubkey:void 0}).then((function(n){e.issuer.stars=n}))},e.updateView=function(){e.updateButtons(),e.updatePaymentData(),e.motion.show({selector:".list > .item",ink:!0}),e.canEdit||e.showFab("fab-like-market-record-"+e.id)},e.updateButtons=function(){e.canEdit=e.formData&&h.isUserPubkey(e.formData.issuer),e.canSold=e.canEdit&&e.formData.stock>0,e.canReopen=e.canEdit&&0===e.formData.stock,e.canReopen&&(e.canEdit=!1)},e.markAsView=function(){if(e.likeData&&e.likeData.views&&!e.likeData.views.wasHit&&!e.canEdit&&!h.isUserPubkey(e.formData.issuer)){var n=l((function(){h.isLogin()&&e.options.like.service.add(e.id,{kind:"view"}).then((function(){e.likeData.views.total=(e.likeData.views.total||0)+1})),n=null}),3e3);e.$on("$destroy",(function(){n&&l.cancel(n)}))}},e.refreshConvertedPrice=function(){e.loading=!0},e.$watch("$root.settings.useRelative",e.refreshConvertedPrice,!0),e.edit=function(){i.go("app.market_edit_record",{id:e.id,title:c("formatSlug")(e.formData.title)}),e.loading=!0},e.delete=function(){e.hideActionsPopover(),u.alert.confirm("MARKET.VIEW.REMOVE_CONFIRMATION").then((function(n){n&&v.record.remove(e.id).then((function(){o.nextViewOptions({historyRoot:!0}),i.go("app.market_lookup"),u.toast.show("MARKET.INFO.RECORD_REMOVED")})).catch(u.onError("MARKET.ERROR.REMOVE_RECORD_FAILED"))}))},e.sold=function(){e.hideActionsPopover(),u.alert.confirm("MARKET.VIEW.SOLD_CONFIRMATION").then((function(n){if(n)return u.loading.show(),v.record.setStock(e.id,0).then((function(){e.canSold=!1,e.canReopen=!0,e.canEdit=!1})).catch(u.onError("MARKET.ERROR.SOLD_RECORD_FAILED")).then((function(){o.nextViewOptions({disableBack:!0,disableAnimate:!1,historyRoot:!0}),l((function(){u.toast.show("MARKET.INFO.RECORD_SOLD")}),500),i.go("app.market_lookup")}))}))},e.reopen=function(){e.hideActionsPopover(),u.alert.confirm("MARKET.VIEW.REOPEN_CONFIRMATION").then((function(n){if(n)return u.loading.show().then((function(){return v.record.setStock(e.id,1).then((function(){return e.canSold=!0,e.canReopen=!1,e.canEdit=!0,u.loading.hide()})).then((function(){u.toast.show("MARKET.INFO.RECORD_REOPEN")})).catch(u.onError("MARKET.ERROR.REOPEN_RECORD_FAILED"))}))}))},e.showActionsPopover=function(n){u.popover.show(n,{templateUrl:"plugins/market/templates/record/view_popover_actions.html",scope:e,autoremove:!0,afterShow:function(n){e.actionsPopover=n}})},e.hideActionsPopover=function(){return e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null),!0},e.showSharePopover=function(n){if(e.hideActionsPopover(),!e.loading&&e.formData.title){var t=e.formData.title;e.formData.price&&e.formData.currency&&(t+=" | {0} {1}".format(e.formData.price/100,c("abbreviate")(e.formData.currency)));var a=b.getUrl("/market/record/"+e.id+"/_share"),i=(e.formData.tags&&e.formData.tags.slice()||[]).join(" #");i=i.length?"#"+i+" ":"",g.data.share.defaultHastags&&(i+=g.data.share.defaultHastags),u.screen.isSmall()&&(n=angular.element(document.querySelector("#record-share-anchor-"+e.id))||n),u.popover.share(n,{bindings:{url:a,titleKey:"MARKET.VIEW.POPOVER_SHARE_TITLE",titleValues:{title:t},time:e.formData.time,postMessage:t,postImage:e.pictures.length>0?e.pictures[0]:null,postHashtags:i}})}},e.showNewMessageModal=function(){return s.all([d("MARKET.VIEW.NEW_MESSAGE_TITLE",e.formData),e.loadWallet({minData:!0})]).then((function(n){var t=n[0];return u.loading.hide(),_.showMessageCompose({title:t,destPub:e.issuer.pubkey,destUid:e.issuer.name})})).then((function(e){e&&u.toast.show("MESSAGE.INFO.MESSAGE_SENT")}))},e.showRecord=function(n,t){if(!n.defaultPrevented){var a=e.search.results[t];a&&i.go("app.market_view_record",{id:a.id,title:a.title})}},e.updatePaymentData=function(){var n=e.formData;if(n&&n.stock>0){var t,a=n.price,i=n.pubkey||e.issuer.pubkey;if("crowdfunding"===n.type?(a=void 0,t=O.record.computePrefix(n),i=n.pubkey||i):"auction"===n.type&&(t=O.record.computePrefix(n)),!i)return console.warn("[market] [record] No pubkey found in the issuer profile or in the Ad"),e.showPayment=!1,void(e.paymentData=null);var o=m.util.pkChecksum(i);e.paymentData={pubkey:i,pubkeyWithChecksum:i+":"+o,amount:a,comment:t,currency:n.currency},O.uri.compute(e.paymentData).then((function(n){e.paymentData.uris=n})),e.showPayment=!0}else e.canPay=!1},e.showPaymentModal=function(){if(e.showPayment&&e.paymentData)return p.show("plugins/market/templates/record/modal_payment.html","MkRecordPaymentModalCtrl",e.paymentData)},e.showIssuers=function(n){var t=e.paymentData.comment;if(t)return e.openLink(n,'https://demo.cesium.app/#/app/data/search/g1/movement?q=comment:"'+t+'"')},h.api.data.on.login(e,R,this),h.api.data.on.logout(e,R,this)}function _e(e,n,t,a,i,o,s,r,l,c,d,u,p,m,E,g,f,h){e.options=e.options||angular.merge({recordType:{show:!0,canEdit:!0},category:{show:!0,filter:void 0},description:{show:!0},location:{show:!0,required:!0},position:{showCheckbox:!0,required:!0,warningMessage:"MARKET.EDIT.WARNING.NO_GEO_POINT"},unit:{canEdit:!0},login:{type:"full"}},m.plugins&&m.plugins.market&&m.plugins.market.record||{}),angular.extend(this,c("ESPositionEditCtrl",{$scope:e})),e.formData={type:null,price:null,category:{},geoPoint:null,useRelative:g.data.useRelative,pubkey:null},e.id=null,e.pictures=[],e.loading=!0,e.pubkeyPattern=p.regexp.PUBKEY,e.motion=d.motion.ripple,e.setForm=function(n){e.form=n},e.enter=function(n,a){return t.all([h.currencies(),e.loadWallet({minData:!0})]).then((function(n){e.currencies=n[0];var t=n[1];if(a.stateParams&&a.stateParams.id)return e.load(a.stateParams.id);a.stateParams&&a.stateParams.type&&(e.formData.type=a.stateParams.type),e.formData.type=e.formData.type||e.options.type&&e.options.type.default||"offer",e.formData.currency=e.currencies&&e.currencies[0],t.profile&&("crowdfunding"===e.formData.type&&t.profile.pubkey&&(e.formData.pubkey=t.profile.pubkey),t.profile.city&&(e.formData.address=t.profile.address,e.formData.city=t.profile.city,t.profile.geoPoint&&t.profile.geoPoint.lat&&t.profile.geoPoint.lon&&(e.formData.geoPoint=t.profile.geoPoint)))})).then((function(){e.loading=!1,d.loading.hide(),e.motion.show(),e.options.focus&&!d.screen.isSmall()&&l("market-record-title")})).catch((function(n){"CANCELLED"===n?(e.motion.hide(),e.showHome()):console.error(n)}))},e.$on("$ionicView.enter",e.enter),e.onFreePriceChanged=function(){e.formData.freePrice&&(e.formData.price=null)},e.showUnitPopover=function(n){d.popover.show(n,{templateUrl:"templates/wallet/popover_unit.html",scope:e,autoremove:!0}).then((function(n){e.formData.useRelative=n}))},e.cancel=function(){e.closeModal()},e.load=function(n){return d.loading.show(),s.record.load(n,{fetchPictures:!0,convertPrice:!1}).then((function(n){angular.merge(e.formData,n.record),e.formData.useRelative="UD"===n.record.unit,e.formData.useRelative||(e.formData.price=e.formData.price?e.formData.price/100:void 0,e.formData.fees=e.formData.fees?e.formData.fees/100:void 0),e.formData.currency||(e.formData.currency=e.currency),!e.formData.city&&e.formData.location&&(e.formData.city=e.formData.location),e.formData.location&&(e.formData.location=null),e.id=n.id,e.pictures=n.record.pictures||[],delete e.formData.pictures,e.dirty=!1,e.motion.show({selector:".animate-ripple .item, .card-gallery"}),d.loading.hide(),o((function(){e.loading=!1}),1e3)})).catch(d.onError("MARKET.ERROR.LOAD_RECORD_FAILED"))},e.save=function(i,l){return e.form.$submitted=!0,!e.saving&&e.form.$valid&&e.formData.category.id?l?(e.saving=!0,console.debug("[ES] [market] Saving record..."),d.loading.show({delay:0}).then((function(){var n=angular.copy(e.formData);delete n.useRelative;var t=e.formData.useRelative?"UD":"unit";return angular.isDefined(n.price)&&null!=n.price?("string"==typeof n.price&&(n.price=parseFloat(n.price.replace(new RegExp("[.,]"),"."))),n.unit=t,"unit"===t&&(n.price=100*n.price),n.currency||(n.currency=e.currency)):(n.unit=null,n.price=null,n.currency||(n.currency=e.currency)),n.fees?("string"==typeof n.fees&&(n.fees=parseFloat(n.fees.replace(new RegExp("[.,]"),"."))),"unit"===t&&(n.fees=100*n.fees),n.feesCurrency||(n.feesCurrency=n.currency||e.currency),n.unit=n.unit||t):(n.fees=null,n.feesCurrency=null),n.time=E.date.now(),n.geoPoint&&n.geoPoint.lat&&n.geoPoint.lon?(n.geoPoint.lat=parseFloat(n.geoPoint.lat),n.geoPoint.lon=parseFloat(n.geoPoint.lon)):n.geoPoint=null,angular.isDefined(n.location)&&(n.location=null),n.picturesCount=e.pictures.length,n.picturesCount?d.image.resizeSrc(e.pictures[0].src,!0).then((function(t){return n.thumbnail=E.image.toAttachment({src:t}),n.pictures=e.pictures.reduce((function(e,n){return e.concat({file:E.image.toAttachment({src:n.src})})}),[]),n})):(e.formData.thumbnail&&(n.thumbnail={_content:"",_content_type:""}),n.pictures=[],n)})).then((function(n){return e.id?s.record.update(n,{id:e.id}):(n.creationTime=E.date.now(),n.stock=angular.isDefined(n.stock)?n.stock:1,s.record.add(n))})).then((function(t){var i=!e.id;if(e.id=e.id||t,e.saving=!1,e.dirty=!1,r.backView()){var o=n.$on("$stateChangeSuccess",(function(n,t,i,s,r){n.preventDefault(),a.go("app.market_view_record",{id:e.id},{location:"replace",reload:!0}),o()}));r.goBack(i?-1:-2)}else r.nextViewOptions({historyRoot:!0}),a.go("app.market_view_record",{id:e.id})})).catch((function(n){e.saving=!1,n&&"ES_HTTP.ERROR.MAX_UPLOAD_BODY_SIZE"===n.message&&(n.message="MARKET.ERROR.RECORD_EXCEED_UPLOAD_SIZE"),d.onError("MARKET.ERROR.FAILED_SAVE_RECORD")(n)}))):(console.debug("[ES] [market] Waiting debounce end, before saving..."),o((function(){return e.save(i,!0)}),650)):t.reject()},e.openCurrencyLookup=function(){alert("Not implemented yet. Please submit an issue if occur again.")},e.cancel=function(){e.dirty=!1,r.goBack()},e.$on("$stateChangeStart",(function(n,t,i,o){if(e.dirty&&!e.saving&&!n.defaultPrevented&&(n.preventDefault(),!e.loading))return d.alert.confirm("CONFIRM.SAVE_BEFORE_LEAVE","CONFIRM.SAVE_BEFORE_LEAVE_TITLE",{cancelText:"COMMON.BTN_NO",okText:"COMMON.BTN_YES_SAVE"}).then((function(n){if(n)return e.save()})).then((function(){e.dirty=!1,r.nextViewOptions({historyRoot:!0}),a.go(t.name,i),d.loading.hide()}))})),e.onFormDataChanged=function(){e.loading||(e.dirty=!0)},e.$watch("formData",e.onFormDataChanged,!0),e.showRecordTypeModal=function(){u.show("plugins/market/templates/record/modal_record_type.html").then((function(n){n&&(e.formData.type=n)}))},e.showCategoryModal=function(){(e.options&&e.options.category&&e.options.category.filter?s.category.filtered({filter:e.options.category.filter}):s.category.all()).then((function(e){return u.show("plugins/es/templates/common/modal_category.html","ESCategoryModalCtrl as ctrl",{categories:e},{focusFirstInput:!0})})).then((function(n){n&&n.parent&&(e.formData.category=n)}))}}function Te(e,n,t,a){e.loading=!0,e.formData={helpSiteUrl:t.data.userForumUrl},e.openHelpSite=function(n){return e.openLink(n,t.data.userForumUrl||"https://forum.monnaie-libre.fr")},e.load=function(){return console.debug("[market] Display payment info",n),angular.merge(e.formData,n),a.uri.compute(n).then((function(n){e.links=n,e.loading=!1}))},e.load()}function be(e,n,t){angular.extend(this,n("MkLookupAbstractCtrl",{$scope:e})),e.search.showClosed=!1,e.search.showOld=!1,e.options.filter.lastRecords=!1,e.smallscreen=t.screen.isSmall(),e.enter=function(n,t){return e.entered?e.search.results&&0!==e.search.results.length?void 0:e.doSearch():e.loadWallet().then((function(n){if(e.search.text=n.pubkey,e.search.lastRecords=!1,e.search.sortAttribute="creationTime",e.search.sortDirection="desc",!e.entered||!e.search.results||0===e.search.results.length)return e.init().then(e.doSearch).then((function(){e.entered=!0,e.showFab("fab-wallet-add-market-record")}))})).catch((function(n){if("CANCELLED"===n)return e.showHome();console.error(n),e.entered=!1}))},e.$on("$ionicView.enter",e.enter)}function ve(e,n,t,a,i){angular.extend(this,n("MkLookupAbstractCtrl",{$scope:e})),e.search.showClosed=!1,e.search.showOld=!1,e.options.filter.lastRecords=!1,e.smallscreen=t.screen.isSmall(),e.enter=function(n,t){return e.entered?e.search.results&&0!==e.search.results.length?void 0:e.doSearch():e.loadWallet({minData:!0}).then((function(e){return i.record.like.load({issuer:e.pubkey,kinds:["LIKE","FOLLOW"]})})).then((function(n){if(e.search.ids=n&&n.hits,e.search.sortAttribute="creationTime",e.search.sortDirection="desc",console.debug("[market] [favorites] Loading favorites...",e.search.ids),!e.entered||!e.search.results||0===e.search.results.length)return e.init().then((function(){return e.doSearch()})).then((function(){e.entered=!0,e.showFab("fab-wallet-add-market-record")}))})).catch((function(n){if("CANCELLED"===n)return e.showHome();console.error(n),e.entered=!1}))},e.$on("$ionicView.enter",e.enter);var o=e.doSearch;e.doSearch=function(n,t){return i.record.like.load({issuer:a.data.pubkey,kinds:["LIKE","FOLLOW"],from:n,_source:["id","time"]}).then((function(a){return e.search.ids=a&&_.pluck(a.hits,"id"),console.debug("Found like ids:",e.search.ids),o(n,t)}))}}function Oe(e,n,t,a,i,o){e.locale=void 0,e.loading=!0,e.motion=t.motion.ripple,e.listeners=void 0,e.options=e.options||angular.merge({category:{filter:void 0,withCache:!1,withStats:!0,withOld:!1,withStock:!0,nbsp:!0},showClosed:!1,showOld:!1},a.plugins&&a.plugins.market&&a.plugins.market.record||{}),e.load=function(t){return(t=t||{}).filter=t.filter||e.options&&e.options.category&&e.options.category.filter,t.withStats=!angular.isDefined(e.options&&e.options.category&&e.options.category.withStats)||e.options.category.withStats,t.withStock=angular.isDefined(t.withStock)?t.withStock:!e.options||!e.options.showClosed,t.withOld=angular.isDefined(t.withOld)?t.withOld:!e.options||e.options.showOld,t.silent=!angular.isDefined(t.silent)||t.silent,t.locale=angular.isDefined(t.locale)?t.locale:n.use(),t.nbsp=angular.isDefined(t.nbsp)?t.nbsp:e.options&&e.options.category&&e.options.category.nbsp,t.silent||(e.loading=!0),e.locale=t.locale,angular.merge(e.options.category,t),console.debug("[market] [categories] Loading...",t),(t.withStats?i.stats(t):i.filtered(t).then(i.asTree)).then((function(n){n=n||[],t.nbsp&&(n=_.map(n,(function(e){return e.name=e.name&&e.name.split(" ").join("&nbsp;"),e}))),e.categories=n,e.totalCount=e.categories.reduce((function(e,n){return e+n.count}),0),e.loading=!1,e.motion.show&&!t.silent&&e.motion.show(),e.listeners||e.addListeners()}))},e.onOptionsChange=function(){!e.loading&&e.locale&&((e.options.category.withStock||!1)===e.options.showClosed||(e.options.category.withOld||!1)!==e.options.showOld)&&e.load()},e.onLocaleChange=function(n){e.locale&&e.locale!==n&&(console.debug("[market] [categories] Need reload for locale {{0]]...".format(n)),e.load({locale:n,silent:!0}))},e.addListeners=function(){e.listeners=[e.$watch("options.showClosed",e.onOptionsChange,!0),e.$watch("options.showOld",e.onOptionsChange,!0),o.api.locale.on.changed(e,e.onLocaleChange,this)]}}function Re(e,n,t){e.entered=!1,angular.extend(this,n("MkListCategoriesCtrl",{$scope:e})),e.enter=function(n,t){return e.load({silent:!0}).then((function(){e.loading=!1,e.entered||e.motion.show(),e.entered=!0}))},e.$on("$ionicView.enter",e.enter),e.onCategoryClick=function(e){return t.go("app.market_lookup",{category:e&&e.id,location:""})}}function Ie(e,n,t,a,i,o,s,r,l){e.entered=!1,e.reorderRoot=!1,e.reorderChildren=!1,e.dirty=!1,e.locales=angular.merge({},r.locales),e.defaultLocale=r.fixLocale(s.defaultLanguage)||"en",e.idPattern=l.regexp.ID,angular.extend(this,n("MkListCategoriesCtrl",{$scope:e})),e.options.category.withStats=!1,e.options.category.withCache=!1,e.enter=function(n,t){return e.load({silent:!0,withStats:!1,withCache:!1}).then((function(){e.loading=!1,e.entered||e.motion.show({selector:".list .item"}),e.entered=!0}))},e.$on("$ionicView.enter",e.enter),e.cancel=function(n){return e.dirty&&!n?o.alert.confirm("MARKET.CATEGORY.EDIT.CONFIRM.CANCEL").then((function(n){if(n)return e.cancel(!0)})):(e.loading=!0,e.load())},e.save=function(){if(e.dirty&&!e.saving)return console.debug("[market] [category] Saving categories..."),e.saving=!0,l.saveAll(e.categories).then((function(){e.saving=!1,e.dirty=!1,o.toast.show("MARKET.CATEGORY.EDIT.INFO.SAVED")})).catch((function(n){return e.saving=!1,console.error(n&&n.message||n),o.onError("MARKET.CATEGORY.EDIT.ERROR.CANNOT_SAVE")(n)}))},e.getName=function(n,t){if(!n)throw new Error("Missing category");var a=n.localizedNames&&n.localizedNames[e.locale];return a?a||"":t&&e.defaultLocale!==e.locale?'<span class="text-italic">'+(n.localizedNames&&e.defaultLocale&&n.localizedNames[e.defaultLocale]||n.name)+"</span>":n.name||""},e.reorderRootCategory=function(n,t,a){n&&t!==a&&(e.categories.splice(t,1),e.categories.splice(a,0,n),e.dirty=!0)},e.reorderChildrenCategory=function(n,t,a,i){n&&t&&a!==i&&(n.children=n.children||[],n.children.splice(a,1),n.children.splice(i,0,t),e.dirty=!0)},e.editRootCategory=function(n){var t=e.categories[n];return e.showEditPopup(t).then((function(n){n&&(angular.merge(t,n),e.dirty=!0)}))},e.addRootCategory=function(){return e.showEditPopup().then((function(n){n&&(e.categories.push(n),e.dirty=!0)}))},e.editChildCategory=function(n,t){var a=n.children[t];return e.showEditPopup(a,n).then((function(n){n&&(angular.merge(a,n),e.dirty=!0)}))},e.addChildCategory=function(n){return e.showEditPopup().then((function(t){t&&(n.children=n.children||[],n.children.push(t),e.dirty=!0)}))},e.removeRootCategory=function(n){e.categories.splice(n,1),e.dirty=!0},e.removeChildCategory=function(n,t){var a=n.children[t];n.children=n.children||[],n.children.splice(t,1),n.count-=a.count||0,e.dirty=!0},e.onChangeLocale=function(n){console.debug("[market] [category] Changing categories locale to: "+n.label),e.locale=n.id},e.setEditForm=function(n){e.editForm=n},e.showEditPopup=function(n,s){e.formData={id:n&&n.id,name:n&&e.getName(n),parent:s&&s.id,localizedNames:n&&angular.merge({},n.localizedNames)||{}};var r=!n,l=r?"MARKET.CATEGORY.EDIT.POPUP.TITLE_NEW":"MARKET.CATEGORY.EDIT.POPUP.TITLE_EDIT";return i((function(i,s){a([l,"COMMON.BTN_OK","COMMON.BTN_CANCEL"]).then((function(a){t.show({templateUrl:"plugins/market/templates/category/popup_edit_category.html",title:a[l],scope:e,buttons:[{text:a["COMMON.BTN_CANCEL"]},{text:a["COMMON.BTN_OK"],type:"button-positive",onTap:function(n){if(e.editForm.$submitted=!0,r&&e.editForm.id.$setValidity("duplicate",e.checkIdNotUsed(e.formData.id)),e.editForm.$valid&&e.formData.id&&e.formData.name)return e.formData;n.preventDefault()}}]}).then((function(t){if(!t)return delete e.formData,void o.loading.hide();t.localizedNames[e.locale]=t.name,n&&n.name?t.name=n.name:delete t.name,i(t)})).catch(s)}))}))},e.checkIdNotUsed=function(n){return-1===_.findIndex(e.categories||[],(function(e){return e.id===n}))}}function Ne(e,n,t){angular.extend(this,n("MkLookupAbstractCtrl",{$scope:e})),e.options.filter.lastRecords=!1,e.smallscreen=t.screen.isSmall(),e.enter=function(n,t){if(!e.entered)return e.pubkey=t&&t.stateParams&&t.stateParams.pubkey,e.pubkey?(e.search.text=e.pubkey,e.search.lastRecords=!1,e.init().then(e.doSearch).then((function(){e.entered=!0})).catch((function(n){console.error(n),e.entered=!0}))):e.showHome()},e.$on("$ionicView.enter",e.enter)}function Se(e,n,t,a,i){angular.extend(this,n("ESLastDocumentsCtrl",{$scope:e})),e.search.index="user,page,group,market",e.search.type="profile,record,comment",e._source=["issuer","hash","time","creationTime","title","price","unit","currency","picturesCount","thumbnail._content_type","city","message","record"],e.inheritedSelectDocument=e.selectDocument,e.selectDocument=function(n,t){if("market"===t.index){if(t&&n&&!n.defaultPrevented)if(n.stopPropagation(),"market"===t.index&&"record"===t.type)a.go("app.market_view_record",{id:t.id,title:t.title});else if("market"===t.index&&"comment"===t.type){var o=i("formatHash")(t.id);a.go("app.market_view_record_anchor",{id:t.record,anchor:o})}}else e.inheritedSelectDocument(n,t)}}function Ae(e,n,t,a,i,o,s,r){function l(n){return moment.unix(n).utc().startOf(e.formData.rangeDuration).unix()}e.loading=!0,e.formData=e.formData||{useRelative:o.data.useRelative,timePct:100,rangeDuration:"day",firstBlockTime:0,scale:"linear",hide:[],beginAtZero:!0},e.formData.useRelative=!1,e.scale="linear",e.height=void 0,e.width=void 0,e.maintainAspectRatio=!0,e.times=[],e.enter=function(n,t){if(e.loading){if(t&&t.stateParams&&(e.stateName=t&&t.stateName,e.stateParams=angular.copy(t&&t.stateParams||{}),!e.formData.currency&&t&&t.stateParams&&t.stateParams.currency&&(e.formData.currency=t.stateParams.currency),t.stateParams.t?e.formData.timePct=t.stateParams.t:t.stateParams.timePct&&(e.formData.timePct=t.stateParams.timePct),t.stateParams.stepUnit&&(e.formData.rangeDuration=t.stateParams.stepUnit),t.stateParams.scale&&(e.formData.scale=t.stateParams.scale),t.stateParams.hide&&(e.formData.hide=t.stateParams.hide.split(",").reduce((function(e,n){return e.concat(parseInt(n))}),[]))),e.init(n,t),!e.formData.currency)return s.get().then((function(a){return e.formData.currency=a?a.name:null,e.formData.firstBlockTime=a?l(a.firstBlockTime):0,e.formData.firstBlockTime||console.warn("[graph] currency.firstBlockTime not loaded ! Should have been loaded by currrency service!"),e.formData.currencyAge=l(moment().utc().unix())-e.formData.firstBlockTime,e.enter(n,t)}));e.load().then((function(){e.setScale(e.formData.scale),e.updateHiddenDataset(),e.loading=!1}))}},e.$on("$csExtension.enter",e.enter),e.$on("$ionicParentView.enter",e.enter),e.updateLocation=function(){e.stateName&&(a.nextViewOptions({disableAnimate:!0,disableBack:!0,historyRoot:!0}),e.stateParams=e.stateParams||{},e.stateParams.t=e.formData.timePct>=0&&e.formData.timePct<100?e.formData.timePct:void 0,e.stateParams.stepUnit="day"!=e.formData.rangeDuration?e.formData.rangeDuration:void 0,e.stateParams.hide=e.formData.hide&&e.formData.hide.length?e.formData.hide.join(","):void 0,e.stateParams.scale="linear"!=e.formData.scale?e.formData.scale:void 0,i.go(e.stateName,e.stateParams,{reload:!1,inherit:!0,notify:!1}))},e.setSize=function(n,t,a){e.height=n,e.width=t,e.maintainAspectRatio=angular.isDefined(a)?a:e.maintainAspectRatio},e.$on("csView.action.refresh",(function(n,t){if(!t||"currency"==t)return e.load()})),e.init=function(e,n){},e.load=function(){},e.toggleScale=function(){e.setScale("linear"===e.formData.scale?"logarithmic":"linear"),e.updateLocation()},e.setScale=function(t){if(e.hideActionsPopover(),e.formData.scale=t,e.options&&e.options.scales&&e.options.scales.yAxes){var a=n("formatInteger");_.forEach(e.options.scales.yAxes,(function(n,i){n.type=t,n.ticks=n.ticks||{},"linear"==t?(n.ticks.beginAtZero=!angular.isDefined(e.formData.beginAtZero)||e.formData.beginAtZero,delete n.ticks.min,n.ticks.callback=function(e){return a(e)}):(delete n.ticks.beginAtZero,delete n.ticks.callback,n.ticks.callback=function(e,n){if(e)return Math.log10(e)%1==0||Math.log10(e/3)%1==0?a(e):""})}))}},e.setRangeDuration=function(n){e.hideActionsPopover(),e.formData&&n==e.formData.rangeDuration||(e.formData.rangeDuration=n,delete e.formData.startTime,delete e.formData.endTime,delete e.formData.rangeDurationSec,e.load(),e.updateLocation())},e.updateHiddenDataset=function(n){n=n||e.datasetOverride||{},_.forEach(e.formData.hide||[],(function(t){if(n[t]){n[t].hidden=!0;var a=n[t].yAxisID,i=a&&e.options&&e.options.scales&&_.findWhere(e.options.scales.yAxes||[],{id:a});a&&i&&1==_.filter(n,(function(e){return e.yAxisID===a})).length&&(i.display=!1)}}))},e.onLegendClick=function(n,t){var a=t.datasetIndex,i=this.chart,o=i.getDatasetMeta(a);o.hidden=null===o.hidden?!i.data.datasets[a].hidden:null,i.config&&i.config.data&&i.config.data.datasets&&1===_.filter(i.config.data.datasets,(function(e){return e.yAxisID&&e.yAxisID===o.yAxisID})).length&&(i.scales[o.yAxisID].options.display=!0!==o.hidden),i.update(),e.formData.hide=e.formData.hide||[],e.formData.hide=o.hidden?_.union(e.formData.hide,[a]):_.difference(e.formData.hide,[a]),e.updateLocation()},e.goPreviousRange=function(){e.loadingRange||(e.loadingRange=!0,e.formData.startTime-=e.times.length*e.formData.rangeDurationSec,e.formData.startTime<e.formData.firstBlockTime&&(e.formData.startTime=e.formData.firstBlockTime),e.formData.endTime=e.formData.startTime+e.times.length*e.formData.rangeDurationSec,e.load().then((function(){e.updateLocation(),e.loadingRange=!1})))},e.goNextRange=function(){e.loadingRange||(e.loadingRange=!0,e.formData.startTime+=e.times.length*e.formData.rangeDurationSec,e.formData.startTime>e.formData.firstBlockTime+e.formData.currencyAge-e.formData.timeWindow&&(e.formData.startTime=e.formData.firstBlockTime+e.formData.currencyAge-e.formData.timeWindow),e.formData.endTime=e.formData.startTime+e.times.length*e.formData.rangeDurationSec,e.load().then((function(){e.updateLocation(),e.loadingRange=!1})))},e.onRangeChanged=function(){e.loadingRange||(e.loadingRange=!0,e.formData.startTime=e.formData.firstBlockTime+parseFloat(e.formData.timePct)/100*(e.formData.currencyAge-e.formData.timeWindow),e.formData.endTime=e.formData.startTime+e.times.length*e.formData.rangeDurationSec,e.load().then((function(){e.updateLocation(),e.loadingRange=!1})))},e.updateRange=function(n,t,a){a=!angular.isDefined(a)||a,e.formData.startTime=n,e.formData.endTime=t,e.formData.timeWindow=e.formData.timeWindow||e.formData.endTime-e.formData.startTime,e.formData.rangeDurationSec=e.formData.rangeDurationSec||e.formData.timeWindow/(e.times.length-1),a&&(e.formData.timePct=Math.ceil(100*(e.formData.startTime-e.formData.firstBlockTime)/(e.formData.currencyAge-e.formData.timeWindow)))},e.showActionsPopover=function(n){r.popover.show(n,{templateUrl:"plugins/graph/templates/common/popover_range_actions.html",scope:e,autoremove:!0,afterShow:function(n){e.actionsPopover=n}})},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null)}}function De(e,n,t,a,i,o,s,r){angular.extend(this,t("GpCurrencyAbstractCtrl",{$scope:e})),e.formData.rangeDuration="month",e.displayRightAxis=!0,e.hiddenDatasets=[],e.chartIdPrefix="docstats-chart-",e.charts=[{id:"market",title:"GRAPH.DOC_STATS.MARKET.TITLE",series:[{key:"market_record",label:"GRAPH.DOC_STATS.MARKET.AD",color:o.rgba.royal(),pointHoverBackgroundColor:o.rgba.royal(),clickState:{name:"app.document_search",params:{index:"market",type:"record"}}},{key:"market_comment",label:"GRAPH.DOC_STATS.MARKET.COMMENT",color:o.rgba.gray(.5),pointHoverBackgroundColor:o.rgba.gray(),clickState:{name:"app.document_search",params:{index:"market",type:"comment"}}}]},{id:"user_delta",title:"GRAPH.DOC_STATS.MARKET_DELTA.TITLE",series:[{key:"market_record_delta",label:"GRAPH.DOC_STATS.MARKET_DELTA.AD",type:"line",yAxisID:"y-axis-delta",color:o.rgba.royal(),pointHoverBackgroundColor:o.rgba.royal()},{key:"market_comment_delta",label:"GRAPH.DOC_STATS.MARKET_DELTA.COMMENT",type:"line",yAxisID:"y-axis-delta",color:o.rgba.gray(.5),pointHoverBackgroundColor:o.rgba.gray()}]},{id:"user",title:"GRAPH.DOC_STATS.USER.TITLE",series:[{key:"user_profile",label:"GRAPH.DOC_STATS.USER.USER_PROFILE",color:o.rgba.royal(.7),pointHoverBackgroundColor:o.rgba.royal(),clickState:{name:"app.document_search",params:{index:"user",type:"profile"}}},{key:"user_settings",label:"GRAPH.DOC_STATS.USER.USER_SETTINGS",color:o.rgba.gray(.5),pointHoverBackgroundColor:o.rgba.gray(),clickState:{name:"app.document_search",params:{index:"user",type:"settings"}}}]},{id:"user_delta",title:"GRAPH.DOC_STATS.USER_DELTA.TITLE",series:[{key:"user_profile_delta",label:"GRAPH.DOC_STATS.USER_DELTA.USER_PROFILE",type:"line",yAxisID:"y-axis-delta",color:o.rgba.royal(),pointHoverBackgroundColor:o.rgba.royal()},{key:"user_settings_delta",label:"GRAPH.DOC_STATS.USER_DELTA.USER_SETTINGS",type:"line",yAxisID:"y-axis-delta",color:o.rgba.gray(.5),pointHoverBackgroundColor:o.rgba.gray()}]},{id:"message",title:"GRAPH.DOC_STATS.MESSAGE.TITLE",series:[{key:"message_inbox",label:"GRAPH.DOC_STATS.MESSAGE.MESSAGE_INBOX",color:o.rgba.royal(),pointHoverBackgroundColor:o.rgba.royal(),clickState:{name:"app.document_search",params:{index:"message",type:"inbox"}}},{key:"message_outbox",label:"GRAPH.DOC_STATS.MESSAGE.MESSAGE_OUTBOX",color:o.rgba.calm(),pointHoverBackgroundColor:o.rgba.calm(),clickState:{name:"app.document_search",params:{index:"message",type:"outbox"}}}]},{id:"social",title:"GRAPH.DOC_STATS.SOCIAL.TITLE",series:[{key:"page_record",label:"GRAPH.DOC_STATS.SOCIAL.PAGE_RECORD",color:o.rgba.royal(),pointHoverBackgroundColor:o.rgba.royal(),clickState:{name:"app.document_search",params:{index:"page",type:"record"}}},{key:"group_record",label:"GRAPH.DOC_STATS.SOCIAL.GROUP_RECORD",color:o.rgba.calm(),pointHoverBackgroundColor:o.rgba.calm(),clickState:{name:"app.document_search",params:{index:"group",type:"record"}}},{key:"page_comment",label:"GRAPH.DOC_STATS.SOCIAL.PAGE_COMMENT",color:o.rgba.gray(.5),pointHoverBackgroundColor:o.rgba.gray(),clickState:{name:"app.document_search",params:{index:"page",type:"comment"}}}]},{id:"subscription",title:"GRAPH.DOC_STATS.SUBSCRIPTION.TITLE",series:[{key:"subscription_record",label:"GRAPH.DOC_STATS.SUBSCRIPTION.EMAIL",color:o.rgba.royal(),pointHoverBackgroundColor:o.rgba.royal(),clickState:{name:"app.document_search",params:{index:"subscription",type:"record"}}}]},{id:"other",title:"GRAPH.DOC_STATS.OTHER.TITLE",series:[{key:"history_delete",label:"GRAPH.DOC_STATS.OTHER.HISTORY_DELETE",color:o.rgba.gray(.5),pointHoverBackgroundColor:o.rgba.gray(),clickState:{name:"app.document_search",params:{index:"history",type:"delete"}}}]}];var l=r("formatInteger");e.defaultChartOptions={responsive:!0,maintainAspectRatio:e.maintainAspectRatio,title:{display:!0},legend:{display:!0,onClick:e.onLegendClick},scales:{xAxes:[{stacked:!0}],yAxes:[{id:"y-axis",stacked:!0},{id:"y-axis-delta",stacked:!1},{id:"y-axis-delta-right",stacked:!1,display:e.displayRightAxis,position:"right",gridLines:{drawOnChartArea:!1}}]},tooltips:{enabled:!0,mode:"index",callbacks:{label:function(e,n){return n.datasets[e.datasetIndex].label+": "+l(e.yLabel)}}}},e.init=function(e,n){n&&n.stateParams},e.load=function(n){return a.all([i(e.charts.reduce((function(e,n){return e.concat(n.series.reduce((function(e,n){return e.concat(n.label)}),[n.title]))}),["COMMON.DATE_PATTERN","COMMON.DATE_SHORT_PATTERN","COMMON.DATE_MONTH_YEAR_PATTERN"])),s.docstat.get(e.formData)]).then((function(t){var a=t[0],i={hour:a["COMMON.DATE_PATTERN"],day:a["COMMON.DATE_SHORT_PATTERN"],month:a["COMMON.DATE_MONTH_YEAR_PATTERN"]};if((t=t[1])&&t.times){e.times=t.times;var s=i[e.formData.rangeDuration];e.labels=_.map(t.times,(function(e){return moment.unix(e).local().format(s)})),e.updateRange(t.times[0],t.times[t.times.length-1],n),e.setScale(e.scale),_.forEach(e.charts,(function(n){var i={};n.data=_.map(n.series,(function(e){if(i[e.yAxisID||"y-axis"]=!0,e.key.endsWith("_delta")){var n=e.key.substring(0,e.key.length-"_delta".length);return((a=t[n])?_.map(a,(function(e){var n=void 0!==e&&void 0!==o?e-(o||e):void 0;return o=e,n})):void 0)||[]}var a,o;return t[e.key]||[]})),n.options=angular.copy(e.defaultChartOptions),n.options.title.text=a[n.title],n.options.scales.yAxes=n.options.scales.yAxes.reduce((function(e,n){return i[n.id]?e.concat(n):e}),[]),n.datasetOverride=_.map(n.series,(function(e){return{yAxisID:e.yAxisID||"y-axis",type:e.type||"line",label:a[e.label],fill:"line"!==e.type,borderWidth:2,pointRadius:"line"!==e.type?0:2,pointHitRadius:4,pointHoverRadius:3,borderColor:e.color,backgroundColor:e.color,pointBackgroundColor:e.color,pointBorderColor:e.color,pointHoverBackgroundColor:e.pointHoverBackgroundColor||e.color,pointHoverBorderColor:e.pointHoverBorderColor||o.rgba.white()}}))}))}}))},e.onChartClick=function(t,a,i){if(i){var o=_.find(e.charts,(function(n){return e.chartIdPrefix+n.id==i._chart.canvas.id})).series[i._datasetIndex];if(o&&o.clickState&&o.clickState.name){var s=o.clickState.params?angular.copy(o.clickState.params):{},r=e.times[i._index],l=moment.unix(r).utc().add(1,e.formData.rangeDuration).unix();return s.q="time:>={0} AND time:<{1}".format(r,l),n.go(o.clickState.name,s)}console.debug("Click on item index={0}".format(i._index))}}}function Ce(e,n,t,a,i,o,s){angular.extend(this,n("GpCurrencyAbstractCtrl",{$scope:e})),e.formData.rangeDuration="month",e.hiddenDatasets=[],e.charts=[{id:"count",title:"GRAPH.SYNCHRO.COUNT.TITLE",series:[{key:"inserts",type:"bar",label:"GRAPH.SYNCHRO.COUNT.INSERTS",color:i.rgba.royal(),pointHoverBackgroundColor:i.rgba.royal()},{key:"updates",type:"bar",label:"GRAPH.SYNCHRO.COUNT.UPDATES",color:i.rgba.calm(),pointHoverBackgroundColor:i.rgba.calm()},{key:"deletes",type:"bar",label:"GRAPH.SYNCHRO.COUNT.DELETES",color:i.rgba.assertive(.5),pointHoverBackgroundColor:i.rgba.assertive()}]},{id:"peer",title:"GRAPH.SYNCHRO.PEER.TITLE",series:[{key:"ES_USER_API",label:"GRAPH.SYNCHRO.PEER.ES_USER_API",color:i.rgba.royal(),pointHoverBackgroundColor:i.rgba.royal()},{key:"ES_SUBSCRIPTION_API",label:"GRAPH.SYNCHRO.PEER.ES_SUBSCRIPTION_API",color:i.rgba.gray(.5),pointHoverBackgroundColor:i.rgba.gray()}]},{id:"performance",title:"GRAPH.SYNCHRO.PERFORMANCE.TITLE",series:[{key:"duration",type:"bar",label:"GRAPH.SYNCHRO.PERFORMANCE.DURATION",color:i.rgba.gray(.5),pointHoverBackgroundColor:i.rgba.gray()}]}];var r=s("formatInteger");e.defaultChartOptions={responsive:!0,maintainAspectRatio:e.maintainAspectRatio,title:{display:!0},legend:{display:!0,onClick:e.onLegendClick},scales:{xAxes:[{stacked:!0}],yAxes:[{stacked:!0,id:"y-axis"}]},tooltips:{enabled:!0,mode:"index",callbacks:{label:function(e,n){return n.datasets[e.datasetIndex].label+": "+r(e.yLabel)}}}},e.init=function(e,n){n&&n.stateParams},e.load=function(n){return t.all([a(e.charts.reduce((function(e,n){return e.concat(n.series.reduce((function(e,n){return e.concat(n.label)}),[n.title]))}),["COMMON.DATE_PATTERN","COMMON.DATE_SHORT_PATTERN","COMMON.DATE_MONTH_YEAR_PATTERN"])),o.synchro.execution.get(e.formData)]).then((function(t){var a=t[0],o={hour:a["COMMON.DATE_PATTERN"],day:a["COMMON.DATE_SHORT_PATTERN"],month:a["COMMON.DATE_MONTH_YEAR_PATTERN"]};if((t=t[1])&&t.times){e.times=t.times;var s=o[e.formData.rangeDuration];e.labels=t.times.reduce((function(e,n){return e.concat(moment.unix(n).local().format(s))}),[]),e.updateRange(t.times[0],t.times[t.times.length-1],n),e.setScale(e.scale),_.forEach(e.charts,(function(n){n.data=[],_.forEach(n.series,(function(e){n.data.push(t[e.key]||[])})),n.options=angular.copy(e.defaultChartOptions),n.options.title.text=a[n.title],n.datasetOverride=n.series.reduce((function(e,n){return e.concat({yAxisID:"y-axis",type:n.type||"line",label:a[n.label],fill:!0,borderWidth:2,pointRadius:0,pointHitRadius:4,pointHoverRadius:3,borderColor:n.color,backgroundColor:n.color,pointBackgroundColor:n.color,pointBorderColor:n.color,pointHoverBackgroundColor:n.pointHoverBackgroundColor||n.color,pointHoverBorderColor:n.pointHoverBorderColor||i.rgba.white()})}),[])}))}}))}}function Le(e,n,t){e.extensionPoint=n.extensions.points.current.get(),e.enable=t.isEnable(),t.api.state.on.changed(e,(function(n){e.enable=n}))}function Pe(e,n,t,a,i,o){e.extensionPoint=t.extensions.points.current.get(),e.enable=a.isEnable(),e.loading=!0,e.node=e.node||{},a.api.state.on.changed(e,(function(n){e.enable=n})),e.enter=function(t,a){return!e.node.currency&&a&&a.stateParams&&a.stateParams.currency&&(e.node.currency=a.stateParams.currency),e.node.currency?e.node.pubkey?e.load():n((function(){return e.enter(t,a)}),500):i.get().then((function(n){return e.node.currency=n?n.name:null,e.enter(t,a)}))},e.$on("$csExtension.enter",e.enter),e.load=function(){if(e.node.currency||e.node.pubkey)return console.info("[Graph] [peer] Loading blocks count for [{0}]".format(e.node.pubkey.substr(0,8))),o.node.blockCount(e.node.currency,e.node.pubkey).then((function(n){e.blockCount=n,e.loading=!1}))}}function ye(e,n,t,a,i,o,s,r,l){e.loading=!0,e.shapeId="shape-"+e.$id,e.formData={country:null},e.countriesMap={fr:"France",be:"Belgium",es:"Spain",gb:"United Kingdom",us:"USA"},e.countries=null,e.load=function(n){if(n=n||{},!e.countries)return e.loadAllCountries().then((function(t){if(t&&t.length)return e.load(n);e.loading=!1}));var t,a=e.getDefaultCountry(n);return e.formData.country=a,n&&!0===n.silent||(e.loading=!0,t=Date.now()),console.debug("[shape] Loading shape for country {{0}}...".format(a)),l.geoJson.search({country:a}).then((function(n){e.updateView(n),e.addListeners(),t&&console.debug("[shape] Shape loaded in {0}ms".format(Date.now()-t)),e.loading=!1})).catch((function(n){console.error("Cannot load shape for country '{0}'".format(a),n),e.loading=!1}))},e.loadAllCountries=function(){return l.getAllCountries().then((function(n){return e.countries=_(n||[]).pluck("id"),e.countries})).catch((function(e){console.error("[shape] Error child loading countries: "+(e&&e.message||e),e)}))},e.getDefaultCountry=function(t){var a=t&&t.country;if(!a){var i=r.data.locale||{id:n.use()},o=i&&i.country||i.id.split("-")[1];a=o&&_.find(e.countries,(function(e){return e.toUpperCase()===o.toUpperCase()}))}return!a&&s.plugins&&s.plugins.es&&s.plugins.es.defaultCountry&&(a=_.find(e.countries,(function(n){var t=e.countriesMap[n];return!(!t||t.toUpperCase()!==s.plugins.es.defaultCountry.toUpperCase())&&n}))||"fr"),a||"fr"},e.updateView=function(n){n?l.svg.createMosaic(n,{selector:"#"+e.shapeId,onclick:e.onClick}):l.svg.remove({selector:"#"+e.shapeId})},e.onCountryChange=function(n){if(n)return console.debug("[shape] Select country map:",n),e.load({country:n})},e.onLocaleChange=function(t){console.debug("[market] [map] Reloading map, because locale changed to "+t);var a=_.findWhere(r.locales,{id:t})||{id:n.use()},i=a&&(a.country||a.id.split("-")[1]);return e.onCountryChange(i)},e.addListeners=function(){e.listeners||(e.listeners=[r.api.locale.on.changed(e,e.onLocaleChange,this)])},e.onClick=function(e,n){e&&e.defaultPrevented||console.warn("[shape] No handler for SVG element click",n)}}function ke(e,n,t,a,i,o,s,r,l,c,d,u,p){e.entered=!1,e.saving=!1,e.formData={country:null,errors:null},e.configData={geoViewBox:{leftLng:null,rightLng:null,topLat:null,bottomLat:null},scale:1,translateX:0,translateY:0,removeHole:!0,applyRound:!0,degreePrecision:p.constants.projection.degreePrecision,strictMode:!1},e.showConfig=!1,e.elementData={country:null,id:null,title:null,position:"main",order:void 0},e.dirty=!1,e.countries=[],e.iso2Pattern=/^[a-z][a-z]$/,e.positions=p.constants.positions,e.positionPattern=new RegExp("^("+p.constants.positions.join("|")+")$"),e.showLeaflet=!1,angular.extend(this,a("MapShapeViewCtrl",{$scope:e})),e.mapId="map-"+e.$id,e.map=d.map({markers:{},center:{zoom:4},defaults:{tileLayerOptions:{attribution:'© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'}},geojson:{data:null,style:{fillColor:p.constants.style.defaults.fill,fillOpacity:.7,color:p.constants.style.defaults.stroke,opacity:1,weight:1}}}),e.enter=function(n,t){e.entered||(e.entered=!0,e.load())},e.$on("$ionicView.enter",e.enter),e.load=function(n){return n=n||{},e.dirty=!1,n.silent||(e.loading=!0,c.loading.show()),o.all([n.country?p.geoJson.search({country:n.country}):o.when(),e.loadAllCountries()]).then((function(t){var a=t[0]||null;return e.updateView(a,n)})).then((function(){e.loading=!1,c.loading.hide()})).catch((function(n){console.error(n),c.alert.error(n&&n.message||n),e.loading=!1}))},e.resetForms=function(n){e.resetForm(n),e.resetConfigForm(n),e.resetElementForm(n)},e.resetForm=function(n){e.formData.country=n&&n.country||null,e.formData.errors=n&&n.errors||null},e.resetConfigForm=function(n){angular.merge(e.configData,{geoViewBox:{leftLng:n&&n.geoViewBox&&n.geoViewBox.leftLng||-180,rightLng:n&&n.geoViewBox&&n.geoViewBox.rightLng||180,topLat:n&&n.geoViewBox&&n.geoViewBox.topLat||90,bottomLat:n&&n.geoViewBox&&n.geoViewBox.bottomLat||-90},scale:n&&n.scale||1,translateX:n&&n.translateX||0,translateY:n&&n.translateY||0,svgText:n&&n.svgText||null,removeHole:!0,applyRound:!0,degreePrecision:p.constants.projection.degreePrecision,strictMode:!1})},e.resetElementForm=function(n){var t=n&&n.position||"main";angular.merge(e.elementData,{id:n&&n.id||null,title:n&&n.title||null,country:n&&n.country||e.formData&&e.formData.country,position:t,order:"main"!==t&&n.order||void 0}),e.elementData.element=n&&n.element||null},e.markAsDirty=function(){e.loading||e.saving||(e.dirty=!0)},e.$watch("formData.country",e.markAsDirty,!0),e.setCountryForm=function(n){e.countryForm=n},e.setConfigForm=function(n){e.configForm=n},e.setElementForm=function(n){e.elementForm=n},e.onFileChanged=function(n){if(n&&n.file&&n.fileContent){e.loading=!0;try{n.file.type.startsWith("image/svg")?(console.debug("[map] [shape] Loading SVG file {0}".format(n.fileData&&n.fileData.name)),e.updateFromSvgFile(n.fileContent)):(console.debug("[map] [shape] Loading GeoJson file {0}".format(n.fileData&&n.fileData.name)),e.updateFromGeoJson(n.fileContent))}catch(n){console.error(n),c.onError("MAP.SHAPE.EDIT.ERROR.INVALID_SVG")(n),e.resetForms(),e.dirty=!1,e.showConfigForm=!1}finally{e.loading=!1}}},e.updateFromSvgFile=function(n){c.loading.show();try{var t=p.svg.createFromText(n,{selector:"#"+e.shapeId}),a={geoViewBox:p.svg.findGeoViewBox(t),customProjection:!0,scale:1,translateX:0,translateY:0,svgText:n};if(a.geoViewBox){var i=p.svg.projectionData(t,{geoViewBox:a.geoViewBox});i&&(a.customProjection=!1,a.scale=i.scale,a.translateX=i.translate[0],a.translateY=i.translate[1])}e.resetConfigForm(a),e.showConfig=!0,e.applySvgConfig(t,angular.merge(a,{customProjection:!0})),t.remove()}finally{c.loading.hide()}},e.updateFromGeoJson=function(n){n="string"==typeof n?JSON.parse(n):n,e.showConfigForm=!1,e.resetForms(),e.markAsDirty(),e.updateView(n)},e.updateView=function(n,t){var a="#"+e.shapeId;return n?(_(e.positions).each((function(e){d3.selectAll([a,"."+e,"svg"].join(" ")).remove()})),_(n.features||[]).each((function(n){n.properties=e.getNormalizeProperties(n.properties||{},t)})),p.svg.createMosaic(n,{selector:a,onclick:e.onPathClick})):p.svg.remove({selector:a}),e.resetElementForm({country:t&&t.country}),e.map.geojson.data=n,o.when()},e.applySvgConfig=function(n,t){if(t=t||e.configData,!e.configForm||(e.configForm.$submitted=!0,e.configForm.$valid)){console.debug("[map] [shape] Apply config: ",t),n=n||p.svg.createFromText(t.svgText,{selector:"#"+e.shapeId,class:"ng-hide"});var a={selector:"#"+e.shapeId,geoViewBox:t.geoViewBox,precision:e.configData.applyRound&&e.configData.degreePrecision,strictMode:e.configData.strictMode,removeHole:e.configData.removeHole};t.customProjection&&(a.scale=t.scale||1,a.translate=[t.translateX||0,t.translateY||0]);var i=p.svg.toGeoJson(n,a);e.updateView(i)}},e.onPathClick=function(n,t){console.debug("[map] [shape] Start edit element:",t);var a=d3.select(t).data()[0]||{},i=e.getNormalizeProperties(a.properties||{});e.resetElementForm(i),e.elementData.element=t,e.$apply()},e.deleteElement=function(){if(e.elementData.element){var n=d3.select(e.elementData.element.parentNode);d3.select(e.elementData.element).remove();var t={type:"FeatureCollection",features:n.selectAll("path").data()};return e.resetElementForm(),e.markAsDirty(),e.updateView(t)}},e.confirmEditElement=function(){if(e.elementData.element&&(e.elementForm.$submitted=!0,e.elementForm.$valid)){var n=d3.select(e.elementData.element),t=e.map.geojson.data,a=n.data()[0]||{};if(!a)throw new Error("No data found in the selected <path> element");var i=JSON.stringify(a);if(!(a=_.find(t.features,(function(e){return e.type===a.type&&JSON.stringify(e)===i}))))throw new Error("Feature not found in the source content");a.properties=a.properties||{},delete e.elementData.element,angular.merge(a.properties,e.elementData),e.resetElementForm(),e.markAsDirty(),e.updateView(t)}},e.cancelEditElement=function(){e.resetElementForm()},e.cancel=function(){e.resetForms(),e.map.geojson.data=null,e.showConfig=!1,d3.select("#"+e.shapeId+" *").remove()},e.save=function(){var n=e.map.geojson.data;if(n&&e.dirty){if(e.formData.errors=null,e.countryForm.$submitted=!0,e.saving||!e.countryForm.$valid||!e.formData.country)return o.reject();if(!u.isLogin())return e.loadWallet().then(e.save);e.saving=!0;var t=e.formData.country||"fr";return c.loading.show({template:"Saving..."}).then((function(){return p.save(n,{country:t,removeHole:e.configData.removeHole,precision:e.configData.applyRound&&e.configData.degreePrecision||null,strictMode:e.configData.strictMode,updateProgression:function(e,n,t){var a=e.properties&&(e.properties.title||e.properties.id)||""+n;c.loading.show({template:"Saving... ({1}/{2})<br/><b>{0}</b>".format(a,n+1,t)})}})})).then((function(){return e.saving=!1,i((function(){return e.load({country:t})}),2e3)})).then((function(){return c.toast.show("MAP.SHAPE.EDIT.INFO.SAVED")})).catch((function(n){c.onError("MAP.SHAPE.EDIT.ERROR.SAVE_FAILED")(n),n&&n.errors?e.formData.errors=n&&n.errors||null:n.message&&(e.formData.errors=[n])})).then((function(){e.saving=!1}))}},e.getNormalizeProperties=function(e,n){return{id:e&&e.id||n&&n.id||e&&e.code,title:e&&(e.title||e.name||e.label||e.nom),country:e&&e.country||n&&n.country,position:e&&e.position,order:e&&e.order||void 0}},e.findSvgElementFromPath=function(e){var n=d3.select(e);alert(n),alert(n.bounds())},e.searchOnPath=function(){if(e.elementData.element){var a=d3.select(e.elementData.element).data();if(a&&a.length){var i=a[0],o=e.getNormalizeProperties(i.properties).name;n.geoShapes=n.geoShapes||{},n.geoShapes[o]=i.geometry,t.go("app.market_lookup",{location:o})}}},e.download=function(){if(!e.loading&&!e.saving&&e.map.geojson.data){var n=JSON.stringify(e.map.geojson.data),t=new Blob([n],{type:"application/geo+json; charset=utf-8"}),a=(e.formData.country||"export")+".geojson";l.saveAs(t,a)}},e.centerMap=function(n){console.debug("[map] [shape] Center map to:",n),n.lng=angular.isDefined(n.lon)?n.lon:n.lng,n.zoom=n.zoom||e.map.center.zoom||10,n.lat===e.map.center.lat&&n.lng===e.map.center.lng&&n.zoom===e.map.center.zoom&&(n.zoom+=2),angular.merge(e.map.center,n)}}function Me(e,n,t,a,i,o,s,r){angular.extend(this,t("MapShapeViewCtrl",{$scope:e})),e.onClick=function(e,n){if(!e||!e.defaultPrevented){console.debug("[map] [home] Handling click on a SVG element...");var t=d3.select(n).data();if(t&&t.length){var i=t[0],o=i.properties,l=o.title&&o.title.trim();if(l&&l.length)return s.cache.put(i).then((function(e){return a.go("app.market_lookup",{shape:e,location:l})})).then((function(){r.data.plugins.market=r.data.plugins.market||{},r.data.plugins.defaultSearch=angular.merge(r.data.plugins.defaultSearch||{},{location:l,geoShape:i,geoPoint:void 0,geoDistance:void 0})}));console.error("[map] [home] Invalid GeoJson data. Missing or empty attribute 'properties.title'.")}else console.error("[map] [home] Invalid SVG element: no geoJson data found.")}},e.start=function(){console.debug("[home] [shape] Starting"),e.load()},i.ready().then(e.start)}if(angular.module("cesium.settings.services",["ngApi","cesium.config"]).factory("csSettings",["$rootScope","$q","$window","Api","localStorage","$translate","csConfig",function(e,n,t,a,i,o,s){var r=[{id:"en",label:"English",flag:"us",country:"us"},{id:"en-GB",label:"English (UK)",flag:"gb",country:"gb"},{id:"eo-EO",label:"Esperanto",flag:"eo"},{id:"fr-FR",label:"Français",flag:"fr",country:"fr"},{id:"fr-BE",label:"Français (BE)",flag:"be",country:"be"},{id:"es-ES",label:"Spanish",flag:"es",country:"es"}],l=s.fallbackLanguage?c(s.fallbackLanguage):"en";function c(e){if(!e)return l;if(_.findWhere(r,{id:e}))return e;var n=e.split("-");if(n.length>1)return c(n[0]);var t=_.find(r,(function(n){return String.prototype.startsWith.call(n.id,e)}));return t?t.id:l}var d,u,p,m,E={STORAGE_KEY:"GCHANGE_SETTINGS",KEEP_AUTH_IDLE_SESSION:9999},g={timeout:4e3,cacheTimeMs:6e4,timeWarningExpireMembership:5184e3,timeWarningExpire:7776e3,minVersion:"1.7.0",newIssueUrl:"https://github.com/duniter-gchange/gchange-client/issues/new?labels=bug",userForumUrl:"https://forum.monnaie-libre.fr",latestReleaseUrl:"https://api.github.com/repos/duniter-gchange/gchange-client/releases/latest",httpsMode:!1,share:{mastodonAuthor:"@gchange@framapiaf.org",defaultHastags:"#gchange"}},f=angular.merge({useRelative:!1,useLocalStorage:!!t.localStorage,useLocalStorageEncryption:!1,persistCache:!1,walletHistoryTimeSecond:2592e3,walletHistorySliceSecond:432e3,walletHistoryAutoRefresh:!0,rememberMe:!0,keepAuthIdle:600,showUDHistory:!0,showLoginSalt:!1,expertMode:!1,decimalCount:2,uiEffects:!0,blockValidityWindow:6,helptip:{enable:!1,installDocUrl:"https://github.com/duniter-gchange/gchange-client/blob/master/README.md",currency:0,network:0,wotLookup:0,wot:0,wotCerts:0,wallet:0,walletCerts:0,wallets:0,header:0,settings:0},currency:{allRules:!1,allWotRules:!1},wallet:{showPubkey:!0,alertIfUnusedWallet:!0,notificationReadTime:0},locale:{id:(p=s.defaultLanguage||o.use(),m=c(p),p!==m&&console.debug("[settings] Fix locale [{0}] -> [{1}]".format(p,m)),m)}},g,s),h={},T=!1,b=new a(this,"csSettings"),v=function(){if(angular.isUndefined(d)||!angular.equals(d,h))return d=angular.copy(h),b.data.raise.changed(h)},O=function(){return T?(h.useLocalStorage?!0===h.node.temporary?i.getObject(E.STORAGE_KEY).then((function(e){var n=angular.copy(h);return n.node=e&&e.node||{},delete n.temporary,i.setObject(E.STORAGE_KEY,n)})):i.setObject(E.STORAGE_KEY,h):i.setObject(E.STORAGE_KEY,null)).then((function(){return h.useLocalStorage&&console.debug("[setting] Saved locally"),b.data.raisePromise.store(h)})).then(v):(console.debug("[setting] Waiting start finished..."),(u||N()).then(O))},R=function(e){if(e){var n=!1;if(e.locale&&e.locale.id){var t=c(e.locale.id);e.locale=_.findWhere(r,{id:t}),n=!h.locale||e.locale.id!==h.locale.id||e.locale.id!==o.use()}if(_.keys(g).forEach((function(n){e[n]=f[n]})),angular.merge(h,e),(e&&e.node&&!e.node.temporary||!h.node.temporary)&&delete h.node.temporary,h.plugins&&h.plugins.es.host&&h.plugins.es.port&&(!h.node||h.node.host!==h.plugins.es.host)){var a=h.node.host,i=h.plugins.es.host;console.warn("[settings] Replacing duniter node {{0}} with gchange pod {{1}}".format(a,i)),h.node={host:i,port:h.plugins.es.port,useSsl:h.plugins.es.useSsl}}n&&o.use(h.locale.id)}},I=function(){var e=Date.now();return i.getObject(E.STORAGE_KEY).then((function(n){if(!n)return console.debug("[settings] No settings in local storage. Using defaults."),R(f),void v();R(n),console.debug("[settings] Loaded from local storage in "+(Date.now()-e)+"ms"),v()}))},N=function(){return console.debug("[settings] Starting..."),u=i.ready().then(I).then((function(){console.debug("[settings] Started"),T=!0,u=null,b.data.raise.ready(h)}))};return e.$on("$translateChangeSuccess",(function(){var e=o.use();console.debug("[settings] Locale ["+e+"]");try{moment.locale(e.toLowerCase())}catch(n){try{moment.locale(e.substr(0,2))}catch(e){moment.locale("en-gb"),console.warn("[settings] Unknown local for moment lib. Using default [en]")}}try{numeral.language(e.toLowerCase())}catch(n){try{numeral.language(e.substring(0,2))}catch(e){numeral.language("en-gb"),console.warn("[settings] Unknown local for numeral lib. Using default [en]")}}b.locale.raise.changed(e)})),b.registerEvent("data","reset"),b.registerEvent("data","changed"),b.registerEvent("data","store"),b.registerEvent("data","ready"),b.registerEvent("locale","changed"),R(f),{isStarted:function(){return T},ready:function(){return T?n.when():u||N()},start:N,data:h,apply:R,getByPath:function(e,n){var t=h;return _.each(e.split("."),(function(e){t=t[e],angular.isUndefined(t)&&(t=n)})),t},reset:function(){return _.keys(h).forEach((function(e){delete h[e]})),R(f),b.data.raisePromise.reset(h).then(O)},store:O,restore:I,getFeedUrl:function(){var e=h.locale&&h.locale.id||s.defaultLanguage||"en";return s.feed&&s.feed.jsonFeed?s.feed.jsonFeed[e]?s.feed.jsonFeed[e]:f.feed.jsonFeed[s.defaultLanguage||"en"]||s.feed:void 0},defaultSettings:f,api:b,locales:r,constants:E,fixLocale:c}}]),angular.module("cesium.crypto.services",["cesium.utils.services"]).factory("CryptoUtils",["$q","$timeout","ionicReady",function(e,n,t){function a(){this.loaded=!1;var e=this;this.copy=function(n){_.forEach(_.keys(n),(function(t){e[t]=n[t]}))},this.isLoaded=function(){return this.loaded},this.util=this.util||{},this.util.array_to_string=function(e,n){var t=new Blob([new Uint8Array(e)]),a=new FileReader;a.onload=function(e){n(e.target.result)},a.readAsText(t)}}a.prototype.constants={crypto_sign_BYTES:64,crypto_secretbox_NONCEBYTES:24,crypto_box_MACBYTES:16,SEED_LENGTH:32,SCRYPT_PARAMS:{SIMPLE:{N:2048,r:8,p:1,memory:-1},DEFAULT:{N:4096,r:16,p:1,memory:-1}}},a.prototype.async_load_base58=function(e){var t=this;if(null!==Base58)return e(Base58);n((function(){t.async_load_base58(e)}),100)},a.prototype.async_load_scrypt=function(e,t){var a=this;null!==scrypt_module_factory?scrypt_module_factory(e,t):n((function(){a.async_load_scrypt(e,t)}),100)},a.prototype.async_load_nacl_js=function(e,t){var a=this;null!==nacl_factory?nacl_factory.instantiate(e,t):n((function(){a.async_load_nacl_js(e,t)}),100)},a.prototype.async_load_base64=function(e){var t=this;null!==Base64?e(Base64):n((function(){t.async_load_base64(e)}),100)},a.prototype.async_load_sha256=function(e){var t=this;if(null!==sha256)return e(sha256);n((function(){t.async_load_sha256(e)}),100)},a.prototype.seed_from_signSk=function(e){for(var n=new Uint8Array(that.constants.SEED_LENGTH),t=0;t<n.length;t++)n[t]=e[t];return n},a.prototype.seed_from_signSk=function(e){for(var n=new Uint8Array(that.constants.SEED_LENGTH),t=0;t<n.length;t++)n[t]=e[t];return n};var i=window.crypto||window.msCrypto||window.Crypto;function o(){this.id="FullJS",this.scrypt=null,this.nacl=null,this.base58=null,this.base64=null;var n=this;function t(e,n){if(0!==n)throw{message:"nacl_raw."+e+" signalled an error"}}function a(e,t,a,o,s){return function(e,n,t,a){if(t.length!==a)throw{message:"nacl."+e+" expected "+a+"-byte "+n+" but got length "+t.length}}(e,t,a,o),function(e,t){var a=t||0,o=i(e.length+a);n.nacl.nacl_raw.HEAPU8.set(e,o+a);for(var s=o;s<o+a;s++)n.nacl.nacl_raw.HEAPU8[s]=0;return o}(a,s)}function i(e){var t=n.nacl.nacl_raw._malloc(e);if(0===t)throw{message:"malloc() failed",nbytes:e};return t}function o(e){n.nacl.nacl_raw._free(e)}function s(e){this.length=e,this.address=i(e)}this.util=this.util||{},this.util.decode_utf8=function(e){var n,t=unescape(encodeURIComponent(e)),a=new Uint8Array(t.length);for(n=0;n<t.length;n++)a[n]=t.charCodeAt(n);return a},this.util.encode_utf8=function(e){return n.nacl.encode_utf8(e)},this.util.encode_base58=function(e){return n.base58.encode(e)},this.util.decode_base58=function(e){var t,a=n.base58.decode(e),i=new Uint8Array(a.length);for(t=0;t<a.length;t++)i[t]=a[t];return i},this.util.decode_base64=function(e){return n.base64.decode(e)},this.util.encode_base64=function(e){return n.base64.encode(e)},this.util.hash_sha256=function(t){return e((function(e){var a=n.util.decode_utf8(t);e(n.nacl.to_hex(n.nacl.crypto_hash_sha256(a)).toUpperCase())}))},this.util.random_nonce=function(){if(n.crypto&&n.crypto.getRandomValues){var t=new Uint8Array(n.constants.crypto_secretbox_NONCEBYTES);return n.crypto.getRandomValues(t),e.when(t)}return e.when(n.nacl.crypto_box_random_nonce())},this.util.crypto_hash_sha256=function(e){return n.nacl.crypto_hash_sha256(e)},this.util.crypto_scrypt=function(t,a,i,o,s,r){return e((function(e,l){try{e(n.scrypt.crypto_scrypt(t,a,i,o,s,r))}catch(e){l(e)}}))},this.box_keypair_from_sign=function(i){return i.boxSk&&i.boxPk?e.when(i):e((function(e,r){try{e((l=a("crypto_box_keypair_from_sign_sk","sk",i.signSk,n.nacl.nacl_raw._crypto_sign_secretkeybytes()),c=new s(n.nacl.nacl_raw._crypto_box_secretkeybytes()),t("_crypto_sign_ed25519_sk_to_curve25519",n.nacl.nacl_raw._crypto_sign_ed25519_sk_to_curve25519(c.address,l)),o(l),n.nacl.crypto_box_keypair_from_raw_sk(c.extractBytes())))}catch(e){r(e)}var l,c}))},this.box_pk_from_sign=function(i){return e((function(e,r){try{e((l=a("crypto_box_pk_from_sign_pk","pk",i,n.nacl.nacl_raw._crypto_sign_publickeybytes()),c=new s(n.nacl.nacl_raw._crypto_box_publickeybytes()),t("_crypto_sign_ed25519_pk_to_curve25519",n.nacl.nacl_raw._crypto_sign_ed25519_pk_to_curve25519(c.address,l)),o(l),c.extractBytes()))}catch(e){r(e)}var l,c}))},this.box_sk_from_sign=function(i){return e((function(e,r){try{e((l=a("crypto_box_sk_from_sign_sk","sk",i,n.nacl.nacl_raw._crypto_sign_secretkeybytes()),c=new s(n.nacl.nacl_raw._crypto_box_secretkeybytes()),t("_crypto_sign_ed25519_sk_to_curve25519",n.nacl.nacl_raw._crypto_sign_ed25519_sk_to_curve25519(c.address,l)),o(l),c.extractBytes()))}catch(e){r(e)}var l,c}))},this.box=function(t,a,i,o){return e((function(e,s){if(t){var r=n.nacl.encode_utf8(t);"string"==typeof i&&(i=n.util.decode_base58(i));try{var l=n.nacl.crypto_box(r,a,i,o);e(n.util.encode_base64(l))}catch(e){s(e)}}else e(t)}))},this.box_open=function(t,a,i,o){return e((function(e,s){if(t){var r=n.util.decode_base64(t);"string"==typeof i&&(i=n.util.decode_base58(i));try{var l=n.nacl.crypto_box_open(r,a,i,o);e(n.nacl.decode_utf8(l))}catch(e){s(e)}}else e(t)}))},this.scryptKeypair=function(e,t,a){return n.util.crypto_scrypt(n.util.encode_utf8(t),n.util.encode_utf8(e),a&&a.N||n.constants.SCRYPT_PARAMS.DEFAULT.N,a&&a.r||n.constants.SCRYPT_PARAMS.DEFAULT.r,a&&a.p||n.constants.SCRYPT_PARAMS.DEFAULT.p,n.constants.SEED_LENGTH).then((function(e){var t=n.nacl.crypto_sign_seed_keypair(e),a=n.nacl.crypto_box_seed_keypair(e);return{signPk:t.signPk,signSk:t.signSk,boxPk:a.boxPk,boxSk:a.boxSk}}))},this.seedKeypair=function(t){return e((function(e,a){var i=n.nacl.crypto_sign_seed_keypair(t),o=n.nacl.crypto_box_seed_keypair(t);e({signPk:i.signPk,signSk:i.signSk,boxPk:o.boxPk,boxSk:o.boxSk})}))},this.scryptSignPk=function(t,a,i){return e((function(e,o){try{var s=n.scrypt.crypto_scrypt(n.util.encode_utf8(a),n.util.encode_utf8(t),i&&i.N||n.constants.SCRYPT_PARAMS.DEFAULT.N,i&&i.r||n.constants.SCRYPT_PARAMS.DEFAULT.r,i&&i.p||n.constants.SCRYPT_PARAMS.DEFAULT.p,n.constants.SEED_LENGTH);e(n.nacl.crypto_sign_seed_keypair(s).signPk)}catch(e){o(e)}}))},this.verify=function(t,a,i){return e((function(e,o){var s,r=n.util.decode_utf8(t),l=n.util.decode_base64(a),c=n.util.decode_base58(i),d=new Uint8Array(n.constants.crypto_sign_BYTES+r.length);for(s=0;s<n.constants.crypto_sign_BYTES;s++)d[s]=l[s];for(s=0;s<r.length;s++)d[s+n.constants.crypto_sign_BYTES]=r[s];e(null!==n.nacl.crypto_sign_open(d,c))}))},this.sign=function(t,a){return e((function(e,i){for(var o=n.util.decode_utf8(t),s=a.signSk,r=n.nacl.crypto_sign(o,s),l=new Uint8Array(n.constants.crypto_sign_BYTES),c=0;c<l.length;c++)l[c]=r[c];e(n.base64.encode(l))}))},this.load=function(){var t=e.defer(),a={},i={};"a"!=ionic.Platform.grade.toLowerCase()&&(console.info("Reduce NaCl memory to 16mb, because plateform grade is not [a] but [{0}]".format(ionic.Platform.grade)),a.requested_total_memory=16777216);var o=0,s=function(){4==++o&&(n.loaded=!0,t.resolve())};return this.async_load_nacl_js((function(e){n.nacl=e,s()}),a),this.async_load_scrypt((function(e){n.scrypt=e,n.scrypt.requested_total_memory=i.requested_total_memory,s()}),i),this.async_load_base58((function(e){n.base58=e,s()})),n.async_load_base64((function(e){n.base64=e,s()})),t.promise},this.util.hash=n.util.hash_sha256,this.box={keypair:{fromSignKeypair:n.box_keypair_from_sign,skFromSignSk:n.box_sk_from_sign,pkFromSignPk:n.box_pk_from_sign},pack:n.box,open:n.box_open},s.prototype.extractBytes=function(e){var t=function(e,t){var a=new Uint8Array(t);return a.set(n.nacl.nacl_raw.HEAPU8.subarray(e,e+t)),a}(this.address+(e||0),this.length-(e||0));return o(this.address),this.address=null,t}}i&&i.getRandomValues&&(a.prototype.crypto=i,a.prototype.util={},a.prototype.util.random_nonce=function(){var n=new Uint8Array(crypto_secretbox_NONCEBYTES);return this.crypto.getRandomValues(n),e.when(n)}),o.prototype=new a,new a;var s=new a;return t().then((function(){console.debug("[crypto] Starting...");var e,n=Date.now();console.debug("[crypto] Loading 'FullJS' implementation..."),(e=new o).load().catch((function(e){throw console.error(e),e})).then((function(){s.copy(e),console.debug("[crypto] Loaded '{0}' implementation in {1}ms".format(s.id,Date.now()-n))}))})),s}]).factory("csCrypto",["$q","$rootScope","$timeout","CryptoUtils","UIUtils","Modals",function(e,n,t,a,i,o){function s(e){return new RegExp(e)}function r(e,n){for(var t=Math.max(e.length,n.length),a=new Uint8Array(t),i=0;i<t;++i)a[i]=e[i]^n[i];return a}function l(e,n){var t=new Uint8Array(e.byteLength+n.byteLength);return t.set(new Uint8Array(e),0),t.set(new Uint8Array(n),e.byteLength),t}var c={WIF:{DATA_LENGTH:35},EWIF:{SALT_LENGTH:4,DERIVED_HALF_LENGTH:16,DATA_LENGTH:39,SCRYPT_PARAMS:{N:16384,r:8,p:8}},REGEXP:{PUBKEY:"[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{43,44}",SECKEY:"[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{86,88}",FILE:{TYPE_LINE:"^Type: ([a-zA-Z0-9]+)\n",VERSION:"Version: ([0-9]+)\n",PUB:"[Pp]ub: ([123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{43,44})\n",SEC:"[Ss]ec: ([123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{86,88})(\n|$)",DATA:"[Dd]ata: ([123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+)(\n|$)"}}},d={FILE:{TYPE_LINE:s(c.REGEXP.FILE.TYPE_LINE),VERSION:s(c.REGEXP.FILE.VERSION),PUB:s(c.REGEXP.FILE.PUB),SEC:s(c.REGEXP.FILE.SEC),DATA:s(c.REGEXP.FILE.DATA)}},u={BAD_PASSWORD:3001,BAD_CHECKSUM:3002};function p(n,t){if(!n)return e.reject("Argument [content] is missing");var i;(t=t||{}).withSecret=!!angular.isDefined(t.withSecret)&&t.withSecret,t.defaultType=t.defaultType||"PubSec";var o=d.FILE.TYPE_LINE.exec(n),s=o&&o[1];if(!s&&t.defaultType)return p("Type: {0}\n{1}".format(t.defaultType,n),t);if("PubSec"===s){if(!(i=d.FILE.PUB.exec(n)))return e.reject("Missing [pub] field in file, or invalid public key value");var r={signPk:a.base58.decode(i[1])};return t.withSecret?(i=d.FILE.SEC.exec(n))?(r.signSk=a.base58.decode(i[1]),e.resolve(r)):e.reject("Missing [sec] field in file, or invalid secret key value"):e.resolve(r)}return"WIF"==s||"EWIF"==s?(i=d.FILE.DATA.exec(n))?m(i[1],{type:s,password:t.password}).then((function(e){return e&&!t.withSecret?{signPk:e.signPk}:e})):e.reject("Missing [Data] field in file. This is required for WIF or EWIF format"):t.defaultType?e.reject("Bad file format: missing Type field"):e.reject("Bad file format, unknown type ["+s+"]")}function m(n,t){t=t||{};var i=n&&a.base58.decode(n);return!i||i.length!=c.EWIF.DATA_LENGTH&&i.length!=c.WIF.DATA_LENGTH?e.reject("Invalid WIF or EWIF format (invalid bytes count)."):(t.type=t.type||1==i[0]&&"WIF"||2==i[0]&&"EWIF","WIF"===t.type?function(n){var t=a.util.decode_base58(n);if(1!=t[0])return e.reject({message:"Invalid WIF v1 format: expected [0x01] as first byte"});if(t.length!=c.WIF.DATA_LENGTH)return e.reject({message:"Invalid WIF v1 format: Data must be a "+c.WIF.DATA_LENGTH+" bytes array, encoded in base 58."});var i=t.slice(0,-2),o=t.slice(1,-2),s=t.slice(-2),r=a.util.crypto_hash_sha256(a.util.crypto_hash_sha256(i)).slice(0,2);return a.util.encode_base58(s)!=a.util.encode_base58(r)&&e.reject({message:"Invalid WIF format: bad checksum"}),a.seedKeypair(o)}(n):"EWIF"===t.type?"function"!=typeof t.password||(t.password=t.password(),t.password)?"object"==typeof t.password&&t.password.then?t.password.then((function(e){if(!e)throw"CANCELLED";return E(n,e)})):"string"==typeof t.password?E(n,t.password):e.reject({message:"Invalid EWIF options.password. Waiting a callback function, a promise or a string."}):e.reject({message:"Invalid callback result for 'options.password()': must return a promise or a string."}):e.reject({message:"Invalid WIF or EWIF format: unknown first byte identifier."}))}function E(n,t){var i=a.util.decode_base58(n);if(2!=i[0])return e.reject({message:"Invalid EWIF v1 format: Expected [0x02] as first byte"});if(i.length!=c.EWIF.DATA_LENGTH)return e.reject({message:"Invalid EWIF v1 format: Expected {0} bytes, encoded in base 58.".format(c.EWIF.DATA_LENGTH)});var o=i.slice(0,-2),s=i.slice(-2),d=i.slice(1,5),p=i.slice(5,21),m=i.slice(21,37);return a.util.crypto_scrypt(a.util.encode_utf8(t),d,c.EWIF.SCRYPT_PARAMS.N,c.EWIF.SCRYPT_PARAMS.r,c.EWIF.SCRYPT_PARAMS.p,64).then((function(e){var n=e.slice(0,32),t=e.slice(32,64),a=new aesjs.ModeOfOperation.ecb(t),i=a.decrypt(p),o=a.decrypt(m);return i=new Uint8Array(i),o=new Uint8Array(o),l(r(i,n.slice(0,16)),r(o,n.slice(16,32)))})).then(a.seedKeypair).then((function(e){var n=a.util.crypto_hash_sha256(a.util.crypto_hash_sha256(e.signPk)).slice(0,4);if(a.util.encode_base58(d)!==a.util.encode_base58(n))throw{ucode:u.BAD_PASSWORD,message:"ACCOUNT.SECURITY.KEYFILE.ERROR.BAD_PASSWORD"};var t=a.util.crypto_hash_sha256(a.util.crypto_hash_sha256(o)).slice(0,2);if(a.util.encode_base58(s)!=a.util.encode_base58(t))throw{ucode:u.BAD_CHECKSUM,message:"ACCOUNT.SECURITY.KEYFILE.ERROR.BAD_CHECKSUM"};return e}))}function g(n){if(!n)throw new Error("Missing keypair");return n.boxPk&&n.boxSk?e.when(n):e.all([a.box.keypair.skFromSignSk(n.signSk),a.box.keypair.pkFromSignPk(n.signPk)]).then((function(e){return{boxSk:e[0],boxPk:e[1]}}))}return{errorCodes:u,constants:c,util:angular.extend({pkChecksum:function(e){var n=a.util.decode_base58(e);return a.util.encode_base58(a.util.crypto_hash_sha256(a.util.crypto_hash_sha256(n))).substring(0,3)}},a.util),keyfile:{read:function(n,t){return n&&n.content?p(n.content,t):e((function(e,a){if(!n)return a("Argument [file] is missing");var i=new FileReader;i.onload=function(n){p(n.target.result,t).then(e).catch(a)},i.readAsText(n,"utf8")}))},parseData:function e(n,a){return(a=a||{}).withSecret=!angular.isDefined(a.withSecret)||a.withSecret,a.silent=!!angular.isDefined(a.withSecret)&&a.silent,a.password=function(){return i.loading.hide(100).then((function(){return o.showPassword({title:"ACCOUNT.SECURITY.KEYFILE.PASSWORD_POPUP.TITLE",subTitle:"ACCOUNT.SECURITY.KEYFILE.PASSWORD_POPUP.HELP",error:a.error,scope:a.scope})})).then((function(e){return t((function(){return e&&i.loading.show(),e}),150)}))},a.silent||i.loading.show(),m(n,a).then((function(e){return e})).catch((function(t){if(!t||"CANCELLED"!==t){if(t&&t.ucode==u.BAD_PASSWORD)return e(n,{withSecret:a.withSecret,error:"ACCOUNT.SECURITY.KEYFILE.ERROR.BAD_PASSWORD"});throw console.error("[crypto] Unable to parse as WIF or EWIF format: "+(t&&t.message||t)),t}}))},generateContent:function n(t,i){switch((i=i||{}).type=i.type||"PubSec",i.type){case"PubSec":return e.resolve("Type: PubSec\nVersion: 1\npub: "+a.base58.encode(t.signPk)+"\nsec: "+a.base58.encode(t.signSk)+"\n");case"WIF":return function(n){var t=a.seed_from_signSk(n.signSk);if(!t||t.byteLength!==a.constants.SEED_LENGTH)throw"Bad see format. Expected {0} bytes".format(a.constants.SEED_LENGTH);var i=new Uint8Array(1);i[0]=1;var o=l(i,t),s=l(o,a.util.crypto_hash_sha256(a.util.crypto_hash_sha256(o)).slice(0,2));return e.when(a.util.encode_base58(s))}(t).then((function(e){return"Type: WIF\nVersion: 1\nData: "+e+"\n"}));case"EWIF":return i.password?i.password&&"function"==typeof i.password&&(console.debug("[crypto] [EWIF] Executing 'options.password()' to resolve the password..."),i.password=i.password(),!i.password)?e.reject({message:"Invalid callback result for 'options.password()': must return a promise or a string."}):i.password&&"object"==typeof i.password&&i.password.then?i.password.then((function(e){if(!e)throw"CANCELLED";return n(t,angular.merge({},i,{password:e}))})):i.password&&"string"==typeof i.password?function(n,t){var i=a.seed_from_signSk(n.signSk);if(!i||i.byteLength!==a.constants.SEED_LENGTH)return e.reject({message:"Bad see format. Expected {0} bytes".format(a.constants.SEED_LENGTH)});var o=a.util.crypto_hash_sha256(a.util.crypto_hash_sha256(n.signPk)).slice(0,4);return a.util.crypto_scrypt(a.util.encode_utf8(t),o,c.EWIF.SCRYPT_PARAMS.N,c.EWIF.SCRYPT_PARAMS.r,c.EWIF.SCRYPT_PARAMS.p,64).then((function(e){var n=e.slice(0,32),t=e.slice(32,64),s=r(i.slice(0,16),n.slice(0,16)),c=r(i.slice(16,32),n.slice(16,32)),d=new aesjs.ModeOfOperation.ecb(t),u=d.encrypt(s),p=d.encrypt(c);u=new Uint8Array(u),p=new Uint8Array(p);var m=new Uint8Array(1);return m[0]=2,m=l(m,o),m=l(m,u),m=l(m,p),m=l(m,a.util.crypto_hash_sha256(a.util.crypto_hash_sha256(m)).slice(0,2)),a.util.encode_base58(m)}))}(t,i.password).then((function(e){return"Type: EWIF\nVersion: 1\nData: "+e+"\n"})):e.reject({message:"Invalid EWIF options.password. Waiting a callback function, a promise or a string."}):e.reject({message:"Missing EWIF options.password."});default:return e.reject({message:"Unknown keyfile format: "+i.type})}}},box:{getKeypair:g,pack:function(n,t,i,o,s){if(!n[i=i||"recipient"])return e.reject({message:"ES_WALLET.ERROR.RECIPIENT_IS_MANDATORY"});"string"==typeof(o=o||"content")&&(o=[o]),n=angular.copy(n);var r=a.util.decode_base58(n[i]);return e.all([g(t),a.box.keypair.pkFromSignPk(r),s?e.when(s):a.util.random_nonce()]).then((function(t){var i=t[0].boxSk,s=t[1],r=t[2];return e.all(o.reduce((function(e,t){return n[t]?e.concat(a.box.pack(n[t],r,s,i)):e}),[])).then((function(e){var t=0;return _.forEach(o,(function(a){n[a]?n[a]=e[t++]:n[a]=null})),n.nonce=a.util.encode_base58(r),n}))}))},open:function(n,t,i,o){i=i||"issuer","string"==typeof(o=o||"content")&&(o=[o]);var s=Date.now(),r={},l=[g(t)];return e.all(n.reduce((function(e,n){var t=n[i];if(!t)throw"Record has no "+i;return r[t]?res:e.concat(a.box.keypair.pkFromSignPk(a.util.decode_base58(t)).then((function(e){r[t]=e})))}),l)).then((function(t){var s=t[0];return e.all(n.reduce((function(e,n){var t=r[n[i]],l=a.util.decode_base58(n.nonce);return n.valid=!0,e.concat(o.reduce((function(e,i){return n[i]?e.concat(a.box.open(n[i],l,t,s.boxSk).then((function(e){n[i]=e})).catch((function(e){console.error(e),console.warn("[ES] [crypto] a record may have invalid cypher "+i),n.valid=!1}))):e}),[]))}),[]))})).then((function(){return console.debug("[ES] [crypto] All record decrypted in "+(Date.now()-s)+"ms"),n}))}}}}]),angular.module("cesium.utils.services",["angular-fullscreen-toggle"]).factory("ionicReady",["$ionicPlatform",function(e){var n;return function(){return n||(n=e.ready()),n}}]).factory("UIUtils",["$ionicLoading","$ionicPopup","$ionicConfig","$ionicHistory","$translate","$q","ionicMaterialInk","ionicMaterialMotion","$window","$timeout","Fullscreen","localStorage","csSettings","$ionicPopover","$state","$rootScope","screenmatch",function(e,n,t,a,i,o,s,r,l,c,d,u,p,m,E,g,f){var h,T=null,b={smallscreen:f.bind("xs, sm",g)},v={};function O(e,t){return e?o((function(a){i([e,"ERROR.POPUP_TITLE","ERROR.UNKNOWN_ERROR","COMMON.BTN_OK",t||"_NON_NULL_"]).then((function(i){var o=e.message||i[e];return n.show({template:"<p>"+(o||i["ERROR.UNKNOWN_ERROR"])+"</p>",title:i["ERROR.POPUP_TITLE"],subTitle:t&&i[t]||void 0,buttons:[{text:"<b>"+i["COMMON.BTN_OK"]+"</b>",type:"button-assertive",onTap:function(e){a(e)}}]})}))})):o.when()}function R(e,t,a){return e?((a=a||{}).cssClass=a.cssClass||"info",a.okText=a.okText||"COMMON.BTN_OK",o((function(o){i([e,"INFO.POPUP_TITLE",a.okText,t||"_NON_NULL_"]).then((function(i){n.show({template:"<p>"+i[e]+"</p>",title:i["INFO.POPUP_TITLE"],subTitle:t&&i[t]||void 0,cssClass:a.cssClass,buttons:[{text:i[a.okText],type:"button-positive",onTap:function(e){o(e)}}]})}))}))):o.reject("Missing 'message' argument")}function I(n){return n?c((function(){return e.hide()}),n):e.hide()}function N(n){return T?((n=n||{}).template=n.template||T,e.show(n)):i("COMMON.LOADING").then((function(e){return T=e,N(n)}))}function S(){return b.smallscreen.active}function A(e,n,t){return function(n){var a,i=n.target.width,o=n.target.height,s=t?200:640,r=t?200:480,l=document.createElement("canvas");if(t){i>o?(i*=r/o,o=r):(o*=s/i,i=s),l.width=s,l.height=r,a=l.getContext("2d");var c=Math.trunc((s-i)/2+.5),d=Math.trunc((r-o)/2+.5);a.drawImage(n.target,c,d,s+-2*c,r+-2*d)}else i>o?i>s&&(o*=s/i,i=s):o>r&&(i*=r/o,o=r),l.width=i,l.height=o,(a=l.getContext("2d")).drawImage(n.target,0,0,l.width,l.height);var u=l.toDataURL();l.remove(),e(u)}}function D(e,n){var t=o.defer();(n=n||{}).templateUrl=n.templateUrl?n.templateUrl:"templates/common/popover_copy.html",n.scope=n.scope||g,n.scope.popovers=n.scope.popovers||{},n.autoselect=n.autoselect||!1,n.autoremove=!angular.isDefined(n.autoremove)||n.autoremove,n.backdropClickToClose=!angular.isDefined(n.backdropClickToClose)||n.backdropClickToClose,n.focusFirstInput=!!angular.isDefined(n.focusFirstInput)&&n.focusFirstInput;var a=function(a){(a=a||n.scope.popovers[n.templateUrl]).isResolved=!1,a.deferred=t,a.options=n,n.bindings&&angular.merge(a.scope,n.bindings),c((function(){a.show(e).then((function(){var e;n.autoselect?(e=document.querySelectorAll(n.autoselect)[0])&&(l.getSelection&&!l.getSelection().toString()?(e.setSelectionRange(0,e.value.length),e.focus()):e.focus()):n.autofocus&&(e=document.querySelectorAll(n.autofocus)[0])&&e.focus(),a.scope.$parent.$emit("popover.shown"),n.afterShow&&n.afterShow(a)}))}))},i=function(e){(e=e||n.scope.popovers[n.templateUrl])&&(delete n.scope.popovers[n.templateUrl],e.remove().then((function(){angular.element(l.document.querySelectorAll("body")[0]).removeClass("popover-open")})))},s=n.scope.popovers[n.templateUrl];return s?a(s):m.fromTemplateUrl(n.templateUrl,{scope:n.scope,backdropClickToClose:n.backdropClickToClose}).then((function(e){e.isResolved=!1,e.scope.closePopover=function(n){var t=e.options&&e.options.autoremove;e.options&&delete e.options.autoremove,e.hide().then((function(){if(t)return i(e)})).then((function(){e.deferred&&e.deferred.resolve(n),delete e.deferred,delete e.options}))},e.scope.$on("popover.hidden",(function(){e.options&&e.options.afterHidden&&e.options.afterHidden(),e.options&&e.options.autoremove&&i(e)})),n.scope.$on("$remove",(function(){e.deferred&&e.deferred.resolve(),i()})),n.scope.popovers[n.templateUrl]=e,a(e)})),t.promise}function C(e,n){var t=S()?100:10,a=".list.{0} .item, .list .{0} .item".format(n,n);return{ionListClass:n,show:function(n){return(n=n||{}).selector=n.selector||a,n.ink=!angular.isDefined(n.ink)||n.ink,n.startVelocity=n.startVelocity||(S()?1100:3e3),c((function(){n.ink&&h.ink(),e(n)}),n.timeout||t)}}}function L(e,n,t,a,i){i=i||"default",qrcode.stringToBytes=qrcode.stringToBytesFuncs[i];var o=qrcode(n||4,t||"M");return o.addData(e,a),o.make(),o}function P(e,n){if("string"==typeof e&&(e={selector:e}),void 0===e.selector||""===e.selector)return console.error("invalid toggleOn selector"),!1;c((function(){var n=document.querySelectorAll(e.selector);n&&_.forEach(n,(function(e){e.classList.toggle("on",!0)}))}),n||100)}function y(e,n){if("string"==typeof e&&(e={selector:e}),void 0===e.selector||""===e.selector)return console.error("invalid toggleOff selector"),!1;c((function(){var n=document.querySelectorAll(e.selector);n&&_.forEach(n,(function(e){e.classList.toggle("on",!1)}))}),n||900)}return v.motion={enable:!0,default:C(r.ripple,"animate-ripple"),blinds:C(r.blinds,"animate-blinds"),fadeSlideIn:C(r.fadeSlideIn,"animate-fade-slide-in"),fadeSlideInRight:C(r.fadeSlideInRight,"animate-fade-slide-in-right"),panInLeft:C(r.panInLeft,"animate-pan-in-left"),pushDown:C(r.pushDown,"push-down"),ripple:C(r.ripple,"animate-ripple"),slideUp:C(r.slideUp,"slide-up"),fadeIn:C((function(e){P(e)}),"fade-in"),toggleOn:P,toggleOff:y},h={alert:{error:O,info:R,confirm:function(e,t,a){return e?(t=t||"CONFIRM.POPUP_TITLE",(a=a||{}).cssClass=a.cssClass||"confirm",a.cancelText=a.cancelText||"COMMON.BTN_CANCEL",a.okText=a.okText||"COMMON.BTN_OK",i([e,t,a.cancelText,a.okText]).then((function(i){return n.confirm({template:i[e],cssClass:a.cssClass,title:i[t],cancelText:i[a.cancelText],cancelType:a.cancelType,okText:i[a.okText],okType:a.okType})}))):o.reject("Missing 'message' argument")},notImplemented:function(){return R("INFO.FEATURES_NOT_IMPLEMENTED")}},loading:{show:N,hide:I,update:function(n){return e._getLoader().then((function(e){if(e&&e.isShown)return n&&n.template?i(n&&n.template).then((function(t){return n.template=t,e})):void 0})).then((function(e){if(e&&e.isShown)return N(n)}))}},toast:{show:function(n,t,a){return n?(t=t||"short",a=a||"bottom",i(n).then((function(n){return"string"==typeof t&&(t="short"===t?2e3:5e3),e.show({template:n,noBackdrop:!0,duration:t})}))):o.reject("Missing 'message' argument")}},onError:function(e,n){return function(t){var a,i=e;if(t&&t.message?(i=t.message,a=e):e||(i=t),!n)return"CANCELLED"===i?I(10):(I(10),O(i,a));n(i)}},screen:{isSmall:S,fullscreen:d},ink:s.displayEffect,motion:v.motion,setEffects:function(e){if(h.motion.enable!==e){if(console.debug("[UI] [effects] "+(e?"Enable":"Disable")),h.motion.enable=e,e)t.views.transition("platform"),angular.merge(h.motion,v.motion);else{t.views.transition("none");var n={class:void 0,show:function(){}};angular.merge(h.motion,{enable:!1,default:n,fadeSlideIn:n,fadeSlideInRight:n,panInLeft:n,pushDown:n,ripple:n,slideUp:n,fadeIn:n,toggleOn:P,toggleOff:y}),g.motion=n}a.clearCache()}},qrcode:{svg:function(e,n,t,a,i){return L(e,n,t,a,i).createSvgTag()},img:function(e,n,t,a,i){return L(e,n,t,a,i).createImgTag()}},fab:{show:function(e,n){n||(n=900),c((function(){var n=document.getElementsByClassName("button-fab");_.forEach(n,(function(n){n.id==e&&n.classList.toggle("on",!0)}))}),n)},hide:function(e,n){n||(n=10),c((function(){var n=document.getElementsByClassName("button-fab");_.forEach(n,(function(n){n.id==e&&n.classList.toggle("on",!1)}))}),n)}},popover:{show:D,copy:function(e,n){var t=n&&n.indexOf("\n")>=0?n.split("\n").length:1;return D(e,{templateUrl:"templates/common/popover_copy.html",bindings:{value:n,rows:t},autoselect:".popover-copy "+(t<=1?"input":"textarea")})},share:function(e,n){return(n=n||{}).templateUrl=n.templateUrl?n.templateUrl:"templates/common/popover_share.html",n.autoselect=n.autoselect||".popover-share input",n.bindings=n.bindings||{},n.bindings.value=n.bindings.value||n.bindings.url||E.href(E.current,E.params,{absolute:!0}),n.bindings.postUrl=n.bindings.postUrl||n.bindings.value,n.bindings.postMessage=n.bindings.postMessage||"",n.bindings.titleKey=n.bindings.titleKey||"COMMON.POPOVER_SHARE.TITLE",n.bindings.shareOnMastodon=function(){!function(e,n){(n=n||{}).templateUrl="templates/common/popover_instance_address.html",n.autoselect=".popover-instance-address input",n.bindings=n.bindings||{},n.bindings.value=n.bindings.value||n.bindings.url||E.href(E.current,E.params,{absolute:!0}),n.bindings.postUrl=n.bindings.postUrl||n.bindings.value,n.bindings.postMessage=n.bindings.postMessage||"",n.bindings.postAuthor=n.bindings.postAuthor||p.data.share.mastodonAuthor,n.bindings.postHashtags=n.bindings.postHashtags||p.data.share.defaultHastags,n.bindings.titleKey=n.bindings.titleKey||"COMMON.POPOVER_SHARE.TITLE",u.get("mastodon_instance").then((function(t){return n.bindings.instance=t||"https://",t&&(n.autoselect=void 0),D(e,n)})).then((function(e){if(e){e.startsWith("https://")||e.startsWith("http://")||(e="https://"+e);var t=document.querySelectorAll('meta[property="og:title"]')[0].getAttribute("content");t||(t=document.getElementsByTagName("title")[0].innerHTML),e.endsWith("/")||(e+="/"),u.put("mastodon_instance",e);var a=e+"share?text="+encodeURIComponent(n.bindings.postMessage+"\n\n"+n.bindings.postUrl+"\n\n"+n.bindings.postHashtags+" "+(n.bindings.postAuthor||""));return console.debug("[utils] Mastodon share link: "+a),window.open(a,"mastodon-share","menubar=no,toolbar=no,resizable=yes,scrollbars=yes,width=580,height=370"),!1}}))}(e,n)},D(e,n)},helptip:function e(n,t){var a="string"==typeof n&&n?l.document.getElementById(n):n;n||a||!t.selector||(a=l.document.querySelector(t.selector));var i=(t=t||{}).deferred||o.defer();if(a&&!t.timeout)t.preAction&&a[t.preAction](),t.templateUrl=t.templateUrl?t.templateUrl:"templates/common/popover_helptip.html",t.autofocus=t.autofocus||"#helptip-btn-ok",t.bindings=t.bindings||{},t.bindings.icon=t.bindings.icon||{},t.bindings.icon.position=t.bindings.icon.position||!1,t.bindings.icon.glyph=t.bindings.icon.glyph||(t.bindings.icon.position&&t.bindings.icon.position.startsWith("bottom-")?"ion-arrow-down-c":"ion-arrow-up-c"),t.bindings.icon.class=t.bindings.icon.class||"calm icon "+t.bindings.icon.glyph,t.bindings.tour=!!angular.isDefined(t.bindings.tour)&&t.bindings.tour,D(a,t).then((function(e){t.postAction&&a[t.postAction](),i.resolve(e)})).catch((function(e){t.postAction&&a[t.postAction](),i.reject(e)}));else if(t.timeout){var s=t.timeout;t.retryTimeout=t.retryTimeout||s,delete t.timeout,t.deferred=i,c((function(){e(n,t)}),s)}else angular.isDefined(t.retry)&&!t.retry?"continue"===t.onError?c((function(){i.resolve(!0)})):c((function(){i.reject("[helptip] element now found: "+n)})):(t.retry=angular.isUndefined(t.retry)?2:t.retry-1,t.deferred=i,c((function(){e(n,t)}),t.timeout||t.retryTimeout||100));return i.promise}},selection:{select:function e(n){if(n.value||"text"===n.type||"textarea"===n.type)l.getSelection&&!l.getSelection().toString()&&n.setSelectionRange(0,n.value.length);else if(n.childNodes&&n.childNodes.length>0)e(n.childNodes[0]);else{var t=l.document.createRange();t.selectNodeContents(n);var a=l.getSelection();a.removeAllRanges(),a.addRange(t)}},get:function(){var e="";return window.getSelection&&(e=l.getSelection().toString()),e}},image:{resizeFile:function(e,n){var t=document.createElement("img");return o((function(a,i){if(e){var o=new FileReader;o.onload=function(e){t.onload=A(a,0,n),t.src=e.target.result},o.readAsDataURL(e)}else i("no file to resize")})).then((function(e){return t.remove(),e}))},resizeSrc:function(e,n){var t=document.createElement("img");return o((function(a,i){t.onload=A(a,0,n),t.src=e})).then((function(e){return t.remove(),e}))},rotateSrc:function(e,n){var t=document.createElement("img");return o((function(n,a){t.onload=function(e,n){var t=Math.PI/180*90;return function(n){var a=n.target.width,i=n.target.height;a>i?a>640&&(i*=640/a,a=640):i>480&&(a*=480/i,i=480);var o=document.createElement("canvas");o.width=i,o.height=a;var s=o.getContext("2d");s.rotate(t),s.drawImage(n.target,0,-1*o.width);var r=o.toDataURL();o.remove(),e(r)}}(n),t.src=e})).then((function(e){return t.remove(),e}))}},raw:v}}]).factory("$focus",["$timeout","$window",function(e,n){return function(t){e((function(){var e=n.document.getElementById(t);e&&e.focus()}))}}]),angular.module("cesium.cache.services",["angular-cache"]).factory("csCache",["$rootScope","$http","$window","csSettings","CacheFactory",function(e,n,t,a,i){var o={VERY_LONG:54e6,LONG:36e5,MEDIUM:3e5,SHORT:a.defaultSettings.cacheTimeMs},s=l(),r=[];function l(e){return(e=e||a.data)&&e.useLocalStorage&&e.persistCache&&t.localStorage?"localStorage":"memory"}function c(e){return(e=e||{}).storageMode=l(),e.deleteOnExpire="localStorage"===e.storageMode||e.onExpire?"aggressive":"passive",e.cacheFlushInterval="passive"===e.deleteOnExpire?36e5:null,e}function d(e){var n=l(e);n!==s&&(s=n,console.debug("[cache] Updating caches with {storageMode: {0}}".format(s)),_.forEach(_.keys(r),(function(e){var n=i.get(e);n&&n.setOptions(c(),!0)})))}return function(){a.api.data.on.changed(e,d,this)}(),{get:function(e,n,t){var a,s=(e=e||"")+((n=n||o.SHORT)/1e3+"s");if(t&&"function"==typeof t){for(var l=1;i.get(s+l);)l++;s+=l}else a=i.get(s);if(r[s]||(r[s]=!0),a)return a;var d=c({maxAge:n,onExpire:t||null});return console.debug("[cache] Creating cache {{0}} with {storageMode: {1}}...".format(s,d.storageMode)),i.createCache(s,d)},clear:function(e){_.forEach(_.keys(r),(function(n){if(n.startsWith(e)){var t=i.get(n);t&&t.removeAll()}}))},clearAll:function(){console.debug("[cache] Cleaning all caches..."),_.forEach(_.keys(r),(function(e){var n=i.get(e);n&&n.removeAll()}))},constants:o}}]),angular.module("cesium.modal.services",[]).controller("EmptyModalCtrl",(function(){})).controller("AboutModalCtrl",["$scope","UIUtils","csHttp",function(e,n,t){e.openLink=function(e,a,i){return(i=i||{}).onError=function(){return n.popover.copy(e,a)},t.uri.open(a,i)}}]).factory("ModalUtils",["$ionicModal","$rootScope","$q","$injector","$controller","$timeout",function(e,n,t,a,i,o){function s(e,n,a){e.deferred=n||t.defer(),e.resolved=!1,e.openModal=function(){return e.modal.show()},e.closeModal=function(n){return e.resolved=!0,e.modal.remove().then((function(){
return e.deferred.resolve(n),n}))},e.setForm=function(n,t){t?e[t]=n:e.form=n},e.getParameters=function(){return a},e.$on("modal.hidden",(function(){e.resolved||(e.resolved=!0,o((function(){return e.deferred.resolve(),e.modal.remove()}),(e.modal.hideDelay||320)+20))}))}return{show:function(a,o,r,l){var c,d,u,p=t.defer();if((l=l||{}).animation=l.animation||"slide-in-up",o){l.scope=l.scope?l.scope.$new():n.$new(),s.call({},l.scope,p,r);var m={$scope:l.scope,parameters:r},E=(d={isControllerAs:!1,controllerName:"",propName:""},u=((c=o)||"").trim().split(/\s+/),d.isControllerAs=3===u.length&&"as"===(u[1]||"").toLowerCase(),d.isControllerAs?(d.controllerName=u[0],d.propName=u[2]):d.controllerName=c,d),g=i(o,m);E.isControllerAs&&(g.openModal=l.scope.openModal,g.closeModal=l.scope.closeModal)}return e.fromTemplateUrl(a,l).then((function(e){if(o)e.scope.$parent.modal=e;else{var n=e.scope;s.call({},n,p,r),n.modal=e}return e.show()}),(function(e){p.reject(e)})),p.promise}}}]).factory("Modals",["ModalUtils",function(e){return{showTransfer:function(n){return e.show("templates/wallet/modal_transfer.html","TransferModalCtrl",n,{focusFirstInput:!0})},showLogin:function(n){var t=angular.copy(n||{});return delete t.templateUrl,delete t.controller,e.show(n&&n.templateUrl||"templates/login/modal_login.html",n&&n.controller||"LoginModalCtrl",t,{focusFirstInput:!0})},showWotLookup:function(n){return e.show("templates/wot/modal_lookup.html","WotLookupModalCtrl",n||{},{focusFirstInput:!0})},showNetworkLookup:function(n){return e.show("templates/network/modal_network.html","NetworkLookupModalCtrl",n,{focusFirstInput:!0})},showAbout:function(n){return e.show("templates/modal_about.html","AboutModalCtrl",n)},showJoin:function(n){return e.show("templates/join/modal_join.html","JoinModalCtrl",n)},showHelp:function(n){return e.show("templates/help/modal_help.html","HelpModalCtrl",n)},showAccountSecurity:function(n){return e.show("templates/wallet/modal_security.html","WalletSecurityModalCtrl",n)}}}]),angular.module("cesium.http.services",["cesium.cache.services"]).factory("csHttp",["$http","$q","$timeout","$window","csSettings","csCache","Device",function(e,n,t,a,i,o,s){var r=i.data.timeout,l=[],c={},d={POSITIVE_INTEGER:/^\d+$/,VERSION_PART_REGEXP:/^[0-9]+|alpha[0-9]+|beta[0-9]+|rc[0-9]+|[0-9]+-SNAPSHOT$/};function u(e,n){return e?e+(n&&80!=n&&443!=n?":"+n:""):null}function p(e,n,t,a){return(443==n||a?"https":"http")+"://"+u(e,n)+(t||"")}function m(e,n,t,a){n&&n.message?e(n):403==a?e({ucode:403,message:"Resource is forbidden"+(t?" ("+t+")":"")}):404==a?e({ucode:404,message:"Resource not found"+(t?" ("+t+")":"")}):n&&n.error?e({status:a,message:n.error}):t?(console.error("[http] Get HTTP error {status: "+a+"} on ["+t+"]"),e("Error while requesting ["+t+"]")):e("Unknown error from node")}function E(e,n,t,a){var i=[],o={},s=e;return"object"==typeof n&&(i=_.keys(n)),_.forEach(i,(function(e){s===(s=s.replace(":"+e,n[e]))&&(o[e]=n[e])})),t.params=o,a(s,t)}function g(e){var n,t;if(e.startsWith("june:")||e.startsWith("web+june:")){n="june:";var a=e.replace(/^(web\+june|june):(\/\/)?/,"");-1!==(t=a).indexOf("/")&&(t=t.substr(0,a.indexOf("/"))),-1!==t.indexOf("?")&&(t=t.substr(0,a.indexOf("?"))),e="http://"+a}var i=document.createElement("a");i.href=e;var o,s=i.pathname;s&&s.startsWith("/")&&(s=s.substring(1)),i.search&&i.search.startsWith("?")&&(o=i.search.substr(1).split("&").reduce((function(e,n){if(-1!==n.indexOf("=")){var t=n.substr(0,n.indexOf("=")),a=n.substr(n.indexOf("=")+1);e[t]=a}else e[n]=!0;return e}),{}));var r={protocol:n||i.protocol,hostname:t||i.hostname,host:i.host,port:i.port,username:i.username,password:i.password,pathname:s,pathSegments:s?s.split("/"):[],search:i.search,searchParams:o,hash:i.hash};return i.remove(),r}function f(e,n){var t=e.split("."),a=n.split(".");function i(e){for(var n=0;n<e.length;n++){var t=d.POSITIVE_INTEGER.test(e[n]);if(0===n&&!t)return!1;if(!t&&!d.VERSION_PART_REGEXP.test(e[n]))return!1;t&&(e[n]=parseInt(e[n]))}return!0}if(!i(t)||!i(a))return NaN;for(var o=0;o<t.length;++o){if(a.length===o)return 1;if(t[o]!==a[o])return t[o]>a[o]?1:-1}return t.length!=a.length?-1:0}return r||(r=4e3),{get:function(t,a,i,o,s){if(!t)return n.reject("[http] invalid URL from host: "+t);var l=p(t,a,i,o);return function(t){return n((function(n,a){E(l,t,{timeout:s||r,responseType:"json"},(function(t,i){e.get(t,i).success((function(e,t,a,i){n(e)})).error((function(e,n,i,o){m(a,e,t,n)}))}))}))}},getWithCache:function(t,a,i,s,l,d,u,g){var f=p(t,a,i,s);return g=g||"csHttp-",l=l||o.constants.LONG,c[g]=!0,function(t){return n((function(n,a){var i={timeout:u||r,responseType:"json"};i.cache=d?o.get(g,l,(function(n,t,a){console.debug("[http] Refreshing cache for {{0}} ".format(n)),e.get(n,i).success((function(e){i.cache.put(n,e),a&&a(n,e)}))})):o.get(g,l),E(f,t,i,(function(t,i){e.get(t,i).success((function(e){n(e)})).error((function(e,n){m(a,e,t,n)}))}))}))}},post:function(t,a,i,o,s){var l=p(t,a,i,o);return function(t,a){return n((function(n,i){E(l,a,{timeout:s||r,headers:{"Content-Type":"application/json;charset=UTF-8"}},(function(a,o){e.post(a,t,o).success((function(e){n(e)})).error((function(e,n){m(i,e,a,n)}))}))}))}},ws:function(e,a,o,s,r){if(!o)throw console.error("calling csHttp.ws without path argument"),"calling csHttp.ws without path argument";var c=function(e,n,t,a){return(443==n||a?"wss":"ws")+"://"+u(e,n)+(t||"")}(e,a,o,s);function d(e){if(!e.delegate)throw new Error("Websocket {0} was closed!".format(c));return 1==e.delegate.readyState?n.when(e.delegate):3==e.delegate.readyState?n.reject("Unable to connect to websocket ["+e.delegate.url+"]"):(e.waitDuration>=r?(e.waitRetryDelay=e.waitRetryDelay&&Math.min(e.waitRetryDelay+2e3,3e4)||2e3,console.debug("[http] Will retry websocket [{0}] in {1}s...".format(e.path,Math.round(e.waitRetryDelay/1e3)))):Math.round(e.waitDuration/1e3)%10==0&&console.debug("[http] Waiting websocket ["+e.path+"]..."),t((function(){return e.waitDuration+=e.waitRetryDelay,d(e)}),e.waitRetryDelay))}function p(e,n,t){return e.delegate||(e.path=o,e.callbacks=[],e.waitDuration=0,e.waitRetryDelay=200,E(c,t,{},(function(n){e.delegate=new WebSocket(n),e.delegate.onerror=function(n){e.delegate.readyState=3},e.delegate.onmessage=function(n){var t=JSON.parse(n.data);_.forEach(e.callbacks,(function(e){e(t)}))},e.delegate.onopen=function(n){console.debug("[http] Listening on websocket ["+e.path+"]..."),l.push(e),e.delegate.openTime=Date.now()},e.delegate.onclose=function(n){var a=_.findIndex(l,(function(n){return n.path===e.path}));a>=0&&l.splice(a,1),e.delegate.closing?e.delegate=null:e.delegate.openTime?(console.debug("[http] Unexpected close of websocket [{0}] (open {1} ms ago): re-opening...",o,Date.now()-e.delegate.openTime),e.delegate=null,p(e,null,t)):n&&(console.debug("[http] Unexpected close of websocket [{0}]: error code: ".format(o),n&&n.code||n),e.delegate=null,p(e,null,t))}}))),n&&e.callbacks.push(n),d(e)}function m(e){e.delegate&&(e.delegate.closing=!0,console.debug("[http] Closing websocket ["+e.path+"]..."),e.delegate.close(),e.callbacks=[],e.onclose&&e.onclose())}return r=r||i.data.timeout,{open:function(e){return p(this,null,e)},on:function(e,n){return p(this,e,n)},onListener:function(e,n){var t=this;return p(t,e,n),function(){!function(e,n){e.callbacks=_.reject(e.callbacks,(function(e){return e===n})),e.callbacks.length||m(e)}(t,e)}},send:function(e){var n=this;return d(n).then((function(){n.delegate&&n.delegate.send(e)}))},close:function(){m(this)},isClosed:function(){return!this.delegate||this.delegate.closing}}},closeAllWs:function(){l.length>0&&(console.debug("[http] Closing all websocket..."),_.forEach(l,(function(e){e.close()})),l=[])},getUrl:p,getServer:u,uri:{parse:g,open:function(e,n){if(n=n||{},!e.startsWith("http://")&&!e.startsWith("https://")){var t=g(e);if(!t.protocol&&n.type&&(t.protocol="email"===n.type?"mailto:":"phone"===n.type?"tel:":"",e=t.protocol+e),"mailto:"===t.protocol&&s.isDesktop())try{return void nw.Shell.openExternal(e)}catch(e){console.error("[http] Failed not open 'mailto:' URI into external tool.")}s.enable&&("mailto:"===t.protocol||"tel:"===t.protocol)||t.protocol,0}var i,o=n.target||(s.enable?"_system":"_blank");if("_blank"===o||"_system"===o&&s.isDesktop())try{return void nw.Shell.openExternal(e)}catch(e){console.error("[http] Failed not open URI into external browser.")}if("_blank"===o&&s.isDesktop()){if(nw&&nw.Shell)return nw.Shell.openExternal(e),!1;i="location=1,titlebar=1,status=1,menubar=1,toolbar=1,resizable=1,scrollbars=1",a.screen&&a.screen.width&&a.screen.height&&(i+=",width={0},height={1}".format(Math.trunc(a.screen.width/2),Math.trunc(a.screen.height/2)))}var r=a.open(e,o,i);i&&a.screen&&a.screen.width&&a.screen.height&&(r.moveTo(a.screen.width/2/2,a.screen.height/2/2),r.focus())}},date:{now:function(){return moment().utc().unix()}},version:{compare:f,isCompatible:function(e,n){return console.debug("[http] Checking actual version [{0}] is compatible with min expected version [{1}]".format(n,e)),f(e,n)<=0}},cache:angular.merge({clear:function(e){e=e||"csHttp-",console.debug("[http] Cleaning cache {prefix: '{0}'}...".format(e)),o.clear(e)},clearAll:function(){console.debug("[http] Cleaning all caches..."),_.keys(c).forEach((function(e){o.clear(e)}))}},o.constants)}}]),angular.module("cesium.storage.services",["cesium.config"]).factory("sessionStorage",["$window","$q",function(e,n){var t={storage:e.sessionStorage||{},put:function(e,a){return t.storage[e]=a,n.when()},get:function(e,a){return n.when(t.storage[e]||a)},setObject:function(e,a){return t.storage[e]=JSON.stringify(a),n.when()},getObject:function(e){return n.when(JSON.parse(t.storage[e]||"null"))}};return t}]).factory("localStorage",["$window","$q","$log","sessionStorage",function(e,n,t,a){var i,o=!1,s={standard:{storage:null},secure:{storage:null}};function r(){if(i)return i;var t=Date.now();return(e.localStorage?(console.debug("[storage] Starting {local} storage..."),s.standard.storage=e.localStorage,_.forEach(_.keys(s.standard),(function(e){s[e]=s.standard[e]}))):(console.debug("[storage] Starting {session} storage..."),_.forEach(_.keys(a),(function(e){s[e]=a[e]}))),i=n.when()).then((function(){console.debug("[storage] Started in "+(Date.now()-t)+"ms"),o=!0,i=null}))}return s.standard.put=function(e,t){return angular.isDefined(t)&&null!=t?s.standard.storage[e]=t:s.standard.storage.removeItem(e),n.when()},s.standard.get=function(e,t){return n.when(s.standard.storage[e]||t)},s.standard.setObject=function(e,t){return s.standard.storage[e]=JSON.stringify(t),n.when()},s.standard.getObject=function(e){return n.when(JSON.parse(s.standard.storage[e]||"null"))},s.secure.put=function(e,a){return n((function(n,i){null!=a?s.secure.storage.set((function(e){n()}),(function(e){t.error(e),i(e)}),e,a):s.secure.storage.remove((function(){n()}),(function(e){t.error(e),n()}),e)}))},s.secure.get=function(e,a){return n((function(n,i){s.secure.storage.get((function(e){n(!e&&a?a:e)}),(function(e){t.error(e),n()}),e)}))},s.secure.setObject=function(e,a){return t.debug("[storage] Setting object into secure storage, using key="+e),n((function(n,t){s.secure.storage.set(n,t,e,a?JSON.stringify(a):void 0)}))},s.secure.getObject=function(e){return t.debug("[storage] Getting object from secure storage, using key="+e),n((function(n,a){s.secure.storage.get((function(e){n(JSON.parse(e||"null"))}),(function(e){t.error(e),n()}),e)}))},s.isStarted=function(){return o},s.ready=function(){return o?n.when():i||r()},r(),s}]),angular.module("cesium.device.services",["cesium.utils.services","cesium.settings.services"]).factory("Device",["$rootScope","$translate","$ionicPopup","$q","Api","ionicReady",function(e,n,t,a,i,o){var s,r=new i(this,"Device"),l={enable:!0},c={},d=!1;function u(e){if(!l.enable)return a.reject("Barcode scanner not enable. Please call 'ionicReady()' once before use (e.g in app.js).");var n=a.defer();return cordova.plugins.barcodeScanner.scan((function(e){e.cancelled?(console.debug("[device] barcode scanner scan: CANCELLED"),n.resolve()):(console.debug("[device] barcode scanner scan: "+e.text),n.resolve(e.text))}),(function(e){console.error("[device] Error while using barcode scanner: "+e),n.reject(e)}),e),n.promise}return l.enable=!1,l.clipboard={copy:function(e,n){if(!l.enable)return a.reject("Device disabled");var t=a.defer();return $cordovaClipboard.copy(e).then((function(){n&&n(),t.resolve()}),(function(){t.reject({message:"ERROR.COPY_CLIPBOARD"})})),t.promise}},l.camera={getPicture:function(e){return l.camera.enable?(e&&"string"==typeof e&&(e={sourceType:e}),e=e||{},angular.isUndefined(e.sourceType)?n(["SYSTEM.PICTURE_CHOOSE_TYPE","SYSTEM.BTN_PICTURE_GALLERY","SYSTEM.BTN_PICTURE_CAMERA"]).then((function(n){return t.show({title:n["SYSTEM.PICTURE_CHOOSE_TYPE"],buttons:[{text:n["SYSTEM.BTN_PICTURE_GALLERY"],type:"button",onTap:function(e){return navigator.camera.PictureSourceType.PHOTOLIBRARY}},{text:n["SYSTEM.BTN_PICTURE_CAMERA"],type:"button button-positive",onTap:function(e){return navigator.camera.PictureSourceType.CAMERA}}]}).then((function(n){return console.info("[camera] User select sourceType:"+n),e.sourceType=n,l.camera.getPicture(e)}))})):(e.quality=e.quality||50,e.destinationType=e.destinationType||navigator.camera.DestinationType.DATA_URL,e.encodingType=e.encodingType||navigator.camera.EncodingType.PNG,e.targetWidth=e.targetWidth||400,e.targetHeight=e.targetHeight||400,$cordovaCamera.getPicture(e))):a.reject("Camera not enable. Please call 'ionicReady()' once before use (e.g in app.js).")},scan:function(e){return console.warn("Deprecated use of Device.camera.scan(). Use Device.barcode.scan() instead"),u(e)}},l.barcode={enable:!1,scan:u},l.keyboard={enable:!1,close:function(){l.keyboard.enable&&cordova.plugins.Keyboard.close()}},window.handleOpenURL=function(e){e&&(console.info("[device] Received new intent: ",e),c.lastIntent=e,r.intent.raise.new(e))},l.intent={enable:!1,last:function(){return a.when(c.lastIntent)},clear:function(){c.lastIntent=void 0}},l.keyboard.digit={settings:{bindModel:function(n,t,a){n=n||e;var i=function(){return(t||"").split(".").reduce((function(e,n){return e?e[n]:void 0}),n)},o=function(e){var a=(t||"").split("."),i=a.length&&a[a.length-1];a.reduce((function(n,t){if(t!=i)return n[t];n[i]=e}),n)};return(a=a||{}).animation=a.animation||"pop",a.action=a.action||function(e){o((i()||"")+e)},a.decimal&&(a.decimalSeparator=a.decimalSeparator||".",a.leftButton={html:"<span>.</span>",action:function(){var e=i()||"";e.indexOf(a.decimalSeparator)>=0||(e.trim().length||(e="0"),o(e+a.decimalSeparator))}}),a.rightButton=a.rightButton||{html:'<i class="icon ion-backspace-outline"></i>',action:function(){var e=i();e&&e.length&&(e=e.slice(0,-1),o(e))}},a}}},l.isIOS=function(){return!!navigator.userAgent.match(/iPhone | iPad | iPod/i)||ionic.Platform.isIOS()},l.isOSX=function(){return!!navigator.userAgent.match(/Macintosh/i)||ionic.Platform.is("osx")},l.isDesktop=function(){if(!angular.isDefined(c.isDesktop))try{c.isDesktop=!(l.enable||!process||!nw||!nw.App)}catch(e){c.isDesktop=!1}return c.isDesktop},l.isWeb=function(){return!l.enable&&!l.isDesktop()},l.isMobile=function(){return l.enable},l.ready=function(){return d?a.when():s||l.start()},l.start=function(){return s=o().then((function(){l.enable=window.cordova&&cordova&&cordova.plugins,l.enable?(l.camera.enable=!!navigator.camera,l.keyboard.enable=cordova&&cordova.plugins&&!!cordova.plugins.Keyboard,l.barcode.enable=cordova&&cordova.plugins&&!!cordova.plugins.barcodeScanner&&!l.isOSX(),l.clipboard.enable=cordova&&cordova.plugins&&!!cordova.plugins.clipboard,l.intent.enable=window&&!!window.plugins.launchmyapp,l.keyboard.enable&&angular.extend(l.keyboard,cordova.plugins.Keyboard),console.debug("[device] Ionic platform ready, with {camera: {0}, barcode: {1}, keyboard: {2}, clipboard: {3}, intent: {4}}".format(l.camera.enable,l.barcode.enable,l.keyboard.enable,l.clipboard.enable,l.intent.enable)),cordova.InAppBrowser&&(console.debug("[device] Enabling InAppBrowser"),window.open=cordova.InAppBrowser.open)):console.debug("[device] Ionic platform ready - no device detected."),d=!0,s=null}))},r.registerEvent("intent","new"),l.api=r,l}]),angular.module("cesium.currency.services",["ngApi","cesium.bma.services"]).factory("csCurrency",["$rootScope","$q","$timeout","BMA","Api","csSettings",function(n,t,a,i,o,s){function r(i,r){var l,c,d={WELL_KNOWN_CURRENCIES:{g1:{firstBlockTime:1488987127,medianTimeOffset:3600}}},u={},p=!1,m=new o(this,"csCurrency-"+i);function E(){u.name=null,u.parameters=null,u.firstBlockTime=null,u.membersCount=null,u.cache={},u.node=r,u.currentUD=null,u.medianTimeOffset=0,p=!1,l=void 0,m.data.raise.reset(u)}function g(){return t.all([r.blockchain.parameters().then((function(e){return u.name=e.currency,u.parameters=e,u.medianTimeOffset=e.avgGenTime*e.medianTimeBlocks/2,e})).then((function(e){return n=e.currency,d.WELL_KNOWN_CURRENCIES[n]?(angular.merge(u,d.WELL_KNOWN_CURRENCIES[n]),t.when()):r.blockchain.block({block:0}).then((function(e){u.firstBlockTime=e.medianTime})).catch((function(e){if(e&&e.ucode===r.errorCodes.BLOCK_NOT_FOUND)return u.firstBlockTime=0,u.initPhase=!0,void console.warn("[currency] Blockchain not launched: Enable init phase mode");throw e}));var n})),r.blockchain.stats.ud().then((function(e){return e.result.blocks.length?function e(n,t){if(!n.result.blocks.length||t<0)return u.currentUD=u.parameters?u.parameters.ud0:-1,u.currentUD;var a=n.result.blocks[t];return r.blockchain.block({block:a}).then((function(e){var n,t;return u.currentUD=(n=e.dividend,(t=e.unitbase)<=0?n:n*Math.pow(10,t)),u.currentUD})).catch((function(i){if(console.error("[currency] Unable to load last block with UD, with number {0}".format(a)),t>0)return console.error("[currency] Retrying to load UD from a previous block..."),e(n,t-1);throw u.currentUD=null,i}))}(e,e.result.blocks.length-1):(u.currentUD=u.parameters?u.parameters.ud0:-1,u.currentUD)})).catch((function(e){throw u.currentUD=null,e})),m.data.raisePromise.load(u)]).catch((function(e){throw E(),e}))}function f(){return p?t.when(u):l||O()}function h(e){return function(){return p?t.when(u[e]):l||O().then((function(){return u[e]}))}}function T(n){var t=new e(n);t.cleanData(),console.debug("[currency] Received new block ["+t.number+"-"+t.hash+"]"),u.currentBlock=t,u.currentBlock.receivedAt=moment().utc().unix(),u.medianTime=t.medianTime,u.membersCount=t.membersCount,t.dividend&&(u.currentUD=t.dividend),m.data.raise.newBlock(t)}function b(){console.debug("[currency] Stopping..."),_.forEach(c,(function(e){e()})),c=[],E()}function v(){return b(),a(O,200)}function O(){console.debug("[currency] Starting...");var e=Date.now();return l=r.ready().then(g).then((function(){!function(){c=[r.api.node.on.restart(n,v,this),r.websocket.block().onListener(T)]}(),console.debug("[currency] Started in "+(Date.now()-e)+"ms"),p=!0,l=null,m.data.raise.ready(u)})).then((function(){return u}))}var R=h("currentBlock");function I(e){return R().then((function(n){var t=moment().utc().unix();if(e){if(n&&t-n.receivedAt<60)return n;n||console.warn("[currency] No current block in cache: get it from network. Websocket [/ws/block] may not be started ?")}return r.blockchain.current().catch((function(e){if(e&&e.ucode==r.errorCodes.NO_CURRENT_BLOCK)return{number:0,hash:r.constants.ROOT_BLOCK_HASH,medianTime:moment().utc().unix()};throw e})).then((function(e){return u.currentBlock=e,u.currentBlock.receivedAt=t,e}))}))}return m.registerEvent("data","ready"),m.registerEvent("data","load"),m.registerEvent("data","reset"),m.registerEvent("data","newBlock"),E(),{ready:function(){return p?t.when(u):l||O()},start:O,stop:b,data:u,get:f,name:h("name"),parameters:h("parameters"),currentUD:h("currentUD"),medianTimeOffset:h("medianTimeOffset"),blockchain:{current:I,lastValid:function(){return s.data.blockValidityWindow<=0?I(!0):I(!0).then((function(e){var n=e.number-s.data.blockValidityWindow;return n>0?r.blockchain.block({block:n}):e}))}},date:{now:function(){return moment().utc().unix()-(u.medianTimeOffset||d.WELL_KNOWN_CURRENCIES.g1.medianTimeOffset)}},api:m,default:function(){return console.warn("[currency] 'csCurrency.default()' has been DEPRECATED - Please use 'csCurrency.get()' instead."),f()}}}var l=r("default",i);return l.instance=r,l}]),angular.module("cesium.bma.services",["ngApi","cesium.http.services","cesium.settings.services"]).factory("BMA",["$q","$window","$rootScope","$timeout","Api","Device","csConfig","csSettings","csHttp",function(e,n,t,a,i,o,s,r,l){function c(o,c,d,u){var p,m="[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{43,44}",E="SIG\\(([0-9a-zA-Z]{43,44})\\)",g="OBJ\\(([0-9]+)\\)",f="( ([a-z_][a-z0-9-_.ğĞ]*))?( ([0-9.]+))?( ([0-9a-f:]+))?( ([0-9]+))( (.+))?",h={BMA:"BASIC_MERKLED_API",BMAS:"BMAS",WS2P:"WS2P",BMATOR:"BMATOR",WS2PTOR:"WS2PTOR"},T={USER_ID:"[0-9a-zA-Z-_]+",CURRENCY:"[0-9a-zA-Z-_]+",PUBKEY:m,PUBKEY_WITH_CHECKSUM:"("+m+"):([123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{3})",COMMENT:"[ a-zA-Z0-9-_:/;*\\[\\]()?!^\\+=@&~#{}|\\\\<>%.]*",INVALID_COMMENT_CHARS:"[^ a-zA-Z0-9-_:/;*\\[\\]()?!^\\+=@&~#{}|\\\\<>%.]*",URI_WITH_AT:"duniter://(?:([A-Za-z0-9_-]+):)?("+m+"@([a-zA-Z0-9-.]+.[ a-zA-Z0-9-_:/;*?!^\\+=@&~#|<>%.]+)",URI_WITH_PATH:"duniter://([a-zA-Z0-9-.]+.[a-zA-Z0-9-_:.]+)/("+m+")(?:/([A-Za-z0-9_-]+))?",BMA_ENDPOINT:h.BMA+f,BMAS_ENDPOINT:h.BMAS+f,WS2P_ENDPOINT:h.WS2P+" ([a-f0-9]{8})"+f,BMATOR_ENDPOINT:h.BMATOR+" ([a-z0-9-_.]*|[0-9.]+|[0-9a-f:]+.onion)(?: ([0-9]+))?",WS2PTOR_ENDPOINT:h.WS2PTOR+" ([a-f0-9]{8}) ([a-z0-9-_.]*|[0-9.]+|[0-9a-f:]+.onion)(?: ([0-9]+))?(?: (.+))?"},b={PROTOCOL_VERSION:10,ROOT_BLOCK_HASH:"E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",LIMIT_REQUEST_COUNT:5,LIMIT_REQUEST_DELAY:1e3,regexp:T,api:h},v=this;function O(e,n,t,a){v.started&&v.stop(),v.alive=!1,v.cache={getByPath:{},postByPath:{},wsByPath:{}},r.data&&r.data.node&&(e=e||r.data.node.host,n=n||r.data.node.port,t=angular.isDefined(t)?t:443==n||r.data.node.useSsl||v.forceUseSsl,a=!angular.isDefined(a)||a),e&&(v.host=e,v.port=n||80,v.useSsl=angular.isDefined(t)?t:443==v.port||v.forceUseSsl,v.useCache=!!angular.isDefined(a)&&a,v.server=l.getServer(e,n),v.url=l.getUrl(e,n,"",t))}function R(e){return new RegExp("^"+e+"$")}function I(e){return new RegExp(e)}function N(){v.cache&&(console.warn("[BMA] Closing all websockets..."),_.keys(v.cache.wsByPath||{}).forEach((function(e){v.cache.wsByPath[e].close()})),v.cache.wsByPath={})}function S(e){l.getUrl(e.node.host,e.node.port,"",e.node.useSsl)!=v.url&&(O(e.node.host,e.node.port,e.node.useSsl,v.useCache),v.restart())}v.api=new i(this,"BMA-"+v.server),v.started=!1,v.init=O,v.forceUseSsl=!!("true"===s.httpsMode||!0===s.httpsMode||"force"===s.httpsMode||n.location&&"https:"===n.location.protocol),v.forceUseSsl&&console.debug("[BMA] Enable SSL (forced by config or detected in URL)"),o&&O(o,c,d,u),v.useCache=u,v.cleanCache=function(){console.debug("[BMA] Cleaning requests cache..."),N(),v.cache={getByPath:{},postByPath:{},wsByPath:{}}},get=function(e,n){n=v.useCache&&n;var t=e+(n?"#"+n:""),i=function(o){if(!v.started)return v._startPromise||console.warn("[BMA] Trying to get [{0}] before start(). Waiting...".format(e)),v.ready().then((function(){return i(o)}));var s=v.cache.getByPath[t];s||(s=n?l.getWithCache(v.host,v.port,e,v.useSsl,n):l.get(v.host,v.port,e,v.useSsl),v.cache.getByPath[t]=s);var r=1;return s(o).catch((function(e){if(e&&e.ucode==A.errorCodes.HTTP_LIMITATION&&r<=A.constants.LIMIT_REQUEST_COUNT)return 1===r&&(console.warn("[BMA] Too many HTTP requests: Will wait then retry..."),UIUtils.loading.update({template:"COMMON.LOADING_WAIT"})),a((function(){return r++,s(o)}),A.constants.LIMIT_REQUEST_DELAY);throw e}))};return i},post=function(e){var n=function(t,a){if(!v.started)return v._startPromise||console.error("[BMA] Trying to post [{0}] before start()...".format(e)),v.ready().then((function(){return n(t,a)}));var i=v.cache.postByPath[e];return i||(i=l.post(v.host,v.port,e,v.useSsl),v.cache.postByPath[e]=i),i(t,a)};return n},ws=function(e){return function(){var n=v.cache.wsByPath[e];return n&&!n.isClosed()||((n=l.ws(v.host,v.port,e,v.useSsl)).onclose=function(){delete v.cache.wsByPath[e]},v.cache.wsByPath[e]=n),n}},v.isAlive=function(){return l.get(v.host,v.port,"/node/summary",v.useSsl)().then((function(e){var n=e&&e.duniter&&e.duniter.software,t=!0;return"duniter"===n&&e.duniter.version&&r.data.minVersion?t=l.version.isCompatible(r.data.minVersion,e.duniter.version):"gchange-pod"===n&&e.duniter.version&&r.data.plugins.es.minVersion?t=l.version.isCompatible(r.data.plugins.es.minVersion,e.duniter.version):console.debug("[BMA] Unknown node software [{0} v{1}]: could not check compatibility.".format(n||"?",e.duniter.version||"?")),t||console.error("[BMA] Incompatible node [{0} v{1}]: expected at least v{2}".format(n,e.duniter.version,r.data.minVersion)),t})).catch((function(){return!1}))},v.isStarted=function(){return v.started},v.ready=function(){return v.started?e.when(!0):v._startPromise||v.start()},v.start=function(){if(v._startPromise)return v._startPromise;if(v.started)return e.when(v.alive);if(!v.host)return r.ready().then((function(){return v.init(),v.useCache=!0,v.start()}));v.useSsl?console.debug("[BMA] Starting [{0}] (SSL on)...".format(v.server)):console.debug("[BMA] Starting [{0}]...".format(v.server));var n=Date.now();return v._startPromise=e.all([r.ready,v.isAlive()]).then((function(e){return v.alive=e[1],v.alive?(p&&0!==p.length||function(){p=[r.api.data.on.changed(t,S,this)]}(),console.debug("[BMA] Started in "+(Date.now()-n)+"ms"),v.api.node.raise.start(),v.started=!0,delete v._startPromise,!0):(console.error("[BMA] Could not start [{0}]: node unreachable".format(v.server)),v.started=!0,delete v._startPromise,!1)})),v._startPromise},v.stop=function(){console.debug("[BMA] Stopping..."),_.forEach(p,(function(e){e()})),p=[],l.cache.clear(),v.cleanCache(),v.alive=!1,v.started=!1,delete v._startPromise,v.api.node.raise.stop()},v.restart=function(){return v.stop(),a(v.start,200).then((function(e){return e&&v.api.node.raise.restart(),e}))},v.api.registerEvent("node","start"),v.api.registerEvent("node","stop"),v.api.registerEvent("node","restart");var A={errorCodes:{REVOCATION_ALREADY_REGISTERED:1002,HTTP_LIMITATION:1006,IDENTITY_SANDBOX_FULL:1007,NO_MATCHING_IDENTITY:2001,UID_ALREADY_USED:2003,NO_MATCHING_MEMBER:2004,NO_IDTY_MATCHING_PUB_OR_UID:2021,WRONG_SIGNATURE_MEMBERSHIP:2006,MEMBERSHIP_ALREADY_SEND:2007,NO_CURRENT_BLOCK:2010,BLOCK_NOT_FOUND:2011,SOURCE_ALREADY_CONSUMED:2015,TX_INPUTS_OUTPUTS_NOT_EQUAL:2024,TX_OUTPUT_SUM_NOT_EQUALS_PREV_DELTAS:2025,TX_ALREADY_PROCESSED:2030},constants:b,regexp:{USER_ID:R(T.USER_ID),COMMENT:R(T.COMMENT),PUBKEY:R(T.PUBKEY),PUBKEY_WITH_CHECKSUM:R(T.PUBKEY_WITH_CHECKSUM),CURRENCY:R(T.CURRENCY),URI:R(T.URI),BMA_ENDPOINT:R(T.BMA_ENDPOINT),BMAS_ENDPOINT:R(T.BMAS_ENDPOINT),WS2P_ENDPOINT:R(T.WS2P_ENDPOINT),BMATOR_ENDPOINT:R(T.BMATOR_ENDPOINT),WS2PTOR_ENDPOINT:R(T.WS2PTOR_ENDPOINT),TX_OUTPUT_SIG:R(E),TX_OUTPUT_FUNCTION:I("SIG\\(([0-9a-zA-Z]{43,44})\\)|XHX\\(([A-F0-9]{1,64})\\)|CSV\\(([0-9]{1,8})\\)|CLTV\\(([0-9]{1,10})\\)"),TX_OUTPUT_OBJ_OPERATOR_AND:I(g+"([ ]*&&[ ]*("+g+"))+"),TX_OUTPUT_OBJ_OPERATOR_OR:I(g+"([ ]*\\|\\|[ ]*("+g+"))+"),TX_OUTPUT_OBJ:I(g),TX_OUTPUT_OBJ_OPERATOR:I("OBJ\\(([0-9]+)\\)[ ]*(&&)|(\\|\\|)[ ]*OBJ\\(([0-9]+)\\)"),TX_OUTPUT_OBJ_PARENTHESIS:I("\\(("+g+")\\)"),TX_OUTPUT_FUNCTIONS:I("SIG\\(([0-9a-zA-Z]{43,44})\\)|XHX\\(([A-F0-9]{1,64})\\)|CSV\\(([0-9]{1,8})\\)|CLTV\\(([0-9]{1,10})\\)([ ]*(&&)|(\\|\\|)[ ]*SIG\\(([0-9a-zA-Z]{43,44})\\)|XHX\\(([A-F0-9]{1,64})\\)|CSV\\(([0-9]{1,8})\\)|CLTV\\(([0-9]{1,10})\\))*")},node:{summary:get("/node/summary",l.cache.LONG),same:function(e,n){return e===v.host&&(!v.port&&!n||v.port==n||80)&&v.useSsl==(n&&443===n)},forceUseSsl:v.forceUseSsl},network:{peering:{self:get("/network/peering"),peers:get("/network/peering/peers")},peers:get("/network/peers"),ws2p:{info:get("/network/ws2p/info"),heads:get("/network/ws2p/heads")}},wot:{lookup:get("/wot/lookup/:search",l.cache.MEDIUM),certifiedBy:get("/wot/certified-by/:pubkey"),certifiersOf:get("/wot/certifiers-of/:pubkey"),member:{all:get("/wot/members",l.cache.LONG),pending:get("/wot/pending",l.cache.SHORT)},requirements:function(e,n){return!0!==n?A.raw.wot.requirements(e):A.raw.wot.requirementsWithCache(e)},add:post("/wot/add"),certify:post("/wot/certify"),revoke:post("/wot/revoke")},blockchain:{parameters:get("/blockchain/parameters",l.cache.VERY_LONG),block:get("/blockchain/block/:block",l.cache.SHORT),blocksSlice:get("/blockchain/blocks/:count/:from"),current:get("/blockchain/current",l.cache.SHORT),membership:post("/blockchain/membership"),stats:{ud:get("/blockchain/with/ud",l.cache.MEDIUM),tx:get("/blockchain/with/tx"),newcomers:get("/blockchain/with/newcomers",l.cache.MEDIUM),hardship:get("/blockchain/hardship/:pubkey"),difficulties:get("/blockchain/difficulties")}},tx:{sources:get("/tx/sources/:pubkey",l.cache.SHORT),process:post("/tx/process"),history:{all:function(e){return A.raw.tx.history.all(e).then((function(e){return e.history=e.history||{},e.history.sending=[],e.history.pendings=[],e}))},times:function(e,n){return(!0!==n?A.raw.tx.history.times(e):A.raw.tx.history.timesWithCache(e)).then((function(e){return e.history=e.history||{},e.history.sending=[],e.history.pendings=[],e}))},blocks:get("/tx/history/:pubkey/blocks/:from/:to",l.cache.LONG),pending:get("/tx/history/:pubkey/pending")}},ud:{history:get("/ud/history/:pubkey")},uri:{},version:{},raw:{wot:{requirementsWithCache:get("/wot/requirements/:pubkey",l.cache.LONG),requirements:get("/wot/requirements/:pubkey")},tx:{history:{timesWithCache:get("/tx/history/:pubkey/times/:from/:to",l.cache.LONG),times:get("/tx/history/:pubkey/times/:from/:to"),all:get("/tx/history/:pubkey")}}}};A.tx.parseUnlockCondition=function(e){for(var n,t,a,i,o=e,s=[],r={},l=A.regexp.TX_OUTPUT_FUNCTION.exec(o);l;)n={},t="OBJ("+s.length+")",n.type=o.substr(l.index,l[0].indexOf("(")),n.value=l[1]||l[2]||l[3]||l[4],s.push(n),r[n.type]=r[n.type]++||1,o=o.replace(l[0],t),l=A.regexp.TX_OUTPUT_FUNCTION.exec(o);for(var c=!0;c;){for(c=!!(l=A.regexp.TX_OUTPUT_OBJ_OPERATOR_AND.exec(o));l;){for(n={},t="OBJ("+s.length+")",n.type="AND",n.children=[],s.push(n),a=l[0],i=A.regexp.TX_OUTPUT_OBJ.exec(a);i;)n.children.push(s[i[1]]),a=a.replace(i[0],""),i=A.regexp.TX_OUTPUT_OBJ.exec(a);o=o.replace(l[0],t),l=A.regexp.TX_OUTPUT_OBJ_OPERATOR_AND.exec(a)}for(l=A.regexp.TX_OUTPUT_OBJ_OPERATOR_OR.exec(o),c=c||!!l;l;){for(n={},t="OBJ("+s.length+")",n.type="OR",n.children=[],s.push(n),a=l[0],i=A.regexp.TX_OUTPUT_OBJ.exec(a);i;)n.children.push(s[i[1]]),a=a.replace(i[0],""),i=A.regexp.TX_OUTPUT_OBJ.exec(a);o=o.replace(l[0],t),l=A.regexp.TX_OUTPUT_OBJ_OPERATOR_AND.exec(o)}for(l=A.regexp.TX_OUTPUT_OBJ_PARENTHESIS.exec(o),c=c||!!l;l;)o=o.replace(l[0],l[1]),l=A.regexp.TX_OUTPUT_OBJ_PARENTHESIS.exec(o)}if(0!==(r=_.keys(r)).length)return console.debug("[BMA] Unlock conditions successfully parsed:",n),{unlockFunctions:r,unlockTree:n};console.error("[BMA] Unparseable unlock condition: ",output)},A.node.parseEndPoint=function(e,n){var t=A.regexp.BMA_ENDPOINT.exec(e);return t?{dns:t[2]||"",ipv4:t[4]||"",ipv6:t[6]||"",port:t[8]||80,useSsl:t[8]&&443==t[8],path:t[10],useBma:!0}:(t=A.regexp.BMAS_ENDPOINT.exec(e))?{dns:t[2]||"",ipv4:t[4]||"",ipv6:t[6]||"",port:t[8]||80,useSsl:!0,path:t[10],useBma:!0}:(t=A.regexp.BMATOR_ENDPOINT.exec(e))?{dns:t[1]||"",port:t[2]||80,useSsl:!1,useTor:!0,useBma:!0}:(t=A.regexp.WS2P_ENDPOINT.exec(e))?{ws2pid:t[1]||"",dns:t[3]||"",ipv4:t[5]||"",ipv6:t[7]||"",port:t[9]||80,useSsl:t[9]&&443==t[9],path:t[11]||"",useWs2p:!0}:(t=A.regexp.WS2PTOR_ENDPOINT.exec(e))?{ws2pid:t[1]||"",dns:t[2]||"",port:t[3]||80,path:t[4]||"",useSsl:!1,useTor:!0,useWs2p:!0}:n&&(t=R(n+f).exec(e))?{dns:t[2]||"",ipv4:t[4]||"",ipv6:t[6]||"",port:t[8]||80,useSsl:t[8]&&443==t[8],path:t[10],useBma:!1}:void 0},A.copy=function(n){var t=v.started;if(l.getUrl(n.host,n.port,"",n.useSsl)!==v.url)return v.init(n.host,n.port,n.useSsl,v.useCache),t?v.restart():e.when()},A.wot.member.uids=function(){return A.wot.member.all().then((function(e){return e.results.reduce((function(e,n){return e[n.pubkey]=n.uid,e}),{})}))},A.wot.member.get=function(e){return A.wot.member.uids().then((function(n){var t=n[e];return{pubkey:e,uid:t||null}}))},A.wot.member.getByUid=function(e){return A.wot.member.all().then((function(n){return _.findWhere(n.results,{uid:e})}))},A.blockchain.blocks=function(e){return A.raw.getHttpRecursive(A.blockchain.block,"block",e)},A.network.peering.peersByLeaves=function(e){return A.raw.getHttpRecursive(A.network.peering.peers,"leaf",e,0,10)},A.raw.getHttpRecursive=function(n,t,i,o,s){return o=angular.isDefined(o)?o:0,s=s||A.constants.LIMIT_REQUEST_COUNT,e((function(r,l){var c=[],d=[];_.each(i.slice(o,o+s),(function(e){var a={};a[t]=e,d.push(n(a).then((function(e){e&&c.push(e)})))})),e.all(d).then((function(){o<i.length-1?a((function(){A.raw.getHttpRecursive(n,t,i,o+s,s).then((function(e){e&&e.length?r(c.concat(e)):r(c)})).catch((function(e){l(e)}))}),A.constants.LIMIT_REQUEST_DELAY):r(c)})).catch((function(e){e&&e.ucode===A.errorCodes.HTTP_LIMITATION?r(c):l(e)}))}))},A.raw.getHttpWithRetryIfLimitation=function(e){return e().catch((function(n){if(n&&n.ucode==A.errorCodes.HTTP_LIMITATION)return a((function(){return A.raw.getHttpWithRetryIfLimitation(e)}),A.constants.LIMIT_REQUEST_DELAY)}))},A.blockchain.lastUd=function(){return A.blockchain.stats.ud().then((function(e){if(!e.result.blocks||!e.result.blocks.length)return null;var n=e.result.blocks[e.result.blocks.length-1];return A.blockchain.block({block:n}).then((function(e){return e.unitbase>0?e.dividend*Math.pow(10,e.unitbase):e.dividend}))}))},A.uri.parse=function(n){return e((function(e,t){var a;if(R(T.PUBKEY).test(n))e({pubkey:n});else if(R(T.PUBKEY_WITH_CHECKSUM).test(n)){console.debug("[BMA.parse] Detecting a pubkey with checksum: "+n);var i=A.regexp.PUBKEY_WITH_CHECKSUM.exec(n);a=i[1];var o=i[2];console.debug("[BMA.parse] Detecting a pubkey {"+a+"} with checksum {"+o+"}");var s=csCrypto.util.pkChecksum(a);console.debug("[BMA.parse] Expecting checksum for pubkey is {"+s+"}"),o!=s?t({message:"ERROR.PUBKEY_INVALID_CHECKSUM"}):e({pubkey:a})}else if(n.startsWith("duniter://")){var r,c=l.uri.parse(n),d=-1===c.host.indexOf(".")?c.host:null,u=-1!==c.host.indexOf(".")?c.host:null;if(c.username&&(c.password?(r=c.username,a=c.password):a=c.username),c.pathname){var p=c.pathname.split("/"),m=p?p.length:0,E=0;if(!d&&m>E&&(d=p[E++]),!a&&m>E&&(a=p[E++]),!r&&m>E&&(r=p[E++]),m>E)return void t({message:"Bad Duniter URI format. Invalid path (incomplete or redundant): "+c.pathname})}if(d)return u||e({uid:r,pubkey:a,currency:d}),l.get(u+"/blockchain/parameters")().then((function(n){n.currency===d?e({uid:r,pubkey:a,host:u,currency:d}):t({message:"Node's currency ["+n.currency+"] does not matched URI's currency ["+d+"]."})})).catch((function(e){console.error(e),t({message:"Could not get node parameter. Currency could not be retrieve"})}));if(!u)return void t({message:"Bad Duniter URI format. Missing currency name (or node address)."});l.get(u+"/blockchain/parameters")().then((function(n){e({uid:r,pubkey:a,host:u,currency:n.currency})})).catch((function(e){console.error(e),t({message:"Could not get node parameter. Currency could not be retrieve"})}))}else console.debug("[BMA.parse] Could not parse URI: "+n),t({message:"ERROR.UNKNOWN_URI_FORMAT"})})).then((function(e){if(e){if(e.pubkey&&!R(T.PUBKEY).test(e.pubkey))throw{message:"Invalid pubkey format ["+e.pubkey+"]"};if(e.uid&&!R(T.USER_ID).test(e.uid))throw{message:"Invalid uid format ["+e.uid+"]"};if(e.currency&&!R(T.CURRENCY).test(e.currency))throw{message:"Invalid currency format ["+e.currency+"]"};return e}}))};var D=r.data.duniterLatestReleaseUrl&&l.uri.parse(r.data.duniterLatestReleaseUrl);A.raw.getLatestRelease=D?l.getWithCache(D.host,D.port,"/"+D.pathname,443==+D.port||"https:"===D.protocol||v.forceUseSsl,l.cache.LONG):function(){return e.when()},A.version.latest=function(){return A.raw.getLatestRelease().then((function(e){if(e)return e.name&&e.html_url?{version:e.name,url:e.html_url}:e.tag_name&&e.html_url?{version:e.tag_name.substring(1),url:e.html_url}:void 0})).catch((function(e){console.error("[BMA] Failed to get Duniter latest version",e)}))},A.websocket={block:ws("/ws/block"),peer:ws("/ws/peer"),close:N},angular.merge(v,A)}var d=new c(void 0,void 0,void 0,!0);return d.instance=function(e,n,t,a){return new c(e,n,t,a)},d.lightInstance=function(e,n,t,a){return{host:e,port:n=n||80,useSsl:t=angular.isDefined(t)?t:443==n,url:l.getUrl(e,n,"",t),node:{summary:l.getWithCache(e,n,"/node/summary",t,l.cache.LONG,!1,a)},network:{peering:{self:l.get(e,n,"/network/peering",t,a)},peers:l.get(e,n,"/network/peers",t,a)},blockchain:{current:l.get(e,n,"/blockchain/current",t,a),stats:{hardship:l.get(e,n,"/blockchain/hardship/:pubkey",t,a)}}}},d}]),angular.module("cesium.wot.services",["ngApi","cesium.bma.services","cesium.crypto.services","cesium.utils.services","cesium.settings.services"]).factory("csWot",["$q","$timeout","BMA","Api","CacheFactory","csConfig","csCurrency","csSettings","csCache",function(e,n,t,a,i,o,s,r,l){function c(i){var o=new a(this,"csWot-"+i),c=l.get("csWot-idty-",l.constants.SHORT),d=function(e){var n={};return e.reduce((function(e,t){return t.id=t.id||t.uid+"-"+t.pubkey,n[t.id]?e:(n[t.id]=!0,e.concat(t))}),[])},u=function(e,n,t){return n=n||0,e=d(e),e=_.sortBy(e,(function(e){var n=1;return n+=1e6*e.block,-(n+=10*(900-e.uid.toLowerCase().charCodeAt(0)))})),angular.isDefined(t)&&e.length>t&&(e=e.slice(n,n+t)),e},p=function(e,n){return t.wot.lookup({search:e||n}).then((function(a){if(!a||!a.results||!a.results.length)return{uid:null,pubkey:e,hasSelf:!1};var i=a.results.reduce((function(e,n){return e.concat(n.uids.reduce((function(e,t){var a=t.meta.timestamp.split("-",2);return e.concat({uid:t.uid,pubkey:n.pubkey,timestamp:t.meta.timestamp,number:parseInt(a[0]),hash:a[1],revoked:t.revoked,revocationNumber:t.revoked_on,sig:t.self})}),[]))}),[]);i.length&&(i=_.sortBy(i,(function(e){var t=0;return t+=1e10*(n&&e.uid===n?1:0),t+=1e9*(e.revoked?0:1),-(t+=1*(e.number?e.number:0))})));var o=i[0],r=[o.number];return o.revocationNumber&&r.push(o.revocationNumber),t.blockchain.blocks(r).then((function(e){return o.sigDate=e[0].medianTime,0!==o.number&&o.hash!==e[0].hash&&(o.hasBadSelfBlock=!0),o.revocationNumber&&(o.revocationTime=e[1].medianTime),o})).catch((function(e){if(e&&e.ucode==t.errorCodes.BLOCK_NOT_FOUND&&0===o.number)return o.sigDate=s.date.now(),o;throw e}))})).catch((function(n){if(n&&n.ucode==t.errorCodes.NO_MATCHING_IDENTITY)return{uid:null,pubkey:e,hasSelf:!1};throw n}))},m=function(e,n,a,i,o,l){function c(e,n){return e+"-"+n}var d=!0,u=a?a.reduce((function(e,n){var t=c(n.pubkey,n.cert_time?n.cert_time.block:n.sigDate);return n.cert_time||(d=!1),e[t]=n,e}),{}):{};return e({pubkey:n}).then((function(e){return e.certifications.reduce((function(e,n){var t=!n.written,a=n.cert_time?n.cert_time.medianTime:null,s=a?t?a+i.sigWindow-o:a+i.sigValidity-o:0;s=s<0?0:s;var l=c(n.pubkey,d&&n.cert_time?n.cert_time.block:n.sigDate);return delete u[l],e.concat({pubkey:n.pubkey,uid:n.uid,time:a,isMember:n.isMember,wasMember:n.wasMember,expiresIn:s,willExpire:s&&s<=r.data.timeWarningExpire,pending:t,block:null!==n.written?n.written.number:n.cert_time?n.cert_time.block:null,valid:s>0})}),[])})).catch((function(e){if(e&&e.ucode==t.errorCodes.NO_MATCHING_MEMBER)return[];throw e})).then((function(e){var n=_.values(u);if(!n.length)return e;if(s.data.initPhase)return n.reduce((function(e,n){return e.concat({pubkey:n.pubkey,uid:n.uid,isMember:n.isMember,wasMember:n.wasMember,time:null,expiresIn:i.sigWindow,willExpire:!1,pending:!0,block:0,valid:!0})}),e);var a=n.reduce((function(e,n){var t=d&&n.cert_time?n.cert_time.block:n.sigDate?n.sigDate.split("-")[0]:null;return angular.isDefined(t)&&(e[t]?e[t].push(n):e[t]=[n]),e}),{});return t.blockchain.blocks(_.keys(a)).then((function(n){return e=n.reduce((function(e,n){return e.concat(a[n.number].reduce((function(e,t){var a=n.medianTime,s=Math.max(0,a+i.sigWindow-o),c=!t.cert_time||!t.cert_time.block_hash||t.cert_time.block_hash==n.hash;c||console.debug("[wot] Invalid cert {0}: block hash changed".format(t.pubkey.substring(0,8)));var u=s>0&&(!l||t.isMember)&&c;return e.concat({pubkey:t.pubkey,uid:t.uid,isMember:t.isMember,wasMember:t.wasMember,time:a,expiresIn:s,willExpire:s&&s<=r.data.timeWarningExpire,pending:!0,block:d&&t.cert_time?t.cert_time.block:t.sigDate?t.sigDate.split("-")[0]:null,valid:u})}),[]))}),e)}))})).then((function(e){var n=e.reduce((function(e,n){return!n.pending&&n.valid&&n.expiresIn>=i.sigWindow&&(e[n.pubkey]=!0),e}),{});e=function(e){return _.sortBy(e,(function(e){var n=1;return n+=1e12*(e.expiresIn?e.expiresIn:0),n+=1e7*(e.isMember?1:0),-(n+=10*(e.block?e.block:0))}))}(e);var t=[],a=[];return{valid:e.reduce((function(e,i){return i.pending?(i.valid&&!n[i.pubkey]?t.push(i):i.valid||n[i.pubkey]||a.push(i),e):e.concat(i)}),[]),pending:t,error:a}}))},E=function(n,a,i,r){var l;if(!n&&i&&!r)return t.wot.member.getByUid(i).then((function(e){return e?E(e.pubkey,a,e.uid):E(n,a,i,!0)}));if(n){if((l=a?c.get(n):null)&&(!i||l.uid==i))return console.debug("[wot] Identity "+n.substring(0,8)+" found in cache"),e.when(l);console.debug("[wot] Loading identity "+n.substring(0,8)+"..."),l={pubkey:n}}else console.debug("[wot] Loading identity from uid "+i),l={};var d,u,g=Date.now();return e.all([s.parameters().then((function(e){d=e,l.sigQty=d.sigQty,l.sigStock=d.sigStock})),s.blockchain.current().then((function(e){u=e.medianTime})).catch((function(e){if(!e||e.ucode!=t.errorCodes.NO_CURRENT_BLOCK)throw e;u=Math.trunc((new Date).getTime()/1e3)})),e.when().then((function(){l.requirements={},l.isMember=!1})),p(n,i).then((function(e){angular.merge(l,e)}))]).then((function(){if(l.requirements.uid){var n=l.requirements.uid+"-"+l.requirements.meta.timestamp;return e.all([m(t.wot.certifiersOf,l.pubkey,l.lookup?l.lookup.certifications[n]:null,d,u,!0).then((function(e){l.received_cert=e.valid,l.received_cert_pending=e.pending,l.received_cert_error=e.error})),m(t.wot.certifiedBy,l.pubkey,l.lookup?l.lookup.givenCertifications:null,d,u,!1).then((function(e){l.given_cert=e.valid,l.given_cert_pending=e.pending,l.given_cert_error=e.error}))])}})).then((function(){return function(e){e.requirements.needCertificationCount=!e.requirements.needMembership&&e.requirements.certificationCount<e.sigQty?e.sigQty-e.requirements.certificationCount:0,e.requirements.willNeedCertificationCount=!e.requirements.needMembership&&!e.requirements.needCertificationCount&&e.requirements.certificationCount-e.requirements.willExpireCertificationCount<e.sigQty?e.sigQty-e.requirements.certificationCount+e.requirements.willExpireCertificationCount:0,e.requirements.pendingCertificationCount=e.received_cert_pending?e.received_cert_pending.length:0,e.requirements.revoked=angular.isDefined(e.requirements.revoked)?e.requirements.revoked:e.revoked,e.requirements.revoked?(delete e.hasBadSelfBlock,b(e,{type:"error",message:"ERROR.IDENTITY_REVOKED",messageParams:{revocationTime:e.revocationTime}}),console.debug("[wot] Identity [{0}] has been revoked".format(e.uid))):e.requirements.pendingRevocation?(b(e,{type:"error",message:"ERROR.IDENTITY_PENDING_REVOCATION"}),console.debug("[wot] Identity [{0}] has pending revocation".format(e.uid))):e.hasBadSelfBlock?(delete e.hasBadSelfBlock,e.isMember||(b(e,{type:"error",message:"ERROR.IDENTITY_INVALID_BLOCK_HASH"}),console.debug("[wot] Invalid membership for {0}: block hash changed".format(e.uid)))):e.requirements.expired?(b(e,{type:"error",message:"ERROR.IDENTITY_EXPIRED"}),console.debug("[wot] Identity {0} expired (in sandbox)".format(e.uid))):e.requirements.willNeedCertificationCount>0&&(b(e,{type:"error",message:"INFO.IDENTITY_WILL_MISSING_CERTIFICATIONS",messageParams:e.requirements}),console.debug("[wot] Identity {0} will need {1} certification(s)".format(e.uid,e.requirements.willNeedCertificationCount)))}(l),o.data.raisePromise.load(l).catch((function(e){console.debug("Error while loading identity data, on extension point."),console.error(e)}))})).then((function(){if(l.pubkey)return delete l.lookup,c.put(l.pubkey,l),console.debug("[wot] Identity "+l.pubkey.substring(0,8)+" loaded in "+(Date.now()-g)+"ms"),l}))},g=function(n,a){if(!n||n.trim()!==n)return e.when(void 0);var i=n.replace(/(^|\s)#\w+/g,"");return i=(i=i.replace(/[^a-zA-Z0-9_-\s]+/g,"")).replace(/\s+/g," ").trim(),(a=a||{}).addUniqueId=!angular.isDefined(a.addUniqueId)||a.addUniqueId,a.allowExtension=!angular.isDefined(a.allowExtension)||a.allowExtension,a.excludeRevoked=!!angular.isDefined(a.excludeRevoked)&&a.excludeRevoked,(i?e.all(i.split(" ").reduce((function(e,n){return console.debug("[wot] Will search on: '"+n+"'"),e.concat(t.wot.lookup({search:n}))}),[])).then((function(e){return e.reduce((function(e,n){return e.concat(n.results.reduce((function(e,n){return e.concat(n.uids.reduce((function(e,t){var i=t.meta.timestamp.split("-",2),o=!t.revoked&&t.revocation_sig;return a.excludeRevoked&&o?e:e.concat({uid:t.uid,pubkey:n.pubkey,number:i[0],hash:i[1],revoked:o})}),[]))}),[]))}),[])})).catch((function(e){if(e&&e.ucode==t.errorCodes.NO_MATCHING_IDENTITY)return[];throw e})):e.when([])).then((function(e){if(!a.allowExtension)return a.addUniqueId?d(e):e;var i=e.length;return o.data.raisePromise.search(n,e,"pubkey").then((function(){if(e.length>i&&_.filter(e,(function(e){return!e.uid&&e.pubkey})).length)return t.wot.member.uids().then((function(n){_.forEach(e,(function(e){!e.uid&&e.pubkey&&(e.uid=n[e.pubkey])}))}))})).then((function(){return a.addUniqueId?d(e):e}))}))},f=function(a,i,o,s){return e((function(r,l){var c=[],d=[];_.each(a.slice(i,i+o),(function(e){d.push(t.blockchain.block({block:e}).then((function(e){e&&e.joiners&&_.each(e.joiners,(function(n){var t=n.split(":"),a=t[t.length-1]+"-"+t[0];c.push({id:a,uid:t[t.length-1],pubkey:t[0],memberDate:e.medianTime,block:e.number})}))})))})),e.all(d).then((function(){c.length<s&&i<a.length-1?n((function(){f(a,i+o,o,s-c.length).then((function(e){r(c.concat(e))})).catch((function(e){l(e)}))}),1e3):r(c)})).catch((function(e){e&&e.ucode===t.errorCodes.HTTP_LIMITATION?r(c):l(e)}))}))},h=function(a,i,o){return e((function(s,r){var l=[],c={},d=[];_.each(a.slice(i,i+o),(function(e){d.push(g(e,{addUniqueId:!1,allowExtension:!1}).then((function(e){e&&e.length&&(l=e.reduce((function(e,n){return c[n.pubkey]?e:(c[n.pubkey]=!0,e.concat(n))}),l))})))})),e.all(d).then((function(){i<a.length-1?n((function(){h(a,i+o,o).then((function(e){e&&e.length?s(e.reduce((function(e,n){return c[n.pubkey]?e:(c[n.pubkey]=!0,e.concat(n))}),l)):s(l)})).catch((function(e){r(e)}))}),t.constants.LIMIT_REQUEST_DELAY):s(l)})).catch((function(e){e&&e.ucode===t.errorCodes.HTTP_LIMITATION?s(l):r(e)}))}))},T=function(n,a,i){a=a||"pubkey";var s=[];return i||s.push(t.wot.member.uids()),s.push(o.data.raisePromise.search(null,n,a).catch((function(e){console.debug("Error while search identities, on extension point."),console.error(e)}))),e.all(s).then((function(e){if(!i){var t=e[0];_.forEach(n,(function(e){!e.uid&&e[a]&&(e.uid=t[e[a]],e.uid&&e.uid==e.name&&delete e.name)}))}return n}))},b=function(e,n){(n=n||{}).type=n.type||"info",n.message=n.message||"",n.messageParams=n.messageParams||{},e.events=e.events||[],e.events.push(n)};return o.registerEvent("data","load"),o.registerEvent("data","search"),{id:i,load:E,search:g,newcomers:function(e,n){return e=e||0,n=n||20,t.blockchain.stats.newcomers().then((function(t){if(!t.result.blocks||!t.result.blocks.length)return null;var a=_.sortBy(t.result.blocks,(function(e){return-e}));return f(a,0,5,e+n)})).then((function(t){return t&&t.length?(t=u(t,e,n),T(t,"pubkey",!0)):null}))},pending:function(n,a){return n=n||0,a=a||20,e.all([t.wot.member.uids(),t.wot.member.pending().then((function(e){return e.memberships&&e.memberships.length?e.memberships:void 0}))]).then((function(i){var o=i[0],s=i[1];if(s){var r={},l={};_.forEach(s,(function(e){if("IN"==e.membership&&!o[e.pubkey]){var n={uid:e.uid,pubkey:e.pubkey,block:e.blockNumber,blockHash:e.blockHash},t=l[e.pubkey];if(t&&n.block>t.block)return;l[n.pubkey]=n,r[n.block]?r[n.block].push(n):r[n.block]=[n],t&&(r[t.block]=r[t.block].reduce((function(e,n){return n.pubkey==t.pubkey?e:(e||[]).concat(n)}),null),null===r[t.block]&&delete r[t.block])}}));var c=u(_.values(l),n,a),d=c.reduce((function(e,n){return e.concat(n.block)}),[]);return e.all([t.blockchain.blocks(_.uniq(d)).then((function(e){_.forEach(e,(function(e){_.forEach(r[e.number],(function(n){n.sigDate=e.medianTime,0!==e.number&&n.blockHash!==e.hash&&(b(n,{type:"error",message:"ERROR.WOT_PENDING_INVALID_BLOCK_HASH"}),console.debug("Invalid membership for uid={0}: block hash changed".format(n.uid)))}))}))})),T(c,"pubkey",!0)]).then((function(){return c}))}}))},all:function(){return h(["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"],0,t.constants.LIMIT_REQUEST_COUNT).then((function(e){return T(e,"pubkey",!0).then((function(){return d(e)}))}))},extend:function(e,n,t){return T([e],n,t).then((function(e){return e[0]}))},extendAll:T,api:o}}var d=c("default");return d.instance=c,d}]),angular.module("cesium.tx.services",["ngApi","cesium.bma.services","cesium.settings.services","cesium.wot.services"]).factory("csTx",["$q","$timeout","$filter","$translate","UIUtils","BMA","Api","csConfig","csSettings","csWot","FileSaver",function(e,n,t,a,i,o,s,r,l,c,d){function u(n,o){var r=new s(this,"csTx-"+n),u=function(e,n,t,a,i){n&&0!==n.length&&_.forEach(n,(function(n){if(n.block_number||i){var s,r,l=!1,c=n.issuers.reduce((function(n,t){return l=t===e||l,n+(t!==e?", "+t:"")}),"");c.length>0&&(c=c.substring(2));var d,u=[],p=n.outputs.reduce((function(t,a,i){var p=a.split(":",3);r=parseInt(p[1]);var E=m(parseInt(p[0]),r),g=p[2],f=o.regexp.TX_OUTPUT_SIG.exec(g);if(f){var h=f[1];if(h==e){if(!l)return t+E;null===n.block_number&&u.push({amount:parseInt(p[0]),base:r,type:"T",identifier:n.hash,noffset:i,consumed:!1})}else if(""!==h&&h!=c&&(s=h),l)return t-E}else if(-1!=g.indexOf("SIG("+e+")")){var _=o.tx.parseUnlockCondition(g);if(_)return _.amount=E,(d=d||[]).push(_),console.debug("[tx] has locked output:",_),t+E}return t}),0),E=p>0?c:s,g=n.time||n.blockstampTime,f=p+":"+n.hash+":"+g;if(!a[f]&&0!==p){a[f]=!0;var h={time:g,amount:p,pubkey:E,comment:n.comment,isUD:!1,hash:n.hash,locktime:n.locktime,block_number:n.block_number};l&&null===n.block_number&&(h.inputs=n.inputs,h.sources=u),d&&(h.lockedOutputs=d),t.push(h)}}}))},p=function(n,t,a){return e((function(a,i){var s=[],r=[],c=[],d=Math.trunc((new Date).getTime()/1e3);t=t||d-l.data.walletHistoryTimeSecond;var p={},m={pendings:[]},E=function(e){u(n,e.history.sent,s,p),u(n,e.history.received,s,p),u(n,e.history.sending,s,p),u(n,e.history.pending,c,p,!0)},g=[o.tx.history.pending({pubkey:n}).then(E)];if(-1!==t){for(var f=l.data.walletHistorySliceSecond,h=t-t%f;h-f<d;h+=f)g.push(o.tx.history.times({pubkey:n,from:h,to:h+f-1}).then(E));g.push(o.tx.history.timesNoCache({pubkey:n,from:d-d%f,to:d+999999999}).then(E))}else g.push(o.tx.history.all({pubkey:n}).then(E));e.all(g).then((function(){m.history=s.concat(r).sort((function(e,n){return n.time-e.time})),m.pendings=c,m.fromTime=t,m.toTime=m.history.length?m.history[0].time:t,a(m)})).catch((function(e){m.history=[],m.pendings=[],m.errors=[],delete m.fromTime,delete m.toTime,i(e)}))}))},m=function(e,n){return n<=0?e:e*Math.pow(10,n)},E=function(e,n){_(n).forEach((function(n){!function(e,n,t){var a=e.type+":"+e.identifier+":"+e.noffset;angular.isUndefined(t[a])&&(n.push(e),t[a]=n.length-1)}(n,e.sources,e.sourcesIndexByKey)}))},g=function(e){return o.tx.sources({pubkey:e}).then((function(e){var n={sources:[],sourcesIndexByKey:[],balance:0};return e.sources&&e.sources.length&&(_.forEach(e.sources,(function(e){e.consumed=!1,n.balance+=m(e.amount,e.base)})),E(n,e.sources)),n}))},f=function(n,t){var a=(new Date).getTime(),i={};return e.all([g(n),p(n,t)]).then((function(e){angular.merge(i,e[0]),i.tx=e[1];var n=[],t=[],a=i.balance;function o(e){var o=[],s=!0;e.amount>0?s=!1:(_.forEach(e.inputs,(function(e){var n=e.split(":").slice(2).join(":"),t=i.sourcesIndexByKey[n];if(!angular.isDefined(t))return s=!1,!1;o.push(i.sources[t])})),e.sources&&E(i,e.sources),delete e.sources,delete e.inputs),s?(a+=e.amount,n.push(e),_.forEach(o,(function(e){e.consumed=!0}))):t.push(e)}for(var s=i.tx.pendings,r=!0;s&&s.length>0;)_.forEach(s,o),t.length>0&&n.length>0&&r?(s=t,t=[],r=!1):s=null;return i.tx.pendings=n,i.tx.errors=t,i.balance=a,c.extendAll((i.tx.history||[]).concat(i.tx.pendings||[]),"pubkey")})).then((function(){return console.debug("[tx] TX and sources loaded in "+((new Date).getTime()-a)+"ms"),i}))};return downloadHistoryFile=function(n,s){return(s=s||{}).fromTime=s.fromTime||-1,console.debug("[tx] Exporting TX history for pubkey [{0}]".format(n.substr(0,8))),e.all([a(["ACCOUNT.HEADERS.TIME","COMMON.UID","COMMON.PUBKEY","ACCOUNT.HEADERS.AMOUNT","ACCOUNT.HEADERS.COMMENT"]),o.blockchain.current(),f(n,s.fromTime)]).then((function(e){var o=e[0],s=e[1],r=s&&s.medianTime||moment().utc().unix(),l=s&&s.currency;return(e=e[2])&&e.tx&&e.tx.history?a("ACCOUNT.FILE_NAME",{currency:l,pubkey:n,currentTime:r}).then((function(e){var n=t("formatDecimal"),a=(t("formatPubkey"),t("formatDate")),i=(t("formatDateForFile"),t("currencySymbolNoHtml")),s=[o["ACCOUNT.HEADERS.TIME"],o["COMMON.UID"],o["COMMON.PUBKEY"],o["ACCOUNT.HEADERS.AMOUNT"]+" ("+i(l)+")",o["ACCOUNT.HEADERS.COMMENT"]],r=e.tx.history.reduce((function(e,t){return e.concat([a(t.time),t.uid,t.pubkey,n(t.amount/100),'"'+t.comment+'"'].join(";")+"\n")}),[s.join(";")+"\n"]),c=new Blob(r,{type:"text/plain; charset=utf-8"});d.saveAs(c,e)})):i.toast.show("INFO.EMPTY_TX_HISTORY")}))},{id:n,load:f,downloadHistoryFile:downloadHistoryFile,api:r}}var p=u("default",o);return p.instance=u,p}]),angular.module("cesium.wallet.services",["ngApi","ngFileSaver","cesium.bma.services","cesium.crypto.services","cesium.utils.services","cesium.settings.services"]).factory("csWallet",["$q","$rootScope","$timeout","$translate","$filter","Api","localStorage","CryptoUtils","BMA","csConfig","csSettings","FileSaver","Blob","csWot","csTx","csCurrency",function(e,n,t,a,i,o,s,r,l,c,d,u,p,m,E,g){function f(a,i){var l,m,E,f={},h=new o(this,"csWallet-"+a),T=function(e){f.loaded=!1,f.pubkey=null,f.qrcode=null,f.uid=null,f.isNew=null,f.events=[],b(),m=!1,E=void 0,e?h.data.raise.init(f):(d.data.useLocalStorage||d.reset(),h.data.raise.reset(f))},b=function(){f.keypair={signSk:null,signPk:null}},v=function(){return!!f.pubkey},O=function(n){return m?v()?e.when(f.keypair):e.reject("Not auth"):(E||M()).then((function(){return O(n)}))},R=function(){if(d.data.useLocalStorage)if(v()&&d.data.rememberMe){var e={keypair:f.keypair,pubkey:f.pubkey,version:c.version};s.setObject("GCHANGE_DATA",e)}else s.setObject("GCHANGE_DATA",null);else s.setObject("GCHANGE_DATA",null);s.setObject("CESIUM_DATA",null)},I=function(){return s.get("GCHANGE_DATA").then((function(e){if(e)return e;try{return s.get("CESIUM_DATA").catch((function(){console.debug("No settings stored in CESIUM_DATA key. Continue")}))}catch(e){return void console.debug("No settings stored in CESIUM_DATA key. Continue")}})).then((function(e){if(e)return P(e,!1).then((function(e){if(e&&e.keypair&&e.pubkey)return f.keypair=e.keypair,f.pubkey=e.pubkey,f.loaded=!1,h.data.raisePromise.login(f)})).then((function(){return f}))}))},N=function(e){return e&&e.minData?A(e):e||f.loaded?D(e):S()},S=function(){return f.loaded=!1,e.all([h.data.raisePromise.load(f,null).catch((function(e){console.error("Error while loading wallet data, on extension point. Try to continue"),console.error(e)}))]).then((function(){return h.data.raisePromise.finishLoad(f).catch((function(e){console.error("Error while finishing wallet data load, on extension point. Try to continue"),console.error(e)}))})).then((function(){return f.loaded=!0,f})).catch((function(e){throw f.loaded=!1,e}))},A=function(e){return D(e=e||{})},D=function(n){n=n||{api:!0};var t=[];return L("requirements"),t.length&&!n.api||t.push(h.data.raisePromise.load(f,n)),e.all(t).then((function(){return h.data.raisePromise.finishLoad(f)})).then((function(){return f})).catch((function(e){console.error("Failed to execute refreshData() jobs:",e)}))},C=function(e){var n=Math.round(e.answer.length/2),t=e.answer.substr(0,n),a=e.answer.substr(n);return r.scryptKeypair(t,a).then((function(n){return e.pubkey=r.util.encode_base58(n.signPk),e.keypair=n,e}))},L=function(e){f.events=f.events.reduce((function(n,t){return t.context&&t.context==e?n:n.concat(t)}),[])},P=function(n,t){return t=!!angular.isUndefined(t)||t,e((function(e,a){var i=JSON.parse(n||"{}");if(i&&i.keypair&&i.keypair.signPk&&i.keypair.signSk){var o,s={},r=new Uint8Array(32);for(o=0;o<32;o++)r[o]=i.keypair.signPk[o];s.signPk=r;var l=new Uint8Array(64);for(o=0;o<64;o++)l[o]=i.keypair.signSk[o];if(s.signSk=l,i.version&&i.keypair.boxPk){var c=new Uint8Array(32);for(o=0;o<32;o++)c[o]=i.keypair.boxPk[o];s.boxPk=c}if(i.version&&i.keypair.boxSk){var d=new Uint8Array(32);for(o=0;o<64;o++)d[o]=i.keypair.boxSk[o];s.boxSk=d}e({pubkey:i.pubkey,keypair:s,tx:i.tx})}else t?a("Not a valid Wallet.data object"):e()}))};function y(){console.debug("[wallet] Stopping..."),_.forEach(l,(function(e){e()})),l=[],T()}function k(){return y(),t(M,200)}function M(){console.debug("[wallet] Starting...");var t=(new Date).getTime();return E=e.all([d.ready(),g.ready(),i.ready()]).then(I).then((function(e){if(e&&e.pubkey)return N({minData:!0})})).then((function(){!function(){l=[d.api.data.on.changed(n,R,this),i.api.node.on.restart(n,k,this)]}(),console.debug("[wallet] Started in "+((new Date).getTime()-t)+"ms"),m=!0,E=null,h.data.raise.ready(f)})).then((function(){return f}))}return h.registerEvent("data","ready"),h.registerEvent("data","init"),h.registerEvent("data","loginCheck"),h.registerEvent("data","login"),h.registerEvent("data","load"),h.registerEvent("data","finishLoad"),h.registerEvent("data","logout"),h.registerEvent("data","unauth"),h.registerEvent("data","reset"),h.registerEvent("error","send"),h.registerEvent("action","certify"),T(!0),{id:a,data:f,ready:function(){return m?e.when():E||M()},start:M,stop:y,login:function(e,n){if(!e||!n)throw Error("Missing required arguments");return r.scryptKeypair(e,n).then((function(e){return f.pubkey=r.util.encode_base58(e.signPk),f.keypair=e,h.data.raisePromise.loginCheck(f).catch((function(e){throw T(),e})).then((function(){return h.data.raisePromise.login(f)}))})).then((function(){return d.data.useLocalStorage&&R(),f}))},logout:function(){return e((function(e,n){T(),R(),h.data.raise.logout(),h.data.raise.unauth(),e()}))},isLogin:v,getKeypair:O,isDataLoaded:function(e){return e&&e.minData,f.loaded},isNeverUsed:function(){if(f.loaded)return!f.pubkey||!(f.name||f.profile||f.avatar)},isNew:function(){return!!f.isNew},isUserPubkey:function(e){return v()&&f.pubkey===e},getData:function(){return f},loadQrCode:function(){return!f.pubkey||f.qrcode?e.when(f.qrcode):(console.debug("[wallet] Creating SVG QRCode..."),t((function(){return f.qrcode=UIUtils.qrcode.svg(f.pubkey),f.qrcode})))},loadData:N,refreshData:D,downloadSaveId:function(e){return function(e){var n="Version: 10 \nType: SaveID\nQuestions: \n"+e.questions+"Issuer: "+f.pubkey+"\nCrypted-Nonce: "+e.nonce+"\nCrypted-Pubkey: "+e.pubkey+"\nCrypted-Salt: "+e.salt+"\nCrypted-Pwd: "+e.pwd+"\n";return r.sign(n,f.keypair).then((function(e){return n+=e+"\n",console.debug("Has generate an SaveID document:\n----\n"+n+"----"),n}))}(e).then((function(e){var n=new p([e],{type:"text/plain; charset=utf-8"});u.saveAs(n,"saveID.txt")}))},getCryptedId:function(e){return C(e).then((function(){return r.util.random_nonce()})).then((function(n){return e.nonce=n,r.box.pack(e.salt,e.nonce,e.keypair.boxPk,e.keypair.boxSk)})).then((function(n){return e.salt=n,r.box.pack(e.pwd,e.nonce,e.keypair.boxPk,e.keypair.boxSk)})).then((function(n){return e.pwd=n,e.nonce=r.util.encode_base58(e.nonce),e}))},recoverId:function(e){var n=r.util.decode_base58(e.cypherNonce);return C(e).then((function(e){return r.box.open(e.cypherSalt,n,e.keypair.boxPk,e.keypair.boxSk)})).then((function(t){return e.salt=t,r.box.open(e.cypherPwd,n,e.keypair.boxPk,e.keypair.boxSk)})).then((function(n){return e.pwd=n,e})).catch((function(e){console.warn("Incorrect answers - Unable to recover passwords")}))},events:{add:function(e,n){(e=e||{}).type=e.type||"info",e.message=e.message||"",e.messageParams=e.messageParams||{},e.context=e.context||"undefined",e.message.trim().length?n?f.events.splice(0,0,e):f.events.push(e):console.debug("Event without message. Skipping this event")},cleanByContext:L},api:h}}var h=f("default",l);return h.instance=f,h}]),angular.module("cesium.plugin.services",[]).provider("PluginService",(function(){var e=[],n={};this.registerEagerLoadingService=function(n){return e.push(n),this},this.extendState=function(e,t){return angular.isDefined(e)&&angular.isDefined(t)&&(n[e]||(n[e]=[]),n[e].push(t)),this},this.extendStates=function(e,n){var t=this;return e.forEach((function(e){t.extendState(e,n)})),this},this.$get=["$injector","$state",function(t,a){var i;return{start:function(){e.length>0&&_.forEach(e,(function(e){t.get(e)}))},extensions:{points:{getActivesByName:function(e){return _.keys(n).reduce((function(e,t){return a.includes(t)?e.concat(n[t]):e}),[]).reduce((function(n,t){return t.points&&t.points[e]?n.concat(t.points[e]):n}),[])},current:{get:function(){return i},set:function(e){i=e}}}}}}]})),angular.module("cesium.services",["cesium.config","cesium.settings.services","cesium.http.services","cesium.bma.services","cesium.crypto.services","cesium.utils.services","cesium.modal.services","cesium.storage.services","cesium.device.services","cesium.currency.services","cesium.wallet.services","cesium.tx.services","cesium.wot.services","cesium.plugin.services"]),e.prototype.isEmpty=function(){"use strict";return!(this.transactionsCount||this.certificationsCount||this.joinersCount||this.dividend||this.activesCount||this.identitiesCount||this.leaversCount||this.excludedCount||this.revokedCount)},e.prototype.parseData=function(){this.identities=this.parseArrayValues(this.identities,["pubkey","signature","buid","uid"]),this.joiners=this.parseArrayValues(this.joiners,["pubkey","signature","mBuid","iBuid","uid"]),this.actives=this.parseArrayValues(this.actives,["pubkey","signature","mBuid","iBuid","uid"]),this.leavers=this.parseArrayValues(this.leavers,["pubkey","signature","mBuid","iBuid","uid"]),this.revoked=this.parseArrayValues(this.revoked,["pubkey","signature"]),this.excluded=this.parseArrayValues(this.excluded,["pubkey"]),this.certifications=this.parseArrayValues(this.certifications,["from","to","block","signature"]),this.transactions=this.parseTransactions(this.transactions),delete this.raw},e.prototype.cleanData=function(){delete this.identities,delete this.joiners,delete this.actives,delete this.leavers,delete this.revoked,delete this.excluded,delete this.certifications,delete this.transactions,delete this.raw},e.prototype.parseArrayValues=function(e,n){return e&&e.length?e.reduce((function(e,t){var a=t.split(":");if(a.length!=n.length)return console.debug("[block] Bad format for '{0}': [{1}]. Expected {1} parts. Skipping".format(arrayProperty,t,n.length)),e;for(var i={},o=0;o<n.length;o++)i[n[o]]=a[o];return e.concat(i)}),[]):[]},e.prototype.regexp={TX_OUTPUT_SIG:("SIG\\(([0-9a-zA-Z]{43,44})\\)",new RegExp("^SIG\\(([0-9a-zA-Z]{43,44})\\)$"))},e.prototype.parseTransactions=function(n){return n&&n.length?n.reduce((function(n,t){var a={issuers:t.issuers,time:t.time};return a.outputs=t.outputs.reduce((function(n,a){var i=a.split(":");if(3!=i.length)return console.debug("[block] Bad format a 'transactions': [{0}]. Expected 3 parts. Skipping".format(a)),n;var o=i[0],s=i[1],r=i[2],l=e.prototype.regexp.TX_OUTPUT_SIG.exec(i[2]);if(l){var c=l[1];return t.issuers&&-1==t.issuers.indexOf(c)?n.concat({amount:s<=0?o:o*Math.pow(10,s),unitbase:s,pubkey:c}):n}return n.concat({amount:s<=0?o:o*Math.pow(10,s),unitbase:s,unlockCondition:r})}),[]),a.error||a.outputs.length||(a.toHimself=!0),n.concat(a)}),[]):[]},t.$inject=["$scope","$rootScope","$state","$ionicSideMenuDelegate","$q","$timeout","$ionicHistory","$controller","$window","csPlatform","UIUtils","BMA","csWallet","Device","Modals","csSettings","csConfig","csHttp"],n.$inject=["$scope","PluginService"],angular.module("cesium.app.controllers",["cesium.platform","cesium.services"]).config(["$stateProvider","$urlRouterProvider",function(e,n){e.state("app",{url:"/app",abstract:!0,templateUrl:"templates/menu.html",controller:"AppCtrl",data:{large:!1}}),n.otherwise("/app/home")}]).controller("AppCtrl",t).controller("PluginExtensionPointCtrl",n),a.$inject=["$scope","$state","$timeout","$ionicHistory","$http","$translate","$q","$location","UIUtils","csConfig","csCache","csPlatform","csCurrency","csSettings"],angular.module("cesium.home.controllers",["cesium.platform","cesium.services"]).config(["$stateProvider","$urlRouterProvider",function(e,n){e.state("app.home",{url:"/home?error&uri",views:{menuContent:{templateUrl:"templates/home/home.html",controller:"HomeCtrl"}}}),n.otherwise("/app/home")}]).controller("HomeCtrl",a),i.$inject=["$timeout","Modals"],o.$inject=["$scope","$state","UIUtils","CryptoUtils","csSettings","Modals","csWallet","mkWallet","BMA"],angular.module("cesium.join.controllers",["cesium.services"]).config(["$stateProvider",function(e){e.state("app.join",{url:"/join",views:{menuContent:{templateUrl:"templates/home/home.html",controller:"JoinCtrl"}}})}]).controller("JoinCtrl",i).controller("JoinModalCtrl",o),s.$inject=["$scope","$timeout","CryptoUtils","UIUtils","Modals","csSettings","Device"],angular.module("cesium.login.controllers",["cesium.services"]).controller("LoginModalCtrl",s),r.$inject=["$scope","$state","$timeout","$anchorScroll","csSettings"],l.$inject=["$scope","$timeout","$anchorScroll","csSettings","parameters"],c.$inject=["$scope","$rootScope","$state","$window","$ionicSideMenuDelegate","$timeout","$q","$anchorScroll","UIUtils","csConfig","csSettings","csCurrency","Device","csWallet"],d.$inject=["$scope"],angular.module("cesium.help.controllers",["cesium.services"]).config(["$stateProvider",function(e){e.state("app.help_tour",{url:"/tour",views:{menuContent:{templateUrl:"templates/home/home.html",controller:"HelpTourCtrl"}}}).state("app.help",{url:"/help?anchor",views:{menuContent:{templateUrl:"templates/help/view_help.html",controller:"HelpCtrl"}}}).state("app.help_anchor",{url:"/help/:anchor",views:{menuContent:{templateUrl:"templates/help/view_help.html",controller:"HelpCtrl"}}})}]).controller("HelpCtrl",r).controller("HelpModalCtrl",l).controller("HelpTipCtrl",c).controller("HelpTourCtrl",d),u.$inject=["$scope","$q","$ionicPopup","$timeout","$state","UIUtils","csWallet","$ionicPopover","Modals","csSettings","esHttp"],angular.module("cesium.wallet.controllers",["cesium.services"]).config(["$stateProvider",function(e){e.state("app.view_wallet",{url:"/wallet",views:{menuContent:{templateUrl:"templates/wallet/view_wallet.html",controller:"WalletCtrl"}}})}]).controller("WalletCtrl",u),p.$inject=["$scope","$state","$timeout","$focus","$ionicPopover","$ionicHistory","UIUtils","csConfig","csCurrency","csSettings","Device","BMA","csWallet","esDocument","esProfile"],m.$inject=["$scope","$controller","$focus","parameters"],E.$inject=["$scope","$rootScope","$state","$ionicHistory","UIUtils","Modals","esHttp","csCurrency","csWot","csWallet"],g.$inject=["$scope","$rootScope","$controller","$timeout","UIUtils","csWallet"],angular.module("cesium.wot.controllers",["cesium.services"]).config(["$stateProvider",function(e){e.state("app.user_lookup",{url:"/user?q&type&hash",views:{menuContent:{templateUrl:"templates/wot/lookup.html",controller:"WotLookupCtrl"}}}).state("app.user_identity",{url:"/user/:pubkey/:name?action",views:{menuContent:{templateUrl:"templates/wot/view_identity.html",controller:"WotIdentityViewCtrl"}}}).state("app.user_identity_name",{url:"/lookup/:name?action",views:{menuContent:{templateUrl:"templates/wot/view_identity.html",controller:"WotIdentityViewCtrl"}}})}]).controller("WotLookupCtrl",p).controller("WotLookupModalCtrl",m).controller("WotIdentityAbstractCtrl",E).controller("WotIdentityViewCtrl",g),f.$inject=["$scope","$q","$window","$ionicHistory","$ionicPopup","$timeout","$translate","UIUtils","Modals","BMA","csHttp","csConfig","csSettings","csPlatform"],angular.module("cesium.settings.controllers",["cesium.services"]).config(["$stateProvider",function(e){e.state("app.settings",{url:"/settings",views:{menuContent:{templateUrl:"templates/settings/settings.html",controller:"SettingsCtrl"}}})}]).controller("SettingsCtrl",f),angular.module("cesium.controllers",["cesium.app.controllers","cesium.home.controllers","cesium.join.controllers","cesium.login.controllers","cesium.help.controllers","cesium.settings.controllers","cesium.wallet.controllers","cesium.wot.controllers"]),angular.module("cesium.templates",[]).run(["$templateCache",function(e){e.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>'),e.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" 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>'),e.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>'),e.put("templates/common/popover_instance_address.html",'<ion-popover-view class="popover-instance-address"><ion-content scroll="false"><form><div class="list"><div class="item item-text-wrap padding item-no-border"><span translate>COMMON.POPOVER_SHARE.INSTANCE_ADDRESS_HELP</span></div><div class="item item-input item-floating-label item-no-border"><span class="input-label" ng-bind-html="\'SETTINGS.POPUP_PEER.HOST\'|translate"></span> <input type="text" ng-model="instance"></div></div><div class="padding text-right"><button class="button button-clear button-dark ink" ng-click="closePopover()" type="button" translate>COMMON.BTN_CANCEL</button> <button class="button button-raised button-positive ink" ng-click="closePopover(instance)" translate>COMMON.BTN_SHARE</button></div></form></ion-content></ion-popover-view>'),e.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>'),e.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="!$root.walletData.avatar" ng-class="{\'royal-bg\': login, \'stable-bg\': !login}"></i> <i class="avatar" ng-if="$root.walletData.avatar" style="background-image: url(\'{{$root.walletData.avatar.src}}\')"></i></div><div class="col col-66" ng-if="login"><h4>{{$root.walletData.name||$root.walletData.uid}}</h4><h4 class="gray" ng-if="!$root.walletData.name && !$root.walletData.uid" copy-on-click="{{$root.walletData.pubkey}}"><i class="icon ion-key"></i> {{$root.walletData.pubkey|formatPubkey}}</h4></div></div><div class="row" ng-show="login"><div class="col col-66 col-offset-33"><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>'),e.put("templates/common/popover_share.html",'<ion-popover-view class="popover-share"><ion-content scroll="false"><div class="bar bar-header"><h1 class="title" ng-bind-html="titleKey|translate:titleValues"></h1><span class="gray pull-right hidden-xs">{{time|formatDate}}</span></div><div class="list no-margin no-padding has-header has-footer block"><div class="item item-input"><input type="text" 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-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 button-icon positive icon ion-social-mastodon" ng-click="shareOnMastodon()" title="{{\'COMMON.POPOVER_SHARE.SHARE_ON_MASTODON\'|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>'),e.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>'),e.put("templates/help/help.html",'<a name="join"></a><h2 translate>HELP.JOIN.SECTION</h2><a name="join-salt"></a><div class="row responsive-sm"><div class="col col-20 gray" translate>LOGIN.SALT</div><div class="col" translate>HELP.JOIN.SALT</div></div><a name="join-password"></a><div class="row responsive-sm"><div class="col col-20 gray" translate>LOGIN.PASSWORD</div><div class="col" translate>HELP.JOIN.PASSWORD</div></div><a name="glossary"></a><h2 translate>HELP.GLOSSARY.SECTION</h2><a name="pubkey"></a><div class="row responsive-sm"><div class="col col-20 gray" translate>COMMON.PUBKEY</div><div class="col" translate>HELP.GLOSSARY.PUBKEY_DEF</div></div><a name="universal_dividend"></a><div class="row responsive-sm"><div class="col col-20 gray" translate>COMMON.UNIVERSAL_DIVIDEND</div><div class="col" translate>HELP.GLOSSARY.UNIVERSAL_DIVIDEND_DEF</div></div>'),e.put("templates/help/modal_help.html",'<ion-view class="modal slide-in-up ng-enter active ng-enter-active"><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"><ng-include src="\'plugins/market/templates/help/help.html\'"></ng-include><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-view>'),e.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>'),e.put("templates/home/home.html",'<ion-view id="home"><ion-nav-title></ion-nav-title><ion-nav-buttons side="secondary"><cs-extension-point name="header-buttons"></cs-extension-point><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.country}}.png);"></i> <b class="ion-arrow-down-b gray"></b></button></ion-nav-buttons><ion-content class="has-header no-padding-xxs bg-image-cover" style="background-image: url({{bgImage}})"><div class="row no-padding-xxs responsive-lg"><div class="col col-md-10 hidden-xs hidden-sm" ng-class="{\'col-30 no-padding\': !feed, \'col-15 no-padding\': feed}">&nbsp;</div><div class="col text-center main-column"><div class="logo"></div><p class="hidden-xs">&nbsp;</p><div class="main-content center padding light-bg"><h4><span class="hidden-xs" translate>HOME.MESSAGE</span> <span ng-show="!loading" ng-bind-html="\'HOME.MESSAGE_CURRENCY\'|translate:{currency: $root.currency.name}"></span></h4><br class="hidden-xs"><div class="center padding" ng-if="loading"><ion-spinner icon="android"></ion-spinner></div><div class="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-fade-in animate-show-hide ng-hide" ng-show="!loading && !error"><cs-extension-point name="buttons"></cs-extension-point><button type="button" class="button button-block button-positive button-raised icon ink-dark" ng-click="showJoinModal()" ng-if="!login" translate>LOGIN.CREATE_FREE_ACCOUNT</button> <button type="button" class="button button-block button-positive button-raised icon icon-left ion-person ink-dark" ui-sref="app.view_wallet" ng-show="login" translate>MENU.ACCOUNT</button><br class="visible-xs visible-sm"><div class="text-center no-padding" ng-show="!login"><br class="visible-xs visible-sm">{{\'LOGIN.HAVE_ACCOUNT_QUESTION\'|translate}} <b><a class="positive hidden-xs hidden-sm" ng-click="loginAndGo(\'app.view_wallet\')" translate>COMMON.BTN_LOGIN</a></b></div><div class="text-center no-padding hidden-xs hidden-sm" ng-show="login"><span class="dark" ng-bind-html="\'HOME.NOT_YOUR_ACCOUNT_QUESTION\'|translate:$root.walletData"></span><br><b><a class="assertive" ng-click="logout()" 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="!login" translate>COMMON.BTN_LOGIN</button> <button type="button" class="button button-block button-assertive button-raised icon icon-left ion-log-out ink-dark visible-xs visible-sm" ng-click="logout()" ng-if="login" translate>COMMON.BTN_LOGOUT</button></div><br><div class="text-center no-padding visible-xs dark"><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 col-lg-10 hidden-xs hidden-sm" ng-class="{\'col-30 no-padding\': !feed, \'col-15 no-padding\': 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><div class="row responsive-lg footer no-margin no-padding"><div class="col no-padding no-margin"><cs-extension-point name="footer-start"></cs-extension-point></div><div class="col col-33 no-padding no-margin"><cs-extension-point name="footer-end"></cs-extension-point></div></div></ion-content></ion-view>'),e.put("templates/join/modal_join.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> <button class="button button-icon button-clear icon ion-ios-help-outline visible-xs" ng-if="!isLastSlide" ng-click="showHelpModal()"></button><h1 class="title" translate>ACCOUNT.NEW.TITLE</h1><button class="button button-clear icon-right visible-xs" ng-if="!isLastSlide" 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="isLastSlide" 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="6" required> <input ng-if="showPassword" name="text" type="text" placeholder="{{\'LOGIN.PASSWORD_HELP\' | translate}}" ng-model="formData.password" ng-change="formDataChanged()" ng-minlength="6" 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"><form name="pseudoForm" novalidate="" ng-submit="doNext(\'pseudoForm\')"><div class="item item-text-wrap text-center padding hidden-xs"><span translate>PROFILE.JOIN.TITLE_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}"><span class="input-label" translate>PROFILE.TITLE</span> <input name="pseudo" type="text" placeholder="{{\'PROFILE.TITLE_HELP\' | translate}}" ng-model="formData.pseudo" ng-minlength="4" ng-maxlength="100" 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><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></form></ion-content></ion-slide-page><ion-slide-page><ion-content class="has-header" scroll="false"><div class="padding text-center" translate>PROFILE.JOIN.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_SEND <i class="icon ion-android-send"></i></button></div></ion-content></ion-slide-page></ion-slides></ion-modal-view>'),e.put("templates/login/modal_login.html",'<ion-modal-view 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" ng-bind-html="\'LOGIN.TITLE\' | translate"></h1><div class="buttons buttons-right"><span class="secondary-buttons visible-xs"><button class="button button-positive button-icon button-clear icon ion-android-done" style="color: #fff;" ng-click="doLogin()"></button></span></div></ion-header-bar><ion-content><form name="loginForm" novalidate="" ng-submit="doLogin()"><div class="list" ng-init="setForm(loginForm)"><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 ng-if="!showSalt" name="username" type="password" placeholder="{{\'LOGIN.SALT_HELP\' | translate}}" autocomplete="off" ng-model="formData.username" ng-model-options="{ debounce: 650 }" class="highlight-light" required> <input ng-if="showSalt" name="username" type="text" 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><div class="item item-toggle dark"><span translate>LOGIN.SHOW_SALT</span> <label class="toggle toggle-stable"><input type="checkbox" ng-model="showSalt"><div class="track"><div class="handle"></div></div></label></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}}" 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-toggle dark hidden-xs"><span translate>SETTINGS.REMEMBER_ME</span> <label class="toggle toggle-calm"><input type="checkbox" ng-model="formData.rememberMe"><div class="track"><div class="handle"></div></div></label></div><div class="item item-button-right left"><span ng-if="formData.username && formData.password" class="input-label" translate>COMMON.PUBKEY</span> <a class="button button-light button-small ink animate-if" ng-click="showPubkey()" ng-if="showPubkeyButton">{{\'COMMON.BTN_SHOW_PUBKEY\' | translate}}</a><h3 class="gray text-no-wrap" ng-if="!computing">{{pubkey}}</h3><h3 ng-if="computing"><ion-spinner icon="android"></ion-spinner></h3></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" type="submit">{{\'COMMON.BTN_LOGIN\' | translate}}</button></div><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><div class="text-center no-padding"><a ng-click="showAccountSecurityModal()" translate>LOGIN.FORGOTTEN_ID</a></div></form></ion-content></ion-modal-view>'),e.put("templates/menu.html",'<ion-side-menus enable-menu-with-back-views="true" bind-notifier="{locale:$root.settings.locale.id}"><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-bar button-clear visible-nomenu" menu-toggle="left"><i class="icon ion-navicon"></i></button></ion-nav-buttons><ion-nav-buttons side="right"><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-click="showProfilePopover($event)"><i class="avatar avatar-member" ng-if="!$root.walletData.avatar" ng-class="{\'disable\': !login, \'royal-bg\': login}"></i> <i class="avatar" ng-if="$root.walletData.avatar" style="background-image: url(\'{{$root.walletData.avatar.src}}\')"></i></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="(min-width: 768px)" enable-menu-with-back-views="false" width="225"><ion-header-bar><h1 class="title dark hidden-sm hidden-xs" translate>COMMON.APP_NAME</h1><div class="visible-sm visible-xs hero"><div class="content"><i class="avatar avatar-member hero-icon" ng-if="!$root.walletData.avatar" ng-class="{\'royal-bg\': login, \'stable-bg\': !login}" ng-click="!login ? showHome() : loginAndGo(\'app.view_wallet\')" menu-close></i> <i class="avatar hero-icon" ng-if="$root.walletData.avatar" style="background-image: url(\'{{$root.walletData.avatar.src}}\')" ng-click="loginAndGo(\'app.view_wallet\')" menu-close></i><h4 ng-if="login"><a class="light" ui-sref="app.view_wallet" menu-close>{{$root.walletData.name||$root.walletData.uid}} <span ng-if="!$root.walletData.name && !$root.walletData.uid"><i class="icon ion-key"></i>&nbsp;{{$root.walletData.pubkey|formatPubkey}}</span></a></h4><h4 ng-if="!login"><a class="light" ui-sref="app.view_wallet" 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></div><a ng-if="::$root.device.isWeb()" ng-click="toggleFullscreen()" class="button-icon visible-sm visible-xs" style="position: absolute; top: 5px; right: 5px; z-index: 999;"><i class="icon ion-arrow-expand" ng-class="{\'ion-arrow-shrink\': fullscreen}"></i></a></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-icon-left" ui-sref="app.home" active-link="active"><i class="icon ion-home"></i> {{:locale:\'MENU.HOME\'|translate}}</ion-item><div class="item item-divider"></div><cs-extension-point name="menu-main"></cs-extension-point><div class="item item-divider"></div><a menu-close class="item item-icon-left" active-link="active" active-link-path-prefix="#/app/wallet" 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><cs-extension-point name="menu-user"></cs-extension-point><div class="item-spacer hidden-readonly"></div><div class="item item-divider visible-xs visible-sm"></div><a menu-close class="item item-icon-left" id="helptip-menu-btn-wot" active-link="active" active-link-path-prefix="#/app/user" ui-sref="app.user_lookup"><i class="icon ion-person-stalker"></i> {{:locale:\'MENU.WOT\'|translate}}</a><cs-extension-point name="menu-discover"></cs-extension-point><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" active-link="active" 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()" title="{{:locale:\'HOME.BTN_ABOUT\'|translate}}"><span 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 translate>HOME.BTN_ABOUT</span></a></ion-footer-bar></ion-side-menu></ion-side-menus>'),e.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"><ng-bind-html ng-bind-html="\'COMMON.APP_NAME\'|translate"></ng-bind-html>&nbsp;<b>{{\'COMMON.APP_VERSION\'|translate:$root.config}}</b> <i ng-if="$root.newRelease" class="assertive ion-alert-circled"></i><h3 ng-if="$root.config.build" class="gray">{{\'COMMON.APP_BUILD\'|translate:$root.config}}</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><div class="item item-icon-left"><i class="item-image icon ion-social-github"></i> {{\'ABOUT.CODE\' | translate}}<h3><a ng-click="openLink($event, \'https://github.com/duniter-gchange/gchange-client\')">https://github.com/duniter-gchange/gchange-client</a></h3></div><div class="item 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></div><div class="item item-icon-left"><i class="item-image icon ion-person-stalker"></i> {{\'ABOUT.DEVELOPERS\' | translate}}<h3><a ng-click="openLink($event, \'https://github.com/blavenie\')">Benoit Lavenier</a></h3></div><ion-item class="item item-icon-left item-text-wrap"><i class="item-image icon ion-bug"></i><h2>{{\'ABOUT.DEV_WARNING\'|translate}}</h2><span translate>ABOUT.DEV_WARNING_MESSAGE</span><br><a ng-click="openLink($event, $root.settings.newIssueUrl)" translate>ABOUT.REPORT_ISSUE</a></ion-item><div class="padding hidden-xs text-center"><button class="button button-positive ink" type="submit" ng-click="closeModal()">{{\'COMMON.BTN_CLOSE\' | translate}}</button></div></div></ion-content></ion-modal-view>'),e.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>'),e.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>'),e.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></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><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">{{\'SETTINGS.AUTHENTICATION_SETTINGS\' | translate}}</span><div class="item item-toggle item-text-wrap"><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></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" 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"><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><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>'),e.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.needSelf" ng-click="self()"><i class="icon ion-flag"></i> {{\'ACCOUNT.BTN_SEND_IDENTITY_DOTS\' | translate}} </a><a class="item item-icon-left ink visible-xs visible-sm" ng-if="walletData.requirements.needMembership" ng-click="membershipIn()"><i class="icon ion-person"></i> {{\'ACCOUNT.BTN_MEMBERSHIP_IN_DOTS\' | translate}} </a><a class="item item-icon-left ink hidden-xs hidden-sm" ng-class="{\'gray\':!walletData.requirements.needMembership}" ng-click="membershipIn()"><i class="icon ion-person"></i> {{\'ACCOUNT.BTN_MEMBERSHIP_IN_DOTS\' | translate}} </a><a class="item item-icon-left ink visible-xs visible-sm" ng-if="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-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 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-android-lock"></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-click="startWalletTour()"><i class="icon ion-easel"></i> {{\'COMMON.BTN_HELP_TOUR_SCREEN\' | translate}}</a></div></ion-content></ion-popover-view>'),e.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>'),e.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"><button class="button button-icon button-clear icon ion-loop visible-xs visible-sm" ng-click="doUpdate()"></button><cs-extension-point name="nav-buttons"></cs-extension-point></ion-nav-buttons><ion-content scroll="true" bind-notifier="{ rebind:settings.useRelative, locale:$root.settings.locale.id}"><div class="positive-900-bg hero" id="wallet-header" ng-class="{\'hero-qrcode-active\': toggleQRCode}"><div class="content" ng-if="!loading"><i class="avatar avatar-member" ng-if=":rebind:!formData.avatar"></i> <i class="avatar" ng-if=":rebind:formData.avatar" style="background-image: url({{:rebind:formData.avatar.src}})"></i><ng-if ng-if=":rebind:formData.name"><h3 class="light">{{:rebind:formData.name}}</h3></ng-if><cs-extension-point name="hero"></cs-extension-point></div><h4 class="content light" ng-if="loading"><ion-spinner icon="android"></ion-spinner></h4></div><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-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;<div ng-if="formData.requirements.needRenew"><br><button class="button button-raised button-stable ink" ng-click="renewMembership()"><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"><button class="button button-assertive button-small-padding ink" ng-click="logout({askConfirm: true})"><i class="icon ion-log-out"></i> {{\'COMMON.BTN_LOGOUT\' | translate}}</button></div><div class="row no-padding"><div class="col col-20 hidden-xs hidden-sm">&nbsp;</div><div class="col"><div class="list" ng-class="::motion.ionListClass" ng-hide="loading"><span class="item item-divider" translate>WOT.GENERAL_DIVIDER</span><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>'),e.put("templates/wot/identity.html",'<i ng-if="::!identity.avatar" class="item-image icon ion-person"></i> <i ng-if="::identity.avatar" class="item-image avatar" style="background-image: url({{::identity.avatar.src}})"></i><h2><span ng-bind-html="::identity.name"></span></h2><h4 class="gray" ng-class="{\'pull-right\': !smallscreen}" ng-if="identity.profile.creationTime"><i class="ion-clock"></i> {{::\'WOT.LOOKUP.REGISTERED\' | translate: {time: identity.profile.creationTime } }}</h4><h4 class="gray"><span class="positive" ng-if="::identity.city"><i class="ion-location"></i> {{::identity.city}}&nbsp;</span></h4><h4 ng-if="::identity.events||identity.tags"><span ng-repeat="event in ::identity.events" class="assertive"><i class="ion-alert-circled" ng-if="::!identity.valid"></i> <span ng-bind-html="::event.message|translate:event.messageParams"></span> </span><span ng-if="::identity.tags" class="dark"><ng-repeat ng-repeat="tag in ::identity.tags">#<ng-bind-html ng-bind-html="::tag"></ng-bind-html></ng-repeat></span></h4>'),
e.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()"> <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" style="display: block; height: 60px;" ng-class="::{\'hidden-xs\': !showResultLabel}"><div class="pull-left" ng-if="!search.loading && showResultLabel"><h4 ng-if="search.type==\'newcomers\'" translate>WOT.LOOKUP.NEWCOMERS</h4><h4 ng-if="search.type==\'text\'" translate>COMMON.RESULTS_LIST</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>&nbsp; &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" 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==\'newcomers\'" translate>WOT.LOOKUP.NO_NEWCOMERS</span></div><div ng-if="!allowMultiple" class="list {{::motion.ionListClass}}"><div ng-repeat="identity in search.results" id="helptip-wot-search-result-{{$index}}" class="item item-border-large item-avatar item-icon-right ink" ng-click="::select(identity)"><ng-include src="\'templates/wot/identity.html\'"></ng-include><i class="icon ion-ios-arrow-right"></i></div></div><div ng-if="::allowMultiple" class="list {{::motion.ionListClass}}"><ion-checkbox ng-repeat="identity in search.results" ng-model="identity.checked" class="item item-border-large item-avatar ink" ng-click="toggleCheck($index, $event)"><ng-include src="\'templates/wot/identity.html\'"></ng-include></ion-checkbox></div><ion-infinite-scroll ng-if="search.hasMore" spinner="android" on-infinite="showMore()" distance="2%"></ion-infinite-scroll></ng-if></div>'),e.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-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>'),e.put("templates/wot/lookup.html",'<ion-view><ion-nav-title>{{\'WOT.LOOKUP.TITLE\' | 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-xs" scroll="true"><ng-include src="\'templates/wot/lookup_form.html\'"></ion-content></ion-view>'),e.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>'),e.put("templates/wot/view_identity_tx.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.OPERATIONS.TITLE" translate-values="{uid: formData.name || formData.uid}"></span></ion-nav-title><ion-content><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></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-divider item-tx">{{\'ACCOUNT.BALANCE_ACCOUNT\'|translate}}<div class="badge badge-balanced">{{balance|formatAmount}} <span ng-bind-html="$root.currency.name|currencySymbol"></span></div></div><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 class="item item-tx item-icon-left" ng-repeat="tx in history" ng-include="\'templates/wallet/item_tx.html\'"></div><div class="item item-text-wrap text-center" ng-if="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: 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>'),e.put("templates/wot/view_identity.html",'<ion-view left-buttons="leftButtons" class="view-identity"><ion-nav-title></ion-nav-title><ion-content scroll="true" class="refresher-top-bg"><ion-refresher pulling-text="{{\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="refresh()"></ion-refresher><div class="hero dark-bg" ng-class="{\'positive-900-bg\': !loading && formData.isMember}"><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" title="{{:rebind:formData.name}}"><h3 class="light">{{:rebind:formData.name|truncText: 30}}</h3></ng-if><ng-if ng-if=":rebind:!formData.name"><h3 class="light"><i class="ion-key"></i> {{::formData.pubkey | formatPubkey}}</h3></ng-if><cs-extension-point name="hero"></cs-extension-point></div><h4 class="content light" ng-if="loading"><ion-spinner icon="android"></ion-spinner></h4></div><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-click="showSharePopover($event)" title="{{\'COMMON.BTN_SHARE\' | translate}}"></button><cs-extension-point name="buttons"></cs-extension-point></div><div class="row no-padding"><div class="visible-xs visible-sm"><cs-extension-point name="buttons-top-fab"></cs-extension-point></div><div class="col col-20 hidden-xs hidden-sm">&nbsp;</div><div class="col list" ng-class="::motion.ionListClass" bind-notifier="{ rebind:loading}"><span class="item item-divider" translate>WOT.GENERAL_DIVIDER</span><div class="item item-text-wrap item-icon-left item-wallet-event assertive" ng-repeat="event in :rebind:formData.events | filter: {type: \'error\'}"><i class="icon ion-alert-circled"></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></ion-view>')}]),angular.module("cesium.translations",[]).config(["$translateProvider",function(e){e.translations("en-GB",{COMMON:{APP_NAME:"ğ<b>change</b>",APP_VERSION:"v{{version}}",APP_BUILD:"build {{build}}",PUBKEY:"Public key",MEMBER:"Member",BLOCK:"Block",BTN_OK:"OK",BTN_YES:"Yes",BTN_NO:"No",BTN_SEND:"Send",BTN_SEND_MONEY:"Transfer money",BTN_SEND_MONEY_SHORT:"Transfer",BTN_SAVE:"Save",BTN_YES_SAVE:"Yes, Save",BTN_YES_CONTINUE:"Yes, Continue",BTN_SHOW:"Show",BTN_SHOW_PUBKEY:"Show key",BTN_RELATIVE_UNIT:"Display amounts in UD?",BTN_BACK:"Back",BTN_NEXT:"Next",BTN_IMPORT:"Import",BTN_CANCEL:"Cancel",BTN_CLOSE:"Close",BTN_COPY:"Copy",BTN_LATER:"Later",BTN_LOGIN:"Sign In",BTN_LOGOUT:"Logout",BTN_ADD_ACCOUNT:"New Account",BTN_SHARE:"Share",BTN_EDIT:"Edit",BTN_DELETE:"Delete",BTN_ADD:"Add",BTN_SEARCH:"Search",BTN_REFRESH:"Refresh",BTN_RETRY:"Retry",BTN_START:"Start",BTN_CONTINUE:"Continue",BTN_CREATE:"Create",BTN_UNDERSTOOD:"I understand",BTN_OPTIONS:"Options",BTN_HELP_TOUR:"Features tour",BTN_HELP_TOUR_SCREEN:"Discover this screen",BTN_DOWNLOAD:"Download",BTN_DOWNLOAD_ACCOUNT_STATEMENT:"Download account statement",BTN_MODIFY:"Modify",CHOOSE_FILE:"Drag your file<br/>or click to select",DAYS:"days",NO_ACCOUNT_QUESTION:"Not a member yet? Register now!",SEARCH_NO_RESULT:"No result found",LOADING:"Loading...",LOADING_WAIT:"Loading...<br/><small>(Waiting for node availability)</small>",SEARCHING:"Searching...",FROM:"From",TO:"To",COPY:"Copy",LANGUAGE:"Language",UNIVERSAL_DIVIDEND:"Universal dividend",UD:"UD",DATE_PATTERN:"DD/MM/YYYY HH:mm",DATE_FILE_PATTERN:"YYYY-MM-DD",DATE_SHORT_PATTERN:"DD/MM/YY",DATE_MONTH_YEAR_PATTERN:"MM/YYYY",EMPTY_PARENTHESIS:"(empty)",UID:"Pseudonym",ENABLE:"Enabled",DISABLE:"Disabled",RESULTS_LIST:"Results:",RESULTS_COUNT:"{{count}} results",EXECUTION_TIME:"executed in {{duration|formatDurationMs}}",SHOW_VALUES:"Display values openly?",POPOVER_ACTIONS_TITLE:"Options",POPOVER_FILTER_TITLE:"Filters",SHOW_MORE:"Show more",SHOW_MORE_COUNT:"(current limit at {{limit}})",POPOVER_SHARE:{TITLE:"Share",SHARE_ON_TWITTER:"Share on Twitter",SHARE_ON_FACEBOOK:"Share on Facebook",SHARE_ON_DIASPORA:"Share on Diaspora*",SHARE_ON_MASTODON:"Share on Mastodon",INSTANCE_ADDRESS_HELP:"Enter an intance address (ex: https://framapiaf.org):"},FILE:{DATE:"Date:",TYPE:"Type:",SIZE:"Size:",VALIDATING:"Validating..."}},SYSTEM:{PICTURE_CHOOSE_TYPE:"Choose source:",BTN_PICTURE_GALLERY:"Gallery",BTN_PICTURE_CAMERA:"<b>Camera</b>"},MENU:{HOME:"Home",WOT:"Registry",CURRENCY:"Currency",ACCOUNT:"My Account",WALLETS:"My wallets",TRANSFER:"Transfer",SCAN:"Scan",SETTINGS:"Settings",NETWORK:"Network",TRANSACTIONS:"My transactions"},ABOUT:{TITLE:"About",LICENSE:"<b>Free/libre software</b> (License GNU AGPLv3).",LATEST_RELEASE:"There is a <b>newer version</ b> of {{'COMMON.APP_NAME' | translate}} (<b>v{{version}}</b>)",PLEASE_UPDATE:"Please update {{'COMMON.APP_NAME' | translate}} (latest version: <b>v{{version}}</b>)",CODE:"Source code:",OFFICIAL_WEB_SITE:"Official web site:",DEVELOPERS:"Developers:",FORUM:"Forum:",DEV_WARNING:"Warning",DEV_WARNING_MESSAGE:"This application is still in active development.<br/>Please report any issue to us!",DEV_WARNING_MESSAGE_SHORT:"This App is still unstable (still under development).",REPORT_ISSUE:"Report an issue"},HOME:{TITLE:"Cesium",MESSAGE:"Welcome to the {{'COMMON.APP_NAME'|translate}} Application!",MESSAGE_CURRENCY:"Make exchanges in the libre currency {{currency|abbreviate}}!",BTN_CURRENCY:"Explore currency",BTN_ABOUT:"about",BTN_HELP:"Help",REPORT_ISSUE:"Report an issue",NOT_YOUR_ACCOUNT_QUESTION:'You do not own the account <b><i class="ion-key"></i> {{pubkey|formatPubkey}}</b>?',BTN_CHANGE_ACCOUNT:"Disconnect this account",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>.',SHOW_ALL_FEED:"Show all",READ_MORE:"Read more",FEED_SOURCE:"Source"},SETTINGS:{TITLE:"Settings",DISPLAY_DIVIDER:"Display",STORAGE_DIVIDER:"Storage",NETWORK_SETTINGS:"Network",PEER:"Duniter peer address",PEER_SHORT:"Peer address",PEER_CHANGED_TEMPORARY:"Address used temporarily",PERSIST_CACHE:"Keep navigation data (experimental)",PERSIST_CACHE_HELP:"Allows faster navigation, locally retaining the data received, for use from one session to another.",USE_LOCAL_STORAGE:"Enable local storage",USE_LOCAL_STORAGE_HELP:"Allows you to save your settings",ENABLE_HELPTIP:"Enable contextual help tips",ENABLE_UI_EFFECTS:"Enable visual effects",HISTORY_SETTINGS:"Account operations",DISPLAY_UD_HISTORY:"Display produced dividends?",AUTHENTICATION_SETTINGS:"Authentication",REMEMBER_ME:"Remember me ?",REMEMBER_ME_HELP:"Allows to remain identified from one session to another, keeping the public key locally.",PLUGINS_SETTINGS:"Extensions",BTN_RESET:"Restore default values",EXPERT_MODE:"Enable expert mode",EXPERT_MODE_HELP:"Allow to see more details",POPUP_PEER:{TITLE:"Duniter peer",HOST:"Address",HOST_HELP:"Address: server:port",USE_SSL:"Secured?",USE_SSL_HELP:"(SSL Encryption)",BTN_SHOW_LIST:"Peer's list"}},BLOCKCHAIN:{HASH:"Hash: {{hash}}",VIEW:{HEADER_TITLE:"Block #{{number}}-{{hash|formatHash}}",TITLE_CURRENT:"Current block",TITLE:"Block #{{number|formatInteger}}",COMPUTED_BY:"Computed by",SHOW_RAW:"Show raw data",TECHNICAL_DIVIDER:"Technical informations",VERSION:"Format version",HASH:"Computed hash",UNIVERSAL_DIVIDEND_HELP:"Money co-produced by each of the {{membersCount}} members",EMPTY:"Aucune donnée dans ce bloc",POW_MIN:"Minimal difficulty",POW_MIN_HELP:"Difficulty imposed in calculating hash",DATA_DIVIDER:"Data",IDENTITIES_COUNT:"New identities",JOINERS_COUNT:"Joiners",ACTIVES_COUNT:"Renewals",ACTIVES_COUNT_HELP:"Members having renewed their membership",LEAVERS_COUNT:"Leavers",LEAVERS_COUNT_HELP:"Members that now refused certification",EXCLUDED_COUNT:"Excluded members",EXCLUDED_COUNT_HELP:"Old members, excluded because missing membreship renewal or certifications",REVOKED_COUNT:"Revoked identities",REVOKED_COUNT_HELP:"These accounts may no longer be member",TX_COUNT:"Transactions",CERT_COUNT:"Certifications",TX_TO_HIMSELF:"Change",TX_OUTPUT_UNLOCK_CONDITIONS:"Unlock conditions",TX_OUTPUT_OPERATOR:{AND:"and",OR:"or"},TX_OUTPUT_FUNCTION:{SIG:"<b>Sign</b> of the public key",XHX:"<b>Password</b>, including SHA256 =",CSV:"Blocked during",CLTV:"Bloqué until"}},LOOKUP:{TITLE:"Blocks",NO_BLOCK:"No bloc",LAST_BLOCKS:"Last blocks:",BTN_COMPACT:"Compact"}},CURRENCY:{VIEW:{TITLE:"Currency",TAB_CURRENCY:"Currency",TAB_WOT:"Web of trust",TAB_NETWORK:"Network",TAB_BLOCKS:"Blocks",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}}.",NETWORK_RULES_DIVIDER:"Network rules",CURRENCY_NAME:"Currency name",MEMBERS:"Members count",MEMBERS_VARIATION:"Variation since {{duration|formatDuration}} (since last UD)",MONEY_DIVIDER:"Money",MASS:"Monetary mass",SHARE:"Money share",UD:"Universal Dividend",C_ACTUAL:"Current growth",MEDIAN_TIME:"Current blockchain time",POW_MIN:"Common difficulty",MONEY_RULES_DIVIDER:"Rules of currency",C_RULE:"Theoretical growth target",UD_RULE:"Universal dividend (formula)",DT_REEVAL:"Period between two re-evaluation of the UD",REEVAL_SYMBOL:"reeval",DT_REEVAL_VALUE:"Every <b>{{dtReeval|formatDuration}}</b> ({{dtReeval/86400}} {{'COMMON.DAYS'|translate}})",UD_REEVAL_TIME0:"Date of first reevaluation of the UD",SIG_QTY_RULE:"Required number of certifications to become a member",SIG_STOCK:"Maximum number of certifications sent by a member",SIG_PERIOD:"Minimum delay between 2 certifications sent by one and the same issuer.",SIG_WINDOW:"Maximum delay before a certification will be treated",SIG_VALIDITY:"Lifetime of a certification that has been treated",MS_WINDOW:"Maximum delay before a pending membership will be treated",MS_VALIDITY:"Lifetime of a membership that has been treated",STEP_MAX:"Maximum distance between a newcomer and each referring members.",WOT_RULES_DIVIDER:"Rules for web of trust",SENTRIES:"Required number of certifications (given <b>and</b> received) to become a referring member",SENTRIES_FORMULA:"Required number of certifications to become a referring member (formula)",XPERCENT:"Minimum percent of referring member to reach to match the distance rule",AVG_GEN_TIME:"The average time between 2 blocks",CURRENT:"current",MATH_CEILING:"CEILING",DISPLAY_ALL_RULES:"Display all rules?",BTN_SHOW_LICENSE:"Show license",WOT_DIVIDER:"Web of trust"},LICENSE:{TITLE:"Currency license",BTN_DOWNLOAD:"Download file",NO_LICENSE_FILE:"License file not found."}},NETWORK:{VIEW:{MEDIAN_TIME:"Blockchain time",LOADING_PEERS:"Loading peers...",NODE_ADDRESS:"Address:",SOFTWARE:"Software:",WARN_PRE_RELEASE:"Pre-release (latest stable: <b>{{version}}</b>)",WARN_NEW_RELEASE:"Version <b>{{version}}</b> available",WS2PID:"Identifier:",PRIVATE_ACCESS:"Private access",POW_PREFIX:"Proof of work prefix:",ENDPOINTS:{BMAS:"Secure endpoint (SSL)",BMATOR:"TOR endpoint",WS2P:"WS2P endpoint",ES_USER_API:"Cesium+ data node"}},INFO:{ONLY_SSL_PEERS:"Non-SSL nodes have a degraded display because Cesium works in HTTPS mode."}},PEER:{PEERS:"Peers",SIGNED_ON_BLOCK:"Signed on block",MIRROR:"mirror",MIRRORS:"Mirrors",MIRROR_PEERS:"Mirror peers",PEER_LIST:"Peer's list",MEMBERS:"Members",MEMBER_PEERS:"Member peers",ALL_PEERS:"All peers",DIFFICULTY:"Difficulty",API:"API",CURRENT_BLOCK:"Block #",POPOVER_FILTER_TITLE:"Filter",OFFLINE:"Offline",OFFLINE_PEERS:"Offline peers",BTN_SHOW_PEER:"Show peer",VIEW:{TITLE:"Peer",OWNER:"Owned by ",SHOW_RAW_PEERING:"See peering document",SHOW_RAW_CURRENT_BLOCK:"See current block (raw format)",LAST_BLOCKS:"Last blocks",KNOWN_PEERS:"Known peers :",GENERAL_DIVIDER:"General information",ERROR:{LOADING_TOR_NODE_ERROR:"Could not get peer data, using the TOR network.",LOADING_NODE_ERROR:"Could not get peer data"}}},WOT:{SEARCH_HELP:"Search (name, hashtag)",SEARCH_INIT_PHASE_WARNING:"During the pre-registration phase, the search for pending registrations <b>may be long</b>. Please wait ...",REGISTERED_SINCE:"Registered on",REGISTERED_SINCE_BLOCK:"Registered since block #",NO_CERTIFICATION:"No validated certification",NO_GIVEN_CERTIFICATION:"No given certification",NOT_MEMBER_PARENTHESIS:"(non-member)",IDENTITY_REVOKED_PARENTHESIS:"(identity revoked)",MEMBER_PENDING_REVOCATION_PARENTHESIS:"(being revoked)",EXPIRE_IN:"Expires",NOT_WRITTEN_EXPIRE_IN:"Deadline<br/>treatment",EXPIRED:"Expired",PSEUDO:"Pseudonym",SIGNED_ON_BLOCK:"Emitted on block #{{block}}",WRITTEN_ON_BLOCK:"Written on block #{{block}}",GENERAL_DIVIDER:"General information",NOT_MEMBER_ACCOUNT:"Non-member account",NOT_MEMBER_ACCOUNT_HELP:"This is a simple wallet, with no pending membership application.",TECHNICAL_DIVIDER:"Technical data",BTN_CERTIFY:"Certify",BTN_YES_CERTIFY:"Yes, certify",BTN_SELECT_AND_CERTIFY:"New certification",ACCOUNT_OPERATIONS:"Account operations",VIEW:{POPOVER_SHARE_TITLE:"Identity {{title}}"},LOOKUP:{TITLE:"Registry",NEWCOMERS:"New members:",NEWCOMERS_COUNT:"{{count}} members",PENDING:"Pending registrations:",PENDING_COUNT:"{{count}} pending registrations",REGISTERED:"Registered {{time | formatFromNow}}",MEMBER_FROM:"Member since {{time|formatFromNowShort}}",BTN_NEWCOMERS:"Latest members",BTN_PENDING:"Pending registrations",SHOW_MORE:"Show more",SHOW_MORE_COUNT:"(current limit to {{limit}})",NO_PENDING:"No pending registrations.",NO_NEWCOMERS:"No members."},CONTACTS:{TITLE:"Contacts"},MODAL:{TITLE:"Search"},CERTIFICATIONS:{TITLE:"{{uid}} - Certifications",SUMMARY:"Received certifications",LIST:"Details of received certifications",PENDING_LIST:"Pending certifications",RECEIVED:"Received certifications",RECEIVED_BY:"Certifications received by {{uid}}",ERROR:"Received certifications in error",SENTRY_MEMBER:"Referring member"},OPERATIONS:{TITLE:"{{uid}} - Operations"},GIVEN_CERTIFICATIONS:{TITLE:"{{uid}} - Certifications sent",SUMMARY:"Sent certifications",LIST:"Details of sent certifications",PENDING_LIST:"Pending certifications",SENT:"Sent certifications",SENT_BY:"Certifications sent by {{uid}}",ERROR:"Sent certifications with error"}},LOGIN:{TITLE:'<i class="icon ion-log-in"></i> Login',SCRYPT_FORM_HELP:"Please enter your credentials. <br> Remember to check the public key for your account.",PUBKEY_FORM_HELP:"Please enter a public account key:",FILE_FORM_HELP:"Choose the keychain file to use:",SCAN_FORM_HELP:"Scan the QR code of a wallet.",SALT:"Identifier",SALT_HELP:"Identifier",SHOW_SALT:"Display identifier?",PASSWORD:"Password",PASSWORD_HELP:"Password",PUBKEY_HELP:"Example: « AbsxSY4qoZRzyV2irfep1V9xw1EMNyKJw2TkuVD4N1mv »",NO_ACCOUNT_QUESTION:"Don't have an account yet?",HAVE_ACCOUNT_QUESTION:"Already have an account ?",CREATE_ACCOUNT:"Create an account",CREATE_FREE_ACCOUNT:"Create a free account",FORGOTTEN_ID:"Forgot password?",ASSOCIATED_PUBKEY:"Public key :",BTN_METHODS:"Other methods",BTN_METHODS_DOTS:"Change method...",METHOD_POPOVER_TITLE:"Methods",MEMORIZE_AUTH_FILE:"Memorize this keychain during the navigation session",SCRYPT_PARAMETERS:"Paramètres (Scrypt) :",AUTO_LOGOUT:{TITLE:"Information",MESSAGE:'<i class="ion-android-time"></i> You were <b>logout</ b> automatically, due to prolonged inactivity.',BTN_RELOGIN:"Sign In",IDLE_WARNING:"You will be logout... {{countdown}}"},METHOD:{SCRYPT_DEFAULT:"Secret and password",SCRYPT_ADVANCED:"Advanced salt",FILE:"Keychain file",PUBKEY:"Public key only",SCAN:"Scan a QR code"},SCRYPT:{SIMPLE:"Light salt",DEFAULT:"Standard salt",SECURE:"Secure salt",HARDEST:"Hardest salt",EXTREME:"Extreme salt",USER:"Personal value",N:"N (Loop):",r:"r (RAM):",p:"p (CPU):"},FILE:{DATE:"Date:",TYPE:"Type:",SIZE:"Size:",VALIDATING:"Validating...",HELP:"Expected file format: <b>.dunikey</b> (type PubSec). Other formats are under development (EWIF, WIF)."}},ACCOUNT:{TITLE:"My Account",SHOW_MORE_TX:"Show more",SHOW_ALL_TX:"Show all",EVENTS:"Events",BTN_RECEIVE_MONEY:"Receive",BTN_SECURITY_DOTS:"Sign-in and security...",BTN_SHOW_DETAILS:"Display technical data",NEW:{TITLE:"Registration",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.).",INTRO_WARNING_SECURITY:"Check that the hardware you are currently using (computer, tablet, phone) <b>is secure and trustworthy </b>.",INTRO_WARNING_SECURITY_HELP:"Up-to-date anti-virus, firewall enabled, session protected by password or pin code...",INTRO_HELP:"Click <b> {{'COMMON.BTN_START'|translate}}</b> to begin creating an account. You will be guided step by step.",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.",REGISTRATION_NODE_HELP:"If you do not trust this peer, please change <a ng-click=\"doQuickFix('settings')\">in the settings</a> of Cesium.",SELECT_ACCOUNT_TYPE:"Choose the type of account to create:",MEMBER_ACCOUNT:"Member account",MEMBER_ACCOUNT_TITLE:"Create a member account",MEMBER_ACCOUNT_HELP:"If you are not yet registered as an individual (one account possible per individual).",WALLET_ACCOUNT:"Simple wallet",WALLET_ACCOUNT_TITLE:"Create a wallet",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.",SALT_WARNING:"Choose a 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!",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!",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>",PSEUDO:"Pseudonym",PSEUDO_HELP:"joe123",SALT_CONFIRM:"Confirm",SALT_CONFIRM_HELP:"Confirm the identifier",PASSWORD_CONFIRM:"Confirm",PASSWORD_CONFIRM_HELP:"Confirm the password",SLIDE_6_TITLE:"Confirmation:",COMPUTING_PUBKEY:"Computing...",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>.",CONFIRMATION_MEMBER_ACCOUNT:'<b class="assertive">Warning:</b> your 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?',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?',CHECKING_PSEUDO:"Checking...",PSEUDO_AVAILABLE:"This pseudonym is available",PSEUDO_NOT_AVAILABLE:"This pseudonym is not available",INFO_LICENSE:"To be able to adhere to the currency, we ask you to kindly read and accept this license.",BTN_ACCEPT:"I accept",BTN_ACCEPT_LICENSE:"I accept the license"},POPUP_REGISTER:{TITLE:"Enter a pseudonym",HELP:"A pseudonym is needed to let other members find you."},HEADERS:{TIME:"Date",AMOUNT:"Amount",COMMENT:"Comment"}},TRANSFER:{TITLE:"Transfer",SUB_TITLE:"Transfer money",FROM:"From",TO:"To",AMOUNT:"Amount",AMOUNT_HELP:"Amount",COMMENT:"Comment",COMMENT_HELP:"Comment (optional)",BTN_SEND:"Send",BTN_ADD_COMMENT:"Add comment?",MODAL:{TITLE:"Transfer"}},ERROR:{UNKNOWN_URI_FORMAT:"Unknown URI format",PUBKEY_INVALID_CHECKSUM:"Invalid public key (bad checksum).",POPUP_TITLE:"Error",UNKNOWN_ERROR:"Unknown error",CRYPTO_UNKNOWN_ERROR:"Your browser is not compatible with cryptographic features.",EQUALS_TO_PSEUDO:"Must be different from pseudonym",EQUALS_TO_SALT:"Must be different from secret identifier",FIELD_REQUIRED:"This field is required.",FIELD_TOO_SHORT:"Value is too short (min {{minLength]] characters).",FIELD_TOO_SHORT_WITH_LENGTH:"This field value is too short.",FIELD_TOO_LONG:"Value is exceeding max length.",FIELD_TOO_LONG_WITH_LENGTH:"Value is too long (max {{maxLength}} characters).",FIELD_MIN:"Minimum value: {{min}}",FIELD_MAX:"Maximal value: {{max}}",FIELD_ACCENT:"Commas and accent characters not allowed",FIELD_NOT_NUMBER:"Value is not a number",FIELD_NOT_INT:"Value is not an integer",FIELD_NOT_EMAIL:"Email adress not valid",PASSWORD_NOT_CONFIRMED:"Must match previous password.",SALT_NOT_CONFIRMED:"Must match previous identifier.",SEND_IDENTITY_FAILED:"Error while trying to register.",SEND_CERTIFICATION_FAILED:"Could not certify identity.",NEED_MEMBER_ACCOUNT_TO_CERTIFY:"You could not send certification, because your account is <b>not a member account</b>.",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.",NOT_MEMBER_FOR_CERTIFICATION:"Your account is not a member account yet.",IDENTITY_TO_CERTIFY_HAS_NO_SELF:"This account could not be certified. No registration found, or need to renew.",LOGIN_FAILED:"Error while sign in.",LOAD_IDENTITY_FAILED:"Could not load identity.",LOAD_REQUIREMENTS_FAILED:"Could not load identity requirements.",SEND_MEMBERSHIP_IN_FAILED:"Error while sending registration as member.",SEND_MEMBERSHIP_OUT_FAILED:"Error while sending membership revocation.",REFRESH_WALLET_DATA:"Could not refresh wallet.",GET_CURRENCY_PARAMETER:"Could not get currency parameters.",GET_CURRENCY_FAILED:"Could not load currency. Please retry later.",SEND_TX_FAILED:"Could not send transaction.",ALL_SOURCES_USED:"Please wait the next block computation (All transaction sources has been used).",NOT_ENOUGH_SOURCES:"Not enough changes to send this amount in one time.<br/>Maximum amount: {{amount}} {{unit}}<sub>{{subUnit}}</sub>.",ACCOUNT_CREATION_FAILED:"Error while creating your member account.",RESTORE_WALLET_DATA_ERROR:"Error while reloading settings from local storage",LOAD_WALLET_DATA_ERROR:"Error while loading wallet data.",COPY_CLIPBOARD_FAILED:"Could not copy to clipboard",TAKE_PICTURE_FAILED:"Could not get picture.",SCAN_FAILED:"Could not scan QR code.",SCAN_UNKNOWN_FORMAT:"Code not recognized.",WOT_LOOKUP_FAILED:"Search failed.",LOAD_PEER_DATA_FAILED:"Duniter peer not accessible. Please retry later.",NEED_LOGIN_FIRST:"Please sign in first.",AMOUNT_REQUIRED:"Amount is required.",AMOUNT_NEGATIVE:"Negative amount not allowed.",NOT_ENOUGH_CREDIT:"Not enough credit.",INVALID_NODE_SUMMARY:"Unreachable peer or invalid address",INVALID_USER_ID:"Field 'pseudonym' must not contains spaces or special characters.",INVALID_COMMENT:"Field 'reference' has a bad format.",INVALID_PUBKEY:"Public key has a bad format.",INVALID_PUBKEY_CHECKSUM:"Invalid checksum.",IDENTITY_REVOKED:"This identity <b>has been revoked {{revocationTime|formatFromNow}}</b> ({{revocationTime|formatDate}}). It can no longer become a member.",IDENTITY_PENDING_REVOCATION:"The <b>revocation of this identity</b> has been requested and is awaiting processing. Certification is therefore disabled.",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.",IDENTITY_EXPIRED:"This identity has expired: this person must re-apply <b>before</b> being certified.",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>).",IDENTITY_NOT_FOUND:"Identity not found",IDENTITY_TX_FAILED:"Error while getting identity's transactions",WOT_PENDING_INVALID_BLOCK_HASH:"Membership not valid.",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.",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.",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.",WALLET_HAS_NO_SELF:"Your identity must first have been published, and not expired.",AUTH_REQUIRED:"Authentication required.",AUTH_INVALID_PUBKEY:"The public key does not match the connected account.",AUTH_INVALID_SCRYPT:"Invalid username or password.",AUTH_INVALID_FILE:"Invalid keychain file.",AUTH_FILE_ERROR:"Failed to open keychain file",IDENTITY_ALREADY_CERTIFY:"You have <b>already certified</b> that identity.<br/><br/>Your certificate is still valid (expires {{expiresIn|formatDuration}}).",IDENTITY_ALREADY_CERTIFY_PENDING:"You have <b>already certified</b> that identity.<br/><br/>Your certification is still pending (Deadline for treatment {{expiresIn|formatDuration}}).",UNABLE_TO_CERTIFY_TITLE:"Unable to certify",LOAD_NEWCOMERS_FAILED:"Unable to load new members.",LOAD_PENDING_FAILED:"Unable to load pending registrations.",ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION:"You must <b>be a member</b> in order to perform this action.",ONLY_SELF_CAN_EXECUTE_THIS_ACTION:"You must have <b>published your identity</b> in order to perform this action.",GET_BLOCK_FAILED:"Error while getting block",INVALID_BLOCK_HASH:"Block not found (incorrect hash)",DOWNLOAD_REVOCATION_FAILED:"Error while downloading revocation file.",REVOCATION_FAILED:"Error while trying to revoke the identity.",SALT_OR_PASSWORD_NOT_CONFIRMED:"Wrong identifier or password ",RECOVER_ID_FAILED:"Could not recover password",LOAD_FILE_FAILED:"Unable to load file",NOT_VALID_REVOCATION_FILE:"Invalid revocation file (wrong file format)",NOT_VALID_SAVE_ID_FILE:"Invalid credentials backup file (wrong file format)",NOT_VALID_KEY_FILE:"Invalid keychain file (unrecognized format)",EXISTING_ACCOUNT:"Your identifiers correspond to an already existing account, whose <a ng-click=\"showHelpModal('pubkey')\">public key</a> is:",EXISTING_ACCOUNT_REQUEST:"Please modify your credentials so that they correspond to an unused account.",GET_LICENSE_FILE_FAILED:"Unable to get license file",CHECK_NETWORK_CONNECTION:"No peer appears to be accessible.<br/><br/>Please <b>check your Internet connection</b>."},INFO:{POPUP_TITLE:"Information",CERTIFICATION_DONE:"Identity successfully signed",NOT_ENOUGH_CREDIT:"Not enough credit",TRANSFER_SENT:"Transfer request successfully sent",COPY_TO_CLIPBOARD_DONE:"Copy succeeded",MEMBERSHIP_OUT_SENT:"Membership revocation sent",NOT_NEED_MEMBERSHIP:"Already a member.",IDENTITY_WILL_MISSING_CERTIFICATIONS:"This identity will soon lack certification (at least {{willNeedCertificationCount}}).",REVOCATION_SENT:"Revocation sent successfully",REVOCATION_SENT_WAITING_PROCESS:"Revocation <b>has been sent successfully</b>. It is awaiting processing.",FEATURES_NOT_IMPLEMENTED:"This features is not implemented yet.<br/><br/>Why not to contribute to get it faster? ;)",EMPTY_TX_HISTORY:"No operations to export"},CONFIRM:{POPUP_TITLE:"<b>Confirmation</b>",POPUP_WARNING_TITLE:"<b>Warning</b>",POPUP_SECURITY_WARNING_TITLE:'<i class="icon ion-alert-circled"></i> <b>Security warning</b>',CERTIFY_RULES_TITLE_UID:"Certify {{uid}}",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?',FULLSCREEN:"View the application in full screen?",EXIT_APP:"Close the application ?",LOGIN_UNUSED_WALLET_TITLE:"Typing error?",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/>.",SAVE_BEFORE_LEAVE:"Do you want to <b>save your changes</b> before leaving the page?",SAVE_BEFORE_LEAVE_TITLE:"Changes not saved",LOGOUT:"Are you sure you want to logout?",USE_FALLBACK_NODE:"Peer <b>{{old}}</b> unreachable or invalid address.<br/><br/>Do you want to temporarily use the <b>{{new}}</b> node?"},HELP:{TITLE:"Online help",JOIN:{SECTION:"Join",SALT:'The 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 identifier must be sufficiently long (8 characters at the very least) and as original as possible.',PASSWORD:"The password is very important. Together with the 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."},GLOSSARY:{SECTION:"Glossary",PUBKEY_DEF:"A public key always identifies a wallet. It may identify a member. In Cesium it is calculated using the identifier and the password.",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.'}}}),e.translations("en",{COMMON:{APP_NAME:"ğ<b>change</b>",APP_VERSION:"v{{version}}",APP_BUILD:"build {{build}}",PUBKEY:"Public key",MEMBER:"Member",BLOCK:"Block",BTN_OK:"OK",BTN_YES:"Yes",BTN_NO:"No",BTN_SEND:"Send",BTN_SEND_MONEY:"Transfer money",BTN_SEND_MONEY_SHORT:"Transfer",BTN_SAVE:"Save",BTN_YES_SAVE:"Yes, Save",BTN_YES_CONTINUE:"Yes, Continue",BTN_SHOW:"Show",BTN_SHOW_PUBKEY:"Show key",BTN_RELATIVE_UNIT:"Display amounts in UD?",BTN_BACK:"Back",BTN_NEXT:"Next",BTN_IMPORT:"Import",BTN_CANCEL:"Cancel",BTN_CLOSE:"Close",BTN_COPY:"Copy",BTN_LATER:"Later",BTN_LOGIN:"Sign In",BTN_LOGOUT:"Logout",BTN_ADD_ACCOUNT:"New Account",BTN_SHARE:"Share",BTN_EDIT:"Edit",BTN_DELETE:"Delete",BTN_ADD:"Add",BTN_SEARCH:"Search",BTN_REFRESH:"Refresh",BTN_RETRY:"Retry",BTN_START:"Start",BTN_CONTINUE:"Continue",BTN_CREATE:"Create",BTN_UNDERSTOOD:"I understand",BTN_OPTIONS:"Options",BTN_HELP_TOUR:"Features tour",BTN_HELP_TOUR_SCREEN:"Discover this screen",BTN_DOWNLOAD:"Download",BTN_DOWNLOAD_ACCOUNT_STATEMENT:"Download account statement",BTN_MODIFY:"Modify",CHOOSE_FILE:"Drag your file<br/>or click to select",DAYS:"days",NO_ACCOUNT_QUESTION:"Not a member yet? Register now!",SEARCH_NO_RESULT:"No result found",LOADING:"Loading...",LOADING_WAIT:"Loading...<br/><small>(Waiting for node availability)</small>",SEARCHING:"Searching...",FROM:"From",TO:"To",COPY:"Copy",LANGUAGE:"Language",UNIVERSAL_DIVIDEND:"Universal dividend",UD:"UD",DATE_PATTERN:"MM/DD/YYYY HH:mm",DATE_FILE_PATTERN:"YYYY-MM-DD",DATE_SHORT_PATTERN:"MM/DD/YY",DATE_MONTH_YEAR_PATTERN:"MM/YYYY",EMPTY_PARENTHESIS:"(empty)",UID:"Pseudonym",ENABLE:"Enabled",DISABLE:"Disabled",RESULTS_LIST:"Results:",RESULTS_COUNT:"{{count}} results",EXECUTION_TIME:"executed in {{duration|formatDurationMs}}",SHOW_VALUES:"Display values openly?",POPOVER_ACTIONS_TITLE:"Options",POPOVER_FILTER_TITLE:"Filters",SHOW_MORE:"Show more",SHOW_MORE_COUNT:"(current limit at {{limit}})",POPOVER_SHARE:{TITLE:"Share",SHARE_ON_TWITTER:"Share on Twitter",SHARE_ON_FACEBOOK:"Share on Facebook",SHARE_ON_DIASPORA:"Share on Diaspora*",SHARE_ON_MASTODON:"Share on Mastodon",INSTANCE_ADDRESS_HELP:"Enter an intance address (ex: https://framapiaf.org):"},FILE:{DATE:"Date:",TYPE:"Type:",SIZE:"Size:",VALIDATING:"Validating..."}},SYSTEM:{PICTURE_CHOOSE_TYPE:"Choose source:",BTN_PICTURE_GALLERY:"Gallery",BTN_PICTURE_CAMERA:"<b>Camera</b>"},MENU:{HOME:"Home",WOT:"Registry",CURRENCY:"Currency",ACCOUNT:"My Account",WALLETS:"My wallets",TRANSFER:"Transfer",SCAN:"Scan",SETTINGS:"Settings",NETWORK:"Network",TRANSACTIONS:"My transactions"},ABOUT:{TITLE:"About",LICENSE:"<b>Free/libre software</b> (License GNU AGPLv3).",LATEST_RELEASE:"There is a <b>newer version</ b> of {{'COMMON.APP_NAME' | translate}} (<b>v{{version}}</b>)",PLEASE_UPDATE:"Please update {{'COMMON.APP_NAME' | translate}} (latest version: <b>v{{version}}</b>)",CODE:"Source code:",OFFICIAL_WEB_SITE:"Official web site:",DEVELOPERS:"Developers:",FORUM:"Forum:",DEV_WARNING:"Warning",DEV_WARNING_MESSAGE:"This application is still in active development.<br/>Please report any issue to us!",DEV_WARNING_MESSAGE_SHORT:"This App is still unstable (still under development).",REPORT_ISSUE:"Report an issue"},HOME:{TITLE:"Cesium",MESSAGE:"Welcome to the {{'COMMON.APP_NAME'|translate}} Application!",MESSAGE_CURRENCY:"Make exchanges in the libre currency {{currency|abbreviate}}!",BTN_CURRENCY:"Explore currency",BTN_ABOUT:"about",BTN_HELP:"Help",REPORT_ISSUE:"Report an issue",NOT_YOUR_ACCOUNT_QUESTION:'You do not own the account <b><i class="ion-key"></i> {{pubkey|formatPubkey}}</b>?',BTN_CHANGE_ACCOUNT:"Disconnect this account",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>.',SHOW_ALL_FEED:"Show all",READ_MORE:"Read more",FEED_SOURCE:"Source"},SETTINGS:{TITLE:"Settings",DISPLAY_DIVIDER:"Display",STORAGE_DIVIDER:"Storage",NETWORK_SETTINGS:"Network",PEER:"Duniter peer address",PEER_SHORT:"Peer address",PEER_CHANGED_TEMPORARY:"Address used temporarily",PERSIST_CACHE:"Keep navigation data (experimental)",PERSIST_CACHE_HELP:"Allows faster navigation, locally retaining the data received, for use from one session to another.",USE_LOCAL_STORAGE:"Enable local storage",USE_LOCAL_STORAGE_HELP:"Allows you to save your settings",ENABLE_HELPTIP:"Enable contextual help tips",ENABLE_UI_EFFECTS:"Enable visual effects",HISTORY_SETTINGS:"Account operations",DISPLAY_UD_HISTORY:"Display produced dividends?",AUTHENTICATION_SETTINGS:"Authentication",REMEMBER_ME:"Remember me ?",REMEMBER_ME_HELP:"Allows to remain identified from one session to another, keeping the public key locally.",PLUGINS_SETTINGS:"Extensions",BTN_RESET:"Restore default values",EXPERT_MODE:"Enable expert mode",EXPERT_MODE_HELP:"Allow to see more details",POPUP_PEER:{TITLE:"Duniter peer",HOST:"Address",HOST_HELP:"Address: server:port",USE_SSL:"Secured?",USE_SSL_HELP:"(SSL Encryption)",BTN_SHOW_LIST:"Peer's list"}},BLOCKCHAIN:{HASH:"Hash: {{hash}}",VIEW:{HEADER_TITLE:"Block #{{number}}-{{hash|formatHash}}",TITLE_CURRENT:"Current block",TITLE:"Block #{{number|formatInteger}}",COMPUTED_BY:"Computed by",SHOW_RAW:"Show raw data",TECHNICAL_DIVIDER:"Technical informations",VERSION:"Format version",HASH:"Computed hash",UNIVERSAL_DIVIDEND_HELP:"Money co-produced by each of the {{membersCount}} members",EMPTY:"Aucune donnée dans ce bloc",POW_MIN:"Minimal difficulty",POW_MIN_HELP:"Difficulty imposed in calculating hash",DATA_DIVIDER:"Data",IDENTITIES_COUNT:"New identities",JOINERS_COUNT:"Joiners",ACTIVES_COUNT:"Renewals",ACTIVES_COUNT_HELP:"Members having renewed their membership",LEAVERS_COUNT:"Leavers",LEAVERS_COUNT_HELP:"Members that now refused certification",EXCLUDED_COUNT:"Excluded members",EXCLUDED_COUNT_HELP:"Old members, excluded because missing membreship renewal or certifications",REVOKED_COUNT:"Revoked identities",REVOKED_COUNT_HELP:"These accounts may no longer be member",TX_COUNT:"Transactions",CERT_COUNT:"Certifications",TX_TO_HIMSELF:"Change",TX_OUTPUT_UNLOCK_CONDITIONS:"Unlock conditions",TX_OUTPUT_OPERATOR:{AND:"and",OR:"or"},TX_OUTPUT_FUNCTION:{SIG:"<b>Sign</b> of the public key",XHX:"<b>Password</b>, including SHA256 =",CSV:"Blocked during",CLTV:"Bloqué until"}},LOOKUP:{TITLE:"Blocks",NO_BLOCK:"No bloc",LAST_BLOCKS:"Last blocks:",BTN_COMPACT:"Compact"}},CURRENCY:{VIEW:{TITLE:"Currency",TAB_CURRENCY:"Currency",TAB_WOT:"Web of trust",TAB_NETWORK:"Network",TAB_BLOCKS:"Blocks",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}}.",NETWORK_RULES_DIVIDER:"Network rules",CURRENCY_NAME:"Currency name",MEMBERS:"Members count",MEMBERS_VARIATION:"Variation since {{duration|formatDuration}} (since last UD)",MONEY_DIVIDER:"Money",MASS:"Monetary mass",SHARE:"Money share",UD:"Universal Dividend",C_ACTUAL:"Current growth",MEDIAN_TIME:"Current blockchain time",POW_MIN:"Common difficulty",MONEY_RULES_DIVIDER:"Rules of currency",C_RULE:"Theoretical growth target",UD_RULE:"Universal dividend (formula)",DT_REEVAL:"Period between two re-evaluation of the UD",REEVAL_SYMBOL:"reeval",DT_REEVAL_VALUE:"Every <b>{{dtReeval|formatDuration}}</b> ({{dtReeval/86400}} {{'COMMON.DAYS'|translate}})",UD_REEVAL_TIME0:"Date of first reevaluation of the UD",SIG_QTY_RULE:"Required number of certifications to become a member",SIG_STOCK:"Maximum number of certifications sent by a member",SIG_PERIOD:"Minimum delay between 2 certifications sent by one and the same issuer.",SIG_WINDOW:"Maximum delay before a certification will be treated",SIG_VALIDITY:"Lifetime of a certification that has been treated",MS_WINDOW:"Maximum delay before a pending membership will be treated",MS_VALIDITY:"Lifetime of a membership that has been treated",STEP_MAX:"Maximum distance between a newcomer and each referring members.",WOT_RULES_DIVIDER:"Rules for web of trust",SENTRIES:"Required number of certifications (given <b>and</b> received) to become a referring member",SENTRIES_FORMULA:"Required number of certifications to become a referring member (formula)",XPERCENT:"Minimum percent of referring member to reach to match the distance rule",AVG_GEN_TIME:"The average time between 2 blocks",CURRENT:"current",MATH_CEILING:"CEILING",DISPLAY_ALL_RULES:"Display all rules?",BTN_SHOW_LICENSE:"Show license",WOT_DIVIDER:"Web of trust"},LICENSE:{TITLE:"Currency license",BTN_DOWNLOAD:"Download file",NO_LICENSE_FILE:"License file not found."}},NETWORK:{VIEW:{MEDIAN_TIME:"Blockchain time",LOADING_PEERS:"Loading peers...",NODE_ADDRESS:"Address:",SOFTWARE:"Software:",WARN_PRE_RELEASE:"Pre-release (latest stable: <b>{{version}}</b>)",WARN_NEW_RELEASE:"Version <b>{{version}}</b> available",WS2PID:"Identifier:",PRIVATE_ACCESS:"Private access",POW_PREFIX:"Proof of work prefix:",ENDPOINTS:{BMAS:"Secure endpoint (SSL)",BMATOR:"TOR endpoint",WS2P:"WS2P endpoint",ES_USER_API:"Cesium+ data node"}},INFO:{ONLY_SSL_PEERS:"Non-SSL nodes have a degraded display because Cesium works in HTTPS mode."}},PEER:{PEERS:"Peers",SIGNED_ON_BLOCK:"Signed on block",MIRROR:"mirror",MIRRORS:"Mirrors",MIRROR_PEERS:"Mirror peers",PEER_LIST:"Peer's list",MEMBERS:"Members",MEMBER_PEERS:"Member peers",ALL_PEERS:"All peers",DIFFICULTY:"Difficulty",API:"API",CURRENT_BLOCK:"Block #",POPOVER_FILTER_TITLE:"Filter",OFFLINE:"Offline",OFFLINE_PEERS:"Offline peers",BTN_SHOW_PEER:"Show peer",VIEW:{TITLE:"Peer",OWNER:"Owned by ",SHOW_RAW_PEERING:"See peering document",SHOW_RAW_CURRENT_BLOCK:"See current block (raw format)",LAST_BLOCKS:"Last blocks",KNOWN_PEERS:"Known peers :",GENERAL_DIVIDER:"General information",ERROR:{LOADING_TOR_NODE_ERROR:"Could not get peer data, using the TOR network.",LOADING_NODE_ERROR:"Could not get peer data"}}},WOT:{SEARCH_HELP:"Search (name, hashtag)",SEARCH_INIT_PHASE_WARNING:"During the pre-registration phase, the search for pending registrations <b>may be long</b>. Please wait ...",REGISTERED_SINCE:"Registered on",REGISTERED_SINCE_BLOCK:"Registered since block #",NO_CERTIFICATION:"No validated certification",NO_GIVEN_CERTIFICATION:"No given certification",NOT_MEMBER_PARENTHESIS:"(non-member)",IDENTITY_REVOKED_PARENTHESIS:"(identity revoked)",MEMBER_PENDING_REVOCATION_PARENTHESIS:"(being revoked)",EXPIRE_IN:"Expires",NOT_WRITTEN_EXPIRE_IN:"Deadline<br/>treatment",EXPIRED:"Expired",PSEUDO:"Pseudonym",SIGNED_ON_BLOCK:"Emitted on block #{{block}}",WRITTEN_ON_BLOCK:"Written on block #{{block}}",GENERAL_DIVIDER:"General information",NOT_MEMBER_ACCOUNT:"Non-member account",NOT_MEMBER_ACCOUNT_HELP:"This is a simple wallet, with no pending membership application.",TECHNICAL_DIVIDER:"Technical data",BTN_CERTIFY:"Certify",BTN_YES_CERTIFY:"Yes, certify",BTN_SELECT_AND_CERTIFY:"New certification",ACCOUNT_OPERATIONS:"Account operations",VIEW:{POPOVER_SHARE_TITLE:"Identity {{title}}"},LOOKUP:{TITLE:"Registry",NEWCOMERS:"New members:",NEWCOMERS_COUNT:"{{count}} members",PENDING:"Pending registrations:",PENDING_COUNT:"{{count}} pending registrations",REGISTERED:"Registered {{time | formatFromNow}}",MEMBER_FROM:"Member since {{time|formatFromNowShort}}",BTN_NEWCOMERS:"Latest members",BTN_PENDING:"Pending registrations",SHOW_MORE:"Show more",SHOW_MORE_COUNT:"(current limit to {{limit}})",NO_PENDING:"No pending registrations.",NO_NEWCOMERS:"No members."},CONTACTS:{TITLE:"Contacts"},MODAL:{TITLE:"Search"},CERTIFICATIONS:{TITLE:"{{uid}} - Certifications",SUMMARY:"Received certifications",LIST:"Details of received certifications",PENDING_LIST:"Pending certifications",RECEIVED:"Received certifications",RECEIVED_BY:"Certifications received by {{uid}}",ERROR:"Received certifications in error",SENTRY_MEMBER:"Referring member"},OPERATIONS:{TITLE:"{{uid}} - Operations"},GIVEN_CERTIFICATIONS:{TITLE:"{{uid}} - Certifications sent",SUMMARY:"Sent certifications",LIST:"Details of sent certifications",PENDING_LIST:"Pending certifications",SENT:"Sent certifications",SENT_BY:"Certifications sent by {{uid}}",ERROR:"Sent certifications with error"}},LOGIN:{TITLE:'<i class="icon ion-log-in"></i> Login',SCRYPT_FORM_HELP:"Please enter your credentials. <br> Remember to check the public key for your account.",PUBKEY_FORM_HELP:"Please enter a public account key:",FILE_FORM_HELP:"Choose the keychain file to use:",SCAN_FORM_HELP:"Scan the QR code of a wallet.",SALT:"Identifier",SALT_HELP:"Identifier",SHOW_SALT:"Display identifier?",PASSWORD:"Password",PASSWORD_HELP:"Password",PUBKEY_HELP:"Example: « AbsxSY4qoZRzyV2irfep1V9xw1EMNyKJw2TkuVD4N1mv »",NO_ACCOUNT_QUESTION:"Don't have an account yet?",HAVE_ACCOUNT_QUESTION:"Already have an account ?",CREATE_ACCOUNT:"Create an account",CREATE_FREE_ACCOUNT:"Create a free account",FORGOTTEN_ID:"Forgot password?",ASSOCIATED_PUBKEY:"Public key :",BTN_METHODS:"Other methods",BTN_METHODS_DOTS:"Change method...",METHOD_POPOVER_TITLE:"Methods",MEMORIZE_AUTH_FILE:"Memorize this keychain during the navigation session",SCRYPT_PARAMETERS:"Paramètres (Scrypt) :",AUTO_LOGOUT:{TITLE:"Information",MESSAGE:'<i class="ion-android-time"></i> You were <b>logout</ b> automatically, due to prolonged inactivity.',BTN_RELOGIN:"Sign In",IDLE_WARNING:"You will be logout... {{countdown}}"},METHOD:{SCRYPT_DEFAULT:"Secret and password",SCRYPT_ADVANCED:"Advanced salt",FILE:"Keychain file",PUBKEY:"Public key only",SCAN:"Scan a QR code"},SCRYPT:{SIMPLE:"Light salt",DEFAULT:"Standard salt",SECURE:"Secure salt",HARDEST:"Hardest salt",EXTREME:"Extreme salt",USER:"Personal value",N:"N (Loop):",r:"r (RAM):",p:"p (CPU):"},FILE:{DATE:"Date:",TYPE:"Type:",SIZE:"Size:",VALIDATING:"Validating...",HELP:"Expected file format: <b>.dunikey</b> (type PubSec). Other formats are under development (EWIF, WIF)."}},ACCOUNT:{TITLE:"My Account",SHOW_MORE_TX:"Show more",SHOW_ALL_TX:"Show all",EVENTS:"Events",BTN_RECEIVE_MONEY:"Receive",BTN_SECURITY_DOTS:"Sign-in and security...",BTN_SHOW_DETAILS:"Display technical data",NEW:{TITLE:"Registration",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.).",INTRO_WARNING_SECURITY:"Check that the hardware you are currently using (computer, tablet, phone) <b>is secure and trustworthy </b>.",INTRO_WARNING_SECURITY_HELP:"Up-to-date anti-virus, firewall enabled, session protected by password or pin code...",INTRO_HELP:"Click <b> {{'COMMON.BTN_START'|translate}}</b> to begin creating an account. You will be guided step by step.",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.",REGISTRATION_NODE_HELP:"If you do not trust this peer, please change <a ng-click=\"doQuickFix('settings')\">in the settings</a> of Cesium.",SELECT_ACCOUNT_TYPE:"Choose the type of account to create:",MEMBER_ACCOUNT:"Member account",MEMBER_ACCOUNT_TITLE:"Create a member account",MEMBER_ACCOUNT_HELP:"If you are not yet registered as an individual (one account possible per individual).",WALLET_ACCOUNT:"Simple wallet",WALLET_ACCOUNT_TITLE:"Create a wallet",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.",SALT_WARNING:"Choose a 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!",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!",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>",PSEUDO:"Pseudonym",PSEUDO_HELP:"joe123",SALT_CONFIRM:"Confirm",SALT_CONFIRM_HELP:"Confirm the identifier",PASSWORD_CONFIRM:"Confirm",PASSWORD_CONFIRM_HELP:"Confirm the password",SLIDE_6_TITLE:"Confirmation:",COMPUTING_PUBKEY:"Computing...",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>.",CONFIRMATION_MEMBER_ACCOUNT:'<b class="assertive">Warning:</b> your 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?',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?',CHECKING_PSEUDO:"Checking...",PSEUDO_AVAILABLE:"This pseudonym is available",PSEUDO_NOT_AVAILABLE:"This pseudonym is not available",INFO_LICENSE:"To be able to adhere to the currency, we ask you to kindly read and accept this license.",BTN_ACCEPT:"I accept",BTN_ACCEPT_LICENSE:"I accept the license"},POPUP_REGISTER:{TITLE:"Enter a pseudonym",HELP:"A pseudonym is needed to let other members find you."},HEADERS:{TIME:"Date",AMOUNT:"Amount",COMMENT:"Comment"}},TRANSFER:{TITLE:"Transfer",SUB_TITLE:"Transfer money",FROM:"From",TO:"To",AMOUNT:"Amount",AMOUNT_HELP:"Amount",COMMENT:"Comment",COMMENT_HELP:"Comment (optional)",BTN_SEND:"Send",BTN_ADD_COMMENT:"Add comment?",MODAL:{TITLE:"Transfer"}},ERROR:{UNKNOWN_URI_FORMAT:"Unknown URI format",PUBKEY_INVALID_CHECKSUM:"Invalid public key (bad checksum).",POPUP_TITLE:"Error",UNKNOWN_ERROR:"Unknown error",CRYPTO_UNKNOWN_ERROR:"Your browser is not compatible with cryptographic features.",EQUALS_TO_PSEUDO:"Must be different from pseudonym",EQUALS_TO_SALT:"Must be different from secret identifier",FIELD_REQUIRED:"This field is required.",FIELD_TOO_SHORT:"Value is too short (min {{minLength]] characters).",FIELD_TOO_SHORT_WITH_LENGTH:"This field value is too short.",FIELD_TOO_LONG:"Value is exceeding max length.",FIELD_TOO_LONG_WITH_LENGTH:"Value is too long (max {{maxLength}} characters).",FIELD_MIN:"Minimum value: {{min}}",FIELD_MAX:"Maximal value: {{max}}",FIELD_ACCENT:"Commas and accent characters not allowed",FIELD_NOT_NUMBER:"Value is not a number",FIELD_NOT_INT:"Value is not an integer",FIELD_NOT_EMAIL:"Email adress not valid",PASSWORD_NOT_CONFIRMED:"Must match previous password.",SALT_NOT_CONFIRMED:"Must match previous identifier.",SEND_IDENTITY_FAILED:"Error while trying to register.",SEND_CERTIFICATION_FAILED:"Could not certify identity.",NEED_MEMBER_ACCOUNT_TO_CERTIFY:"You could not send certification, because your account is <b>not a member account</b>.",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.",NOT_MEMBER_FOR_CERTIFICATION:"Your account is not a member account yet.",IDENTITY_TO_CERTIFY_HAS_NO_SELF:"This account could not be certified. No registration found, or need to renew.",LOGIN_FAILED:"Error while sign in.",LOAD_IDENTITY_FAILED:"Could not load identity.",LOAD_REQUIREMENTS_FAILED:"Could not load identity requirements.",SEND_MEMBERSHIP_IN_FAILED:"Error while sending registration as member.",SEND_MEMBERSHIP_OUT_FAILED:"Error while sending membership revocation.",REFRESH_WALLET_DATA:"Could not refresh wallet.",GET_CURRENCY_PARAMETER:"Could not get currency parameters.",GET_CURRENCY_FAILED:"Could not load currency. Please retry later.",SEND_TX_FAILED:"Could not send transaction.",ALL_SOURCES_USED:"Please wait the next block computation (All transaction sources has been used).",NOT_ENOUGH_SOURCES:"Not enough changes to send this amount in one time.<br/>Maximum amount: {{amount}} {{unit}}<sub>{{subUnit}}</sub>.",ACCOUNT_CREATION_FAILED:"Error while creating your member account.",RESTORE_WALLET_DATA_ERROR:"Error while reloading settings from local storage",LOAD_WALLET_DATA_ERROR:"Error while loading wallet data.",COPY_CLIPBOARD_FAILED:"Could not copy to clipboard",TAKE_PICTURE_FAILED:"Could not get picture.",SCAN_FAILED:"Could not scan QR code.",SCAN_UNKNOWN_FORMAT:"Code not recognized.",WOT_LOOKUP_FAILED:"Search failed.",LOAD_PEER_DATA_FAILED:"Duniter peer not accessible. Please retry later.",NEED_LOGIN_FIRST:"Please sign in first.",AMOUNT_REQUIRED:"Amount is required.",AMOUNT_NEGATIVE:"Negative amount not allowed.",NOT_ENOUGH_CREDIT:"Not enough credit.",INVALID_NODE_SUMMARY:"Unreachable peer or invalid address",INVALID_USER_ID:"Field 'pseudonym' must not contains spaces or special characters.",INVALID_COMMENT:"Field 'reference' has a bad format.",INVALID_PUBKEY:"Public key has a bad format.",INVALID_PUBKEY_CHECKSUM:"Invalid checksum.",IDENTITY_REVOKED:"This identity <b>has been revoked {{revocationTime|formatFromNow}}</b> ({{revocationTime|formatDate}}). It can no longer become a member.",IDENTITY_PENDING_REVOCATION:"The <b>revocation of this identity</b> has been requested and is awaiting processing. Certification is therefore disabled.",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.",IDENTITY_EXPIRED:"This identity has expired: this person must re-apply <b>before</b> being certified.",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>).",IDENTITY_NOT_FOUND:"Identity not found",IDENTITY_TX_FAILED:"Error while getting identity's transactions",WOT_PENDING_INVALID_BLOCK_HASH:"Membership not valid.",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.",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.",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.",WALLET_HAS_NO_SELF:"Your identity must first have been published, and not expired.",AUTH_REQUIRED:"Authentication required.",AUTH_INVALID_PUBKEY:"The public key does not match the connected account.",AUTH_INVALID_SCRYPT:"Invalid username or password.",AUTH_INVALID_FILE:"Invalid keychain file.",AUTH_FILE_ERROR:"Failed to open keychain file",IDENTITY_ALREADY_CERTIFY:"You have <b>already certified</b> that identity.<br/><br/>Your certificate is still valid (expires {{expiresIn|formatDuration}}).",IDENTITY_ALREADY_CERTIFY_PENDING:"You have <b>already certified</b> that identity.<br/><br/>Your certification is still pending (Deadline for treatment {{expiresIn|formatDuration}}).",UNABLE_TO_CERTIFY_TITLE:"Unable to certify",LOAD_NEWCOMERS_FAILED:"Unable to load new members.",LOAD_PENDING_FAILED:"Unable to load pending registrations.",ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION:"You must <b>be a member</b> in order to perform this action.",ONLY_SELF_CAN_EXECUTE_THIS_ACTION:"You must have <b>published your identity</b> in order to perform this action.",GET_BLOCK_FAILED:"Error while getting block",INVALID_BLOCK_HASH:"Block not found (incorrect hash)",DOWNLOAD_REVOCATION_FAILED:"Error while downloading revocation file.",REVOCATION_FAILED:"Error while trying to revoke the identity.",SALT_OR_PASSWORD_NOT_CONFIRMED:"Wrong identifier or password ",RECOVER_ID_FAILED:"Could not recover password",LOAD_FILE_FAILED:"Unable to load file",NOT_VALID_REVOCATION_FILE:"Invalid revocation file (wrong file format)",NOT_VALID_SAVE_ID_FILE:"Invalid credentials backup file (wrong file format)",NOT_VALID_KEY_FILE:"Invalid keychain file (unrecognized format)",EXISTING_ACCOUNT:"Your identifiers correspond to an already existing account, whose <a ng-click=\"showHelpModal('pubkey')\">public key</a> is:",EXISTING_ACCOUNT_REQUEST:"Please modify your credentials so that they correspond to an unused account.",GET_LICENSE_FILE_FAILED:"Unable to get license file",CHECK_NETWORK_CONNECTION:"No peer appears to be accessible.<br/><br/>Please <b>check your Internet connection</b>."},INFO:{POPUP_TITLE:"Information",CERTIFICATION_DONE:"Identity successfully signed",NOT_ENOUGH_CREDIT:"Not enough credit",TRANSFER_SENT:"Transfer request successfully sent",COPY_TO_CLIPBOARD_DONE:"Copy succeeded",MEMBERSHIP_OUT_SENT:"Membership revocation sent",NOT_NEED_MEMBERSHIP:"Already a member.",IDENTITY_WILL_MISSING_CERTIFICATIONS:"This identity will soon lack certification (at least {{willNeedCertificationCount}}).",REVOCATION_SENT:"Revocation sent successfully",REVOCATION_SENT_WAITING_PROCESS:"Revocation <b>has been sent successfully</b>. It is awaiting processing.",FEATURES_NOT_IMPLEMENTED:"This features is not implemented yet.<br/><br/>Why not to contribute to get it faster? ;)",EMPTY_TX_HISTORY:"No operations to export"},CONFIRM:{POPUP_TITLE:"<b>Confirmation</b>",POPUP_WARNING_TITLE:"<b>Warning</b>",POPUP_SECURITY_WARNING_TITLE:'<i class="icon ion-alert-circled"></i> <b>Security warning</b>',CERTIFY_RULES_TITLE_UID:"Certify {{uid}}",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?',FULLSCREEN:"View the application in full screen?",EXIT_APP:"Close the application ?",LOGIN_UNUSED_WALLET_TITLE:"Typing error?",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/>.",SAVE_BEFORE_LEAVE:"Do you want to <b>save your changes</b> before leaving the page?",SAVE_BEFORE_LEAVE_TITLE:"Changes not saved",LOGOUT:"Are you sure you want to logout?",USE_FALLBACK_NODE:"Peer <b>{{old}}</b> unreachable or invalid address.<br/><br/>Do you want to temporarily use the <b>{{new}}</b> node?"},HELP:{TITLE:"Online help",JOIN:{SECTION:"Join",SALT:'The 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 identifier must be sufficiently long (8 characters at the very least) and as original as possible.',PASSWORD:"The password is very important. Together with the 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."},GLOSSARY:{SECTION:"Glossary",PUBKEY_DEF:"A public key always identifies a wallet. It may identify a member. In Cesium it is calculated using the identifier and the password.",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.'}}}),e.translations("eo-EO",{COMMON:{APP_NAME:"ğ<b>change</b>",APP_VERSION:"v{{version}}",APP_BUILD:"dato: {{build}}",PUBKEY:"Publika ŝlosilo",MEMBER:"Membro",BLOCK:"Bloko",BTN_OK:"OK",BTN_YES:"Jes",BTN_NO:"Ne",BTN_SEND:"Sendi",BTN_SEND_MONEY:"Fari elspezon",BTN_SEND_MONEY_SHORT:"Elspezo",BTN_SAVE:"Konservi",BTN_YES_SAVE:"Jes, Konservi",BTN_YES_CONTINUE:"Jes, Daŭrigi",BTN_SHOW:"Vidi",BTN_SHOW_PUBKEY:"Afiŝi la publikan ŝlosilon",BTN_RELATIVE_UNIT:"Afiŝi la sumojn en UD?",BTN_BACK:"Reiro",BTN_NEXT:"Sekva",BTN_IMPORT:"Enporti",BTN_CANCEL:"Nuligi",BTN_CLOSE:"Fermi",BTN_COPY:"Kopii",BTN_LATER:"Poste",BTN_LOGIN:"Konektiĝi",BTN_LOGOUT:"Malkonektiĝo",BTN_ADD_ACCOUNT:"Nova konto",BTN_SHARE:"Diskonigi",BTN_EDIT:"Modifi",BTN_DELETE:"Forigi",BTN_ADD:"Aldoni",BTN_SEARCH:"Traserĉi",BTN_REFRESH:"Aktualigi",BTN_RETRY:"Rekomenci",BTN_START:"Komenci",BTN_CONTINUE:"Daŭrigi",BTN_CREATE:"Krei",BTN_UNDERSTOOD:"Mi komprenis",BTN_OPTIONS:"Kromeblecoj",BTN_HELP_TOUR:"Gvidata vizito",BTN_HELP_TOUR_SCREEN:"Malkovri tiun ĉi paĝon",BTN_DOWNLOAD:"Elŝuti",BTN_DOWNLOAD_ACCOUNT_STATEMENT:"Elŝuti la konto-tabelon",BTN_MODIFY:"Modifi",CHOOSE_FILE:"Almetu vian dosieron <br/>aŭ klaku por selekti ĝin",DAYS:"tagoj",NO_ACCOUNT_QUESTION:"Ankoraŭ sen konto? Kreu ĝin senpage!",SEARCH_NO_RESULT:"Neniu rezulto trovita",LOADING:"Bonvolu pacienci...",LOADING_WAIT:"Bonvolu pacienci...<br/><small>(ğchange petadas la reton)</small>",SEARCHING:"Serĉanta...",FROM:"De",TO:"Al",COPY:"Kopii",LANGUAGE:"Lingvo",UNIVERSAL_DIVIDEND:"Universala dividendo",UD:"UD",DATE_PATTERN:"DD/MM/YY HH:mm",DATE_FILE_PATTERN:"YYYY-MM-DD",DATE_SHORT_PATTERN:"DD/MM/YY",DATE_MONTH_YEAR_PATTERN:"MM/YYYY",EMPTY_PARENTHESIS:"(malplena)",UID:"Pseŭdonimo",ENABLE:"Aktiva",DISABLE:"Malaktiva",RESULTS_LIST:"Rezultoj",RESULTS_COUNT:"{{count}} rezultoj",EXECUTION_TIME:"plenumita en {{duration|formatDurationMs}}",SHOW_VALUES:"Afiŝi la signojn klare?",POPOVER_ACTIONS_TITLE:"Kromeblecoj",POPOVER_FILTER_TITLE:"Filtriloj",SHOW_MORE:"Afiŝi pli",SHOW_MORE_COUNT:"(nuna limo je {{limit}})",POPOVER_SHARE:{TITLE:"Diskonigi",SHARE_ON_TWITTER:"Diskonigi ĉe Twitter",SHARE_ON_FACEBOOK:"Diskonigi ĉe Facebook",SHARE_ON_DIASPORA:"Diskonigi ĉe Diaspora*",SHARE_ON_MASTODON:"Diskonigi ĉe Mastodon",INSTANCE_ADDRESS_HELP:"Tajpi la retligon (ekzemple: https://framapiaf.org):"},FILE:{DATE:"Dato:",TYPE:"Tipo:",SIZE:"Amplekso:",VALIDATING:"Validiĝanta..."}},SYSTEM:{PICTURE_CHOOSE_TYPE:"Elekti la fonton:",BTN_PICTURE_GALLERY:"Bildaro",BTN_PICTURE_CAMERA:"<b>Kamerao</b>"},MENU:{HOME:"Hejmpaĝo",WOT:"Kontaro",CURRENCY:"Mono",ACCOUNT:"Mia konto",WALLETS:"Miaj monujoj",TRANSFER:"Elspezo",SCAN:"Skani",SETTINGS:"Parametroj",NETWORK:"Reto",TRANSACTIONS:"Miaj spezoj"},ABOUT:{TITLE:"Prie",LICENSE:"Programo <b>libera</b> (licenco GNU AGPLv3).",LATEST_RELEASE:"Ekzistas <b>pli freŝdata versio</b> de {{'COMMON.APP_NAME'|translate}} (<b>v{{version}}</b>)",PLEASE_UPDATE:"Bonvolu ĝisdatigi {{'COMMON.APP_NAME'|translate}} (lasta versio: <b>v{{version}}</b>)",CODE:"Fonto-kodo:",OFFICIAL_WEB_SITE:"Oficiala retejo:",DEVELOPERS:"Programita de:",FORUM:"Forumo:",DEV_WARNING:"Averto",DEV_WARNING_MESSAGE:"Tiu ĉi programo daŭre estas programiĝanta.<br/>Ne hezitu sciigi al ni la renkontitajn fuŝaĵojn!",DEV_WARNING_MESSAGE_SHORT:"Tiu ĉi programo daŭre estas programiĝanta.",REPORT_ISSUE:"Sciigi problemon"},HOME:{TITLE:"ğ<b>change</b>",MESSAGE:"Bonvenon ĉe ğ<b>change</b>!",MESSAGE_CURRENCY:"Interŝanĝi <b>tra la mondo</b> per {{currency|abbreviate}} fariĝas... tre simple!",BTN_CURRENCY:"Esplori la monon {{name|abbreviate}}",BTN_ABOUT:"Prie",BTN_HELP:"Ret-helpo",REPORT_ISSUE:"fuŝaĵo",NOT_YOUR_ACCOUNT_QUESTION:"Vi ne posedas la konton<br/><b>{{name|| (pubkey|formatPubkey) }}</b> ?",BTN_CHANGE_ACCOUNT:"Malkonektu tiun ĉi konton",CONNECTION_ERROR:'Nodo <b>{{server}}</b> neatingebla por aliri la monon, aŭ adreso nevalida.<br/><br/>Kontrolu vian retkonekton, aŭ ŝanĝu nodon <a class="positive" ng-click="doQuickFix(\'settings\')">ĉe la parametroj</a>.',SHOW_ALL_FEED:"Vidi ĉion",READ_MORE:"Legi la sekvon",FEED_SOURCE:"Fonto"},SETTINGS:{TITLE:"Parametroj",DISPLAY_DIVIDER:"Afiŝado",STORAGE_DIVIDER:"Stokado",NETWORK_SETTINGS:"Reto",PEER:"Adreso de la nodo Duniter",PEER_SHORT:"Adreso de la nodo",PEER_CHANGED_TEMPORARY:"Adreso provizore uzata",PERSIST_CACHE:"Konservi la datenojn pri retumado (provaĵo)",PERSIST_CACHE_HELP:"Ebligas pli rapidan retumadon, loke konservante la ricevitajn datenojn, por uzi ilin de seanco al alia.",USE_LOCAL_STORAGE:"Aktivigi lokan stokadon",USE_LOCAL_STORAGE_HELP:"Ebligas konservi viajn parametrojn",ENABLE_HELPTIP:"Aktivigi la rilatigajn help-vezikojn",ENABLE_UI_EFFECTS:"Aktivigi la vid-efikojn",HISTORY_SETTINGS:"Miaj spezoj",DISPLAY_UD_HISTORY:"Afiŝi la produktitajn dividendojn?",AUTHENTICATION_SETTINGS:"Aŭtentigado",REMEMBER_ME:"Memori min?",REMEMBER_ME_HELP:"Ebligas resti ĉiam konektita.",PLUGINS_SETTINGS:"Krom-programoj",BTN_RESET:"Restarigi la originajn valorojn",EXPERT_MODE:"Aktivigi la spertan moduson",EXPERT_MODE_HELP:"Ebligas pli detalan afiŝadon",POPUP_PEER:{TITLE:"Nodo Duniter",HOST:"Adreso",HOST_HELP:"Adreso : servilo:konektujo",USE_SSL:"Sekurigita?",USE_SSL_HELP:"(SSL-ĉifrado)",BTN_SHOW_LIST:"Listo de la nodoj"}},BLOCKCHAIN:{HASH:"Haketo: {{hash}}",VIEW:{HEADER_TITLE:"Bloko #{{number}}-{{hash|formatHash}}",TITLE_CURRENT:"Nuna bloko",TITLE:"Bloko #{{number|formatInteger}}",COMPUTED_BY:"Kalkulita de la nodo de",SHOW_RAW:"Vidi la kompletan dosieron",TECHNICAL_DIVIDER:"Teknikaj informoj",VERSION:"Versio de la daten-strukturo",HASH:"Kalkulita haketo",UNIVERSAL_DIVIDEND_HELP:"Mono kunproduktita de ĉiu el la {{membersCount}} membroj",EMPTY:"Neniu dateno en tiu ĉi bloko",POW_MIN:"Minimuma malfacileco",POW_MIN_HELP:"Malfacileco trudita por la haket-kalkulo",DATA_DIVIDER:"Darenoj",IDENTITIES_COUNT:"Novaj identecoj",JOINERS_COUNT:"Novaj membroj",ACTIVES_COUNT:"Revalidigoj",ACTIVES_COUNT_HELP:"Membroj revalidigintaj sian membrecon",LEAVERS_COUNT:"Membroj elirintaj",LEAVERS_COUNT_HELP:"Membroj ne plu dezirantaj atestaĵon",EXCLUDED_COUNT:"Membroj eksigitaj",EXCLUDED_COUNT_HELP:"Malnovaj membroj eksigitaj pro nerevalidiĝo aŭ manko de atestaĵoj",REVOKED_COUNT:"Nuligitaj identecoj",REVOKED_COUNT_HELP:"Tiuj kontoj ne plu povos esti membroj",TX_COUNT:"Spezoj",CERT_COUNT:"Atestaĵoj",TX_TO_HIMSELF:"Operacio pri monŝanĝo",TX_OUTPUT_UNLOCK_CONDITIONS:"Kondiĉoj por malblokado",TX_OUTPUT_OPERATOR:{AND:"kaj",OR:"aŭ"},TX_OUTPUT_FUNCTION:{SIG:"<b>Subskribo</b> de ",XHX:"<b>Pasvorto</b>, el kiu SHA256 =",CSV:"Blokita dum",CLTV:"Blokita ĝis"}},LOOKUP:{TITLE:"Blokoj",NO_BLOCK:"Neniu bloko",LAST_BLOCKS:"Lastaj blokoj:",BTN_COMPACT:"Densigi"}},CURRENCY:{VIEW:{TITLE:"Mono",TAB_CURRENCY:"Mono",TAB_WOT:"Reto de fido",TAB_NETWORK:"Reto",TAB_BLOCKS:"Blokoj",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.",NETWORK_RULES_DIVIDER:"Reguloj de la reto",CURRENCY_NAME:"Nomo de la mono",MEMBERS:"Nombro de membroj",MEMBERS_VARIATION:"Variado post la lasta UD",MONEY_DIVIDER:"Mono",MASS:"Mona maso",SHARE:"Maso por membro",UD:"Universala dividendo",C_ACTUAL:"Nuna kreskado",MEDIAN_TIME:"Horo de la blokĉeno",POW_MIN:"Minimuma nivelo pri malfacileco de kalkulo",MONEY_RULES_DIVIDER:"Reguloj de la mono",C_RULE:"Teoria kreskado celata",UD_RULE:"Kalkulo de la universala dividendo",DT_REEVAL:"Periodo de revalorigo de la UD",REEVAL_SYMBOL:"reval",DT_REEVAL_VALUE:"Ĉiuj <b>{{dtReeval|formatDuration}}</b> ({{dtReeval/86400}} {{'COMMON.DAYS'|translate}})",UD_REEVAL_TIME0:"Dato de la unua revalorigo",SIG_QTY_RULE:"Nombro de necesaj atestaĵoj por fariĝi membro",SIG_STOCK:"Maksimuma nombro da senditaj atestaĵoj por membro",SIG_PERIOD:"Minimuma daŭro de atendado inter 2 sinsekvaj atestaĵoj senditaj de sama persono",SIG_WINDOW:"Limdaŭro por akcepti atestaĵon",SIG_VALIDITY:"Vivdaŭro de atestaĵo, kiu estis akceptita",MS_WINDOW:"Limdaŭro por akcepti aliĝ-peton kiel membron",MS_VALIDITY:"Vivdaŭro de aliĝo, kiu estis akceptita",STEP_MAX:"Maksimuma distanco, per la atestaĵoj, inter nova eniranto kaj la referencaj membroj",WOT_RULES_DIVIDER:"Reguloj de la reto de fido",SENTRIES:"Nombro de atestaĵoj (senditaj <b>kaj</b> ricevitaj) por fariĝi referenca membro",SENTRIES_FORMULA:"Nombro de atestaĵoj (senditaj <b>kaj</b> ricevitaj) por fariĝi referenca membro (formulo)",XPERCENT:"Minimuma procento da referencaj membroj atingenda por konformiĝi al la regulo pri distanco",AVG_GEN_TIME:"Meza daŭro inter du blokoj",CURRENT:"nuna",MATH_CEILING:"PLAFONO",DISPLAY_ALL_RULES:"Afiŝi ĉiujn regulojn?",BTN_SHOW_LICENSE:"Vidi la licencon",WOT_DIVIDER:"Reto de fido"},LICENSE:{TITLE:"Licenco de la mono",BTN_DOWNLOAD:"Elŝuti la dosieron",NO_LICENSE_FILE:"Dosiero pri licenco ne trovita."}},NETWORK:{VIEW:{MEDIAN_TIME:"Horo de la blokĉeno",LOADING_PEERS:"Nodoj ŝarĝiĝantaj...",NODE_ADDRESS:"Adreso:",SOFTWARE:"Programo",WARN_PRE_RELEASE:"Antaŭ-versio (lasta stabila versio: <b>{{version}}</b>)",WARN_NEW_RELEASE:"Versio <b>{{version}}</b> disponebla",WS2PID:"Identigilo:",PRIVATE_ACCESS:"Privata aliro",POW_PREFIX:"Prefikso pri labor-pruvo:",ENDPOINTS:{BMAS:"Sekurigita interfaco (SSL)",BMATOR:"Reta interfaco TOR",WS2P:"Interfaco WS2P",ES_USER_API:"Nodo de datenoj Cesium+"}},INFO:{ONLY_SSL_PEERS:"La nodoj ne-SSL estas mis-afiŝitaj, ĉar Cesium funkcias laŭ moduso HTTPS."}},PEER:{PEERS:"Nodoj",SIGNED_ON_BLOCK:"Skribita en la bloko",MIRROR:"spegulo",MIRRORS:"Speguloj",MIRROR_PEERS:"Spegul-nodoj",PEER_LIST:"Listo de la nodoj",MEMBERS:"Membroj",MEMBER_PEERS:"Membro-nodoj",ALL_PEERS:"Ĉiuj nodoj",DIFFICULTY:"Malfacileco",API:"API",CURRENT_BLOCK:"Bloko #",POPOVER_FILTER_TITLE:"Filtrilo",OFFLINE:"Nekonektita",OFFLINE_PEERS:"Nekonektitaj nodoj",BTN_SHOW_PEER:"Vidi la nodon",VIEW:{TITLE:"Nodo",OWNER:"Apartenas al",SHOW_RAW_PEERING:"Vidi la samrangan dokumenton",SHOW_RAW_CURRENT_BLOCK:"Vidi la lastan blokon (kompleta strukturo)",LAST_BLOCKS:"Lastaj blokoj konataj",KNOWN_PEERS:"Konataj nodoj:",GENERAL_DIVIDER:"Ĝeneralaj informoj",ERROR:{LOADING_TOR_NODE_ERROR:"Neeblas ricevi la informojn de la nodo. La limdaŭro de atendado estas transpasita.",LOADING_NODE_ERROR:"Neeblas ricevi la informojn de la nodo"}}},WOT:{SEARCH_HELP:"Traserĉado (familia nomo, persona nomo, markvorto)",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...",REGISTERED_SINCE:"Enskribita la",REGISTERED_SINCE_BLOCK:"Enskribita en la bloko #",NO_CERTIFICATION:"Neniu atestaĵo validigita",NO_GIVEN_CERTIFICATION:"Neniu atestaĵo sendita",NOT_MEMBER_PARENTHESIS:"(ne membro)",IDENTITY_REVOKED_PARENTHESIS:"(identeco nuligita)",MEMBER_PENDING_REVOCATION_PARENTHESIS:"(nuliĝanta)",EXPIRE_IN:"Finiĝo",NOT_WRITTEN_EXPIRE_IN:"Limdato<br/>de traktado",EXPIRED:"Finiĝinta",PSEUDO:"Pseŭdonimo",SIGNED_ON_BLOCK:"Sendita en la bloko #{{block}}",WRITTEN_ON_BLOCK:"Enskribita en la bloko #{{block}}",GENERAL_DIVIDER:"Ĝeneralaj informoj",NOT_MEMBER_ACCOUNT:"Simpla konto (ne membro)",NOT_MEMBER_ACCOUNT_HELP:"Temas pri simpla monujo, sen aliĝ-peto atendanta.",TECHNICAL_DIVIDER:"Teknikaj informoj",BTN_CERTIFY:"Atesti",BTN_YES_CERTIFY:"Jes, atesti",BTN_SELECT_AND_CERTIFY:"Nova atestaĵo",ACCOUNT_OPERATIONS:"Spezoj en la konto",VIEW:{POPOVER_SHARE_TITLE:"Identeco {{title}}"},LOOKUP:{TITLE:"Kontaro",NEWCOMERS:"Novaj membroj:",NEWCOMERS_COUNT:"{{count}} membroj",PENDING:"Atendantaj enskribiĝoj",PENDING_COUNT:"{{count}} atendantaj enskribiĝoj",REGISTERED:"Enskribita {{time | formatFromNow}}",MEMBER_FROM:"Membro depost {{time|formatFromNowShort}}",BTN_NEWCOMERS:"Novaj membroj",BTN_PENDING:"Atendantaj enskribiĝoj",SHOW_MORE:"Afiŝi pli",SHOW_MORE_COUNT:"(nuna limo je {{limit}})",NO_PENDING:"Neniu enskribiĝo atendanta.",NO_NEWCOMERS:"Neniu membro."},CONTACTS:{TITLE:"Kontaktoj"},MODAL:{TITLE:"Traserĉado"},CERTIFICATIONS:{TITLE:"{{uid}} - Atestaĵoj",SUMMARY:"Ricevitaj atestaĵoj",LIST:"Detalo pri la ricevitaj atestaĵoj",PENDING_LIST:"Atestaĵoj atendantaj traktadon",RECEIVED:"Ricevitaj atestaĵoj",RECEIVED_BY:"Atestaĵoj ricevitaj de {{uid}}",ERROR:"Atestaĵoj erare ricevitaj",SENTRY_MEMBER:"Referenca membro"},OPERATIONS:{TITLE:"{{uid}} - Spezoj"},GIVEN_CERTIFICATIONS:{TITLE:"{{uid}} - Senditaj atestaĵoj",SUMMARY:"Senditaj atestaĵoj",LIST:"Detalo pri la senditaj atestaĵoj",PENDING_LIST:"Atestaĵoj atendantaj traktadon",SENT:"Senditaj atestaĵoj",SENT_BY:"Atestaĵoj senditaj de {{uid}}",ERROR:"Atestaĵoj erare senditaj"}},LOGIN:{TITLE:'<i class="icon ion-log-in"></i> Konektiĝo',SCRYPT_FORM_HELP:"Bonvolu tajpi viajn identigilojn.<br>Pensu kontroli, ke la publika ŝlosilo estas tiu de via konto.",PUBKEY_FORM_HELP:"Bonvolu tajpi publikan ŝlosilon de konto:",FILE_FORM_HELP:"Elektu la ŝlosilaro-dosieron uzotan:",SCAN_FORM_HELP:"Skani la QR-kodon de monujo.",SALT:"Identigilo",SALT_HELP:"Identigilo",SHOW_SALT:"Afiŝi la identigilon?",PASSWORD:"Pasvorto",PASSWORD_HELP:"Pasvorto",PUBKEY_HELP:"Ekzemple: « AbsxSY4qoZRzyV2irfep1V9xw1EMNyKJw2TkuVD4N1mv »",NO_ACCOUNT_QUESTION:"Vi ankoraŭ ne havas konton?",HAVE_ACCOUNT_QUESTION:"Vi jam havas konton?",CREATE_ACCOUNT:"Krei konton...",CREATE_FREE_ACCOUNT:"Krei konton senpage",FORGOTTEN_ID:"Pasvorto forgesita?",ASSOCIATED_PUBKEY:"Publika ŝlosilo de la ŝlosilaro:",BTN_METHODS:"Aliaj metodoj",BTN_METHODS_DOTS:"Ŝanĝi metodon...",METHOD_POPOVER_TITLE:"Metodoj",MEMORIZE_AUTH_FILE:"Memorigi tiun ŝlosilaron por la daŭro de la sesio de retumado",SCRYPT_PARAMETERS:"Parametroj (Skripto):",AUTO_LOGOUT:{TITLE:"Informo",MESSAGE:'<i class="ion-android-time"></i> Vi estis <b>malkonektita</b> aŭtomate, pro tro longa senaktiveco.',BTN_RELOGIN:"Rekonektiĝi",IDLE_WARNING:"Vi estos malkonektita... {{countdown}}"},METHOD:{SCRYPT_DEFAULT:"Identigilo kaj pasvorto",SCRYPT_ADVANCED:"Sperta salumado",FILE:"Dosiero pri ŝlosilaro",PUBKEY:"Publika ŝlosilo aŭ pseŭdonimo",SCAN:"Skani QR-kodon"},SCRYPT:{SIMPLE:"Malpeza salumado",DEFAULT:"Kutima salumado",SECURE:"Sekura salumado",HARDEST:"Plej sekura salumado",EXTREME:"Ekstrema salumado",USER:"Personigita salumado",N:"N (Loop):",r:"r (RAM):",p:"p (CPU):"},FILE:{DATE:"Dato:",TYPE:"Tipo:",SIZE:"Amplekso:",VALIDATING:"Validigo...",HELP:"Atendita strukturo de dosiero: <b>.yml</b> aŭ <b>.dunikey</b> (tipo PubSec, WIF aŭ EWIF)."}},ACCOUNT:{TITLE:"Mia konto",SHOW_MORE_TX:"Afiŝi pli",SHOW_ALL_TX:"Afiŝi ĉion",EVENTS:"Okazaĵoj",BTN_RECEIVE_MONEY:"Enkasigi",BTN_SECURITY_DOTS:"Konto kaj sekureco...",BTN_SHOW_DETAILS:"Afiŝi la teknikajn informojn",NEW:{TITLE:"Enskribiĝo",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.).",INTRO_WARNING_SECURITY:"Kontrolu ke la aparatoj, kiujn vi nun uzas (komputilo, tabuleto, telefono), <b>estas sekurigitaj kaj fidindaj</b>.",INTRO_WARNING_SECURITY_HELP:"Senvirusigilo ĝisdata, fajroŝirmilo aktivigita, sesio protektita per pasvorto aŭ PIN-kodo, ktp.",INTRO_HELP:"Alklaku <b>{{'COMMON.BTN_START'|translate}}</b> por ekigi la kreadon de konto. Vi estos gvidata paŝon post paŝo.",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.",REGISTRATION_NODE_HELP:"Se vi ne fidas tiun nodon, bonvolu ŝanĝi ĝin <a ng-click=\"doQuickFix('settings')\">en la parametroj</a> de Cesium.",SELECT_ACCOUNT_TYPE:"Elektu la tipon de konto kreota:",MEMBER_ACCOUNT:"Membro-konto",MEMBER_ACCOUNT_TITLE:"Kreado de membro-konto",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.",WALLET_ACCOUNT:"Simpla monujo",WALLET_ACCOUNT_TITLE:"Kreado de monujo",WALLET_ACCOUNT_HELP:"Por ĉiuj aliaj kazoj, ekzemple se vi bezonas plian konton.<br/>Neniu universala dividendo estos kreita per tia konto.",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!",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!",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>",PSEUDO:"Pseŭdonimo",PSEUDO_HELP:"Pseŭdonimo",SALT_CONFIRM:"Konfirmo",SALT_CONFIRM_HELP:"Konfirmo de la sekreta identigilo",PASSWORD_CONFIRM:"Konfirmo",PASSWORD_CONFIRM_HELP:"Konfirmo de la pasvorto",SLIDE_6_TITLE:"Konfirmo:",COMPUTING_PUBKEY:"Kalkulanta...",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.",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?',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?',CHECKING_PSEUDO:"Kontrolo...",PSEUDO_AVAILABLE:"Pseŭdonimo disponebla",PSEUDO_NOT_AVAILABLE:"Pseŭdonimo ne disponebla",INFO_LICENSE:"Antaŭ ol krei membro-konton, <b>bonvolu legi kaj akcepti la licencon</b> pri uzado de la mono:",BTN_ACCEPT:"Mi akceptas",BTN_ACCEPT_LICENSE:"Mi akceptas la licencon"},POPUP_REGISTER:{TITLE:"Elektu pseŭdonimon",HELP:"Pseŭdonimo estas deviga por fariĝi membro."},HEADERS:{TIME:"Dato",AMOUNT:"Sumo",COMMENT:"Komento"}},TRANSFER:{TITLE:"Elspezo",SUB_TITLE:"Fari elspezon",FROM:"De",TO:"Al",AMOUNT:"Sumo",AMOUNT_HELP:"Sumo",COMMENT:"Komento",COMMENT_HELP:"Komento",BTN_SEND:"Sendi",BTN_ADD_COMMENT:"Aldoni komenton?",MODAL:{TITLE:"Elspezo"}},ERROR:{UNKNOWN_URI_FORMAT:"URI-formato nekonata",PUBKEY_INVALID_CHECKSUM:"Publika ŝlosilo nevalida (bad checksum).",POPUP_TITLE:"Eraro",UNKNOWN_ERROR:"Eraro nekonata",CRYPTO_UNKNOWN_ERROR:"Via retumilo ŝajnas ne kongrua kun la kriptografiaj funkcioj.",EQUALS_TO_PSEUDO:"Devas esti malsama ol la pseŭdonimo",EQUALS_TO_SALT:"Devas esti malsama ol la sekreta identigilo",FIELD_REQUIRED:"Deviga kampo",FIELD_TOO_SHORT:"Signaro tro mallonga",FIELD_TOO_SHORT_WITH_LENGTH:"Signaro tro mallonga ({{minLength}} signoj minimume)",FIELD_TOO_LONG:"Signaro tro longa",FIELD_TOO_LONG_WITH_LENGTH:"Signaro tro longa ({{maxLength}} signoj maksimume)",FIELD_MIN:"Minimuma longeco: {{min}}",FIELD_MAX:"Maksimuma longeco: {{max}}",FIELD_ACCENT:"Diakritaj literoj kaj komoj ne permesataj",FIELD_NOT_NUMBER:"Nombra valoro atendata",FIELD_NOT_INT:"Entjera nombro atendata",FIELD_NOT_EMAIL:"Retadreso nevalida",PASSWORD_NOT_CONFIRMED:"Ne kongruas kun la pasvorto",SALT_NOT_CONFIRMED:"Ne kongruas kun la sekreta identigilo",SEND_IDENTITY_FAILED:"Aliĝo malsukcesa",SEND_CERTIFICATION_FAILED:"Atestado malsukcesa",NEED_MEMBER_ACCOUNT_TO_CERTIFY:"Vi ne povas efektivigi atestadon, ĉar via konto <b>ne estas membro</b>.",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.",NOT_MEMBER_FOR_CERTIFICATION:"Via konto ankoraŭ ne estas membro.",IDENTITY_TO_CERTIFY_HAS_NO_SELF:"Konto ne atestebla. Neniu aliĝo-peto estis farita, aŭ la aliĝo ne estis revalidigita.",LOGIN_FAILED:"Eraro dum konektiĝo.",LOAD_IDENTITY_FAILED:"Eraro por ŝarĝi la identecon.",LOAD_REQUIREMENTS_FAILED:"Eraro por ŝarĝi la antaŭ-necesaĵoj de la identeco.",SEND_MEMBERSHIP_IN_FAILED:"Malsukceso pri la provado eniri la komunumon.",SEND_MEMBERSHIP_OUT_FAILED:"Malsukceso pri la ĉesigo de la aliĝo.",REFRESH_WALLET_DATA:"Malsukceso pri la ĝisdatigo de la monujo.",GET_CURRENCY_PARAMETER:"Malsukceso por ricevi la regulojn de la mono.",GET_CURRENCY_FAILED:"Ne eblis ŝarĝi la monon. Bonvolu reprovi pli poste.",SEND_TX_FAILED:"Elspezado malsukcesa.",ALL_SOURCES_USED:"Bonvolu atendi la kalkulon de la venonta bloko (ĉiuj viaj monfontoj estis uzitaj).",NOT_ENOUGH_SOURCES:"Ne sufiĉe da mono por sendi tiun ĉi sumon per ununura spezo.<br/>Maksimuma sumo: {{amount}} {{unit}}<sub>{{subUnit}}</sub>.",ACCOUNT_CREATION_FAILED:"Malsukceso por krei la membro-konton.",RESTORE_WALLET_DATA_ERROR:"Malsukceso por reŝarĝi la parametrojn de la loka stokaĵo",LOAD_WALLET_DATA_ERROR:"Malsukceso por ŝarĝi la datenojn de la monujo.",COPY_CLIPBOARD_FAILED:"Ne eblis kopii la valoron.",TAKE_PICTURE_FAILED:"Malsukceso por ricevi la foton.",SCAN_FAILED:"Malsukceso por skani la QR-kodon.",SCAN_UNKNOWN_FORMAT:"Kodo nerekonata.",WOT_LOOKUP_FAILED:"Serĉado malsukcesa.",LOAD_PEER_DATA_FAILED:"Ne eblis legi la nodon Duniter. Bonvolu reprovi poste.",NEED_LOGIN_FIRST:"Bonvolu unue konektiĝi.",AMOUNT_REQUIRED:"La monsumo estas deviga.",AMOUNT_NEGATIVE:"Negativa sumo nepermesata.",NOT_ENOUGH_CREDIT:"Saldo nesufiĉa.",INVALID_NODE_SUMMARY:"Nodo neatingebla aŭ adreso nevalida.",INVALID_USER_ID:"La pseŭdonimo devas enteni nek spacon nek signon specialan aŭ kun supersigno.",INVALID_COMMENT:"La kampo 'referenco' ne devas enteni literojn kun supersigno.",INVALID_PUBKEY:"La publika ŝlosilo ne havas la atenditan strukturon.",INVALID_PUBKEY_CHECKSUM:"Kontrolsumo nevalida.",IDENTITY_REVOKED:"Tiu ĉi identeco <b>estis nuligita</b>. Ĝi ne plu povas fariĝi membro.",IDENTITY_PENDING_REVOCATION:"La <b>nuligo de tiu ĉi identeco</b> estis petita kaj atendas traktadon. La atestado estas do malaktivigita.",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.",IDENTITY_EXPIRED:"La publikigo de tiu ĉi identeco finiĝis: tiu persono devas fari novan aliĝo-peton <b>antaŭ ol</b> esti atestita.",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>).",IDENTITY_NOT_FOUND:"Identeco ne trovita.",IDENTITY_TX_FAILED:"Malsukceso por ŝarĝi la spezojn.",WOT_PENDING_INVALID_BLOCK_HASH:"Aliĝo ne valida.",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.",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.",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.",WALLET_HAS_NO_SELF:"Via identeco devas unue esti publikigita, kaj ne esti finiĝinta.",AUTH_REQUIRED:"Aŭtentigado necesa.",AUTH_INVALID_PUBKEY:"La publika ŝlosilo ne rilatas al la konektita konto.",AUTH_INVALID_SCRYPT:"Identigilo aŭ pasvorto nevalida.",AUTH_INVALID_FILE:"Dosiero pri ŝlosilaro nevalida.",AUTH_FILE_ERROR:"Malsukceso por malfermi la dosieron pri ŝlosilaro.",IDENTITY_ALREADY_CERTIFY:"Vi <b>jam atestis</b> tiun identecon.<br/><br/>Tiu atestado daŭre validas (finiĝo {{expiresIn|formatDurationTo}}).",IDENTITY_ALREADY_CERTIFY_PENDING:"Vi <b>jam atestis</b> tiun identecon.<br/><br/>Tiu atestado atendas traktadon (limdato de traktado {{expiresIn|formatDurationTo}}).",UNABLE_TO_CERTIFY_TITLE:"Atestado neebla",LOAD_NEWCOMERS_FAILED:"Malsukceso por ŝarĝi la novajn membrojn.",LOAD_PENDING_FAILED:"Malsukceso por ŝarĝi la atendantajn aliĝojn.",ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION:"Vi devas <b>esti membro</b> por rajti efektivigi tiun ĉi agon.",ONLY_SELF_CAN_EXECUTE_THIS_ACTION:"Via identeco devas <b>jam esti publikigita</b>, por ke vi rajtu efektivigi tiun ĉi agon.",GET_BLOCK_FAILED:"Malsukceso por ricevi la blokon.",INVALID_BLOCK_HASH:"Bloko ne trovita (haketo malsama)",DOWNLOAD_REVOCATION_FAILED:"Malsukceso por elŝuti la dosieron pri nuligo.",REVOCATION_FAILED:"Malsukceso pri nuligo.",SALT_OR_PASSWORD_NOT_CONFIRMED:"Sekreta identigilo aŭ pasvorto malĝusta.",RECOVER_ID_FAILED:"Malsukceso por ricevi la identigilojn",LOAD_FILE_FAILED:"Malsukceso por ŝarĝi la dosieron",NOT_VALID_REVOCATION_FILE:"Dosiero pri nuligo ne valida (malĝusta strukturo de dosiero)",NOT_VALID_SAVE_ID_FILE:"Dosiero pri konservado ne valida (malĝusta strukturo de dosiero)",NOT_VALID_KEY_FILE:"Dosiero pri ŝlosilaro ne valida (strukturo ne rekonata)",EXISTING_ACCOUNT:"Viaj identigiloj rilatas al jam ekzistanta konto, kies <a ng-click=\"showHelpModal('pubkey')\">publika ŝlosilo</a> estas:",EXISTING_ACCOUNT_REQUEST:"Bonvolu modifi viajn identigilojn, por ke ili rilatu al ne uzata konto.",GET_LICENSE_FILE_FAILED:"La ricevo de la dosiero pri licenco ne eblis.",CHECK_NETWORK_CONNECTION:"Neniu nodo ŝajnas atingebla.<br/><br/>Bonvolu <b>kontroli vian retkonekton</b>."},INFO:{POPUP_TITLE:"Informo",CERTIFICATION_DONE:"Atestaĵo sendita",NOT_ENOUGH_CREDIT:"Saldo nesufiĉa",TRANSFER_SENT:"Elspezo sendita",COPY_TO_CLIPBOARD_DONE:"Kopiita en la loka memoro",MEMBERSHIP_OUT_SENT:"Eksiĝo sendita",NOT_NEED_MEMBERSHIP:"Vi jam estas membro.",IDENTITY_WILL_MISSING_CERTIFICATIONS:"Al tiu ĉi identeco baldaŭ mankos atestaĵoj (almenaŭ {{willNeedCertificationCount}}).",REVOCATION_SENT:"Nuligo sendita",REVOCATION_SENT_WAITING_PROCESS:"La <b>nuligo de tiu ĉi identeco</b> estis petita kaj atendas traktadon.",FEATURES_NOT_IMPLEMENTED:"Tiu ĉi funkciaro ankoraŭ estas programiĝanta.<br/>Kial ne <b>kontribui al Cesium</b>, por ekhavi ĝin pli rapide? ;)",EMPTY_TX_HISTORY:"Neniu spezo elportota"},CONFIRM:{POPUP_TITLE:"<b>Konfirmo</b>",POPUP_WARNING_TITLE:"<b>Averto</b>",POPUP_SECURITY_WARNING_TITLE:'<i class="icon ion-alert-circled"></i> <b>Averto pri sekureco</b>',CERTIFY_RULES_TITLE_UID:"Atesti {{uid}}",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?',FULLSCREEN:"Afiŝi la programon plen-ekrane?",EXIT_APP:"Fermi la programon?",LOGIN_UNUSED_WALLET_TITLE:"Tajperaro?",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>.",SAVE_BEFORE_LEAVE:"Ĉu vi volas <b>konservi viajn modifojn</b> antaŭ ol eliri el la paĝo?",SAVE_BEFORE_LEAVE_TITLE:"Modifoj ne registritaj",LOGOUT:"Ĉu vi certas, ke vi volas malkonektiĝi?",USE_FALLBACK_NODE:"Nodo <b>{{old}}</b> neatingebla aŭ adreso nevalida.<br/><br/>Ĉu vi volas provizore uzi la nodon <b>{{new}}</b> ?"},HELP:{TITLE:"Ret-helpo",JOIN:{SECTION:"Enskribiĝo",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.',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."},GLOSSARY:{SECTION:"Glosaro",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.',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.'}}}),e.translations("es-ES",{COMMON:{APP_NAME:"ğ<b>change</b>",APP_VERSION:"v{{version}}",APP_BUILD:"fecha: {{build}}",PUBKEY:"Llave pública",MEMBER:"Miembro",BLOCK:"Bloque",BTN_OK:"OK",BTN_YES:"Sí",BTN_NO:"No",BTN_SEND:"Enviar",BTN_SEND_MONEY:"Hacer un pago",BTN_SEND_MONEY_SHORT:"Pago",BTN_SAVE:"Guardar",BTN_YES_SAVE:"Sí, guardar",BTN_YES_CONTINUE:"Sí, continuar",BTN_SHOW:"Ver",BTN_SHOW_PUBKEY:"Ver la llave",BTN_RELATIVE_UNIT:"Mostrar importes en DU",BTN_BACK:"Anterior",BTN_NEXT:"Siguiente",BTN_IMPORT:"Importar",BTN_CANCEL:"Cancelar",BTN_CLOSE:"Cerrar",BTN_LATER:"Más tarde",BTN_LOGIN:"Conectarse",BTN_LOGOUT:"Desconexión",BTN_ADD_ACCOUNT:"Nueva cuenta",BTN_SHARE:"Compartir",BTN_EDIT:"Modificar",BTN_DELETE:"Suprimir",BTN_ADD:"Añadir",BTN_SEARCH:"Buscar",BTN_REFRESH:"Actualizar",BTN_RETRY:"Empezar de nuevo",BTN_START:"Empezar",BTN_CONTINUE:"Continuar",BTN_COPY:"Copiar",BTN_CREATE:"Crear",BTN_UNDERSTOOD:"Entendido",BTN_OPTIONS:"Opciones",BTN_HELP_TOUR:"Visita guiada",BTN_HELP_TOUR_SCREEN:"Explicar esta pantalla",BTN_DOWNLOAD:"Descargar",BTN_DOWNLOAD_ACCOUNT_STATEMENT:"Descargar historial de cuenta",BTN_MODIFY:"Modificar",CHOOSE_FILE:"Arrastre el archivo<br/>o haga clic para seleccionarlo",DAYS:"Días",NO_ACCOUNT_QUESTION:"¿Todavía no es miembro? ¡Crear una cuenta!",SEARCH_NO_RESULT:"Ningún resultado encontrado",LOADING:"Espere por favor…",LOADING_WAIT:"Espere por favor…<br/><small>(Esperando disponibilidad de nodo)</small>",SEARCHING:"Búsqueda en proceso…",FILE:{DATE:"Fecha:",SIZE:"Tamaño:",TYPE:"Tipo:",VALIDATING:"Validando..."},FROM:"De",TO:"A",COPY:"Copiar",LANGUAGE:"Idioma",UNIVERSAL_DIVIDEND:"Dividendo universal",UD:"DU",DATE_PATTERN:"DD/MM/YYYY HH:mm",DATE_FILE_PATTERN:"YYYY-MM-DD",DATE_SHORT_PATTERN:"DD/MM/YY",DATE_MONTH_YEAR_PATTERN:"MM/YYYY",EMPTY_PARENTHESIS:"(vacío)",UID:"Seudónimo",ENABLE:"Activado",DISABLE:"Desactivado",RESULTS_LIST:"Resultados:",RESULTS_COUNT:"{{count}} resultados",EXECUTION_TIME:"ejecutado en {{duration|formatDurationMs}}",SHOW_VALUES:"¿Publicar los valores no codificados?",POPOVER_ACTIONS_TITLE:"Opciones",POPOVER_FILTER_TITLE:"Filtros",SHOW_MORE:"Mostrar más",SHOW_MORE_COUNT:"(límite actual {{limit}})",POPOVER_SHARE:{TITLE:"Compartir",INSTANCE_ADDRESS_HELP:"Introduce la dirección de la instancia (ej: https://red.confederac.io/):",SHARE_ON_MASTODON:"Compartir en Mastodon",SHARE_ON_TWITTER:"Compartir en Twitter",SHARE_ON_FACEBOOK:"Compartir en Facebook",SHARE_ON_DIASPORA:"Compartir en Diaspora*",SHARE_ON_GOOGLEPLUS:"Compartir en Google+"}},SYSTEM:{PICTURE_CHOOSE_TYPE:"Elegir la fuente:",BTN_PICTURE_GALLERY:"Galería",BTN_PICTURE_CAMERA:"<b>Cámara</b>"},MENU:{CURRENCIES:"Monedas",SCAN:"Escanear",TRANSFER:"Transferir",HOME:"Inicio",WOT:"Directorio",CURRENCY:"Moneda",ACCOUNT:"Mi cuenta",SETTINGS:"Ajustes",NETWORK:"Red",TRANSACTIONS:"Mis transacciones",WALLETS:"Mis monederos"},ABOUT:{LATEST_RELEASE:"Hay una <b>versión nueva</b> de {{'COMMON.APP_NAME' | translate}} (<b>v{{version}}</b>)",OFFICIAL_WEB_SITE:"Sitio Web Oficial:",PLEASE_UPDATE:"Por favor actualice {{'COMMON.APP_NAME' | translate}} (última versión: <b>v{{version}}</b>)",DEV_WARNING:"Advertencia",DEV_WARNING_MESSAGE:"Esta aplicación todavía se encuentra en desarrollo.<br/>¡No dude en reportarnos las anomalías encontradas!",DEV_WARNING_MESSAGE_SHORT:"Esta app todavía está en desarrollo.",TITLE:"Acerca de",LICENSE:"Software <b>libre</b> (licencia GNU AGPLv3).",CODE:"Código fuente:",DEVELOPERS:"Desarrollado por:",FORUM:"Foro:",REPORT_ISSUE:"Reportar un problema"},HOME:{FEED_SOURCE:"Fuente",READ_MORE:"Leer más",SHOW_ALL_FEED:"Ver todo",TITLE:"ğ<b>change</b>",MESSAGE:"¿ ğ<b>change</b> ?",BTN_CURRENCY:"Explorar la moneda",MESSAGE_CURRENCY:"¡Intercambiar en {{currency|abbreviate}} ahora es… muy sencillo!",BTN_ABOUT:"Acerca de",BTN_HELP:"Ayuda en línea",REPORT_ISSUE:"anomalía",NOT_YOUR_ACCOUNT_QUESTION:'¿No es suya la cuenta <b><i class="ion-key"></i> {{pubkey|formatPubkey}}</b>?',BTN_CHANGE_ACCOUNT:"Desconectar esta cuenta",CONNECTION_ERROR:'Nodo <b>{{servidor}}</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>.'},SETTINGS:{AUTO_LOGOUT:"Desconexión automática",AUTO_LOGOUT_HELP:"Periodo de inactividad antes de la desconexión",AUTO_LOGOUT_OPTION_HOUR:"Despúes de {{value}} hora",AUTO_LOGOUT_OPTION_MINUTE:"Despúes de {{value}} minuto",AUTO_LOGOUT_OPTION_MINUTES:"Despúes de {{value}} minuto",AUTO_LOGOUT_OPTION_NEVER:"Nunca",AUTO_LOGOUT_OPTION_SECONDS:"Despúes de {{value}} segundos",TITLE:"Ajustes",DISPLAY_DIVIDER:"Visualización",STORAGE_DIVIDER:"Almacenamiento",NETWORK_SETTINGS:"Red",PEER:"Dirección del nodo Duniter",PEER_CHANGED_TEMPORARY:"Dirección utilizada temporalmente",PEER_SHORT:"Nodo Duniter",PERSIST_CACHE:"Conservar los datos de navegación (experimental)",PERSIST_CACHE_HELP:"Permite una navegación más rápida, conservando localmente los datos recibidos, para usar de una sesión a otra.",USE_LOCAL_STORAGE:"Activar el almacenamiento local",USE_LOCAL_STORAGE_HELP:"Permitir conservar sus ajustes",ENABLE_HELPTIP:"Activar la ayuda contextual",ENABLE_UI_EFFECTS:"Activar los efectos visuales",HISTORY_SETTINGS:"Transacciones de la cuenta",DISPLAY_UD_HISTORY:"Mostrar los DU creados",AUTHENTICATION_SETTINGS:"Autenticación",REMEMBER_ME:"Recordarme",REMEMBER_ME_HELP:"Permite mantenerse siempre conectado (no recomendado), conservando localmente la llave pública.",PLUGINS_SETTINGS:"Extensiones",BTN_RESET:"Restaurar los valores por defecto",EXPERT_MODE:"Modo experto",EXPERT_MODE_HELP:"Permite una visualización más detallada",POPUP_PEER:{TITLE:"Nodo Duniter",HOST:"Dirección",HOST_HELP:"Dirección: servidor:puerto",USE_SSL:"Conexión segura",USE_SSL_HELP:"(Cifrado SSL)",BTN_SHOW_LIST:"Lista de nodos"}},BLOCKCHAIN:{HASH:"Hash: {{hash}}",VIEW:{HEADER_TITLE:"Bloque #{{number}}-{{hash|formatHash}}",TITLE_CURRENT:"Bloque actual",TITLE:"Bloque #{{number|formatInteger}}",COMPUTED_BY:"Calculado por el nodo de",SHOW_RAW:"Ver el fichero en bruto",TECHNICAL_DIVIDER:"Informaciones técnicas",VERSION:"Versión del formato",HASH:"Hash calculado",UNIVERSAL_DIVIDEND_HELP:"Moneda co-producida por cada uno de los {{membersCount}} miembros",EMPTY:"Ningún dato en este bloque",POW_MIN:"Dificultad mínima",POW_MIN_HELP:"Dificultad impuesta por el cálculo del hash",DATA_DIVIDER:"Datos",IDENTITIES_COUNT:"Nuevas identidades",JOINERS_COUNT:"Nuevos miembros",ACTIVES_COUNT:"Renovaciones",ACTIVES_COUNT_HELP:"Miembros que han renovado sus adhesiones",LEAVERS_COUNT:"Miembros salientes",LEAVERS_COUNT_HELP:"Miembros salientes que ya no quieren estar certificados",EXCLUDED_COUNT:"Miembros excluidos",EXCLUDED_COUNT_HELP:"Antiguos miembros excluidos por no renovación o falta de certificaciones",REVOKED_COUNT:"Identidades revocadas",REVOKED_COUNT_HELP:"Estas cuentas no podrán ser miembros",TX_COUNT:"Transacciones",CERT_COUNT:"Certificaciones",TX_TO_HIMSELF:"Operación de cambio",TX_OUTPUT_UNLOCK_CONDITIONS:"Condiciones de desbloqueo",TX_OUTPUT_OPERATOR:{AND:"y",OR:"o"},TX_OUTPUT_FUNCTION:{SIG:"<b>Firma</b> de ",XHX:"<b>Contraseña</b>, cuyo SHA256 =",CSV:"Bloqueado durante",CLTV:"Bloqueado hasta"}},LOOKUP:{TITLE:"Bloques",NO_BLOCK:"Ningún bloque",LAST_BLOCKS:"Últimos bloques:",BTN_COMPACT:"Compactar"}},CURRENCY:{VIEW:{TITLE:"Moneda",TAB_CURRENCY:"Moneda",TAB_WOT:"Red de confianza",TAB_NETWORK:"Red",TAB_BLOCKS:"Bloques",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}}.",NETWORK_RULES_DIVIDER:"Reglas de la red",CURRENCY_NAME:"Nombre de la moneda",MEMBERS:"Cantidad de miembros",MEMBERS_VARIATION:"Variación desde último DU",MONEY_DIVIDER:"Moneda",MASS:"Masa monetaria",SHARE:"Masa media por miembro",UD:"Dividendo Universal",C_ACTUAL:"Crecimiento actual",MEDIAN_TIME:"Hora de la cadena de bloques",POW_MIN:"Nivel mínimo de dificultad de cálculo",MONEY_RULES_DIVIDER:"Reglas de la moneda",C_RULE:"Crecimiento teórico objetivo",UD_RULE:"Cálculo del dividendo universal",DT_REEVAL:"Periodo de revalorización del DU",REEVAL_SYMBOL:"reval",DT_REEVAL_VALUE:"Todos los <b>{{dtReeval|formatDuration}}</b> ({{dtReeval/86400}} {{'COMMON.DAYS'|translate}})",UD_REEVAL_TIME0:"Fecha de la primera revalorización",SIG_QTY_RULE:"Certificaciones requeridas para ser miembro",SIG_STOCK:"Máximo de certificaciones emitibles por miembros",SIG_PERIOD:"Espera mínima entre 2 certificaciones sucesivas emitidas por la misma persona",SIG_WINDOW:"Límite para tener en cuenta una certificación",SIG_VALIDITY:"Duración de una certificación que ya ha sido aceptada",MS_WINDOW:"Límite para aprobar una solicitud de membresía",STEP_MAX:"Distancia máxima entre una nueva candidatura y cada miembro referente",WOT_RULES_DIVIDER:"Reglas de la red de confianza",SENTRIES:"Certificaciones necesarias para ser miembro referente",SENTRIES_FORMULA:"Fórmula de las certificaciones necesarias para ser miembro referente",XPERCENT:"Porcentaje mínimo necesario de miembros referentes respentando la regla de distancia máxima",AVG_GEN_TIME:"Tiempo medio entre dos bloques",MS_VALIDITY:"Duración de una candidatura que ya ha sido aceptada",CURRENT:"actual",MATH_CEILING:"TECHO",DISPLAY_ALL_RULES:"¿Ver todas las reglas?",BTN_SHOW_LICENSE:"Ver la licencia",WOT_DIVIDER:"Red de confianza"},LICENSE:{TITLE:"Licencia de la moneda",BTN_DOWNLOAD:"Descargar el fichero",NO_LICENSE_FILE:"Fichero de licencia no encontrado."}},NETWORK:{VIEW:{MEDIAN_TIME:"Hora de la cadena de bloques",LOADING_PEERS:"Cargando nodos…",NODE_ADDRESS:"Dirección:",SOFTWARE:"Software:",WARN_PRE_RELEASE:"Prelanzamiento (última versión estable: <b>{{version}}</b>)",WARN_NEW_RELEASE:"Versión <b>{{version}}</b> disponible",WS2PID:"ID:",PRIVATE_ACCESS:"Acceso privado",POW_PREFIX:"Prefijo de la prueba de trabajo:",ENDPOINTS:{BMAS:"Interfaz segura (SSL)",BMATOR:"Interfaz red TOR",WS2P:"Interfaz WS2P",ES_USER_API:"Nodo de datos Cesium+"}},INFO:{ONLY_SSL_PEERS:"La visualización de los nodos sin SSL aparece degradada porque Cesium funciona en modo HTTPS."}},PEER:{PEERS:"Nodos",SIGNED_ON_BLOCK:"Firmado sobre el bloque",MIRROR:"espejo",MIRROR_PEERS:"Nodos espejo",MIRRORS:"Espejo",PEER_LIST:"Lista de nodos",MEMBERS:"Miembro",MEMBER_PEERS:"Nodos miembro",ALL_PEERS:"Todos los nodos",DIFFICULTY:"Dificultad",API:"API",CURRENT_BLOCK:"Bloque #",POPOVER_FILTER_TITLE:"Filtro",OFFLINE:"Fuera de línea",OFFLINE_PEERS:"Nodos fuera de línea",BTN_SHOW_PEER:"Ver nodo",VIEW:{TITLE:"Nodo",OWNER:"Propiedad de",SHOW_RAW_PEERING:"Ver la ficha del nodo",SHOW_RAW_CURRENT_BLOCK:"Ver el bloque actual (en formato crudo)",LAST_BLOCKS:"Bloques recientes",KNOWN_PEERS:"Nodos conocidos:",GENERAL_DIVIDER:"Información general",ERROR:{LOADING_TOR_NODE_ERROR:"No se pudo obtener la información del nodo usando la red TOR.",LOADING_NODE_ERROR:"No se pudo obtener la información del nodo"}}},WOT:{SEARCH_HELP:"Buscar (apellido, primer nombre, hashtag)",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…",REGISTERED_SINCE:"Se registró en",REGISTERED_SINCE_BLOCK:"Se registró en el bloque #",NO_CERTIFICATION:"Ninguna certificación validada",NO_GIVEN_CERTIFICATION:"Ninguna certificación emitida",NOT_MEMBER_PARENTHESIS:"(no miembro)",IDENTITY_REVOKED_PARENTHESIS:"(identidad revocada)",MEMBER_PENDING_REVOCATION_PARENTHESIS:"(revocación en proceso)",EXPIRE_IN:"Expira",NOT_WRITTEN_EXPIRE_IN:"Fecha límite<br/>de procesamiento",EXPIRED:"Expirado",PSEUDO:"Seudónimo",SIGNED_ON_BLOCK:"Emitida en el bloque #{{block}}",WRITTEN_ON_BLOCK:"Escrita en el bloque #{{block}}",GENERAL_DIVIDER:"Informaciones generales",NOT_MEMBER_ACCOUNT:"Cuenta no miembro",NOT_MEMBER_ACCOUNT_HELP:"Se trata de un monedero simple, sin solicitud de membresía en espera",TECHNICAL_DIVIDER:"Informaciones técnicas",BTN_CERTIFY:"Certificar",BTN_YES_CERTIFY:"Sí, certificar",BTN_SELECT_AND_CERTIFY:"Nueva certificación",ACCOUNT_OPERATIONS:"Transacciones de la cuenta",VIEW:{POPOVER_SHARE_TITLE:"Identidad {{title}}"},LOOKUP:{TITLE:"Directorio",NEWCOMERS:"Nuevos miembros:",NEWCOMERS_COUNT:"{{count}} miembros",PENDING:"Inscripciones en espera:",PENDING_COUNT:"{{count}} inscripciones en espera",REGISTERED:"Se inscribió {{sigDate | formatFromNow}}",MEMBER_FROM:"Miembro desde {{memberDate|medianFromNowShort}}",BTN_NEWCOMERS:"Miembros recientes",BTN_PENDING:"Candidaturas en espera",SHOW_MORE:"Mostrar más",SHOW_MORE_COUNT:"(mostrar solo {{limit}})",NO_PENDING:"Ninguna candidatura en espera.",NO_NEWCOMERS:"Sin miembros."},MODAL:{TITLE:"Buscar"},CERTIFICATIONS:{TITLE:"{{uid}} - Certificaciones",SUMMARY:"Certificaciones recibidas",LIST:"Detalle de las certificaciones recibidas",PENDING_LIST:"Certificaciones en espera de tratamiento",RECEIVED:"Certificaciones recibidas",RECEIVED_BY:"Certificaciones recibidas por {{uid}}",ERROR:"Certificaciones recibidas por error",SENTRY_MEMBER:"Miembro referente"},CONTACTS:{TITLE:"Contactos"},OPERATIONS:{TITLE:"{{uid}} - Transacciones"},GIVEN_CERTIFICATIONS:{TITLE:"{{uid}} - Certificaciones emitidas",SUMMARY:"Certificaciones emitidas",LIST:"Detalle de las certificaciones emitidas",PENDING_LIST:"Certificaciones en espera a ser procesadas",SENT:"Certificaciones emitidas",SENT_BY:"Certificaciones emitidas por {{uid}}",ERROR:"Certificaciones emitidas por error"}},LOGIN:{FILE:{HELP:"Formato de archivo esperado: <b>.dunikey</b> (tipo PubSec). Otros formatos en desarrollo todavía (EWIF, WIF).",DATE:"Fecha:",TYPE:"Tipo:",SIZE:"Tamaño:",VALIDATING:"Validando…"},TITLE:'<i class="icon ion-locked"></i> Conexión',SCRYPT_FORM_HELP:"Ingrese sus credenciales.<br>Recuerde comprobar que la llave pública pertenece a su cuenta.",PUBKEY_FORM_HELP:"Por favor ingrese una llave pública de cuenta:",FILE_FORM_HELP:"Elija el archivo de llavero a usar:",SALT:"Identificador",SALT_HELP:"Identificador",SHOW_SALT:"Mostrar el identificador",PASSWORD:"Contraseña",PASSWORD_HELP:"Contraseña",PUBKEY_HELP:"llave pública",NO_ACCOUNT_QUESTION:"¿Aún no tiene cuenta? ",HAVE_ACCOUNT_QUESTION:"¿Ya tiene cuenta?",CREATE_ACCOUNT:"Crear una cuenta",CREATE_FREE_ACCOUNT:"Crear una cuenta gratis",FORGOTTEN_ID:"¿Olvidó su contraseña?",ASSOCIATED_PUBKEY:"Llave pública del llavero:",BTN_METHODS:"Otros métodos",BTN_METHODS_DOTS:"Otras vías…",METHOD_POPOVER_TITLE:"Métodos",SCAN_FORM_HELP:"Escanee el código QR de un monedero.",MEMORIZE_AUTH_FILE:"Memorizar las llaves durante la sesión de navegación",SCRYPT_PARAMETERS:"Ajustes (Scrypt):",AUTO_LOGOUT:{TITLE:"Informació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.',BTN_RELOGIN:"Volver a conectarme",IDLE_WARNING:"Será desconectado en… {{countdown}}"},METHOD:{SCRYPT_DEFAULT:"Estándar (por defecto)",SCRYPT_ADVANCED:"Aleatoriedad avanzada",FILE:"Archivo de llaves",PUBKEY:"Llave pública o seudónimo",SCAN:"Escanear un código QR"},SCRYPT:{SIMPLE:"Ligero",DEFAULT:"Predeterminado",SECURE:"Seguro",HARDEST:"El más seguro",EXTREME:"Extremo",USER:"Personalizado",N:"N (Loop):",r:"r (RAM):",p:"p (CPU):"}},AUTH:{TITLE:'<i class="icon ion-locked"></i> Autenticación',BTN_AUTH:"Autenticar",ERROR:{FILE:"Archivo llavero",SCRYPT_ADVANCED:"Aleatoriedad avanzada",SCRYPT_DEFAULT:"Estándar (por defecto)"},METHOD_LABEL:"Método de autenticación",SCRYPT_FORM_HELP:"Autentíquese :"},ACCOUNT:{BTN_MEMBERSHIP_IN_DOTS:"Registrarse como miembro…",BTN_SEND_IDENTITY_DOTS:"Publicar su identidad…",TITLE:"Mi cuenta",BALANCE:"Saldo",LAST_TX:"Últimas transacciones validadas",BALANCE_ACCOUNT:"Saldo de la cuenta",NO_TX:"Ninguna transacción",SHOW_MORE_TX:"Mostrar más",SHOW_ALL_TX:"Mostrar todo",TX_FROM_DATE:"(mostrar solo {{fromTime|medianFromNowShort}})",PENDING_TX:"Transacciones pendientes",ERROR_TX:"Transacciones no ejecutadas",ERROR_TX_SENT:"Transacciones ejecutadas fallidas",PENDING_TX_RECEIVED:"Tansacciones en espera de recepción",EVENTS:"Eventos",WAITING_MEMBERSHIP:"Solicitud de membresía emitida. En espera de aceptación.",WAITING_CERTIFICATIONS:"Debe obtener {{needCertificationCount}} certificación(es) para ser miembro.",WILL_MISSING_CERTIFICATIONS:"Pronto le van a <b>faltar certificaciones</b> (al menos {{willNeedCertificationCount}} son necesarias)",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.",NEED_RENEW_MEMBERSHIP:"No es miembro porque su adhesión <b>ha expirado</b>. Piense en <a ng-click=\"doQuickFix('renew')\">renovar su adhesión</a>.",CERTIFICATION_COUNT:"Certificaciones recibidas",CERTIFICATION_COUNT_SHORT:"Certificaciones",SIG_STOCK:"Certificaciones emitidas",BTN_RECEIVE_MONEY:"Recibir",BTN_MEMBERSHIP_RENEW:"Renovar la membresía",BTN_MEMBERSHIP_RENEW_DOTS:"Renovar la membresía…",BTN_MEMBERSHIP_OUT_DOTS:"Cancelar la membresía…",BTN_SECURITY_DOTS:"Cuenta y seguridad…",BTN_SHOW_DETAILS:"Publicar la información técnica",LOCKED_OUTPUTS_POPOVER:{TITLE:"Importe bloqueado",DESCRIPTION:"Aquí están las condiciones para desbloquear este importe:",DESCRIPTION_MANY:"Esta transacción esta compuesta de varias partes, cuyas condiciones de desbloqueo son:",LOCKED_AMOUNT:"Condiciones del importe:"},NEW:{TITLE:"Registrarse",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.)",INTRO_WARNING_SECURITY:"Asegúrese de que el dispositivo actual (ordenador, tablet, teléfono) <b>es seguro y de confianza</b>.",INTRO_WARNING_SECURITY_HELP:"Antivirus, cortafuegos, sesión protegida por contraseña o número PIN, etc.",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.",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.",REGISTRATION_NODE_HELP:"Si no confía en este nodo, <a ng-click=\"doQuickFix('settings')\">cambie los ajustes</a> de Cesium.",SELECT_ACCOUNT_TYPE:"Elegir el tipo de cuenta a crear:",MEMBER_ACCOUNT:"Cuenta miembro",MEMBER_ACCOUNT_TITLE:"Crear una cuenta miembro",MEMBER_ACCOUNT_HELP:"Si todavía no tiene membresía (solamente una cuenta miembro posible por persona).",WALLET_ACCOUNT:"Simple monedero",WALLET_ACCOUNT_TITLE:"Crear una cuenta simple",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.",SALT_WARNING:"Elija su identificador.<br/>Se solicitará cada vez que se conectará con esta cuenta.<br/><br/><b>Conserve bien este identificador</b>.<br/>¡En caso de pérdida, nadie podrá acceder a su cuenta!",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!",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>",PSEUDO:"Seudónimo",PSEUDO_HELP:"Seudónimo",SALT_CONFIRM:"Confirmación",SALT_CONFIRM_HELP:"Confirmación del identificador",PASSWORD_CONFIRM:"Confirmación",PASSWORD_CONFIRM_HELP:"Confirmación de la contraseña",SLIDE_6_TITLE:"Confirmación:",COMPUTING_PUBKEY:"Cálculo en proceso…",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.",CONFIRMATION_MEMBER_ACCOUNT:'<b class="assertive">Advertencia:</b> el identificador, 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?',CONFIRMATION_WALLET_ACCOUNT:'<b class="assertive">Advertencia:</b> el identificador y la contraseña no podrán ser modificados.<br/><b>¡Asegúrese de recordarlos siempre!</b><br/><br/><b>¿Desea</b> continuar?',CHECKING_PSEUDO:"Verificando…",PSEUDO_AVAILABLE:"Este nombre está disponible",PSEUDO_NOT_AVAILABLE:"Este nombre de usuario no está disponible",INFO_LICENSE:"Para unirse a la moneda, le pedimos leer y aceptar esta licencia.",BTN_ACCEPT:"Acepto",BTN_ACCEPT_LICENSE:"Acepto la licencia"},POPUP_REGISTER:{TITLE:"Elija un seudónimo",HELP:"Un seudónimo es obligatorio para ser miembro."},SECURITY:{ADD_QUESTION:"Añadir pregunta personalizada",BTN_CLEAN:"Limpiar",BTN_RESET:"Reiniciar",DOWNLOAD_REVOKE:"Guardar un archivo de revocació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.",HELP_LEVEL:"Elija <strong> al menos {{nb}} preguntas:</strong>",LEVEL:"Nivel de seguridad",LOW_LEVEL:'Bajo <span class="hidden-xs">(2 preguntas min.)</span>',MEDIUM_LEVEL:'Medio <span class="hidden-xs">(4 preguntas min.)</span>',QUESTION_1:"¿Cómo se llamaba su mejor amigo de la adolescencia?",QUESTION_2:"¿Cómo se llamaba su primer animal de compañía?",QUESTION_3:"¿Cuál es el primer plato que aprendió a cocinar?",QUESTION_4:"¿Cuál es la primera película que vió en un cine?",QUESTION_5:"¿Cuál era el destino del primer avión que cogió?",QUESTION_6:"¿Cómo se llamaba su docente favorito en la escuela primaria?",QUESTION_7:"¿Cuál sería para usted el mejor oficio?",QUESTION_8:"¿Cuál es su libro infantil preferido?",QUESTION_9:"¿Cuál fue el modelo de su primer vehículo?",QUESTION_10:"¿Cuál fue su sobrenombre durante su infancia?",QUESTION_11:"¿Cuál fue su personaje o actor/actriz preferido/a cuando era estudiante?",QUESTION_12:"¿Cuál fue su cantante o grupo preferido cuando era estudiante?",QUESTION_13:"¿En qué ciudad sus padres se encontraron?",QUESTION_14:"¿Cómo se llamaba su primer jefe/a?",QUESTION_15:"¿Cómo se llama la calle donde creció?",QUESTION_16:"¿Cómo se llama la primera playa donde se bañó?",QUESTION_17:"¿Cuál es el primer álbum que compró?",QUESTION_18:"¿Cuál es el nombre de su equipo deportivo preferido?",QUESTION_19:"¿Cuál fue el oficio de su abuelo?",RECOVER_ID:"Recuperar sus credenciales",REVOCATION_WITH_FILE:"Revocar una identidad a partir de un fichero",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.",REVOCATION_FILENAME:"revocacion-{{uid}}-{{pubkey|formatPubkey}}-{{currency}}.txt",REVOCATION_WALLET:"Revocar esta identidad",SAVE_ID:"Guardar mis credenciales",STRONG_LEVEL:'Alto <span class="hidden-xs ">(6 preguntas min.)</span>',TITLE:"Cuenta y seguridad",
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.",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.",SAVE_ID_HELP:"Creación de un archivo de recuperación, para <b>reobtener su contraseña</b> (e identificador) en caso de olvido. El archivo se <b>cifra</b> con ayuda de las preguntas personales elegidas."},FILE_NAME:"{{currency}}_HistorialDeCuenta_{{pubkey|formatPubkey}}_{{currentTime|formatDateForFile}}.csv",HEADERS:{TIME:"Fecha",AMOUNT:"Cantidad",COMMENT:"Comentario"}},TRANSFER:{TITLE:"Transferencia",SUB_TITLE:"Hacer una transferencia",FROM:"De",TO:"A",AMOUNT:"Importe",AMOUNT_HELP:"Importe",COMMENT:"Comentario",COMMENT_HELP:"Comentario",BTN_SEND:"Enviar",BTN_ADD_COMMENT:"Añadir un comentario",MODAL:{TITLE:"Transferencia"}},ERROR:{UNKNOWN_URI_FORMAT:"Formato URI desconocido",PUBKEY_INVALID_CHECKSUM:"Llave pública no válida (suma de comprobación incorrecta).",POPUP_TITLE:"Error",UNKNOWN_ERROR:"Error desconocido",CRYPTO_UNKNOWN_ERROR:"Su navegador parece incompatible con las funcionalidades de cryptografía.",DOWNLOAD_KEYFILE_FAILED:"Error al generar el archivo de llaves.",EQUALS_TO_PSEUDO:"Debe ser diferente del seudónimo.",EQUALS_TO_SALT:"Debe ser diferente del identificador.",FIELD_REQUIRED:"Campo obligatorio.",FIELD_TOO_SHORT:"Valor demasiado corta.",FIELD_TOO_SHORT_WITH_LENGTH:"Valor demasiado corta ({{minLength}} carácteres mín)",FIELD_TOO_LONG:"Valor demasiado largo",FIELD_TOO_LONG_WITH_LENGTH:"Valor demasiado largo, ({{maxLength}} carácteres máx)",FIELD_MIN:"Valor mínimo: {{min}}",FIELD_MAX:"Valor máximo: {{max}}",FIELD_ACCENT:"Caracteres acentuados y comas no autorizados",FIELD_NOT_NUMBER:"Valor numérico esperado",FIELD_NOT_INT:"Valor entero esperado",FIELD_NOT_EMAIL:"Correo electrónico no válido",PASSWORD_NOT_CONFIRMED:"No coincide con la contraseña anterior.",SALT_NOT_CONFIRMED:"No corresponde al identificador anterior.",SEND_IDENTITY_FAILED:"Error de la inscripción.",SEND_CERTIFICATION_FAILED:"Error de la certificación.",NEED_MEMBER_ACCOUNT_TO_CERTIFY:"No se puede certificar, porque su cuenta no <b>es miembro</b>.",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.",IDENTITY_TO_CERTIFY_HAS_NO_SELF:"Esta cuenta no se pudo certificar. No se ha solicitado la membresía, o se necesita renovarla.",LOGIN_FAILED:"Error durante la autentificación.",LOAD_IDENTITY_FAILED:"Error de carga de la identidad.",LOAD_REQUIREMENTS_FAILED:"Error de carga de las condiciones de la identidad.",SEND_MEMBERSHIP_IN_FAILED:"Error en el intento de entrada en la comunidad.",SEND_MEMBERSHIP_OUT_FAILED:"Error en la interrupción de adhesión.",REFRESH_WALLET_DATA:"Error en la actualización del monedero.",GET_CURRENCY_PARAMETER:"Error en la recuperación de las reglas de moneda.",GET_CURRENCY_FAILED:"Carga de la moneda imposible. Por favor, intente más tarde.",SEND_TX_FAILED:"Error en la transferencia.",ALL_SOURCES_USED:"Por favor, espera el cálculo del bloque siguiente (Todas sus fuentes de moneda fueron utilizada).",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>.",NOT_MEMBER_FOR_CERTIFICATION:"Su cuenta no es todavía de tipo miembro.",ACCOUNT_CREATION_FAILED:"Error en la creación de la cuenta miembro.",RESTORE_WALLET_DATA_ERROR:"Error en la recarga de los ajustes desde el almacenamiento local",LOAD_WALLET_DATA_ERROR:"Error en la carga de los datos del monedero.",COPY_CLIPBOARD_FAILED:"Copia de la valor imposible.",TAKE_PICTURE_FAILED:"Error en la recuperación de la foto.",SCAN_FAILED:"Error en el escán del Codigo QR",SCAN_UNKNOWN_FORMAT:"Codigo no reconocido.",WOT_LOOKUP_FAILED:"Error en la búsqueda",LOAD_PEER_DATA_FAILED:"Lectura del nodo Duniter imposible. Por favor, intente más tarde.",NEED_LOGIN_FIRST:"Por favor, conéctese en primer lugar.",AMOUNT_REQUIRED:"El importe es obligatorio.",AMOUNT_NEGATIVE:"Importe negativo no autorizado.",NOT_ENOUGH_CREDIT:"Crédito insuficiente.",INVALID_NODE_SUMMARY:"Nodo ilocalizable o dirección inválida.",INVALID_USER_ID:"El seudónimo no debe contener ni espacios ni caracteres especiales o acentuado.",INVALID_COMMENT:"El campo 'referencia no debe contener carácteres acentuados.",INVALID_PUBKEY:"La llave pública no tiene el formato esperado.",INVALID_PUBKEY_CHECKSUM:"Suma de comprobación inválida.",IDENTITY_REVOKED:"Esta identidad <b>fue revocada</b>. No puede volver a convertirla en miembro.",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.",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.",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.",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>).",IDENTITY_NOT_FOUND:"Identidad no encontrada",WOT_PENDING_INVALID_BLOCK_HASH:"Adhesión no validada.",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.",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.",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.",WALLET_HAS_NO_SELF:"Su identidad debe en primer lugar haber estado publicado, y no estar caducada.",AUTH_REQUIRED:"Autenticación requerida.",AUTH_INVALID_PUBKEY:"La llave pública no se corresponde con la cuenta conectada",AUTH_INVALID_SCRYPT:"De usuario o contraseña no válidos.",AUTH_INVALID_FILE:"archivo de llave no válido.",AUTH_FILE_ERROR:"No se pudo abrir el archivo de llave",IDENTITY_ALREADY_CERTIFY:"Ya <b>ha certificado</b> esta identidad.<br/><br/>Esta certificación todavía es valida (expiration {{expiresIn|formatDurationTo}}).",IDENTITY_ALREADY_CERTIFY_PENDING:"Ya <b>ha certificado</b> esta identidad.<br/><br/>Esta certificación está en espera de tratamiento (fecha límite de tratamiento {{expiresIn|formatDurationTo}}).",IDENTITY_TX_FAILED:"Error al obtener las transacciones de la identidad",UNABLE_TO_CERTIFY_TITLE:"Certificación imposible",LOAD_NEWCOMERS_FAILED:"No se pudo cargar las nuevas membresías.",LOAD_PENDING_FAILED:"No se pudo cargar las inscripciones pendientes.",ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION:"Debe <b>ser miembro</b> para poder realizar esta acción.",ONLY_SELF_CAN_EXECUTE_THIS_ACTION:"Debe haber <b>publicado su identidad</b> para poder realizar esta acción.",GET_BLOCK_FAILED:"Error en la recuperación del bloque",INVALID_BLOCK_HASH:"Bloque no encontrado (hash diferente)",DOWNLOAD_REVOCATION_FAILED:"Debe seleccionar un fichero de texto",REVOCATION_FAILED:"Error en la revocación.",SALT_OR_PASSWORD_NOT_CONFIRMED:"identificador o contraseña incorrectos",RECOVER_ID_FAILED:"Error en la recuperación de las credenciales",LOAD_FILE_FAILED:"Error en la carga del archivo",NOT_VALID_REVOCATION_FILE:"Archivo de revocación no válido (formato de archivo erróneo)",NOT_VALID_SAVE_ID_FILE:"Archivo no válido (formato de archivo erróneo)",NOT_VALID_KEY_FILE:"Archivo no válido (formato de archivo erróneo)",EXISTING_ACCOUNT:"Sus credenciales corresponden a una cuenta existente, la <a ng-click=\"showHelpModal('pubkey')\">llave pública</a> es:",EXISTING_ACCOUNT_REQUEST:"Por favor, cambie sus credenciales para que coincida con una cuenta sin usar.",GET_LICENSE_FILE_FAILED:"Error al obtener el archivo de licencia",CHECK_NETWORK_CONNECTION:"No se puede conectar a ningún nodo.<br/><br/><b>Compruebe la conexión a Internet</b>."},INFO:{POPUP_TITLE:"Información",CERTIFICATION_DONE:"Certificación enviada",NOT_ENOUGH_CREDIT:"Crédito insuficiente",TRANSFER_SENT:"Transferencia enviada",COPY_TO_CLIPBOARD_DONE:"Copia realizada",MEMBERSHIP_OUT_SENT:"Anulación enviada",NOT_NEED_MEMBERSHIP:"Ya es miembro.",IDENTITY_WILL_MISSING_CERTIFICATIONS:"Esta identidad pronto va a necesitar certificaciones (al menos {{willNeedCertificationCount}}).",REVOCATION_SENT:"Revocación enviada",REVOCATION_SENT_WAITING_PROCESS:"La <b>revocación de esta identidad</b> fue solicitada y está en espera de ser procesada.",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? ;)",EMPTY_TX_HISTORY:"Ninguna operación a exportar"},CONFIRM:{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?',CERTIFY_RULES_TITLE_UID:"Certificar {{uid}}",EXIT_APP:"¿ Cerrar la aplicación ?",FULLSCREEN:"¿ Mostrar la aplicación en pantalla completa ?",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>",LOGIN_UNUSED_WALLET_TITLE:"¿Error de introducción de datos?",LOGOUT:"¿Desea desconectarse?",POPUP_SECURITY_WARNING_TITLE:'<i class="icon ion-alert-circled"></i> <b>Advertencia de seguridad</b>',POPUP_TITLE:"<b>Confirmación</b>",POPUP_WARNING_TITLE:"<b>Advertencia</b>",SAVE_BEFORE_LEAVE:"¿Desea <b>guardar sus cambios</b> antes de abandonar la página?",SAVE_BEFORE_LEAVE_TITLE:"Cambios no registrados",USE_FALLBACK_NODE:"Nodo <b>{{old}}</b> inalcanzable o dirección inválida.<br/><br/>¿Desea utilizar temporalmente el nodo <b>{{new}}</b>?"},DOWNLOAD:{POPUP_TITLE:"<b>Revocación del archivo</b>",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>"},HELP:{TITLE:"Ayuda en línea",JOIN:{SECTION:"Inscripción",SALT:'El identificador 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 debe ser suficientemente largo (al menos 8 carácteres) y lo más original posible.',PASSWORD:'La contraseña es muy importante. Junto al identificador, 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.'},GLOSSARY:{SECTION:"Glosario",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 y la contraseña.",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.'}}}),e.translations("fr-FR",{COMMON:{APP_NAME:"ğ<b>change</b>",APP_VERSION:"v{{version}}",APP_BUILD:"date : {{build}}",PUBKEY:"Clé publique",MEMBER:"Membre",BLOCK:"Bloc",BTN_OK:"OK",BTN_YES:"Oui",BTN_NO:"Non",BTN_SEND:"Envoyer",BTN_SEND_MONEY:"Faire un virement",BTN_SEND_MONEY_SHORT:"Virement",BTN_SAVE:"Enregistrer",BTN_YES_SAVE:"Oui, Enregistrer",BTN_YES_CONTINUE:"Oui, Continuer",BTN_SHOW:"Voir",BTN_SHOW_PUBKEY:"Afficher la clé publique",BTN_RELATIVE_UNIT:"Afficher les montants en DU ?",BTN_BACK:"Retour",BTN_NEXT:"Suivant",BTN_IMPORT:"Importer",BTN_CANCEL:"Annuler",BTN_CLOSE:"Fermer",BTN_COPY:"Copier",BTN_LATER:"Plus tard",BTN_LOGIN:"Se connecter",BTN_LOGOUT:"Déconnexion",BTN_ADD_ACCOUNT:"Nouveau compte",BTN_SHARE:"Partager",BTN_EDIT:"Modifier",BTN_DELETE:"Supprimer",BTN_ADD:"Ajouter",BTN_SEARCH:"Rechercher",BTN_REFRESH:"Actualiser",BTN_RETRY:"Recommencer",BTN_START:"Commencer",BTN_CONTINUE:"Continuer",BTN_CREATE:"Créer",BTN_UNDERSTOOD:"J'ai compris",BTN_OPTIONS:"Options",BTN_HELP_TOUR:"Visite guidée",BTN_HELP_TOUR_SCREEN:"Découvrir cet écran",BTN_DOWNLOAD:"Télécharger",BTN_DOWNLOAD_ACCOUNT_STATEMENT:"Télécharger le relevé du compte",BTN_MODIFY:"Modifier",CHOOSE_FILE:"Déposez votre fichier <br/>ou cliquez pour le sélectionner",DAYS:"jours",NO_ACCOUNT_QUESTION:"Pas encore de compte ? Créez-en un gratuitement !",SEARCH_NO_RESULT:"Aucun résultat trouvé",LOADING:"Veuillez patienter...",LOADING_WAIT:"Veuillez patienter...<br/><small>(ğchange interroge le réseau)</small>",SEARCHING:"Recherche en cours...",FROM:"De",TO:"À",COPY:"Copier",LANGUAGE:"Langue",UNIVERSAL_DIVIDEND:"Dividende universel",UD:"DU",DATE_PATTERN:"DD/MM/YY HH:mm",DATE_FILE_PATTERN:"YYYY-MM-DD",DATE_SHORT_PATTERN:"DD/MM/YY",DATE_MONTH_YEAR_PATTERN:"MM/YYYY",EMPTY_PARENTHESIS:"(vide)",UID:"Pseudonyme",ENABLE:"Activé",DISABLE:"Désactivé",RESULTS_LIST:"Résultats",RESULTS_COUNT:"{{count}} résultats",EXECUTION_TIME:"exécuté en {{duration|formatDurationMs}}",SHOW_VALUES:"Afficher les valeurs en clair ?",POPOVER_ACTIONS_TITLE:"Options",POPOVER_FILTER_TITLE:"Filtres",SHOW_MORE:"Afficher plus",SHOW_MORE_COUNT:"(limite actuelle à {{limit}})",POPOVER_SHARE:{TITLE:"Partager",SHARE_ON_TWITTER:"Partager sur Twitter",SHARE_ON_FACEBOOK:"Partager sur Facebook",SHARE_ON_DIASPORA:"Partager sur Diaspora*",SHARE_ON_MASTODON:"Partager sur Mastodon",INSTANCE_ADDRESS_HELP:"Entrer l'adresse de l'instance (ex: https://framapiaf.org) :"},FILE:{DATE:"Date :",TYPE:"Type :",SIZE:"Taille :",VALIDATING:"Validation en cours..."}},SYSTEM:{PICTURE_CHOOSE_TYPE:"Choisir la source :",BTN_PICTURE_GALLERY:"Galerie",BTN_PICTURE_CAMERA:"<b>Caméra</b>"},MENU:{HOME:"Accueil",WOT:"Annuaire",CURRENCY:"Monnaie",ACCOUNT:"Mon compte",WALLETS:"Mes portefeuilles",TRANSFER:"Virement",SCAN:"Scanner",SETTINGS:"Paramètres",NETWORK:"Réseau",TRANSACTIONS:"Mes opérations"},ABOUT:{TITLE:"À propos",LICENSE:"Application <b>libre</b> (Licence GNU AGPLv3).",LATEST_RELEASE:"Il existe une <b>version plus récente</b> de {{'COMMON.APP_NAME'|translate}} (<b>v{{version}}</b>)",PLEASE_UPDATE:"Veuillez mettre à jour {{'COMMON.APP_NAME'|translate}} (dernière version : <b>v{{version}}</b>)",CODE:"Code source :",OFFICIAL_WEB_SITE:"Site web officiel :",DEVELOPERS:"Développé par :",FORUM:"Forum :",DEV_WARNING:"Avertissement",DEV_WARNING_MESSAGE:"Cette application est toujours en développement.<br/>N'hésitez pas à nous remonter les anomalies rencontrées !",DEV_WARNING_MESSAGE_SHORT:"Cette application est toujours en développement.",REPORT_ISSUE:"Remonter un problème"},HOME:{TITLE:"ğ<b>change</b>",MESSAGE:"ğ<b>change</b> ?",MESSAGE_CURRENCY:"Un logiciel pour <b>garder le contrôle</b> de vos petites annonces en {{currency|abbreviate}}",BTN_CURRENCY:"Explorer la monnaie {{name|abbreviate}}",BTN_ABOUT:"à propos",BTN_HELP:"Aide en ligne",REPORT_ISSUE:"anomalie",NOT_YOUR_ACCOUNT_QUESTION:"Vous n'êtes pas propriétaire du compte<br/><b>{{name|| (pubkey|formatPubkey) }}</b> ?",BTN_CHANGE_ACCOUNT:"Déconnecter ce compte",CONNECTION_ERROR:'Nœud <b>{{server}}</b> d\'accès à la monnaie injoignable ou adresse invalide.<br/><br/>Vérifiez votre connexion Internet, ou changez de nœud <a class="positive" ng-click="doQuickFix(\'settings\')">dans les paramètres</a>.',SHOW_ALL_FEED:"Voir tout",READ_MORE:"Lire la suite",FEED_SOURCE:"Source"},SETTINGS:{TITLE:"Paramètres",DISPLAY_DIVIDER:"Affichage",STORAGE_DIVIDER:"Stockage",NETWORK_SETTINGS:"Réseau",PEER:"Adresse du nœud Duniter",PEER_SHORT:"Adresse du nœud",PEER_CHANGED_TEMPORARY:"Adresse utilisée temporairement",PERSIST_CACHE:"Conserver les données de navigation (expérimental)",PERSIST_CACHE_HELP:"Permet une navigation plus rapide, en conservant localement les données reçues, pour les utiliser d'une session à l'autre.",USE_LOCAL_STORAGE:"Activer le stockage local",USE_LOCAL_STORAGE_HELP:"Permet de sauvegarder vos paramètres",ENABLE_HELPTIP:"Activer les bulles d'aide contextuelles",ENABLE_UI_EFFECTS:"Activer les effets visuels",HISTORY_SETTINGS:"Mes opérations",DISPLAY_UD_HISTORY:"Afficher les dividendes produits ?",AUTHENTICATION_SETTINGS:"Authentification",REMEMBER_ME:"Se souvenir de moi ?",REMEMBER_ME_HELP:"Permet de rester toujours connecté.",PLUGINS_SETTINGS:"Extensions",BTN_RESET:"Restaurer les valeurs par défaut",EXPERT_MODE:"Activer le mode expert",EXPERT_MODE_HELP:"Permet un affichage plus détaillé",POPUP_PEER:{TITLE:"Nœud Duniter",HOST:"Adresse",HOST_HELP:"Adresse : serveur:port",USE_SSL:"Sécurisé ?",USE_SSL_HELP:"(Chiffrement SSL)",BTN_SHOW_LIST:"Liste des noeuds"}},BLOCKCHAIN:{HASH:"Hash : {{hash}}",VIEW:{HEADER_TITLE:"Bloc #{{number}}-{{hash|formatHash}}",TITLE_CURRENT:"Bloc courant",TITLE:"Bloc #{{number|formatInteger}}",COMPUTED_BY:"Calculé par le noeud de",SHOW_RAW:"Voir le fichier brut",TECHNICAL_DIVIDER:"Informations techniques",VERSION:"Version du format",HASH:"Hash calculé",UNIVERSAL_DIVIDEND_HELP:"Monnaie co-produite par chacun des {{membersCount}} membres",EMPTY:"Aucune donnée dans ce bloc",POW_MIN:"Difficulté minimale",POW_MIN_HELP:"Difficulté imposée pour le calcul du hash",DATA_DIVIDER:"Données",IDENTITIES_COUNT:"Nouvelles identités",JOINERS_COUNT:"Nouveaux membres",ACTIVES_COUNT:"Renouvellements",ACTIVES_COUNT_HELP:"Membres ayant renouvelé leur adhésion",LEAVERS_COUNT:"Membres sortants",LEAVERS_COUNT_HELP:"Membres ne souhaitant plus de certification",EXCLUDED_COUNT:"Membres exclus",EXCLUDED_COUNT_HELP:"Anciens membres exclus par non renouvellement ou manque de certifications",REVOKED_COUNT:"Identités révoquées",REVOKED_COUNT_HELP:"Ces comptes ne pourront plus être membres",TX_COUNT:"Transactions",CERT_COUNT:"Certifications",TX_TO_HIMSELF:"Opération de change",TX_OUTPUT_UNLOCK_CONDITIONS:"Conditions de déblocage",TX_OUTPUT_OPERATOR:{AND:"et",OR:"ou"},TX_OUTPUT_FUNCTION:{SIG:"<b>Signature</b> de ",XHX:"<b>Mot de passe</b>, dont SHA256 =",CSV:"Bloqué pendant",CLTV:"Bloqué jusqu'à"}},LOOKUP:{TITLE:"Blocs",NO_BLOCK:"Aucun bloc",LAST_BLOCKS:"Derniers blocs :",BTN_COMPACT:"Compacter"}},CURRENCY:{VIEW:{TITLE:"Monnaie",TAB_CURRENCY:"Monnaie",TAB_WOT:"Toile de confiance",TAB_NETWORK:"Réseau",TAB_BLOCKS:"Blocs",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}}.",NETWORK_RULES_DIVIDER:"Règles du réseau",CURRENCY_NAME:"Nom de la monnaie",MEMBERS:"Nombre de membres",MEMBERS_VARIATION:"Variation depuis le dernier DU",MONEY_DIVIDER:"Monnaie",MASS:"Masse monétaire",SHARE:"Masse par membre",UD:"Dividende universel",C_ACTUAL:"Croissance actuelle",MEDIAN_TIME:"Heure de la blockchain",POW_MIN:"Niveau minimal de difficulté de calcul",MONEY_RULES_DIVIDER:"Règles de la monnaie",C_RULE:"Croissance théorique cible",UD_RULE:"Calcul du dividende universel",DT_REEVAL:"Période de revalorisation du DU",REEVAL_SYMBOL:"reval",DT_REEVAL_VALUE:"Tous les <b>{{dtReeval|formatDuration}}</b> ({{dtReeval/86400}} {{'COMMON.DAYS'|translate}})",UD_REEVAL_TIME0:"Date de la 1ère revalorisation",SIG_QTY_RULE:"Nombre de certifications requises pour devenir membre",SIG_STOCK:"Nombre maximal de certifications émises par membre",SIG_PERIOD:"Délai minimal d'attente entre 2 certifications successives émises par une même personne",SIG_WINDOW:"Délai limite de prise en compte d'une certification",SIG_VALIDITY:"Durée de vie d'une certification qui a été prise en compte",MS_WINDOW:"Délai limite de prise en compte d'une demande d'adhésion comme membre",MS_VALIDITY:"Durée de vie d'une adhésion qui a été prise en compte",STEP_MAX:"Distance maximale, par les certifications, entre un nouvel entrant et les membres référents",WOT_RULES_DIVIDER:"Règles de la toile de confiance",SENTRIES:"Nombre de certifications (émises <b>et</b> reçues) pour devenir membre référent",SENTRIES_FORMULA:"Nombre de certifications (émises <b>et</b> reçues) pour devenir membre référent (formule)",XPERCENT:"Pourcentage minimum de membres référents à atteindre pour respecter la règle de distance",AVG_GEN_TIME:"Temps moyen entre deux blocs",CURRENT:"actuel",MATH_CEILING:"PLAFOND",DISPLAY_ALL_RULES:"Afficher toutes les règles ?",BTN_SHOW_LICENSE:"Voir la licence",WOT_DIVIDER:"Toile de confiance"},LICENSE:{TITLE:"Licence de la monnaie",BTN_DOWNLOAD:"Télécharger le fichier",NO_LICENSE_FILE:"Fichier de licence non trouvé."}},NETWORK:{VIEW:{MEDIAN_TIME:"Heure de la blockchain",LOADING_PEERS:"Chargement des noeuds...",NODE_ADDRESS:"Adresse :",SOFTWARE:"Logiciel",WARN_PRE_RELEASE:"Pré-version (dernière version stable : <b>{{version}}</b>)",WARN_NEW_RELEASE:"Version <b>{{version}}</b> disponible",WS2PID:"Identifiant :",PRIVATE_ACCESS:"Accès privé",POW_PREFIX:"Préfixe de preuve de travail :",ENDPOINTS:{BMAS:"Interface sécurisée (SSL)",BMATOR:"Interface réseau TOR",WS2P:"Interface WS2P",ES_USER_API:"Noeud de données Cesium+"}},INFO:{ONLY_SSL_PEERS:"Les noeuds non SSL ont un affichage dégradé, car Cesium fonctionne en mode HTTPS."}},PEER:{PEERS:"Nœuds",SIGNED_ON_BLOCK:"Signé sur le bloc",MIRROR:"miroir",MIRRORS:"Miroirs",MIRROR_PEERS:"Nœuds miroirs",PEER_LIST:"Liste des nœuds",MEMBERS:"Membres",MEMBER_PEERS:"Nœuds membres",ALL_PEERS:"Tous les nœuds",DIFFICULTY:"Difficulté",API:"API",CURRENT_BLOCK:"Bloc #",POPOVER_FILTER_TITLE:"Filtre",OFFLINE:"Hors ligne",OFFLINE_PEERS:"Nœuds hors ligne",BTN_SHOW_PEER:"Voir le nœud",VIEW:{TITLE:"Nœud",OWNER:"Appartient à",SHOW_RAW_PEERING:"Voir la fiche de pair",SHOW_RAW_CURRENT_BLOCK:"Voir le dernier bloc (format brut)",LAST_BLOCKS:"Derniers blocs connus",KNOWN_PEERS:"Nœuds connus :",GENERAL_DIVIDER:"Informations générales",ERROR:{LOADING_TOR_NODE_ERROR:"Récupération des informations du noeud impossible. Le délai d'attente est dépassé.",LOADING_NODE_ERROR:"Récupération des informations du noeud impossible"}}},WOT:{SEARCH_HELP:"Recherche (nom, prénom, hashtag)",SEARCH_INIT_PHASE_WARNING:"Durant la phase de pré-inscription, la recherche des inscriptions en attente <b>peut être longue</b>. Merci de patienter...",REGISTERED_SINCE:"Inscrit le",REGISTERED_SINCE_BLOCK:"Inscrit au bloc #",NO_CERTIFICATION:"Aucune certification validée",NO_GIVEN_CERTIFICATION:"Aucune certification émise",NOT_MEMBER_PARENTHESIS:"(non membre)",IDENTITY_REVOKED_PARENTHESIS:"(identité révoquée)",MEMBER_PENDING_REVOCATION_PARENTHESIS:"(en cours de révocation)",EXPIRE_IN:"Expiration",NOT_WRITTEN_EXPIRE_IN:"Date limite<br/>de traitement",EXPIRED:"Expiré",PSEUDO:"Pseudonyme",SIGNED_ON_BLOCK:"Emise au bloc #{{block}}",WRITTEN_ON_BLOCK:"Ecrite au bloc #{{block}}",GENERAL_DIVIDER:"Informations générales",NOT_MEMBER_ACCOUNT:"Compte simple (non membre)",NOT_MEMBER_ACCOUNT_HELP:"Il s'agit d'un simple portefeuille, sans demande d'adhésion en attente.",TECHNICAL_DIVIDER:"Informations techniques",BTN_CERTIFY:"Certifier",BTN_YES_CERTIFY:"Oui, certifier",BTN_SELECT_AND_CERTIFY:"Nouvelle certification",ACCOUNT_OPERATIONS:"Opérations sur le compte",VIEW:{POPOVER_SHARE_TITLE:"Identité {{title}}"},LOOKUP:{TITLE:"Annuaire",NEWCOMERS:"Nouveaux membres :",NEWCOMERS_COUNT:"{{count}} membres",PENDING:"Inscriptions en attente :",PENDING_COUNT:"{{count}} inscriptions en attente",REGISTERED:"Inscrit {{time | formatFromNow}}",MEMBER_FROM:"Membre depuis {{time|formatFromNowShort}}",BTN_NEWCOMERS:"Nouveaux membres",BTN_PENDING:"Inscriptions en attente",SHOW_MORE:"Afficher plus",SHOW_MORE_COUNT:"(limite actuelle à {{limit}})",NO_PENDING:"Aucune inscription en attente.",NO_NEWCOMERS:"Aucun membre."},CONTACTS:{TITLE:"Contacts"},MODAL:{TITLE:"Recherche"},CERTIFICATIONS:{TITLE:"{{uid}} - Certifications",SUMMARY:"Certifications reçues",LIST:"Détail des certifications reçues",PENDING_LIST:"Certifications en attente de traitement",RECEIVED:"Certifications reçues",RECEIVED_BY:"Certifications reçues par {{uid}}",ERROR:"Certifications reçues en erreur",SENTRY_MEMBER:"Membre référent"},OPERATIONS:{TITLE:"{{uid}} - Opérations"},GIVEN_CERTIFICATIONS:{TITLE:"{{uid}} - Certifications émises",SUMMARY:"Certifications émises",LIST:"Détail des certifications émises",PENDING_LIST:"Certifications en attente de traitement",SENT:"Certifications émises",SENT_BY:"Certifications émises par {{uid}}",ERROR:"Certifications émises en erreur"}},LOGIN:{TITLE:'<i class="icon ion-log-in"></i> Connexion',SCRYPT_FORM_HELP:"Veuillez saisir vos identifiants.<br>Pensez à vérifier que la clé publique est celle de votre compte.",PUBKEY_FORM_HELP:"Veuillez saisir une clé publique de compte :",FILE_FORM_HELP:"Choisissez le fichier de trousseau à utiliser :",SCAN_FORM_HELP:"Scanner le QR code d'un portefeuille.",SALT:"Identifiant",SALT_HELP:"Identifiant",SHOW_SALT:"Afficher l'identifiant ?",PASSWORD:"Mot de passe",PASSWORD_HELP:"Mot de passe",PUBKEY_HELP:"Exemple : « AbsxSY4qoZRzyV2irfep1V9xw1EMNyKJw2TkuVD4N1mv »",NO_ACCOUNT_QUESTION:"Vous n'avez pas encore de compte ?",HAVE_ACCOUNT_QUESTION:"Vous avez déjà un compte ?",CREATE_ACCOUNT:"Créer un compte...",CREATE_FREE_ACCOUNT:"Créer un compte gratuitement",FORGOTTEN_ID:"Mot de passe oublié ?",ASSOCIATED_PUBKEY:"Clé publique du trousseau :",BTN_METHODS:"Autres méthodes",BTN_METHODS_DOTS:"Changer de méthode...",METHOD_POPOVER_TITLE:"Méthodes",MEMORIZE_AUTH_FILE:"Mémoriser ce trousseau le temps de la session de navigation",SCRYPT_PARAMETERS:"Paramètres (Scrypt) :",AUTO_LOGOUT:{TITLE:"Information",MESSAGE:'<i class="ion-android-time"></i> Vous avez été <b>déconnecté</b> automatiquement, suite à une inactivité prolongée.',BTN_RELOGIN:"Me reconnecter",IDLE_WARNING:"Vous allez être déconnecté... {{countdown}}"},METHOD:{SCRYPT_DEFAULT:"Identifiant et mot de passe",SCRYPT_ADVANCED:"Salage avancé",FILE:"Fichier de trousseau",PUBKEY:"Clé publique ou pseudonyme",SCAN:"Scanner un QR code"},SCRYPT:{SIMPLE:"Salage léger",DEFAULT:"Salage standard",SECURE:"Salage sûr",HARDEST:"Salage le plus sûr",EXTREME:"Salage extrême",USER:"Salage personnalisé",N:"N (Loop):",r:"r (RAM):",p:"p (CPU):"},FILE:{DATE:"Date:",TYPE:"Type:",SIZE:"Taille:",VALIDATING:"Validation...",HELP:"Format de fichier attendu : <b>.yml</b> ou <b>.dunikey</b> (type PubSec, WIF ou EWIF)."}},ACCOUNT:{TITLE:"Mon compte",SHOW_MORE_TX:"Afficher plus",SHOW_ALL_TX:"Afficher tout",EVENTS:"Evénements",BTN_RECEIVE_MONEY:"Encaisser",BTN_SECURITY_DOTS:"Compte et sécurité...",BTN_SHOW_DETAILS:"Afficher les infos techniques",NEW:{TITLE:"Inscription",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.).",INTRO_WARNING_SECURITY:"Vérifier que le matériel que vous utilisez actuellement (ordinateur, tablette, téléphone) <b>est sécurisé et digne de confiance</b>.",INTRO_WARNING_SECURITY_HELP:"Anti-virus à jour, pare-feu activé, session protégée par mot de passe ou code pin, etc.",INTRO_HELP:"Cliquez sur <b>{{'COMMON.BTN_START'|translate}}</b> pour débuter la création de compte. Vous serez guidé étape par étape.",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.",REGISTRATION_NODE_HELP:"Si vous ne faites pas confiance à ce noeud, veuillez en changer <a ng-click=\"doQuickFix('settings')\">dans les paramètres</a> de Cesium.",SELECT_ACCOUNT_TYPE:"Choisissez le type de compte à créer :",MEMBER_ACCOUNT:"Compte membre",MEMBER_ACCOUNT_TITLE:"Création d'un compte membre",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}}.",WALLET_ACCOUNT:"Simple portefeuille",WALLET_ACCOUNT_TITLE:"Création d'un portefeuille",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.",SALT_WARNING:"Choisissez votre identifiant.<br/>Il vous sera demandé à chaque connexion sur ce compte.<br/><br/><b>Retenez-le bien</b>.<br/>En cas de perte, plus personne ne pourra accéder à votre compte !",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>.<br/>En cas de perte, plus personne ne pourra accéder à votre compte !",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>",PSEUDO:"Pseudonyme",PSEUDO_HELP:"Pseudonyme",SALT_CONFIRM:"Confirmation",SALT_CONFIRM_HELP:"Confirmation de l'identifiant",PASSWORD_CONFIRM:"Confirmation",PASSWORD_CONFIRM_HELP:"Confirmation du mot de passe",SLIDE_6_TITLE:"Confirmation :",COMPUTING_PUBKEY:"Calcul en cours...",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 leur paiement.<br/><b>Il n'est pas obligatoire</b> de la noter ici, vous pourrez également le faire plus tard.",CONFIRMATION_MEMBER_ACCOUNT:"<b class=\"assertive\">Avertissement :</b> l'identifiant, 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 ?",CONFIRMATION_WALLET_ACCOUNT:'<b class="assertive">Avertissement :</b> l\'identifiant 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 ?',CHECKING_PSEUDO:"Vérification...",PSEUDO_AVAILABLE:"Pseudonyme disponible",PSEUDO_NOT_AVAILABLE:"Pseudonyme non disponible",INFO_LICENSE:"Avant de créer un compte membre, <b>veuillez lire et accepter la licence</b> d'usage de la monnaie :",BTN_ACCEPT:"J'accepte",BTN_ACCEPT_LICENSE:"J'accepte la licence"},POPUP_REGISTER:{TITLE:"Choisissez un pseudonyme",HELP:"Un pseudonyme est obligatoire pour devenir membre."},HEADERS:{TIME:"Date",AMOUNT:"Montant",COMMENT:"Commentaire"}},TRANSFER:{TITLE:"Virement",SUB_TITLE:"Faire un virement",FROM:"De",TO:"À",AMOUNT:"Montant",AMOUNT_HELP:"Montant",COMMENT:"Commentaire",COMMENT_HELP:"Commentaire",BTN_SEND:"Envoyer",BTN_ADD_COMMENT:"Saisir un commentaire ?",MODAL:{TITLE:"Virement"}},ERROR:{UNKNOWN_URI_FORMAT:"Format d'URI inconnu",PUBKEY_INVALID_CHECKSUM:"Clé publique invalide (bad checksum).",POPUP_TITLE:"Erreur",UNKNOWN_ERROR:"Erreur inconnue",CRYPTO_UNKNOWN_ERROR:"Votre navigateur ne semble pas compatible avec les fonctionnalités de cryptographie.",EQUALS_TO_PSEUDO:"Doit être différent du pseudonyme",EQUALS_TO_SALT:"Doit être différent de l'identifiant secret",FIELD_REQUIRED:"Champ obligatoire",FIELD_TOO_SHORT:"Valeur trop courte",FIELD_TOO_SHORT_WITH_LENGTH:"Valeur trop courte ({{minLength}} caractères min)",FIELD_TOO_LONG:"Valeur trop longue",FIELD_TOO_LONG_WITH_LENGTH:"Valeur trop longue ({{maxLength}} caractères max)",FIELD_MIN:"Valeur minimale : {{min}}",FIELD_MAX:"Valeur maximale : {{max}}",FIELD_ACCENT:"Caractères accentués et virgules non autorisés",FIELD_NOT_NUMBER:"Valeur numérique attendue",FIELD_NOT_INT:"Valeur entière attendue",FIELD_NOT_EMAIL:"Adresse email non valide",PASSWORD_NOT_CONFIRMED:"Ne correspond pas au mot de passe",SALT_NOT_CONFIRMED:"Ne correspond pas à l'identifiant",SEND_IDENTITY_FAILED:"Échec de l'inscription",SEND_CERTIFICATION_FAILED:"Échec de la certification",NEED_MEMBER_ACCOUNT_TO_CERTIFY:"Vous ne pouvez pas effectuer de certification, car votre compte n'est <b>pas membre</b>.",NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF:"Vous ne pouvez pas effectuer de certification, car votre 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.",NOT_MEMBER_FOR_CERTIFICATION:"Votre compte n'est pas encore membre.",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.",LOGIN_FAILED:"Erreur lors de la connexion.",LOAD_IDENTITY_FAILED:"Erreur de chargement de l'identité.",LOAD_REQUIREMENTS_FAILED:"Erreur de chargement des prérequis de l'identité.",SEND_MEMBERSHIP_IN_FAILED:"Échec de la tentative d'entrée dans la communauté.",SEND_MEMBERSHIP_OUT_FAILED:"Échec de l'arrêt de l'adhésion.",REFRESH_WALLET_DATA:"Échec du rafraîchissement du portefeuille.",GET_CURRENCY_PARAMETER:"Échec de la récupération des règles de la monnaie.",GET_CURRENCY_FAILED:"Chargement de la monnaie impossible. Veuillez réessayer plus tard.",SEND_TX_FAILED:"Échec du virement.",ALL_SOURCES_USED:"Veuillez attendre le calcul du prochain bloc (toutes vos sources de monnaie ont été utilisées).",NOT_ENOUGH_SOURCES:"Pas assez de change pour envoyer ce montant en une seule transaction.<br/>Montant maximum : {{amount}} {{unit}}<sub>{{subUnit}}</sub>.",ACCOUNT_CREATION_FAILED:"Échec de la création du compte membre.",RESTORE_WALLET_DATA_ERROR:"Échec du rechargement des paramètres depuis le stockage local",LOAD_WALLET_DATA_ERROR:"Échec du chargement des données du portefeuille.",COPY_CLIPBOARD_FAILED:"Copie de la valeur impossible.",TAKE_PICTURE_FAILED:"Échec de la récupération de la photo.",SCAN_FAILED:"Échec du scan de QR-code.",SCAN_UNKNOWN_FORMAT:"Code non reconnu.",WOT_LOOKUP_FAILED:"Échec de la recherche.",LOAD_PEER_DATA_FAILED:"Lecture du nœud Duniter impossible. Veuillez réessayer ultérieurement.",NEED_LOGIN_FIRST:"Veuillez d'abord vous connecter.",AMOUNT_REQUIRED:"Le montant est obligatoire.",AMOUNT_NEGATIVE:"Montant négatif non autorisé.",NOT_ENOUGH_CREDIT:"Crédit insuffisant.",INVALID_NODE_SUMMARY:"Nœud injoignable ou adresse invalide.",INVALID_USER_ID:"Le pseudonyme ne doit contenir ni espace ni caractère spécial ou accentué.",INVALID_COMMENT:"Le champ 'référence' ne doit pas contenir de caractères accentués.",INVALID_PUBKEY:"La clé publique n'a pas le format attendu.",INVALID_PUBKEY_CHECKSUM:"Somme de contrôle invalide.",IDENTITY_REVOKED:"Cette identité <b>a été révoquée {{revocationTime|formatFromNow}}</b> ({{revocationTime|formatDate}}). Elle ne peut plus devenir membre.",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.",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.",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.",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>).",IDENTITY_NOT_FOUND:"Identité non trouvée.",IDENTITY_TX_FAILED:"Échec du chargement des opérations.",WOT_PENDING_INVALID_BLOCK_HASH:"Adhésion non valide.",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.",WALLET_IDENTITY_EXPIRED:"La publication de <b>votre identité a expiré</b>.<br/>Vous devez <a ng-click=\"doQuickFix('fixIdentity')\">publier à nouveau votre identité</a> pour résoudre ce problème.",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.",WALLET_HAS_NO_SELF:"Votre identité doit d'abord avoir été publiée, et ne pas être expirée.",AUTH_REQUIRED:"Authentification requise.",AUTH_INVALID_PUBKEY:"La clé publique ne correspond pas au compte connecté.",AUTH_INVALID_SCRYPT:"Identifiant ou mot de passe invalide.",AUTH_INVALID_FILE:"Fichier de trousseau invalide.",AUTH_FILE_ERROR:"Échec de l'ouverture du fichier de trousseau",IDENTITY_ALREADY_CERTIFY:"Vous avez <b>déjà certifié</b> cette identité.<br/><br/>Cette certification est encore valide (expiration {{expiresIn|formatDurationTo}}).",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}}).",UNABLE_TO_CERTIFY_TITLE:"Certification impossible",LOAD_NEWCOMERS_FAILED:"Échec du chargement des nouveaux membres.",LOAD_PENDING_FAILED:"Échec du chargement des inscriptions en attente.",ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION:"Vous devez <b>être membre</b> pour pouvoir effectuer cette action.",ONLY_SELF_CAN_EXECUTE_THIS_ACTION:"Vous devez avoir <b>publié votre identité</b> pour pouvoir effectuer cette action.",GET_BLOCK_FAILED:"Échec de la récupération du bloc",INVALID_BLOCK_HASH:"Bloc non trouvé (hash différent)",DOWNLOAD_REVOCATION_FAILED:"Échec du téléchargement du fichier de révocation.",REVOCATION_FAILED:"Échec de la révocation.",SALT_OR_PASSWORD_NOT_CONFIRMED:"Identifiant ou mot de passe incorrect",RECOVER_ID_FAILED:"Échec de la récupération des identifiants",LOAD_FILE_FAILED:"Échec du chargement du fichier",NOT_VALID_REVOCATION_FILE:"Fichier de révocation non valide (mauvais format de fichier)",NOT_VALID_SAVE_ID_FILE:"Fichier de récupération non valide (mauvais format de fichier)",NOT_VALID_KEY_FILE:"Fichier de trousseau non valide (format non reconnu)",EXISTING_ACCOUNT:"Vos identifiants correspondent à un compte déjà existant, dont la <a ng-click=\"showHelpModal('pubkey')\">clef publique</a> est :",EXISTING_ACCOUNT_REQUEST:"Veuillez modifier vos identifiants afin qu'ils correspondent à un compte non utilisé.",GET_LICENSE_FILE_FAILED:"Récupération du fichier de licence impossible",CHECK_NETWORK_CONNECTION:"Aucun nœud ne semble accessible.<br/><br/>Veuillez <b>vérifier votre connexion Internet</b>."},INFO:{POPUP_TITLE:"Information",CERTIFICATION_DONE:"Certification envoyée",NOT_ENOUGH_CREDIT:"Crédit insuffisant",TRANSFER_SENT:"Virement envoyé",COPY_TO_CLIPBOARD_DONE:"Copié dans le presse-papier",MEMBERSHIP_OUT_SENT:"Résiliation envoyée",NOT_NEED_MEMBERSHIP:"Vous êtes déjà membre.",IDENTITY_WILL_MISSING_CERTIFICATIONS:"Cette identité va bientôt manquer de certifications (au moins {{willNeedCertificationCount}}).",REVOCATION_SENT:"Révocation envoyée",REVOCATION_SENT_WAITING_PROCESS:"La <b>révocation de cette identité</b> a été demandée et est en attente de traitement.",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 ? ;)",EMPTY_TX_HISTORY:"Aucune opération à exporter"},CONFIRM:{POPUP_TITLE:"<b>Confirmation</b>",POPUP_WARNING_TITLE:"<b>Avertissement</b>",POPUP_SECURITY_WARNING_TITLE:'<i class="icon ion-alert-circled"></i> <b>Avertissement de sécurité</b>',CERTIFY_RULES_TITLE_UID:"Certifier {{uid}}",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é ?',FULLSCREEN:"Afficher l'application en plein écran ?",EXIT_APP:"Fermer l'application ?",LOGIN_UNUSED_WALLET_TITLE:"Erreur de saisie ?",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>.",SAVE_BEFORE_LEAVE:"Voulez-vous <b>sauvegarder vos modifications</b> avant de quitter la page ?",SAVE_BEFORE_LEAVE_TITLE:"Modifications non enregistrées",LOGOUT:"Êtes-vous de vouloir vous déconnecter ?",USE_FALLBACK_NODE:"Nœud <b>{{old}}</b> injoignable ou adresse invalide.<br/><br/>Voulez-vous temporairement utiliser le nœud <b>{{new}}</b> ?"},HELP:{TITLE:"Aide en ligne",JOIN:{SECTION:"Inscription",SALT:"L'identifiant sert à vous identifier sur votre compte gchange.<br/><b>Veillez à bien le mémoriser</b>, car aucun moyen n'est actuellement prévu pour le 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 doit être suffisamment long (au moins 8 caractères) et le plus original possible.",PASSWORD:"Le mot de passe est très essentiel pour accéder à votre compte.<br/><b>Veillez à bien le mémoriser</b>, car aucun moyen n'est actuellement prévu pour 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."},GLOSSARY:{SECTION:"Glossaire",PUBKEY_DEF:"Une clé publique identifie un compte. Elle est calculée grâce à l'identifiant et au mot de passe.",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 reçoivent sur leur compte la même 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.'}}})}]),angular.module("cesium.plugins",["cesium.plugins.translations","cesium.plugins.templates","cesium.es.plugin","cesium.market.plugin","cesium.map.plugin","cesium.graph.plugin"]),angular.module("cesium.plugins.translations",[]).config(["$translateProvider",function(e){e.translations("en-GB",{COMMON:{CATEGORY:"Category",CATEGORY_SELECT_HELP:"Select",CATEGORIES:"Categories",CATEGORY_SEARCH_HELP:"Search",COMMENT_HELP:"Comments",LAST_MODIFICATION_DATE:"Updated on ",BTN_LIKE:"I like",BTN_FOLLOW:"Follow",BTN_STOP_FOLLOW:"Stop following",LIKES_TEXT:"{{total}} {{total > 1 ? 'people' : 'person'}} liked this page",DISLIKES_TEXT:"{{total}} {{total > 1 ? 'people' : 'person'}} disliked this page",VIEWS_TEXT:"{{total}} {{total > 1 ? 'people' : 'person'}} viewed this page",FOLLOWS_TEXT:"{{total}} {{total > 1 ? 'people' : 'person'}} follows this page",ABUSES_TEXT:"{{total}} {{total > 1 ? 'people' : 'person'}} reported a problem on this page",BTN_REPORT_ABUSE_DOTS:"Report a problem or an abuse...",BTN_REMOVE_REPORTED_ABUSE:"Cancel my problem report",SUBMIT_BY:"Submitted by",GEO_DISTANCE_SEARCH:"Search distance",GEO_DISTANCE_OPTION:"{{value}} km",BTN_PUBLISH:"Publish",BTN_PICTURE_DELETE:"Delete",BTN_PICTURE_FAVORISE:"Default",BTN_PICTURE_ROTATE:"Rotate",BTN_ADD_PICTURE:"Add picture",NOTIFICATION:{TITLE:"New notification | {{'COMMON.APP_NAME'|translate}}",HAS_UNREAD:"You have {{count}} unread notification{{count>0?'s':''}}"},NOTIFICATIONS:{TITLE:"Notifications",MARK_ALL_AS_READ:"Mark all as read",NO_RESULT:"No notification",SHOW_ALL:"Show all",LOAD_NOTIFICATIONS_FAILED:"Could not load notifications"},REPORT_ABUSE:{TITLE:"Report a problem",SUB_TITLE:"Please explain briefly the problem:",REASON_HELP:"I explain the problem...",ASK_DELETE:"Request removal?",CONFIRM:{SENT:"Request sent. Thank you!"}}},MENU:{REGISTRY:"Pages",USER_PROFILE:"My Profile",MESSAGES:"Messages",NOTIFICATIONS:"Notifications",INVITATIONS:"Invitations"},ACCOUNT:{NEW:{ORGANIZATION_ACCOUNT:"Account for an organization",ORGANIZATION_ACCOUNT_HELP:"If you represent a company, association, etc.<br/>No universal dividend will be created by this account."},EVENT:{MEMBER_WITHOUT_PROFILE:'To obtain your certification more quickly, fill in <a ui-sref="app.user_edit_profile">your user profile</a>. Members will more easily put their trust in a verifiable identity.'},ERROR:{WS_CONNECTION_FAILED:"Cesium can not receive notifications because of a technical error (connection to the Cesium + data node).<br/><br/>If the problem persists, please <b>choose another data node</b> in Cesium+ settings."}},WOT:{BTN_SUGGEST_CERTIFICATIONS_DOTS:"Suggest identities to certify...",BTN_ASK_CERTIFICATIONS_DOTS:"Ask members to certify me...",BTN_ASK_CERTIFICATION:"Ask a certification",SUGGEST_CERTIFICATIONS_MODAL:{TITLE:"Suggest certifications",HELP:"Select your suggestions"},ASK_CERTIFICATIONS_MODAL:{TITLE:"Ask certifications",HELP:"Select recipients"},SEARCH:{DIVIDER_PROFILE:"Profile",DIVIDER_PAGE:"Pages",DIVIDER_GROUP:"Groups"},VIEW:{SENIORITY:"Seniority on {{'COMMON.APP_NAME'|translate}}",STARS:"Trust level",STAR_HIT_COUNT:"{{total}} rate{{total>1 ? 's' : ''}}",BTN_STAR_HELP:"Rate this profile",BTN_STARS_REMOVE:"Remove my note",BTN_REDO_STAR_HELP:"Update your rate for this profile",BTN_FOLLOW:"Follow the activity of this profile",BTN_STOP_FOLLOW:"Stop following this profile"}},COMMENTS:{DIVIDER:"Comments",SHOW_MORE_COMMENTS:"Show previous comments",COMMENT_HELP:"Your comment, question...",COMMENT_HELP_REPLY_TO:"Your answer...",BTN_SEND:"Send",POPOVER_SHARE_TITLE:"Message #{{number}}",REPLY:"Reply",REPLY_TO:"Respond to:",REPLY_TO_LINK:"In response to ",REPLY_TO_DELETED_COMMENT:"In response to a deleted comment",REPLY_COUNT:"{{replyCount}} responses",DELETED_COMMENT:"Comment deleted",MODIFIED_ON:"modified on {{time|formatDate}}",MODIFIED_PARENTHESIS:"(modified then)",ERROR:{FAILED_SAVE_COMMENT:"Saving comment failed",FAILED_REMOVE_COMMENT:"Deleting comment failed"}},MESSAGE:{REPLY_TITLE_PREFIX:"Re: ",FORWARD_TITLE_PREFIX:"Fw: ",BTN_REPLY:"Reply",BTN_COMPOSE:"New message",BTN_WRITE:"Write",NO_MESSAGE_INBOX:"No message received",NO_MESSAGE_OUTBOX:"No message sent",NOTIFICATIONS:{TITLE:"Messages",MESSAGE_RECEIVED:"You <b>received a message</b><br/>from"},LIST:{INBOX:"Inbox",OUTBOX:"Outbox",LAST_INBOX:"New messages",LAST_OUTBOX:"Sent messages",BTN_LAST_MESSAGES:"Recent messages",TITLE:"Private messages",SEARCH_HELP:"Search in messages",POPOVER_ACTIONS:{TITLE:"Options",DELETE_ALL:"Delete all messages"}},COMPOSE:{TITLE:"New message",TITLE_REPLY:"Reply",SUB_TITLE:"New message",TO:"To",OBJECT:"Object",OBJECT_HELP:"Object",ENCRYPTED_HELP:"Please note this message will be encrypted before sending so that only the recipient can read it and be sure you are the author.",MESSAGE:"Message",MESSAGE_HELP:"Message content",CONTENT_CONFIRMATION:"No message content.<br/><br/>Are your sure you want to send this message?"},VIEW:{TITLE:"Message",SENDER:"Sent by",RECIPIENT:"Sent to",NO_CONTENT:"Empty message",DELETE:"Delete the message"},CONFIRM:{REMOVE:"Are you sure you want to <b>delete this message</b>?<br/><br/> This operation is irreversible.",REMOVE_ALL:"Are you sure you want to <b>delete all messages</b>?<br/><br/> This operation is irreversible.",MARK_ALL_AS_READ:"Are you sure you want to <b>mark all message as read</b>?",USER_HAS_NO_PROFILE:"This identity has no Cesium + profile. It may not use the Cesium + extension, so it <b>will not read your message</b>.<br/><br/>Are you sure you want <b>to continue</b>?"},INFO:{MESSAGE_REMOVED:"Message successfully deleted",All_MESSAGE_REMOVED:"Messages successfully deleted",MESSAGE_SENT:"Message sent"},ERROR:{SEND_MSG_FAILED:"Error while sending message.",LOAD_MESSAGES_FAILED:"Error while loading messages.",LOAD_MESSAGE_FAILED:"Error while loading message.",MESSAGE_NOT_READABLE:"Unable to read message.",USER_NOT_RECIPIENT:"You are not the recipient of this message: unable to read it.",NOT_AUTHENTICATED_MESSAGE:"The authenticity of the message is not certain or its content is corrupted.",REMOVE_MESSAGE_FAILED:"Error while deleting message",MESSAGE_CONTENT_TOO_LONG:"Value too long ({{maxLength}} characters max).",MARK_AS_READ_FAILED:"Unable to mark the message as 'read'.",LOAD_NOTIFICATIONS_FAILED:"Error while loading messages notifications.",REMOVE_All_MESSAGES_FAILED:"Error while removing all messages.",MARK_ALL_AS_READ_FAILED:"Error while marking messages as read.",RECIPIENT_IS_MANDATORY:"Recipient is mandatory."}},REGISTRY:{CATEGORY:"Main activity",GENERAL_DIVIDER:"Basic information",LOCATION_DIVIDER:"Address",SOCIAL_NETWORKS_DIVIDER:"Social networks, web sites",TECHNICAL_DIVIDER:"Technical data",BTN_SHOW_WOT:"People",BTN_SHOW_WOT_HELP:"Search for people",BTN_SHOW_PAGES:"Pages",BTN_SHOW_PAGES_HELP:"Search for pages",BTN_NEW:"New page",MY_PAGES:"My pages",NO_PAGE:"No page",SEARCH:{TITLE:"Pages",SEARCH_HELP:"What, Who: hairdresser, Lili's restaurant, ...",BTN_ADD:"New",BTN_LAST_RECORDS:"Recent pages",BTN_ADVANCED_SEARCH:"Advanced search",BTN_OPTIONS:"Advanced search",TYPE:"Kind of organization",LOCATION_HELP:"Where: City, Country",RESULTS:"Results",RESULT_COUNT_LOCATION:"{{count}} result{{count>0?'s':''}}, near {{location}}",RESULT_COUNT:"{{count}} result{{count>0?'s':''}}",LAST_RECORDS:"Recent pages",LAST_RECORD_COUNT_LOCATION:"{{count}} recent page{{count>0?'s':''}}, near {{location}}",LAST_RECORD_COUNT:"{{count}} recent page{{count>0?'s':''}}",POPOVER_FILTERS:{BTN_ADVANCED_SEARCH:"Advanced options?"}},VIEW:{TITLE:"Registry",CATEGORY:"Main activity:",LOCATION:"Address:",MENU_TITLE:"Options",POPOVER_SHARE_TITLE:"{{title}}",REMOVE_CONFIRMATION:"Are you sure you want to delete this reference?<br/><br/>This is irreversible."},TYPE:{TITLE:"New page",SELECT_TYPE:"Kind of organization:",ENUM:{SHOP:"Local shops",COMPANY:"Company",ASSOCIATION:"Association",INSTITUTION:"Institution"}},EDIT:{TITLE:"Edit",TITLE_NEW:"New page",RECORD_TYPE:"Kind of organization",RECORD_TITLE:"Name",RECORD_TITLE_HELP:"Name",RECORD_DESCRIPTION:"Description",RECORD_DESCRIPTION_HELP:"Describe activity",RECORD_ADDRESS:"Street",RECORD_ADDRESS_HELP:"Street, building...",RECORD_CITY:"City",RECORD_CITY_HELP:"City, Country",RECORD_SOCIAL_NETWORKS:"Social networks and web site",RECORD_PUBKEY:"Public key",RECORD_PUBKEY_HELP:"Public key to receive payments"},WALLET:{REGISTRY_DIVIDER:"Pages",REGISTRY_HELP:"Pages refer to activities accepting money or promoting it: local shops, companies, associations, institutions."},ERROR:{LOAD_CATEGORY_FAILED:"Loading main activities failed",LOAD_RECORD_FAILED:"Loading failed",LOOKUP_RECORDS_FAILED:"Error while loading records.",REMOVE_RECORD_FAILED:"Deleting failed",SAVE_RECORD_FAILED:"Saving failed",RECORD_NOT_EXISTS:"Record not found",GEO_LOCATION_NOT_FOUND:"City or zip code not found"},INFO:{RECORD_REMOVED:"Page successfully deleted",RECORD_SAVED:"Page successfully saved"}},PROFILE:{PROFILE_DIVIDER:"ğchange profile",PROFILE_DIVIDER_HELP:"It is related data, stored in the ğchange network.",NO_PROFILE_DEFINED:"No ğchange profile",BTN_ADD:"Create my profile",BTN_EDIT:"Edit my profile",BTN_DELETE:"Delete my profile",BTN_REORDER:"Reorder",UID:"Pseudonym",TITLE:"Lastname, FirstName",TITLE_HELP:"Name",DESCRIPTION:"About me",DESCRIPTION_HELP:"About me...",SOCIAL_HELP:"http://...",GENERAL_DIVIDER:"General data",SOCIAL_NETWORKS_DIVIDER:"Social networks and web site",STAR:"Trust level",TECHNICAL_DIVIDER:"Technical data",MODAL_AVATAR:{TITLE:"Avatar",SELECT_FILE_HELP:"<b>Choose an image file</b>, by clicking on the button below:",BTN_SELECT_FILE:"Choose an image",RESIZE_HELP:"<b>Re-crop the image</b> if necessary. A click on the image allows to move it. Click on the area at the bottom left to zoom in.",RESULT_HELP:"<b>Here is the result</b> as seen on your profile:"},CONFIRM:{DELETE:"Are you sure you want to <b>delete your Cesium+ profile ?</b><br/><br/>This operation is irreversible."},ERROR:{REMOVE_PROFILE_FAILED:"Deleting profile failed",LOAD_PROFILE_FAILED:"Could not load user profile.",SAVE_PROFILE_FAILED:"Saving profile failed",INVALID_SOCIAL_NETWORK_FORMAT:"Invalid format: please fill a valid Internet address.<br/><br/>Examples :<ul><li>- A Facebook page (https://www.facebook.com/user)</li><li>- A web page (http://www.domain.com)</li><li>- An email address (joe@dalton.com)</li></ul>",IMAGE_RESIZE_FAILED:"Error while resizing picture"},INFO:{PROFILE_REMOVED:"Profile deleted",PROFILE_SAVED:"Profile saved"},HELP:{WARNING_PUBLIC_DATA:"Please note that the information published here <b>is public</b>: visible including by <b>not logged in people</b>."}},LOCATION:{BTN_GEOLOC_ADDRESS:"Find my address on the map",USE_GEO_POINT:"Verify address (recommended)?",LOADING_LOCATION:"Searching address...",LOCATION_DIVIDER:"Localisation",ADDRESS:"Address",ADDRESS_HELP:"Address (optional)",CITY:"City",CITY_HELP:"City, Country",DISTANCE:"Maximum distance around the city",DISTANCE_UNIT:"mi",DISTANCE_OPTION:"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}",SEARCH_HELP:"City, Country",PROFILE_POSITION:"Profile position",MODAL:{TITLE:"Search address",SEARCH_HELP:"City, Country",ALTERNATIVE_RESULT_DIVIDER:"Alternative results for <b>{{address}}</b>:",POSITION:"lat/lon : {{lat}} / {{lon}}"},ERROR:{CITY_REQUIRED_IF_STREET:"Required if a street has been filled",REQUIRED_FOR_LOCATION:"Required field to appear on the map",INVALID_FOR_LOCATION:"Unknown address",GEO_LOCATION_FAILED:"Unable to retrieve your current position. Please use the search button.",ADDRESS_LOCATION_FAILED:"Unable to retrieve the address position"}},SUBSCRIPTION:{SUBSCRIPTION_DIVIDER:"Online services",SUBSCRIPTION_DIVIDER_HELP:"Online services offer optional additional services, delegated to a third party.",BTN_ADD:"Add a service",BTN_EDIT:"Manage my services",NO_SUBSCRIPTION:"No service defined",SUBSCRIPTION_COUNT:"Services / Subscription",EDIT:{TITLE:"Online services",HELP_TEXT:"Manage your subscriptions and other online services here",PROVIDER:"Provider:"},TYPE:{ENUM:{EMAIL:"Receive email notifications"}},CONFIRM:{DELETE_SUBSCRIPTION:"Are you sur you want to <b>delete this subscription</b>?"},ERROR:{LOAD_SUBSCRIPTIONS_FAILED:"Error while loading online services",ADD_SUBSCRIPTION_FAILED:"Error while adding subscription",UPDATE_SUBSCRIPTION_FAILED:"Error during subscription update",DELETE_SUBSCRIPTION_FAILED:"Error while deleting subscription"},MODAL_EMAIL:{TITLE:"Notification by email",HELP:"Fill out this form to <b>be notified by email</ b> of your account's events. <br/>Your email address will be encrypted only to be visible to the service provider.",EMAIL_LABEL:"Your email:",EMAIL_HELP:"john@domain.com",FREQUENCY_LABEL:"Frequency of notifications:",FREQUENCY_DAILY:"Daily",FREQUENCY_WEEKLY:"Weekly",PROVIDER:"Service Provider:"}},DOCUMENT:{HASH:"Hash: ",LOOKUP:{TITLE:"Document search",BTN_ACTIONS:"Actions",SEARCH_HELP:"issuer:AAA*, time:1508406169",LAST_DOCUMENTS_DOTS:"Last documents :",LAST_DOCUMENTS:"Last documents",SHOW_QUERY:"Show query",HIDE_QUERY:"Hide query",HEADER_TIME:"Time/Hour",HEADER_ISSUER:"Issuer",HEADER_RECIPIENT:"Recipient",READ:"Read",DOCUMENT_TYPE:"Type",DOCUMENT_TITLE:"Title",BTN_REMOVE:"Delete this document",BTN_COMPACT:"Compact",HAS_REGISTERED:"create or edit his profile",POPOVER_ACTIONS:{TITLE:"Actions",REMOVE_ALL:"Delete these documents..."},TYPE:{USER_PROFILE:"Profile",MARKET_RECORD:"Ad",MARKET_COMMENT:"Comment on a ad",PAGE_RECORD:"Page",PAGE_COMMENT:"Comment on a page",GROUP_RECORD:"Group",GROUP_COMMENT:"Comment on a group"}},INFO:{REMOVED:"Deleted document"},CONFIRM:{REMOVE:"Are you sure you want to <b>delete this document</b>?",REMOVE_ALL:"Are you sure you want to <b>delete these documents</b>?"},ERROR:{LOAD_DOCUMENTS_FAILED:"Error searching documents",REMOVE_FAILED:"Error deleting the document",REMOVE_ALL_FAILED:"Error deleting documents"}},ES_SETTINGS:{PLUGIN_NAME:"Cesium+",PLUGIN_NAME_HELP:"User profiles, notifications, private messages",ENABLE_TOGGLE:"Enable extension?",ENABLE_MESSAGE_TOGGLE:"Enable messages?",ENABLE_SETTINGS_TOGGLE:"Enable remote storage for settings?",PEER:"Data peer address",POPUP_PEER:{TITLE:"Data peer",HELP:"Set the address of the peer to use:",PEER_HELP:"server.domain.com:port"},NOTIFICATIONS:{DIVIDER:"Notifications",HELP_TEXT:"Enable the types of notifications you want to receive:",ENABLE_TX_SENT:"Notify the validation of <b>sent payments</b>?",ENABLE_TX_RECEIVED:"Notify the validation of <b>received payments</b>?",ENABLE_CERT_SENT:"Notify the validation of <b>sent certifications</b>?",ENABLE_CERT_RECEIVED:"Notify the validation of <b>received certifications</b>?"},CONFIRM:{ASK_ENABLE_TITLE:"New features",ASK_ENABLE:'Some new features are available: <ul><li>&nbsp;&nbsp;<b><i class="icon ion-person"></i> user profiles</b>;<li>&nbsp;&nbsp;<b><i class="icon ion-android-notifications"></i> Notifications</b>;<li>&nbsp;&nbsp;<b><i class="icon ion-email"></i> Private messages</b>.</ul><br/>They have been <b>disabled</b> in your settings.<br/><br/><b>Do you want to enable</b> these features?'}},ES_WALLET:{ERROR:{RECIPIENT_IS_MANDATORY:"A recipient is required for encryption."}},ES_PEER:{NAME:"Name",DOCUMENTS:"Documents",SOFTWARE:"Software",DOCUMENT_COUNT:"Number of documents",EMAIL_SUBSCRIPTION_COUNT:"{{emailSubscription}} subscribers to email notification"},EVENT:{NODE_STARTED:"Your node ES API <b>{{params[0]}}</b> is UP",NODE_BMA_DOWN:"Node <b>{{params[0]}}:{{params[1]}}</b> (used by your ES API) is <b>unreachable</b>.",NODE_BMA_UP:"Node <b>{{params[0]}}:{{params[1]}}</b> is reachable again.",MEMBER_JOIN:"You are now a <b>member</b> of currency <b>{{params[0]}}</b>!",MEMBER_LEAVE:"You are <b>not a member anymore</b> of currency <b>{{params[0]}}</b>!",MEMBER_EXCLUDE:"You are <b>not more member</b> of the currency <b>{{params[0]}}</b>, for lack of renewal or lack of certifications.",MEMBER_REVOKE:"Your account has been revoked. It will no longer be a member of the currency <b>{{params[0]}}</b>.",MEMBER_ACTIVE:"Your membership to <b>{{params[0]}}</b> has been <b>renewed successfully</b>.",TX_SENT:'Your payment to <span class="positive" ><i class="icon ion-person"></i>&thinsp;{{name||uid||params[1]}}</span> was executed.',TX_SENT_MULTI:"Your payment to <b>{{params[1]}}</b> was executed.",TX_RECEIVED:'You received a payment from <span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||uid||params[1]}}</span>.',TX_RECEIVED_MULTI:"You received a payment from <b>{{params[1]}}</b>.",CERT_SENT:'Your <b>certification</b> to <span class="positive" ><i class="icon ion-person"></i>&thinsp;{{name||uid||params[1]}}</span> was executed.',CERT_RECEIVED:'You have <b>received a certification</b> from <span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||uid||params[1]}}</span>.',USER:{LIKE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> like your profile',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> follows your activity',STAR_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> rated you ({{params[3]}} <i class="ion-star">)',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> asks you for a moderation on the profile: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> reported a profile to be deleted: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> has requested moderation on your profile'},PAGE:{NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> has commented on your referencing: <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> has modified his comment on your referencing: <b>{{params[2]}}</b>',NEW_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> has replied to your comment on the referencing: <b>{{params[2]}}</b>',UPDATE_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> has modified his answer to your comment, on the referencing: <b>{{params[2]}}</b>',FOLLOW_NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> has commented on the page: <b>{{params[2]}}</b>',FOLLOW_UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> has modified his comment on the page: <b>{{params[2]}}</b>',FOLLOW_NEW:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> added a page: <b>{{params[2]}}</b>',FOLLOW_UPDATE:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> updated the page: <b>{{params[2]}}</b>',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> asks you for a moderation on the page: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> reported a page to be deleted: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> has requested moderation on your page: <b>{{params[2]}}</b>'}},CONFIRM:{ES_USE_FALLBACK_NODE:"Data node <b>{{old}}</b> unreachable or invalid address.<br/><br/>Do you want to temporarily use the <b>{{new}}</b> data node?"},ERROR:{ES_CONNECTION_ERROR:'Data node <b>{{server}}</b> unreachable or invalid address.<br/><br/>Check your Internet connection, or change data node in <a class="positive" ng-click="doQuickFix(\'settings\')">advanced settings</a>.',ES_MAX_UPLOAD_BODY_SIZE:"The volume of data to be sent exceeds the limit set by the server.<br/><br/>Please try again after, for example, deleting photos."}}),e.translations("en",{COMMON:{CATEGORY:"Category",CATEGORY_SELECT_HELP:"Select",CATEGORIES:"Categories",CATEGORY_SEARCH_HELP:"Search",COMMENT_HELP:"Comments",LAST_MODIFICATION_DATE:"Updated on ",BTN_LIKE:"I like",BTN_FOLLOW:"Follow",BTN_STOP_FOLLOW:"Stop following",LIKES_TEXT:"{{total}} {{total > 1 ? 'people' : 'person'}} liked this page",DISLIKES_TEXT:"{{total}} {{total > 1 ? 'people' : 'person'}} disliked this page",VIEWS_TEXT:"{{total}} {{total > 1 ? 'people' : 'person'}} viewed this page",FOLLOWS_TEXT:"{{total}} {{total > 1 ? 'people' : 'person'}} follows this page",ABUSES_TEXT:"{{total}} {{total > 1 ? 'people' : 'person'}} reported a problem on this page",BTN_REPORT_ABUSE_DOTS:"Report a problem or an abuse...",BTN_REMOVE_REPORTED_ABUSE:"Cancel my problem report",SUBMIT_BY:"Submitted by",GEO_DISTANCE_SEARCH:"Search distance",GEO_DISTANCE_OPTION:"{{value}} km",BTN_PUBLISH:"Publish",BTN_PICTURE_DELETE:"Delete",BTN_PICTURE_FAVORISE:"Default",BTN_PICTURE_ROTATE:"Rotate",BTN_ADD_PICTURE:"Add picture",NOTIFICATION:{TITLE:"New notification | {{'COMMON.APP_NAME'|translate}}",HAS_UNREAD:"You have {{count}} unread notification{{count>0?'s':''}}"},NOTIFICATIONS:{TITLE:"Notifications",MARK_ALL_AS_READ:"Mark all as read",NO_RESULT:"No notification",SHOW_ALL:"Show all",LOAD_NOTIFICATIONS_FAILED:"Could not load notifications"},REPORT_ABUSE:{TITLE:"Report a problem",SUB_TITLE:"Please explain briefly the problem:",REASON_HELP:"I explain the problem...",ASK_DELETE:"Request removal?",CONFIRM:{SENT:"Request sent. Thank you!"}}},MENU:{REGISTRY:"Pages",USER_PROFILE:"My Profile",MESSAGES:"Messages",NOTIFICATIONS:"Notifications",INVITATIONS:"Invitations"},ACCOUNT:{NEW:{ORGANIZATION_ACCOUNT:"Account for an organization",ORGANIZATION_ACCOUNT_HELP:"If you represent a company, association, etc.<br/>No universal dividend will be created by this account."},EVENT:{MEMBER_WITHOUT_PROFILE:'To obtain your certification more quickly, fill in <a ui-sref="app.user_edit_profile">your user profile</a>. Members will more easily put their trust in a verifiable identity.'},ERROR:{WS_CONNECTION_FAILED:"Cesium can not receive notifications because of a technical error (connection to the Cesium + data node).<br/><br/>If the problem persists, please <b>choose another data node</b> in Cesium+ settings."}},WOT:{BTN_SUGGEST_CERTIFICATIONS_DOTS:"Suggest identities to certify...",BTN_ASK_CERTIFICATIONS_DOTS:"Ask members to certify me...",BTN_ASK_CERTIFICATION:"Ask a certification",SUGGEST_CERTIFICATIONS_MODAL:{TITLE:"Suggest certifications",HELP:"Select your suggestions"},ASK_CERTIFICATIONS_MODAL:{TITLE:"Ask certifications",HELP:"Select recipients"},SEARCH:{DIVIDER_PROFILE:"Profile",DIVIDER_PAGE:"Pages",DIVIDER_GROUP:"Groups"},VIEW:{SENIORITY:"Seniority on {{'COMMON.APP_NAME'|translate}}",STARS:"Trust level",STAR_HIT_COUNT:"{{total}} rate{{total>1 ? 's' : ''}}",BTN_STAR_HELP:"Rate this profile",BTN_STARS_REMOVE:"Remove my note",BTN_REDO_STAR_HELP:"Update your rate for this profile",BTN_FOLLOW:"Follow the activity of this profile",BTN_STOP_FOLLOW:"Stop following this profile"}},COMMENTS:{DIVIDER:"Comments",SHOW_MORE_COMMENTS:"Show previous comments",COMMENT_HELP:"Your comment, question...",COMMENT_HELP_REPLY_TO:"Your answer...",BTN_SEND:"Send",POPOVER_SHARE_TITLE:"Message #{{number}}",REPLY:"Reply",REPLY_TO:"Respond to:",REPLY_TO_LINK:"In response to ",REPLY_TO_DELETED_COMMENT:"In response to a deleted comment",REPLY_COUNT:"{{replyCount}} responses",DELETED_COMMENT:"Comment deleted",MODIFIED_ON:"modified on {{time|formatDate}}",MODIFIED_PARENTHESIS:"(modified then)",ERROR:{FAILED_SAVE_COMMENT:"Saving comment failed",FAILED_REMOVE_COMMENT:"Deleting comment failed"}},MESSAGE:{REPLY_TITLE_PREFIX:"Re: ",FORWARD_TITLE_PREFIX:"Fw: ",BTN_REPLY:"Reply",BTN_COMPOSE:"New message",BTN_WRITE:"Write",NO_MESSAGE_INBOX:"No message received",NO_MESSAGE_OUTBOX:"No message sent",NOTIFICATIONS:{TITLE:"Messages",MESSAGE_RECEIVED:"You <b>received a message</b><br/>from"},LIST:{INBOX:"Inbox",OUTBOX:"Outbox",LAST_INBOX:"New messages",LAST_OUTBOX:"Sent messages",BTN_LAST_MESSAGES:"Recent messages",TITLE:"Private messages",SEARCH_HELP:"Search in messages",POPOVER_ACTIONS:{TITLE:"Options",DELETE_ALL:"Delete all messages"}},COMPOSE:{TITLE:"New message",TITLE_REPLY:"Reply",SUB_TITLE:"New message",TO:"To",OBJECT:"Object",OBJECT_HELP:"Object",ENCRYPTED_HELP:"Please note this message will be encrypted before sending so that only the recipient can read it and be sure you are the author.",MESSAGE:"Message",MESSAGE_HELP:"Message content",CONTENT_CONFIRMATION:"No message content.<br/><br/>Are your sure you want to send this message?"},VIEW:{TITLE:"Message",SENDER:"Sent by",RECIPIENT:"Sent to",NO_CONTENT:"Empty message",DELETE:"Delete the message"},CONFIRM:{REMOVE:"Are you sure you want to <b>delete this message</b>?<br/><br/> This operation is irreversible.",REMOVE_ALL:"Are you sure you want to <b>delete all messages</b>?<br/><br/> This operation is irreversible.",MARK_ALL_AS_READ:"Are you sure you want to <b>mark all message as read</b>?",USER_HAS_NO_PROFILE:"This identity has no Cesium + profile. It may not use the Cesium + extension, so it <b>will not read your message</b>.<br/><br/>Are you sure you want <b>to continue</b>?"},INFO:{MESSAGE_REMOVED:"Message successfully deleted",All_MESSAGE_REMOVED:"Messages successfully deleted",MESSAGE_SENT:"Message sent"},ERROR:{SEND_MSG_FAILED:"Error while sending message.",LOAD_MESSAGES_FAILED:"Error while loading messages.",LOAD_MESSAGE_FAILED:"Error while loading message.",MESSAGE_NOT_READABLE:"Unable to read message.",USER_NOT_RECIPIENT:"You are not the recipient of this message: unable to read it.",NOT_AUTHENTICATED_MESSAGE:"The authenticity of the message is not certain or its content is corrupted.",REMOVE_MESSAGE_FAILED:"Error while deleting message",MESSAGE_CONTENT_TOO_LONG:"Value too long ({{maxLength}} characters max).",MARK_AS_READ_FAILED:"Unable to mark the message as 'read'.",LOAD_NOTIFICATIONS_FAILED:"Error while loading messages notifications.",REMOVE_All_MESSAGES_FAILED:"Error while removing all messages.",MARK_ALL_AS_READ_FAILED:"Error while marking messages as read.",RECIPIENT_IS_MANDATORY:"Recipient is mandatory."}},REGISTRY:{CATEGORY:"Main activity",GENERAL_DIVIDER:"Basic information",LOCATION_DIVIDER:"Address",SOCIAL_NETWORKS_DIVIDER:"Social networks, web sites",TECHNICAL_DIVIDER:"Technical data",BTN_SHOW_WOT:"People",BTN_SHOW_WOT_HELP:"Search for people",BTN_SHOW_PAGES:"Pages",BTN_SHOW_PAGES_HELP:"Search for pages",BTN_NEW:"New page",MY_PAGES:"My pages",NO_PAGE:"No page",SEARCH:{TITLE:"Pages",SEARCH_HELP:"What, Who: hairdresser, Lili's restaurant, ...",BTN_ADD:"New",BTN_LAST_RECORDS:"Recent pages",BTN_ADVANCED_SEARCH:"Advanced search",BTN_OPTIONS:"Advanced search",TYPE:"Kind of organization",LOCATION_HELP:"Where: City, Country",RESULTS:"Results",RESULT_COUNT_LOCATION:"{{count}} result{{count>0?'s':''}}, near {{location}}",RESULT_COUNT:"{{count}} result{{count>0?'s':''}}",LAST_RECORDS:"Recent pages",LAST_RECORD_COUNT_LOCATION:"{{count}} recent page{{count>0?'s':''}}, near {{location}}",LAST_RECORD_COUNT:"{{count}} recent page{{count>0?'s':''}}",POPOVER_FILTERS:{BTN_ADVANCED_SEARCH:"Advanced options?"}},VIEW:{TITLE:"Registry",CATEGORY:"Main activity:",LOCATION:"Address:",MENU_TITLE:"Options",POPOVER_SHARE_TITLE:"{{title}}",REMOVE_CONFIRMATION:"Are you sure you want to delete this reference?<br/><br/>This is irreversible."},TYPE:{TITLE:"New page",SELECT_TYPE:"Kind of organization:",ENUM:{SHOP:"Local shops",COMPANY:"Company",ASSOCIATION:"Association",INSTITUTION:"Institution"}},EDIT:{TITLE:"Edit",TITLE_NEW:"New page",RECORD_TYPE:"Kind of organization",RECORD_TITLE:"Name",RECORD_TITLE_HELP:"Name",RECORD_DESCRIPTION:"Description",RECORD_DESCRIPTION_HELP:"Describe activity",RECORD_ADDRESS:"Street",RECORD_ADDRESS_HELP:"Street, building...",RECORD_CITY:"City",RECORD_CITY_HELP:"City, Country",RECORD_SOCIAL_NETWORKS:"Social networks and web site",RECORD_PUBKEY:"Public key",RECORD_PUBKEY_HELP:"Public key to receive payments"},WALLET:{REGISTRY_DIVIDER:"Pages",REGISTRY_HELP:"Pages refer to activities accepting money or promoting it: local shops, companies, associations, institutions."},ERROR:{LOAD_CATEGORY_FAILED:"Loading main activities failed",LOAD_RECORD_FAILED:"Loading failed",LOOKUP_RECORDS_FAILED:"Error while loading records.",REMOVE_RECORD_FAILED:"Deleting failed",SAVE_RECORD_FAILED:"Saving failed",RECORD_NOT_EXISTS:"Record not found",GEO_LOCATION_NOT_FOUND:"City or zip code not found"},INFO:{RECORD_REMOVED:"Page successfully deleted",RECORD_SAVED:"Page successfully saved"}},PROFILE:{PROFILE_DIVIDER:"ğchange profile",PROFILE_DIVIDER_HELP:"It is related data, stored in the ğchange network.",NO_PROFILE_DEFINED:"No ğchange profile",BTN_ADD:"Create my profile",BTN_EDIT:"Edit my profile",BTN_DELETE:"Delete my profile",BTN_REORDER:"Reorder",UID:"Pseudonym",TITLE:"Lastname, FirstName",TITLE_HELP:"Name",DESCRIPTION:"About me",DESCRIPTION_HELP:"About me...",SOCIAL_HELP:"http://...",GENERAL_DIVIDER:"General data",SOCIAL_NETWORKS_DIVIDER:"Social networks and web site",STAR:"Trust level",TECHNICAL_DIVIDER:"Technical data",MODAL_AVATAR:{TITLE:"Avatar",SELECT_FILE_HELP:"<b>Choose an image file</b>, by clicking on the button below:",BTN_SELECT_FILE:"Choose an image",RESIZE_HELP:"<b>Re-crop the image</b> if necessary. A click on the image allows to move it. Click on the area at the bottom left to zoom in.",RESULT_HELP:"<b>Here is the result</b> as seen on your profile:"},CONFIRM:{DELETE:"Are you sure you want to <b>delete your Cesium+ profile ?</b><br/><br/>This operation is irreversible."},ERROR:{REMOVE_PROFILE_FAILED:"Deleting profile failed",LOAD_PROFILE_FAILED:"Could not load user profile.",SAVE_PROFILE_FAILED:"Saving profile failed",INVALID_SOCIAL_NETWORK_FORMAT:"Invalid format: please fill a valid Internet address.<br/><br/>Examples :<ul><li>- A Facebook page (https://www.facebook.com/user)</li><li>- A web page (http://www.domain.com)</li><li>- An email address (joe@dalton.com)</li></ul>",IMAGE_RESIZE_FAILED:"Error while resizing picture"},INFO:{PROFILE_REMOVED:"Profile deleted",PROFILE_SAVED:"Profile saved"},HELP:{WARNING_PUBLIC_DATA:"Please note that the information published here <b>is public</b>: visible including by <b>not logged in people</b>."}},LOCATION:{BTN_GEOLOC_ADDRESS:"Find my address on the map",USE_GEO_POINT:"Verify address (recommended)?",LOADING_LOCATION:"Searching address...",LOCATION_DIVIDER:"Localisation",ADDRESS:"Address",ADDRESS_HELP:"Address (optional)",CITY:"City",CITY_HELP:"City, Country",DISTANCE:"Maximum distance around the city",DISTANCE_UNIT:"mi",DISTANCE_OPTION:"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}",SEARCH_HELP:"City, Country",PROFILE_POSITION:"Profile position",MODAL:{TITLE:"Search address",SEARCH_HELP:"City, Country",ALTERNATIVE_RESULT_DIVIDER:"Alternative results for <b>{{address}}</b>:",POSITION:"lat/lon : {{lat}} / {{lon}}"},ERROR:{CITY_REQUIRED_IF_STREET:"Required if a street has been filled",REQUIRED_FOR_LOCATION:"Required field to appear on the map",INVALID_FOR_LOCATION:"Unknown address",GEO_LOCATION_FAILED:"Unable to retrieve your current position. Please use the search button.",ADDRESS_LOCATION_FAILED:"Unable to retrieve the address position"}},SUBSCRIPTION:{SUBSCRIPTION_DIVIDER:"Online services",SUBSCRIPTION_DIVIDER_HELP:"Online services offer optional additional services, delegated to a third party.",BTN_ADD:"Add a service",BTN_EDIT:"Manage my services",NO_SUBSCRIPTION:"No service defined",SUBSCRIPTION_COUNT:"Services / Subscription",EDIT:{TITLE:"Online services",HELP_TEXT:"Manage your subscriptions and other online services here",PROVIDER:"Provider:"},TYPE:{ENUM:{EMAIL:"Receive email notifications"}},CONFIRM:{DELETE_SUBSCRIPTION:"Are you sur you want to <b>delete this subscription</b>?"},ERROR:{LOAD_SUBSCRIPTIONS_FAILED:"Error while loading online services",ADD_SUBSCRIPTION_FAILED:"Error while adding subscription",UPDATE_SUBSCRIPTION_FAILED:"Error during subscription update",DELETE_SUBSCRIPTION_FAILED:"Error while deleting subscription"},MODAL_EMAIL:{TITLE:"Notification by email",HELP:"Fill out this form to <b>be notified by email</ b> of your account's events. <br/>Your email address will be encrypted only to be visible to the service provider.",EMAIL_LABEL:"Your email:",EMAIL_HELP:"john@domain.com",FREQUENCY_LABEL:"Frequency of notifications:",FREQUENCY_DAILY:"Daily",FREQUENCY_WEEKLY:"Weekly",PROVIDER:"Service Provider:"}},DOCUMENT:{HASH:"Hash: ",LOOKUP:{TITLE:"Document search",BTN_ACTIONS:"Actions",SEARCH_HELP:"issuer:AAA*, time:1508406169",LAST_DOCUMENTS_DOTS:"Last documents :",LAST_DOCUMENTS:"Last documents",SHOW_QUERY:"Show query",HIDE_QUERY:"Hide query",HEADER_TIME:"Time/Hour",HEADER_ISSUER:"Issuer",HEADER_RECIPIENT:"Recipient",READ:"Read",DOCUMENT_TYPE:"Type",DOCUMENT_TITLE:"Title",BTN_REMOVE:"Delete this document",BTN_COMPACT:"Compact",HAS_REGISTERED:"create or edit his profile",POPOVER_ACTIONS:{TITLE:"Actions",REMOVE_ALL:"Delete these documents..."},TYPE:{USER_PROFILE:"Profile",MARKET_RECORD:"Ad",MARKET_COMMENT:"Comment on a ad",PAGE_RECORD:"Page",PAGE_COMMENT:"Comment on a page",GROUP_RECORD:"Group",GROUP_COMMENT:"Comment on a group"}},INFO:{REMOVED:"Deleted document"},CONFIRM:{REMOVE:"Are you sure you want to <b>delete this document</b>?",REMOVE_ALL:"Are you sure you want to <b>delete these documents</b>?"},ERROR:{LOAD_DOCUMENTS_FAILED:"Error searching documents",REMOVE_FAILED:"Error deleting the document",REMOVE_ALL_FAILED:"Error deleting documents"}},ES_SETTINGS:{PLUGIN_NAME:"Cesium+",PLUGIN_NAME_HELP:"User profiles, notifications, private messages",ENABLE_TOGGLE:"Enable extension?",ENABLE_MESSAGE_TOGGLE:"Enable messages?",ENABLE_SETTINGS_TOGGLE:"Enable remote storage for settings?",PEER:"Data peer address",POPUP_PEER:{TITLE:"Data peer",HELP:"Set the address of the peer to use:",PEER_HELP:"server.domain.com:port"},NOTIFICATIONS:{DIVIDER:"Notifications",HELP_TEXT:"Enable the types of notifications you want to receive:",ENABLE_TX_SENT:"Notify the validation of <b>sent payments</b>?",ENABLE_TX_RECEIVED:"Notify the validation of <b>received payments</b>?",ENABLE_CERT_SENT:"Notify the validation of <b>sent certifications</b>?",ENABLE_CERT_RECEIVED:"Notify the validation of <b>received certifications</b>?"},CONFIRM:{ASK_ENABLE_TITLE:"New features",ASK_ENABLE:'Some new features are available: <ul><li>&nbsp;&nbsp;<b><i class="icon ion-person"></i> user profiles</b>;<li>&nbsp;&nbsp;<b><i class="icon ion-android-notifications"></i> Notifications</b>;<li>&nbsp;&nbsp;<b><i class="icon ion-email"></i> Private messages</b>.</ul><br/>They have been <b>disabled</b> in your settings.<br/><br/><b>Do you want to enable</b> these features?'}},ES_WALLET:{ERROR:{RECIPIENT_IS_MANDATORY:"A recipient is required for encryption."}},ES_PEER:{NAME:"Name",DOCUMENTS:"Documents",SOFTWARE:"Software",DOCUMENT_COUNT:"Number of documents",EMAIL_SUBSCRIPTION_COUNT:"{{emailSubscription}} subscribers to email notification"},EVENT:{NODE_STARTED:"Your node ES API <b>{{params[0]}}</b> is UP",NODE_BMA_DOWN:"Node <b>{{params[0]}}:{{params[1]}}</b> (used by your ES API) is <b>unreachable</b>.",NODE_BMA_UP:"Node <b>{{params[0]}}:{{params[1]}}</b> is reachable again.",MEMBER_JOIN:"You are now a <b>member</b> of currency <b>{{params[0]}}</b>!",MEMBER_LEAVE:"You are <b>not a member anymore</b> of currency <b>{{params[0]}}</b>!",MEMBER_EXCLUDE:"You are <b>not more member</b> of the currency <b>{{params[0]}}</b>, for lack of renewal or lack of certifications.",MEMBER_REVOKE:"Your account has been revoked. It will no longer be a member of the currency <b>{{params[0]}}</b>.",MEMBER_ACTIVE:"Your membership to <b>{{params[0]}}</b> has been <b>renewed successfully</b>.",TX_SENT:'Your payment to <span class="positive" ><i class="icon ion-person"></i>&thinsp;{{name||uid||params[1]}}</span> was executed.',TX_SENT_MULTI:"Your payment to <b>{{params[1]}}</b> was executed.",TX_RECEIVED:'You received a payment from <span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||uid||params[1]}}</span>.',TX_RECEIVED_MULTI:"You received a payment from <b>{{params[1]}}</b>.",CERT_SENT:'Your <b>certification</b> to <span class="positive" ><i class="icon ion-person"></i>&thinsp;{{name||uid||params[1]}}</span> was executed.',CERT_RECEIVED:'You have <b>received a certification</b> from <span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||uid||params[1]}}</span>.',USER:{LIKE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> like your profile',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> follows your activity',STAR_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> rated you ({{params[3]}} <i class="ion-star">)',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> asks you for a moderation on the profile: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> reported a profile to be deleted: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> has requested moderation on your profile'},PAGE:{NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> has commented on your referencing: <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> has modified his comment on your referencing: <b>{{params[2]}}</b>',NEW_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> has replied to your comment on the referencing: <b>{{params[2]}}</b>',UPDATE_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> has modified his answer to your comment, on the referencing: <b>{{params[2]}}</b>',FOLLOW_NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> has commented on the page: <b>{{params[2]}}</b>',FOLLOW_UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> has modified his comment on the page: <b>{{params[2]}}</b>',FOLLOW_NEW:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> added a page: <b>{{params[2]}}</b>',FOLLOW_UPDATE:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> updated the page: <b>{{params[2]}}</b>',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> asks you for a moderation on the page: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> reported a page to be deleted: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> has requested moderation on your page: <b>{{params[2]}}</b>'}},CONFIRM:{ES_USE_FALLBACK_NODE:"Data node <b>{{old}}</b> unreachable or invalid address.<br/><br/>Do you want to temporarily use the <b>{{new}}</b> data node?"},ERROR:{ES_CONNECTION_ERROR:'Data node <b>{{server}}</b> unreachable or invalid address.<br/><br/>Check your Internet connection, or change data node in <a class="positive" ng-click="doQuickFix(\'settings\')">advanced settings</a>.',ES_MAX_UPLOAD_BODY_SIZE:"The volume of data to be sent exceeds the limit set by the server.<br/><br/>Please try again after, for example, deleting photos."}}),e.translations("eo-EO",{COMMON:{CATEGORY:"Kategorio",CATEGORY_SELECT_HELP:"Elekti",CATEGORIES:"Kategorioj",CATEGORY_SEARCH_HELP:"Serĉado",COMMENT_HELP:"Komento",LAST_MODIFICATION_DATE:"Ĝisdatigita la",BTN_LIKE:"Mi ŝatas",BTN_FOLLOW:"Sekvi",BTN_STOP_FOLLOW:"Ne plu sekvi",LIKES_TEXT:"{{total}} persono{{total > 1 ? 'j' : ''}} ŝatis tiun ĉi paĝon",DISLIKES_TEXT:"{{total}} persono{{total > 1 ? 'j' : ''}} ne ŝatis tiun ĉi paĝon",VIEWS_TEXT:"{{total}} persono{{total > 1 ? 'j' : ''}} konsultis tiun ĉi paĝon",FOLLOWS_TEXT:"{{total}} persono{{total > 1 ? 'j' : ''}} sekvas tiun ĉi paĝon",ABUSES_TEXT:"{{total}} persono{{total > 1 ? 'j' : ''}} atentigis pri problemo",BTN_REPORT_ABUSE_DOTS:"Atentigi pri problemo aŭ misuzo...",BTN_REMOVE_REPORTED_ABUSE:"Nuligi mian atentigon",SUBMIT_BY:"Submetita de",GEO_DISTANCE_SEARCH:"Distanco por serĉado",GEO_DISTANCE_OPTION:"{{value}} km",BTN_PUBLISH:"Publikigi",BTN_PICTURE_DELETE:"Forigi",BTN_PICTURE_FAVORISE:"Precipa",BTN_PICTURE_ROTATE:"Turni",BTN_ADD_PICTURE:"Aldoni foton",NOTIFICATION:{TITLE:"Nova avizo | {{'COMMON.APP_NAME'|translate}}",HAS_UNREAD:"Vi havas {{count}} avizo{{count>0?'j':''}}n ne legita{{count>0?'j':''}}n"},NOTIFICATIONS:{TITLE:"Avizoj",MARK_ALL_AS_READ:"Ĉion marki legita",NO_RESULT:"Neniu avizo",SHOW_ALL:"Vidi ĉion",LOAD_NOTIFICATIONS_FAILED:"Malsukceso por ŝarĝi la avizojn"},REPORT_ABUSE:{TITLE:"Atentigi pri problemo",SUB_TITLE:"Bonvolu klarigi rapide la problemon:",REASON_HELP:"Mi klarigas la problemon...",ASK_DELETE:"Peti la forigon?",CONFIRM:{SENT:"Atentigo sendita. Dankon!"}}},MENU:{REGISTRY:"Paĝoj",USER_PROFILE:"Mia profilo",MESSAGES:"Mesaĝoj",NOTIFICATIONS:"Avizoj",INVITATIONS:"Invitoj"},ACCOUNT:{NEW:{ORGANIZATION_ACCOUNT:"Konto por organizaĵo",ORGANIZATION_ACCOUNT_HELP:"Se vi reprezentas entreprenon, asocion, ktp.<br/>Neniu universala dividendo estos kreita per tiu ĉi konto."},EVENT:{MEMBER_WITHOUT_PROFILE:'Vi povas <a ui-sref="app.edit_profile">tajpi vian profilon Cesium+</a> (kromebleco) por disponi pli bonan videblecon por via konto. Tiu profilo estos stokata en <b>sendependa kontaro</b> de la mono, sed malcentralizita.'},ERROR:{WS_CONNECTION_FAILED:"ğchange ne povas ricevi la avizojn pro teknika eraro (konekto al la daten-nodo Cesium+).<br/><br/>Se la problemo daŭradas, bonvolu <b>elekti alian daten-nodon</b> ĉe la parametroj Cesium+."}},WOT:{BTN_SUGGEST_CERTIFICATIONS_DOTS:"Sugesti identecojn atestotajn...",BTN_ASK_CERTIFICATIONS_DOTS:"Peti membrojn atesti min...",BTN_ASK_CERTIFICATION:"Peti atestaĵon",SUGGEST_CERTIFICATIONS_MODAL:{TITLE:"Sugesti atestadojn",HELP:"Selekti viajn sugestojn"},ASK_CERTIFICATIONS_MODAL:{TITLE:"Peti atestaĵojn",HELP:"Selekti la ricevontojn"},SEARCH:{DIVIDER_PROFILE:"Kontoj",DIVIDER_PAGE:"Paĝoj",DIVIDER_GROUP:"Grupoj"},VIEW:{SENIORITY:"Delongeco ĉe {{'COMMON.APP_NAME'|translate}}",STARS:"Fido-nivelo",STAR_HIT_COUNT:"{{total}} noto{{total>1 ? 'j' : ''}}",BTN_STAR_HELP:"Noti tiun ĉi profilon",BTN_STARS_REMOVE:"Forigi mian noton",BTN_REDO_STAR_HELP:"Aktualigi vian noton",BTN_FOLLOW:"Sekvi la agojn de tiu ĉi profilo",BTN_STOP_FOLLOW:"Ne plu sekvi tiun ĉi profilon"}},COMMENTS:{DIVIDER:"Komentoj",SHOW_MORE_COMMENTS:"Afiŝi la antaŭajn komentojn",COMMENT_HELP:"Via komento, demando, ktp.",COMMENT_HELP_REPLY_TO:"Via respondo...",BTN_SEND:"Sendi",POPOVER_SHARE_TITLE:"Mesaĝo #{{number}}",REPLY:"Respondi",REPLY_TO:"Respondo al:",REPLY_TO_LINK:"Responde al ",REPLY_TO_DELETED_COMMENT:"Responde al forigita komento",REPLY_COUNT:"{{replyCount}} respondoj",DELETED_COMMENT:"Komento forigita",MODIFIED_ON:"modifita la {{time|formatDate}}",MODIFIED_PARENTHESIS:"(modifita poste)",ERROR:{FAILED_SAVE_COMMENT:"Eraro dum la konservo de la komento",FAILED_REMOVE_COMMENT:"Eraro dum la forigo de la komento"}},MESSAGE:{REPLY_TITLE_PREFIX:"Resp: ",FORWARD_TITLE_PREFIX:"Tr: ",BTN_REPLY:"Respondi",BTN_COMPOSE:"Nova mesaĝo",BTN_WRITE:"Skribi",NO_MESSAGE_INBOX:"Neniu mesaĝo ricevita",NO_MESSAGE_OUTBOX:"Neniu mesaĝo sendita",NOTIFICATIONS:{TITLE:"Mesaĝoj",MESSAGE_RECEIVED:"Vi <b>ricevis mesaĝon</b><br/>de"},LIST:{INBOX:"Ricevujo",OUTBOX:"Senditaj mesaĝoj",LAST_INBOX:"Novaj mesaĝoj",LAST_OUTBOX:"Senditaj mesaĝoj",BTN_LAST_MESSAGES:"Freŝdataj mesaĝoj",TITLE:"Mesaĝoj",SEARCH_HELP:"Serĉado en la mesaĝoj",POPOVER_ACTIONS:{TITLE:"Kromaĵoj",DELETE_ALL:"Forigi ĉiujn mesaĝojn"}},COMPOSE:{TITLE:"Nova mesaĝo",TITLE_REPLY:"Respondi",SUB_TITLE:"Nova mesaĝo",TO:"Al",OBJECT:"Temo",OBJECT_HELP:"Temo",ENCRYPTED_HELP:"Bonvolu noti, ke tiu ĉi mesaĝo estos ĉifrita antaŭ sendo, tiel ke nur la adresato povos legi ĝin, kaj ke li estos certa, ke vi ja estas ties aŭtoro.",MESSAGE:"Mesaĝo",MESSAGE_HELP:"Enhavo de la mesaĝo",CONTENT_CONFIRMATION:"La enhavo de la mesaĝo estas malplena.<br/><br/>Ĉu vi volas tamen sendi la mesaĝon?"},VIEW:{TITLE:"Mesaĝo",SENDER:"Sendita de",RECIPIENT:"Sendita al",NO_CONTENT:"Mesaĝo malplena",DELETE:"Forigi la mesaĝon"},CONFIRM:{REMOVE:"Ĉu vi certas, ke vi volas <b>forigi tiun ĉi mesaĝon</b>?<br/><br/>Tiu ago estas neinversigebla.",REMOVE_ALL:"Ĉu vi certas, ke vi volas <b>forigi ĉiujn mesaĝojn</b>?<br/><br/>Tiu ago estas neinversigebla.",MARK_ALL_AS_READ:"Ĉu vi certas, ke vi volas <b>marki ĉiujn mesaĝojn legitaj</b>?",USER_HAS_NO_PROFILE:"Tiu identeco havas neniun profilon Cesium+. Eblas ke ĝi ne uzas la krom-programon Cesium+, kaj <b>do ne legos vian mesaĝon</b>.<br/><br/>Ĉu vi certas, ke vi volas tamen <b>daŭrigi</b>?"},INFO:{MESSAGE_REMOVED:"Mesaĝo forigita",All_MESSAGE_REMOVED:"Ĉiuj mesaĝoj estis forigitaj",MESSAGE_SENT:"Mesaĝo sendita"},ERROR:{SEND_MSG_FAILED:"Eraro dum la sendo de la mesaĝo.",LOAD_MESSAGES_FAILED:"Eraro dum la ricevo de la mesaĝoj.",LOAD_MESSAGE_FAILED:"Eraro dum la ricevo de la mesaĝo.",MESSAGE_NOT_READABLE:"Legado de la mesaĝo neebla.",USER_NOT_RECIPIENT:"Vi ne estas la adresato de tiu ĉi mesaĝo: malĉifrado neebla.",NOT_AUTHENTICATED_MESSAGE:"La aŭtenteco de la mesaĝo estas dubinda aŭ ties enhavo estas difektita.",REMOVE_MESSAGE_FAILED:"Malsukceso por forigi la mesaĝon",MESSAGE_CONTENT_TOO_LONG:"Signaro tro longa ({{maxLength}} signoj maksimume).",MARK_AS_READ_FAILED:"Neeblas marki la mesaĝon 'legita'.",LOAD_NOTIFICATIONS_FAILED:"Eraro dum la ricevo de la mesaĝo-avizoj.",REMOVE_All_MESSAGES_FAILED:"Eraro dum la forigo de ĉiuj mesaĝoj.",MARK_ALL_AS_READ_FAILED:"Eraro por marki la mesaĝojn legitaj.",RECIPIENT_IS_MANDATORY:"La adresato estas deviga."}},REGISTRY:{CATEGORY:"Ĉefa agado",GENERAL_DIVIDER:"Ĝeneralaj informoj",LOCATION_DIVIDER:"Adreso",SOCIAL_NETWORKS_DIVIDER:"Sociaj retoj kaj retejo",TECHNICAL_DIVIDER:"Teknikaj informoj",BTN_SHOW_WOT:"Personoj",BTN_SHOW_WOT_HELP:"Traserĉi personojn",BTN_SHOW_PAGES:"Paĝoj",BTN_SHOW_PAGES_HELP:"Traserĉi paĝojn",BTN_NEW:"Krei paĝon",MY_PAGES:"Miaj paĝoj",NO_PAGE:"Neniu paĝo",SEARCH:{TITLE:"Paĝoj",SEARCH_HELP:"Kio, Kiu: restoracio, Ĉe Marcelo, ...",BTN_ADD:"Nova",BTN_LAST_RECORDS:"Freŝdataj paĝoj",BTN_ADVANCED_SEARCH:"Sperta serĉado",BTN_OPTIONS:"Sperta serĉado",TYPE:"Tipo de paĝo",LOCATION_HELP:"Kie: Poŝto-kodo, Urbo",RESULTS:"Rezultoj",RESULT_COUNT_LOCATION:"{{count}} rezulto{{count>0?'j':''}}, proksime de {{location}}",RESULT_COUNT:"{{count}} rezulto{{count>0?'j':''}}",LAST_RECORDS:"Freŝdataj paĝoj",LAST_RECORD_COUNT_LOCATION:"{{count}} paĝo{{count>0?'j':''}} freŝdata{{count>0?'j':''}}, proksime de {{location}}",LAST_RECORD_COUNT:"{{count}} paĝo{{count>0?'j':''}} freŝdata{{count>0?'j':''}}",POPOVER_FILTERS:{BTN_ADVANCED_SEARCH:"Spertaj kromaĵoj?"}},VIEW:{TITLE:"Adresaro",CATEGORY:"Ĉefa agado:",LOCATION:"Adreso:",MENU_TITLE:"Kromaĵoj",POPOVER_SHARE_TITLE:"{{title}}",REMOVE_CONFIRMATION:"Ĉu vi certas, ke vi volas forigi tiun ĉi paĝon?<br/><br/>Tiu ago estas neinversigebla."},TYPE:{TITLE:"Tipoj",SELECT_TYPE:"Tipo de paĝo:",ENUM:{SHOP:"Loka komerco",COMPANY:"Entrepreno",ASSOCIATION:"Asocio",INSTITUTION:"Institucio"}},EDIT:{TITLE:"Redaktado",TITLE_NEW:"Nova paĝo",RECORD_TYPE:"Tipo de paĝo",RECORD_TITLE:"Nomo",RECORD_TITLE_HELP:"Nomo",RECORD_DESCRIPTION:"Priskribo",RECORD_DESCRIPTION_HELP:"Priskribo de la agado",RECORD_ADDRESS:"Strato",RECORD_ADDRESS_HELP:"Strato, konstruaĵo...",RECORD_CITY:"Urbo",RECORD_CITY_HELP:"Urbo",RECORD_SOCIAL_NETWORKS:"Sociaj retoj kaj retejo",RECORD_PUBKEY:"Publika ŝlosilo",RECORD_PUBKEY_HELP:"Publika ŝlosilo por ricevi la pagojn"},WALLET:{REGISTRY_DIVIDER:"Paĝoj",REGISTRY_HELP:"La paĝoj referencigas agadojn akceptantajn la monon aŭ favorigantajn ĝin: komercoj, entreprenoj, asocioj, institucioj."},ERROR:{LOAD_CATEGORY_FAILED:"Eraro dum la ŝarĝo de la listo de la agadoj",LOAD_RECORD_FAILED:"Eraro dum la ŝarĝo de la paĝo",LOOKUP_RECORDS_FAILED:"Eraro dum la serĉado",REMOVE_RECORD_FAILED:"Eraro dum la forigo de la paĝo",SAVE_RECORD_FAILED:"Eraro dum la konservado",RECORD_NOT_EXISTS:"Paĝo neekzistanta",GEO_LOCATION_NOT_FOUND:"Urbo aŭ poŝto-kodo ne trovita"},INFO:{RECORD_REMOVED:"Paĝo forigita",RECORD_SAVED:"Paĝo konservita"}},PROFILE:{PROFILE_DIVIDER:"Profilo ğchange",PROFILE_DIVIDER_HELP:"Temas pri kromaj datenoj, stokitaj ĉe la reto ğchange.",NO_PROFILE_DEFINED:"Neniu profilo tajpita",BTN_ADD:"Tajpi mian profilon",BTN_EDIT:"Redakti mian profilon",BTN_DELETE:"Forigi mian profilon",BTN_REORDER:"Reordigi",UID:"Pseŭdonimo",TITLE:"Familia nomo, Persona nomo",TITLE_HELP:"Familia nomo, Persona nomo",DESCRIPTION:"Pri mi",DESCRIPTION_HELP:"Pri mi...",SOCIAL_HELP:"http://...",GENERAL_DIVIDER:"Ĝeneralaj informoj",SOCIAL_NETWORKS_DIVIDER:"Sociaj retoj, retejoj",STAR:"Fido-nivelo",TECHNICAL_DIVIDER:"Teknikaj informoj",MODAL_AVATAR:{TITLE:"Profil-foto",SELECT_FILE_HELP:"Bonvolu <b>elekti bildo-dosieron</b>, alklakante la ĉi-suban butonon:",BTN_SELECT_FILE:"Elekti foton",RESIZE_HELP:"<b>Rekadri la bildon</b>, laŭbezone. Pluigi klakon sur la bildo ebligas movi ĝin. Alklaku la zonon malsupre maldekstre por zomi.",RESULT_HELP:"<b>Jen la rezulto</b> tiel videbla ĉe via profilo:"},CONFIRM:{DELETE:"Ĉu vi certas, ke vi volas <b>forigi vian profilon ğchange?</b><br/><br/>Tiu ago estas neinversigebla."},ERROR:{REMOVE_PROFILE_FAILED:"Malsukceso por forigi la profilon",LOAD_PROFILE_FAILED:"Malsukceso por ŝarĝi la profilon de la uzanto",SAVE_PROFILE_FAILED:"Eraro dum la konservado",INVALID_SOCIAL_NETWORK_FORMAT:"Strukturo ne rekonata: bonvolu tajpi validan adreson.<br/><br/>Ezemploj:<ul><li>- Facebook-paĝo (https://www.facebook.com/uzanto)</li><li>- Retpaĝo (http://www.miaretejo.net)</li><li>- Retadreso (joe@dalton.com)</li></ul>",IMAGE_RESIZE_FAILED:"Eraro dum la reformatigo de la bildo"},INFO:{PROFILE_REMOVED:"Profilo forigita",PROFILE_SAVED:"Profilo konservita"},HELP:{WARNING_PUBLIC_DATA:"La informoj afiŝitaj en via profilo <b>estas publikaj</b>: videblaj inkluzive de la personoj <b>ne konektitaj</b>.<br/>{{'PROFILE.PROFILE_DIVIDER_HELP'|translate}}"}},LOCATION:{BTN_GEOLOC_ADDRESS:"Trovi mian adreson surmape",USE_GEO_POINT:"Kontroli la adreson (konsilinda)?",LOADING_LOCATION:"Serĉado de la adreso...",LOCATION_DIVIDER:"Adreso",ADDRESS:"Strato",ADDRESS_HELP:"Strato, adres-aldonaĵo...",CITY:"Urbo",CITY_HELP:"Poŝto-kodo, Urbo, Lando",DISTANCE:"Maksimuma distanco ĉirkaŭ la urbo",DISTANCE_UNIT:"km",DISTANCE_OPTION:"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}",SEARCH_HELP:"Poŝto-kodo, Urbo",PROFILE_POSITION:"Loko de la profilo",MODAL:{TITLE:"Serĉado de la adreso",SEARCH_HELP:"Urbo, Poŝto-kodo, Lando",ALTERNATIVE_RESULT_DIVIDER:"Alternativaj rezultoj por <b>{{address}}</b>:",POSITION:"Lat/Lon: {{lat}}/{{lon}}"},ERROR:{CITY_REQUIRED_IF_STREET:"Deviga kampo (ĉar strato estas tajpita)",REQUIRED_FOR_LOCATION:"Deviga kampo por aperi sur la mapo",INVALID_FOR_LOCATION:"Adreso nekonata",GEO_LOCATION_FAILED:"Neeblas ricevi vian lokiĝon. Bonvolu uzi la serĉo-butonon.",ADDRESS_LOCATION_FAILED:"Neeblas ricevi la lokon per la adreso"}},SUBSCRIPTION:{SUBSCRIPTION_DIVIDER:"Retaj servoj",SUBSCRIPTION_DIVIDER_HELP:"La retaj servoj proponas pliajn nedevigajn servojn, delegitajn al aliulo.",BTN_ADD:"Aldoni servon",BTN_EDIT:"Mastrumi miajn servojn",NO_SUBSCRIPTION:"Neniu servo uzata",SUBSCRIPTION_COUNT:"Servoj / Abonoj",EDIT:{TITLE:"Retaj servoj",HELP_TEXT:"Mastrumu ĉi tie viajn abonojn kaj aliajn retajn servojn",PROVIDER:"Provizanto:"},TYPE:{ENUM:{EMAIL:"Ricevi la avizojn per retmesaĝo"}},CONFIRM:{DELETE_SUBSCRIPTION:"Ĉu vi certas, ke vi volas <b>forigi tiun abonon</b>?"},ERROR:{LOAD_SUBSCRIPTIONS_FAILED:"Eraro dum la ŝarĝo de la retaj servoj",ADD_SUBSCRIPTION_FAILED:"Malsukceso por sendi la abonon",UPDATE_SUBSCRIPTION_FAILED:"Malsukceso por ĝisdatigi la abonon",DELETE_SUBSCRIPTION_FAILED:"Eraro dum la forigo de la abono"},MODAL_EMAIL:{TITLE:"Avizo per retmesaĝo",HELP:"Plenigu tiun ĉi formularon por <b>esti avizita per retmesaĝo</b> pri la okazaĵoj ĉe via konto.<br/>Via retadreso estos ĉifrita por esti videbla nur de la servo-provizanto.",EMAIL_LABEL:"Via retadreso:",EMAIL_HELP:"johano.stelaro@esperanto.org",FREQUENCY_LABEL:"Periodo de la avizoj:",FREQUENCY_DAILY:"Ĉiutaga",FREQUENCY_WEEKLY:"Ĉiusemajna",PROVIDER:"Servo-provizanto:"}},DOCUMENT:{HASH:"Haketo: ",LOOKUP:{TITLE:"Serĉado de dokumentoj",BTN_ACTIONS:"Agoj",SEARCH_HELP:"Sendanto:AAA*, tempo:1508406169",LAST_DOCUMENTS_DOTS:"Lastaj dokumentoj:",LAST_DOCUMENTS:"Lastaj dokumentoj",SHOW_QUERY:"Vidi la informpeton",HIDE_QUERY:"Kaŝi la informpeton",HEADER_TIME:"Dato/Horo",HEADER_ISSUER:"Sendanto",HEADER_RECIPIENT:"Ricevonto",READ:"Legita",DOCUMENT_TYPE:"Tipo",DOCUMENT_TITLE:"Titolo",BTN_REMOVE:"Forigi tiun ĉi dokumenton",BTN_COMPACT:"Densigi",HAS_REGISTERED:"kreis aŭ modifis sian profilon",POPOVER_ACTIONS:{TITLE:"Agoj",REMOVE_ALL:"Forigi tiujn ĉi dokumentojn..."},TYPE:{USER_PROFILE:"Profilo",MARKET_RECORD:"Anonco",MARKET_COMMENT:"Komento ĉe anonco",PAGE_RECORD:"Paĝo",PAGE_COMMENT:"Komento ĉe paĝo",GROUP_RECORD:"Grupo",GROUP_COMMENT:"Komento ĉe grupo"}},INFO:{REMOVED:"Dokumento forigita"},CONFIRM:{REMOVE:"Ĉu vi certas, ke vi volas <b>forigi tiun ĉi dokumenton</b>?",REMOVE_ALL:"Ĉu vi certas, ke vi volas <b>forigi tiujn ĉi dokumentojn</b>?"},ERROR:{LOAD_DOCUMENTS_FAILED:"Eraro dum la serĉado de dokumentoj",REMOVE_FAILED:"Eraro dum la forigo de la dokumento",REMOVE_ALL_FAILED:"Eraro dum la forigo de la dokumentoj"}},ES_SETTINGS:{PLUGIN_NAME:"Spertaj parametroj",PLUGIN_NAME_HELP:"Filtrado de avizoj, ktp.",ENABLE_TOGGLE:"Aktivigi la krom-programon?",ENABLE_MESSAGE_TOGGLE:"Aktivigi la privatajn mesaĝojn?",ENABLE_SETTINGS_TOGGLE:"Aktivigi la foran stokadon de la parametroj?",PEER:"Adreso de la daten-nodo",POPUP_PEER:{TITLE:"Daten-nodo",HELP:"Tajpu la adreson de la nodo, kiun vi volas uzi:",PEER_HELP:"servo.domajno.com:port"},NOTIFICATIONS:{DIVIDER:"Avizoj",HELP_TEXT:"Aktivigu la avizo-tipojn, kiujn vi deziras ricevi:",ENABLE_TX_SENT:"Avizi pri la <b>senditaj pagoj</b>?",ENABLE_TX_RECEIVED:"Avizi pri la <b>ricevitaj pagoj</b>?",ENABLE_CERT_SENT:"Avizi pri la <b>senditaj atestaĵoj</b>?",ENABLE_CERT_RECEIVED:"Avizi pri <b>la ricevitaj atestaĵoj</b>?"},CONFIRM:{ASK_ENABLE_TITLE:"Kromaj funkcioj",ASK_ENABLE:'La krom-programo Cesium+ estas <b>malaktivigita</b> ĉe viaj parametroj, kio senaktivigas la funkciojn: <ul><li>&nbsp;&nbsp;<b><i class="icon ion-person"></i> Profiloj Cesium+</b>;<li>&nbsp;&nbsp;<b><i class="icon ion-android-notifications"></i> Avizoj</b>;<li>&nbsp;&nbsp;<b><i class="icon ion-email"></i> Privataj mesaĝoj</b>.<li>&nbsp;&nbsp;<b><i class="icon ion-location"></i> Mapoj, ktp.</b>.</ul><br/><b>Ĉu vi deziras reaktivigi</b> la krom-programon?'}},ES_WALLET:{ERROR:{RECIPIENT_IS_MANDATORY:"Adresito estas deviga por la ĉifrado."}},ES_PEER:{NAME:"Nomo",DOCUMENTS:"Dokumentoj",SOFTWARE:"Programo",DOCUMENT_COUNT:"Nombro de dokumentoj",EMAIL_SUBSCRIPTION_COUNT:"{{emailSubscription}} abonantoj pri avizoj per retmesaĝoj"},EVENT:{NODE_STARTED:"Via nodo ES API <b>{{params[0]}}</b> ekis",NODE_BMA_DOWN:"La nodo <b>{{params[0]}}:{{params[1]}}</b> (uzata de via nodo ES API) estas <b>neatingebla</b>.",NODE_BMA_UP:"La nodo <b>{{params[0]}}:{{params[1]}}</b> estas denove alirebla.",MEMBER_JOIN:"Vi estas nun <b>membro</b> de la mono <b>{{params[0]}}</b>!",MEMBER_LEAVE:"Vi <b>ne plu estas membro</b> de la mono <b>{{params[0]}}</b>!",MEMBER_EXCLUDE:"Vi <b>ne plu estas membro</b> de la mono <b>{{params[0]}}</b>, pro ne revalidiĝo aŭ pro manko da atestaĵoj.",MEMBER_REVOKE:"La nuligo de via konto efektiviĝis. Ĝi ne plu povos esti membro-konto de la mono <b>{{params[0]}}</b>.",MEMBER_ACTIVE:"La revalidiĝo de via aliĝo al la mono <b>{{params[0]}}</b> estis <b>ricevita</b>.",TX_SENT:"Via <b>pago</b> al <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\" ><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> efektiviĝis.",TX_SENT_MULTI:"Via <b>pago</b> al <b>{{params[1]}}</b> efektiviĝis.",TX_RECEIVED:"Vi <b>ricevis pagon</b> de <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span>.",TX_RECEIVED_MULTI:"Vi <b>ricevis pagon</b> de <b>{{params[1]}}</b>.",CERT_SENT:"Via <b>atestado</b> al <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\" ><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> efektiviĝis.",CERT_RECEIVED:"Vi <b>ricevis atestaĵon</b> de <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span>.",USER:{LIKE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[2]}}</span> ŝatas vian profilon',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[2]}}</span> sekvas viajn agojn',STAR_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[2]}}</span> notis vin ({{params[3]}} <b class="ion-star">)',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[2]}}</span> petas de vi moderigon pri la profilo: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[2]}}</span> atentigis pri profilo foriginda: <b>{{params[2]}}</b>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[2]}}</span> atentigis pri via profilo'},PAGE:{NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> komentis vian paĝon: <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> modifis sian komenton ĉe via paĝo: <b>{{params[2]}}</b>',NEW_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> respondis al via komento ĉe la paĝo: <b>{{params[2]}}</b>',UPDATE_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> modifis sian respondon al via komento ĉe la paĝo: <b>{{params[2]}}</b>',FOLLOW_NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> komentis la paĝon: <b>{{params[2]}}</b>',FOLLOW_UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> modifis sian komenton ĉe la paĝo: <b>{{params[2]}}</b>',FOLLOW_NEW:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> aldonis la paĝon: <b>{{params[2]}}</b>',FOLLOW_UPDATE:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> modifis la paĝon: <b>{{params[2]}}</b>',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> petas de vi moderigon pri la paĝo: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> atentigis pri paĝo foriginda: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> atentigis pri via paĝo: <b>{{params[2]}}</b>'}},CONFIRM:{ES_USE_FALLBACK_NODE:"Daten-nodo <b>{{old}}</b> neatingebla aŭ adreso nevalida.<br/><br/>Ĉu vi volas provizore uzi la daten-nodon <b>{{new}}</b> ?"},ERROR:{ES_CONNECTION_ERROR:'Daten-nodo <b>{{server}}</b> neatingebla aŭ adreso nevalida.<br/><br/>Kontrolu vian retkonekton, aŭ ŝanĝu la daten-nodon en la <a class="positive" ng-click="doQuickFix(\'settings\')">spertaj parametroj</a>.',ES_MAX_UPLOAD_BODY_SIZE:"La kvanto de datenoj sendotaj superas la limon fiksitan de la servilo.<br/>Bonvolu reprovi post, ekzemple, forigo de fotoj."}}),e.translations("es-ES",{COMMON:{ABUSES_TEXT:"{{total}} {{total > 1 ? 'people' : 'person'}} reported a problem on this page",BTN_FOLLOW:"Seguir",BTN_LIKE:"Me gusta",BTN_REMOVE_REPORTED_ABUSE:"Cancelar mi reporte o problema",BTN_REPORT_ABUSE_DOTS:"Reportar un problema o abuso...",BTN_STOP_FOLLOW:"Dejar de seguir",COMMENT_HELP:"Comentarios",DISLIKES_TEXT:"A {{total}} {{total > 1 ? 'personas no les' : 'persona no le'}} gusta esta página",LIKES_TEXT:"A {{total}} {{total > 1 ? 'personas les' : 'persona le'}} gusta esta página",FOLLOWS_TEXT:"{{total}} {{total > 1 ? 'personas siguen' : 'persona sigue'}} esta página",VIEWS_TEXT:"{{total}} 'personas vieron' : 'persona vió'}} esta página",GEO_DISTANCE_OPTION:"{{value}} km",GEO_DISTANCE_SEARCH:"Buscar por proximidad",NOTIFICATION:{HAS_UNREAD:"Tiene {{count}} notificaci{{count>0?'ón':'ones'}} no leída{{count>0?'s':''}}",TITLE:"Nueva notificación | {{'COMMON.APP_NAME'|translate}}"},REPORT_ABUSE:{ASK_DELETE:"¿Solicitar eliminación?",CONFIRM:{SENT:"Solicitud enviada. ¡Gracias!"},REASON_HELP:"Yo explico el problema...",SUB_TITLE:"Por favor explique brevemente el problema:",TITLE:"Reportar un problema"},CATEGORY:"Categoría",CATEGORIES:"Categorías",CATEGORY_SEARCH_HELP:"Búsqueda",CATEGORY_SELECT_HELP:"Seleccionar",LAST_MODIFICATION_DATE:"Actualización el",SUBMIT_BY:"Sometido por",BTN_PUBLISH:"Publicar",BTN_PICTURE_DELETE:"Suprimir",BTN_PICTURE_FAVORISE:"Principal",BTN_PICTURE_ROTATE:"Girar",BTN_ADD_PICTURE:"Añadir una foto",NOTIFICATIONS:{TITLE:"Notificaciones",MARK_ALL_AS_READ:"Marcar todo como leído",NO_RESULT:"Ningúna notificación",SHOW_ALL:"Ver todo",LOAD_NOTIFICATIONS_FAILED:"Fracaso en la carga de las notificaciones"}},MENU:{REGISTRY:"Páginas",USER_PROFILE:"Mi perfil",MESSAGES:"Mensajes",NOTIFICATIONS:"Notificaciones",INVITATIONS:"Invitaciones"},ACCOUNT:{NEW:{ORGANIZATION_ACCOUNT:"Cuenta para una organización",ORGANIZATION_ACCOUNT_HELP:"Si representa una empresa, una asociación, etc.<br/>Ningún dividendo universal será creído por esta cuenta."},EVENT:{MEMBER_WITHOUT_PROFILE:'Para obtener sus certificaciones más rapidamente, complete <a ui-sref="app.edit_profile">su perfil usuario</a>. Los miembros concederán más fácilmente su confianza a una identidad verificable.'},ERROR:{WS_CONNECTION_FAILED:"ğchange no puede recibir las notificaciones, a causa de un error técnico (conexión al nodo de datos ğchange).<br/><br/>Si el problema persiste, por favor <b>elija otro nodo de datos</b> en los ajustes."}},WOT:{BTN_SUGGEST_CERTIFICATIONS_DOTS:"Sugerir identidades a certificar…",BTN_ASK_CERTIFICATIONS_DOTS:"Pedir a miembros que le certifiquen…",BTN_ASK_CERTIFICATION:"Pedir una certificación",VIEW:{BTN_FOLLOW:"Seguir la actividad de este perfil",BTN_REDO_STAR_HELP:"Actualizar su puntuación",BTN_STAR_HELP:"Puntuar este perfil",BTN_STARS_REMOVE:"Suprimir mi puntuación",BTN_STOP_FOLLOW:"Dejar de seguir este perfil",SENIORITY:"Antigüedad en {{'COMMON.APP_NAME'|translate}}",STAR_HIT_COUNT:"{{total}} puntuaci{{total>1 ? 'ones' : 'ón'}}",STARS:"Nivel de confianza"},SUGGEST_CERTIFICATIONS_MODAL:{TITLE:"Sugerir certificaciones",HELP:"Selectionar sus sugerencias"},ASK_CERTIFICATIONS_MODAL:{TITLE:"Solicitar certificaciones",HELP:"Selectionar los destinatarios"},SEARCH:{DIVIDER_PROFILE:"Cuentas",DIVIDER_PAGE:"Páginas",DIVIDER_GROUP:"Grupos"},CONFIRM:{SUGGEST_CERTIFICATIONS:"¿Desea <b>enviar estas sugerencias de certificatión</b> ?",ASK_CERTIFICATION:"¿Desea <b>enviar una solicitud de certificación</b> ?",ASK_CERTIFICATIONS:"¿Desea <b>enviar una solicitud de certificación</b> a estas personas ?"}},INVITATION:{TITLE:"Invitaciones",NO_RESULT:"Ningúna invitación en espera",BTN_DELETE_ALL:"Suprimir todas las invitaciones",BTN_DELETE:"Suprimir la invitación",BTN_NEW_INVITATION:"Nueva invitación",ASK_CERTIFICATION:'<a href="#/app/wot/{{pubkey}}/{{::uid}}">{{::name||uid}}</a> solicita su certificación',SUGGESTION_CERTIFICATION:'<a href="#/app/wot/{{::pubkey}}/{{::uid}}">{{::name||uid}}</a> él es sugerido por certificación',SUGGESTED_BY:'Sugerencia mandada por <a class="positive" href="#/app/wot/{{::issuer.pubkey}}/{{::issuer.uid}}">{{::issuer.name||issuer.uid}}</a>',NOTIFICATIONS:{TITLE:"Invitaciones"},LIST:{TITLE:"Invitaciones"},NEW:{TITLE:"Nueva invitación",RECIPIENTS:"A",RECIPIENTS_HELP:"Destinatarios de la invitación",RECIPIENTS_MODAL_TITLE:"Destinatarios",RECIPIENTS_MODAL_HELP:"Por favor, elige los destinatarios :",SUGGESTION_IDENTITIES:"Sugerencia de certificación",SUGGESTION_IDENTITIES_HELP:"Certificaciones a sugerir",SUGGESTION_IDENTITIES_MODAL_TITLE:"Sugerencias",SUGGESTION_IDENTITIES_MODAL_HELP:"Por favor, elige sus sugerencias :"},CONFIRM:{DELETE_ALL_CONFIRMATION:"La supresión de las invitaciones es una <b>operación ireversible</b>.<br/><br/>¿ Desea continuar ?",SEND_INVITATIONS_TO_CERTIFY:"¿ Desea <b>mandar esta invitación a certificar</b> ?"},INFO:{INVITATION_SENT:"Invitación mandada"},ERROR:{LOAD_INVITATIONS_FAILED:"Fracaso en la carga de las invitaciones",REMOVE_INVITATION_FAILED:"Fracaso durante la supresión de la invitación",REMOVE_ALL_INVITATIONS_FAILED:"Fracaso durante la supresión de las invitaciones",SEND_INVITATION_FAILED:"Fracaso durante el envío de la invitación",BAD_INVITATION_FORMAT:'<span class="assertive"><i class="ion-close-circled"></i> Invitación ilegible (formato desconocido)</span> - mandada por <a ui-sref="app.user_identity({pubkey: \'{{::pubkey}}\', uid: \'{{::uid}}\' })">{{::name||uid}}</a>'}},COMMENTS:{DIVIDER:"Comentarios",SHOW_MORE_COMMENTS:"Visualizar los comentarios anteriores",COMMENT_HELP:"Su comentario, preguntas, etc.",COMMENT_HELP_REPLY_TO:"Su repuesta…",MODIFIED_ON:"modificado el {{time|formatDate}}",MODIFIED_PARENTHESIS:"(modificado entonces)",BTN_SEND:"Mandar",POPOVER_SHARE_TITLE:"Mensaje #{{number}}",REPLY:"Responder",REPLY_TO:"Repuesta a :",REPLY_TO_LINK:"En repuesta a ",REPLY_TO_DELETED_COMMENT:"En repuesta a un comentario suprimido",REPLY_COUNT:"{{replyCount}} repuestas",DELETED_COMMENT:"Comentario suprimido",ERROR:{FAILED_SAVE_COMMENT:"Fracaso durante el respaldo del comentario",FAILED_REMOVE_COMMENT:"Fracaso durante la supresión del comentario"}},MESSAGE:{REPLY_TITLE_PREFIX:"Rep: ",FORWARD_TITLE_PREFIX:"Tr: ",BTN_REPLY:"Responder",BTN_COMPOSE:"Nuevo mensaje",BTN_WRITE:"Escribir",NO_MESSAGE_INBOX:"Ningun mensaje recibido",NO_MESSAGE_OUTBOX:"Ningun mensaje mandado",NOTIFICATIONS:{TITLE:"Mensajes",MESSAGE_RECEIVED:"Ha <b>recibido un mensaje</b><br/>de"},LIST:{INBOX:"Bandeja de entrada",OUTBOX:"Mensajes enviados",LAST_INBOX:"Nuevos mensajes",LAST_OUTBOX:"Mensajes enviados",BTN_LAST_MESSAGES:"Mensajes recientes",TITLE:"Mensajes",SEARCH_HELP:"Buscar en mensajes",POPOVER_ACTIONS:{TITLE:"Opciones",DELETE_ALL:"Suprimir todos los mensajes"}},COMPOSE:{TITLE:"Nuevo mensaje",TITLE_REPLY:"Responder",SUB_TITLE:"Nuevo mensaje",TO:"A",OBJECT:"Objeto",OBJECT_HELP:"Objeto",ENCRYPTED_HELP:"Tenga en cuenta que este mensaje será cifrado antes del envío, con el fin de que solo el destinatario pueda leerlo, y que se tenga la seguridad de que la autoría es suya.",MESSAGE:"Mensaje",MESSAGE_HELP:"Contenido del mensaje",CONTENT_CONFIRMATION:"El contenido del mensaje está vacío.<br/><br/>Sin embargo, ¿ quiere mandar el mensaje ?"},VIEW:{TITLE:"Mensaje",SENDER:"Enviado por",RECIPIENT:"Enviado a",NO_CONTENT:"Mensaje vacío",DELETE:"Eliminar el mensaje"},CONFIRM:{REMOVE:"¿Desea <b>suprimir este mensaje</b> ?<br/><br/>Esta operación es ireversible.",REMOVE_ALL:"¿Desea <b>suprimir todos los mensajes</b> ?<br/><br/>Esta operación es ireversible.",MARK_ALL_AS_READ:"¿Desea <b>marcar todos los mensajes como leído</b> ?",USER_HAS_NO_PROFILE:"Esta identidad no tiene ningún perfil Cesium+. Puede que no tenga habilitada la extensión Cesium+, y <b>no podrá ver su mensaje</b>.<br/><br/>¿ Desea <b>continuar</b> a pesar de todo ?"},INFO:{MESSAGE_REMOVED:"Mensaje suprimido",All_MESSAGE_REMOVED:"Todos los mensajes fueron suprimido",MESSAGE_SENT:"Mensaje mandado"},ERROR:{SEND_MSG_FAILED:"Fracaso durante el envío del mensaje.",LOAD_MESSAGES_FAILED:"Fracaso durante la recuperación de los mensajes.",LOAD_MESSAGE_FAILED:"Fracaso durante la recuperación del mensaje.",MESSAGE_NOT_READABLE:"Lectura del mensaje imposible.",USER_NOT_RECIPIENT:"No esta el destinatario de este mensaje : deciframiento imposible.",NOT_AUTHENTICATED_MESSAGE:"La autenticidad del mensaje es dudosa o su contenido es corrupto.",REMOVE_MESSAGE_FAILED:"Fracaso en la supresión del mensaje",MESSAGE_CONTENT_TOO_LONG:"Valor demasiado largo ({{maxLength}} carácteres max).",MARK_AS_READ_FAILED:"Imposible marcar el mensaje como 'leído'.",LOAD_NOTIFICATIONS_FAILED:"Fracaso durante la recuperación de las notificaciones de mensajes.",REMOVE_All_MESSAGES_FAILED:"Fracaso durante la supresión de todos los mensajes.",MARK_ALL_AS_READ_FAILED:"Fracaso durante el marcaje de los mensajes como leído.",RECIPIENT_IS_MANDATORY:"El destinatario es obligatorio."}},REGISTRY:{CATEGORY:"Actividad principal",GENERAL_DIVIDER:"Informaciones generales",LOCATION_DIVIDER:"Dirección",SOCIAL_NETWORKS_DIVIDER:"Redes sociales y sitio web",TECHNICAL_DIVIDER:"Informaciones técnicas",BTN_SHOW_WOT:"Personas",BTN_SHOW_WOT_HELP:"Buscar personas",BTN_SHOW_PAGES:"Páginas",BTN_SHOW_PAGES_HELP:"Búsqueda de páginas",BTN_NEW:"Crear una página",MY_PAGES:"Mis páginas",NO_PAGE:"Sin páginas",SEARCH:{TITLE:"Páginas",SEARCH_HELP:"Qué, Quién, ej: peluquería, restaurante Sol.",BTN_ADD:"Nuevo",BTN_LAST_RECORDS:"Páginas recientes",BTN_ADVANCED_SEARCH:"búsqueda avanzada",BTN_OPTIONS:"Búsqueda avanzada",TYPE:"Tipo de página",LOCATION_HELP:"Ciudad",RESULTS:"Resultados",RESULT_COUNT_LOCATION:"{{count}} Resultado{{count>0?'s':''}}, cerca de {{location}}",RESULT_COUNT:"{{count}} resultado{{count>0?'s':''}}",LAST_RECORDS:"Páginas recientes",LAST_RECORD_COUNT_LOCATION:"{{count}} página{{count>0?'s':''}} reciente{{count>0?'s':''}}, cerca de {{location}}",LAST_RECORD_COUNT:"{{count}} página{{count>0?'s':''}} reciente{{count>0?'s':''}}",POPOVER_FILTERS:{BTN_ADVANCED_SEARCH:"Opciones avanzadas?"}},VIEW:{TITLE:"Anuario",CATEGORY:"Actividad principal :",LOCATION:"Dirección :",MENU_TITLE:"Opciones",POPOVER_SHARE_TITLE:"{{title}}",REMOVE_CONFIRMATION:"¿Desea suprimir esta página ?<br/><br/>Esta operación es ireversible."},TYPE:{TITLE:"Nueva página",SELECT_TYPE:"Tipo de página :",ENUM:{SHOP:"Comercio local",COMPANY:"Empresa",ASSOCIATION:"Asociación",INSTITUTION:"Institución"}},EDIT:{TITLE:"Edición",TITLE_NEW:"Nueva página",RECORD_TYPE:"Tipo de página",RECORD_TITLE:"Nombre",RECORD_TITLE_HELP:"Nombre",RECORD_DESCRIPTION:"Descripción",RECORD_DESCRIPTION_HELP:"Descripción de la actividad",RECORD_ADDRESS:"Calle",RECORD_ADDRESS_HELP:"Calle, edificio…",RECORD_CITY:"Ciudad",RECORD_CITY_HELP:"Ciudad",RECORD_SOCIAL_NETWORKS:"Redes sociales y sitio web",RECORD_PUBKEY:"Llave pública",RECORD_PUBKEY_HELP:"Llave pública para recibir pagos"},WALLET:{REGISTRY_DIVIDER:"Páginas",REGISTRY_HELP:'Las páginas se refieren a colectivos que aceptan moneda o la promocionan: tiendas, empresas, negocios, asociaciones, instituciones. Se almacenan fuera de la red de la moneda, en <a ui-sref="app.es_network">la red Cesium+</a>.'},ERROR:{LOAD_CATEGORY_FAILED:"Fracaso en la carga de la lista de actividades",LOAD_RECORD_FAILED:"Fracaso durante la carga de la página",LOOKUP_RECORDS_FAILED:"Fracaso durante la ejecución de la búsqueda.",REMOVE_RECORD_FAILED:"Fracaso en la supresión de la página",SAVE_RECORD_FAILED:"Fracaso durante el respaldo",RECORD_NOT_EXISTS:"Página inexistente",GEO_LOCATION_NOT_FOUND:"Ciudad o código postal no encontrado"},INFO:{RECORD_REMOVED:"Página suprimida",RECORD_SAVED:"Página guardada"}},PROFILE:{PROFILE_DIVIDER:"Perfil Cesium+",PROFILE_DIVIDER_HELP:"Estos son datos auxiliares, almacenados fuera de la red monetaria",NO_PROFILE_DEFINED:"Ningún perfil Cesium+",BTN_ADD:"Ingresar mi perfil",BTN_EDIT:"Editar mi perfil",BTN_DELETE:"Eliminar mi perfil",BTN_REORDER:"Reordenar",UID:"Seudónimo",TITLE:"Nombre, Apellidos",TITLE_HELP:"Nombre, Apellidos",DESCRIPTION:"Sobre mí",DESCRIPTION_HELP:"Escriba algo sobre usted…",SOCIAL_HELP:"http://...",GENERAL_DIVIDER:"Informaciones generales",SOCIAL_NETWORKS_DIVIDER:"Redes sociales, sitios web",TECHNICAL_DIVIDER:"Informaciones técnicas",STAR:"Nivel de confianza",MODAL_AVATAR:{TITLE:"Foto de perfil",SELECT_FILE_HELP:"Por favor, <b>elija una imagen</b>, haciendo clic sobre el cuadro de abajo:",BTN_SELECT_FILE:"Eligir una imagen",RESIZE_HELP:"<b>Encuadre la imagen</b>, si es necesario. Un clic presionado sobre la imagen permite desplazarla. Haga clic en la zona inferior izquierda para hacer zoom.",RESULT_HELP:"<b>Aquí está el resultado</b> tal como se verá sobre su perfil :"},CONFIRM:{DELETE:"¿Desea <b>eliminar su perfil Cesium+?</b><br/><br/>Esta operación es irreversible."},ERROR:{REMOVE_PROFILE_FAILED:"Error de eliminación de perfil",LOAD_PROFILE_FAILED:"Fracaso en la carga del perfil usuario.",SAVE_PROFILE_FAILED:"Fracaso durante el respaldo",INVALID_SOCIAL_NETWORK_FORMAT:"Formato inválido: por favor, indique una dirección válida.<br/><br/>Ejemplos :<ul><li>- Una página Facebook (https://www.facebook.com/user)</li><li>- Una página web (http://www.misitio.es)</li><li>- Una dirección de correo (joe@dalton.com)</li></ul>",IMAGE_RESIZE_FAILED:"Falló el redimensionado de la imagen"},INFO:{PROFILE_REMOVED:"Perfil eliminado",PROFILE_SAVED:"Perfil guardado"},HELP:{WARNING_PUBLIC_DATA:"La información de su perfil <b>es pública</b>: visible también por personas <b>sin cuenta</b>.<br/>{{'PROFILE.PROFILE_DIVIDER_HELP'|translate}}"}},LOCATION:{BTN_GEOLOC_ADDRESS:"Actualizar desde la dirección",USE_GEO_POINT:"Comprobar la dirección (recomendado)",LOADING_LOCATION:"Encontrar la dirección…",LOCATION_DIVIDER:"Dirección",ADDRESS:"Calle",ADDRESS_HELP:"Calle, número, etc…",CITY:"Ciudad",CITY_HELP:"Ciudad, País",DISTANCE:"Distancia máxima alrededor de la ciudad",DISTANCE_UNIT:"km",DISTANCE_OPTION:"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}",SEARCH_HELP:"Ciudad, País",PROFILE_POSITION:"Posición del perfil",MODAL:{TITLE:"Búsqueda de dirección",SEARCH_HELP:"Ciudad, País",ALTERNATIVE_RESULT_DIVIDER:"Resultados alternativos para <b>{{address}}</b> :",POSITION:"Latitud/Longitud : {{lat}} / {{lon}}"},ERROR:{CITY_REQUIRED_IF_STREET:"Requerido si una calle ha sido llenada",REQUIRED_FOR_LOCATION:"Campo obligatorio para aparecer en el mapa",INVALID_FOR_LOCATION:"Dirección desconocida",
GEO_LOCATION_FAILED:"No se puede recuperar su ubicación Por favor usa el botón de búsqueda.",ADDRESS_LOCATION_FAILED:"No se puede recuperar la posición de la dirección."}},SUBSCRIPTION:{SUBSCRIPTION_DIVIDER:"Servicios en línea",SUBSCRIPTION_DIVIDER_HELP:"Los servicios en línea ofrecen servicios adicionales, proporcionados por un tercero.",BTN_ADD:"Agregar un servicio",BTN_EDIT:"Administrar mis servicios",NO_SUBSCRIPTION:"Ningún servicio definido",SUBSCRIPTION_COUNT:"Servicios / Suscripción",EDIT:{TITLE:"Servicios en línea",HELP_TEXT:"Gestione sus suscripciones y otros servicios en línea aquí",PROVIDER:"Proveedor:"},TYPE:{ENUM:{EMAIL:"Recibir notificaciones por correo electrónico"}},CONFIRM:{DELETE_SUBSCRIPTION:"¿ Deseas <b>eliminar</b> esta suscripción ?"},ERROR:{LOAD_SUBSCRIPTIONS_FAILED:"Error al cargar servicios en línea",ADD_SUBSCRIPTION_FAILED:"Error al agregar suscripción",UPDATE_SUBSCRIPTION_FAILED:"Error durante la actualización de la suscripción",DELETE_SUBSCRIPTION_FAILED:"Error al eliminar la suscripción"},MODAL_EMAIL:{TITLE:"Notificación por correo electrónico",HELP:"Rellene este formulario para <b>ser notificado por correo electrónico</b> de los eventos de su cuenta. <br/> Su dirección de correo electrónico se cifrará y únicamente será visible para el proveedor de servicios.",EMAIL_LABEL:"Su correo electrónico :",EMAIL_HELP:"maria@dominio.com",FREQUENCY_LABEL:"Frecuencia de las notificaciones :",FREQUENCY_DAILY:"Diaria",FREQUENCY_WEEKLY:"Semanal",PROVIDER:"Proveedor de servicio:"}},DOCUMENT:{HASH:"Hash: ",LOOKUP:{TITLE:"Búsqueda de documentos",BTN_ACTIONS:"Acciones",BTN_COMPACT:"Compactar",DOCUMENT_TITLE:"Título",DOCUMENT_TYPE:"Tipo",HAS_REGISTERED:"ha creado o modificado su perfil",SEARCH_HELP:"issuer:AAA*, time:1508406169",LAST_DOCUMENTS:"Últimos documentos",LAST_DOCUMENTS_DOTS:"Últimos documentos :",SHOW_QUERY:"Ver la búsqueda",HIDE_QUERY:"Esconder la búsqueda",HEADER_TIME:"Fecha/Hora",HEADER_ISSUER:"Emisor",HEADER_RECIPIENT:"Destinatario",READ:"Leído",BTN_REMOVE:"Sumprimer este documento",TYPE:{GROUP_COMMENT:"Comentario en un grupo",GROUP_RECORD:"Grupo",MARKET_COMMENT:"Comentario en un anuncio",MARKET_RECORD:"Anuncio",PAGE_COMMENT:"Comentario en una página",PAGE_RECORD:"Página",USER_PROFILE:"Perfil"},POPOVER_ACTIONS:{TITLE:"Acciones",REMOVE_ALL:"Suprimir estos documentos..."}},INFO:{REMOVED:"Documento suprimido"},CONFIRM:{REMOVE:"¿ Desea <b>suprimir este documento</b> ?",REMOVE_ALL:"¿ Desea <b>suprimer estos documentos</b> ?"},ERROR:{LOAD_DOCUMENTS_FAILED:"Error al buscar documentos",REMOVE_FAILED:"Error al suprimir el documento",REMOVE_ALL_FAILED:"Error al suprimir los documentos"}},ES_PEER:{DOCUMENT_COUNT:"Número de documentos",DOCUMENTS:"Documentos",EMAIL_SUBSCRIPTION_COUNT:"{{emailSubscription}} suscritas/os a notificaciones por correo",NAME:"Nombre",SOFTWARE:"Software"},ES_SETTINGS:{PLUGIN_NAME:"Cesium+",PLUGIN_NAME_HELP:"Perfiles, notificaciones, mensajes privados",ENABLE_TOGGLE:"Activar la extensión",ENABLE_MESSAGE_TOGGLE:"Activar los mensajes privados",ENABLE_SETTINGS_TOGGLE:"Activar el almacenamiento a distancia de los ajustes",PEER:"Dirección del nodo de datos",POPUP_PEER:{TITLE:"Nodo de datos",HELP:"Ingrese la dirección del nodo que quiere utilizar:",PEER_HELP:"servidor.dominio.com:puerto"},NOTIFICATIONS:{DIVIDER:"Notificaciones",HELP_TEXT:"Active los tipos de notificaciones que desea recibir:",ENABLE_TX_SENT:"Notificar la validación de los <b>pagos emitidos</b>",ENABLE_TX_RECEIVED:"Notificar la validación de los <b>pagos recibidos</b>",ENABLE_CERT_SENT:"Notificar la validación de las <b>certificaciones emitidas</b>",ENABLE_CERT_RECEIVED:"Notificar la validación de las <b>certificaciones recibidas</b>"},CONFIRM:{ASK_ENABLE_TITLE:"Otras funcionalidades",ASK_ENABLE:'La extensión de Cesium+ está deshabilitada en sus ajutes, desactivando ciertas funcionalidades: <ul><li>&nbsp;&nbsp;<b><i class="icon ion-person"></i> Perfiles de usuario/a</b>;<li>&nbsp;&nbsp;<b><i class="icon ion-android-notifications"></i> Notificaciones</b>;<li>&nbsp;&nbsp;<b><i class="icon ion-email"></i> Mensajes privados</b>.</ul><br/><br/>¿<b>Desea re-activar</b> la extensión?'}},ES_WALLET:{ERROR:{RECIPIENT_IS_MANDATORY:"Un destinatario es obligatorio para el cifrado."}},EVENT:{NODE_STARTED:"Su nodo ES API <b>{{params[0]}}</b> ha comenzado",NODE_BMA_DOWN:"El nodo <b>{{params[0]}}:{{params[1]}}</b> (utilizado por su nodo ES API) <b>no es localizable</b>.",NODE_BMA_UP:"El nodo <b>{{params[0]}}:{{params[1]}}</b> es de nuevo accesible.",MEMBER_JOIN:"Ahora es <b>miembro</b> de la moneda <b>{{params[0]}}</b> !",MEMBER_LEAVE:"No es <b>miembro</b> de la moneda <b>{{params[0]}}</b>!",MEMBER_EXCLUDE:"Usted ya no es miembro de la moneda <b>{{params[0]}}</b>, por falta de renovación o certificaciones.",MEMBER_REVOKE:"Su membresía ha sido revocada. Ya no es miembro de la moneda <b>{{params[0]}}</b>.",MEMBER_ACTIVE:"Su membresía a <b>{{params[0]}}</b> ha sido <b>renovada con éxito</b>.",TX_SENT:"Su <b>pago</b> a <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\" ><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> fue efectuado.",TX_SENT_MULTI:"Su <b>pago</b> a <b>{{params[1]}}</b> fue efectuado.",TX_RECEIVED:"Ha <b>recibido un pago</b> de <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span>.",TX_RECEIVED_MULTI:"Ha <b>recibido un pago</b> de <b>{{params[1]}}</b>.",PAGE:{ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> ha reportardo su anuncio : <b>{{params[2]}}</b>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> ha reportado un anuncio para moderar : <b>{{params[2]}}</b>',FOLLOW_CLOSE:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> ha cerrado el anuncio : <b>{{params[2]}}</b>',FOLLOW_NEW:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> ha añadido el anuncio : <b>{{params[2]}}</b>',FOLLOW_NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> ha comentado el anuncio : <b>{{params[2]}}</b>',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> sigue su anuncio : <b>{{params[2]}}</b>',FOLLOW_UPDATE:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> ha modificado el anuncio : <b>{{params[2]}}</b>',FOLLOW_UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> ha modificado su comentario en el anuncio : <b>{{params[2]}}</b>',LIKE_RECEIVED:'A <span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> le ha gustado su anuncio : <b>{{params[2]}}</b>',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> os pide moderación sobre el anuncio : <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> ha comentado su anuncio : <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> ha modificado su comentario sobre su anuncio : <b>{{params[2]}}</b>',NEW_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> ha contestado a su comentario sobre el anuncio : <b>{{params[2]}}</b>',UPDATE_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> ha modificado la repuesta a su comentario sobre el anuncio : <b>{{params[2]}}</b>'},USER:{ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[2]}}</span> ha reportado su perfil',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[2]}}</span> ha reportado un perfil a eliminar: <b>{{params[2]}}</b>',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[2]}}</span> sigue su actividad',LIKE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[2]}}</span> le gusta su perfil',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[2]}}</span> os pide una moderación sobre el perfil: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',STAR_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[2]}}</span> os ha puntuado ({{params[3]}} <b class="ion-star">)'},CERT_SENT:"Su <b>certificación</b> a <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\" ><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> fue efectuada.",CERT_RECEIVED:"Ha <b>recibido una certificación</b> de <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span>.",REGISTRY:{NEW_COMMENT:"<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> ha comentado su referencia : <b>{{params[2]}}</b>",UPDATE_COMMENT:"<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid }\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> ha modificado su comentario sobre su referencia : <b>{{params[2]}}</b>",NEW_REPLY_COMMENT:"<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> ha contestado a su comentario sobre la referencia : <b>{{params[2]}}</b>",UPDATE_REPLY_COMMENT:"<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid }\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> ha modificado la repuesta a su comentario sobre la referencia : <b>{{params[2]}}</b>"}},CONFIRM:{ES_USE_FALLBACK_NODE:"Nodo de datos <b>{{old}}</b> inalcanzable o dirección no válida.<br/><br/>¿Desea utilizar temporalmente el nodo de datos <b>{{new}}</b>?"},ERROR:{ES_CONNECTION_ERROR:'Nodo de datos <b>{{server}}</b> inalcanzable o dirección no válida.<br/><br/>Cesium continuará funcionando, <b>sin la extensión Cesium+</b> (perfiles de usuario, mensajes privados), mapas y gráficos).<br/><br/>Verifique su conexión a Internet, o cambie el nodo de datos en <a class="positive" ng-click="doQuickFix(\'settings\')"> los ajustes de la extensión </a>.',ES_MAX_UPLOAD_BODY_SIZE:"El volumen de datos a enviar excede el límite establecido por el servidor.<br/><br/>Por favor, inténtelo de nuevo después, por ejemplo, borrando fotos."}}),e.translations("fr-FR",{COMMON:{CATEGORY:"Catégorie",CATEGORY_SELECT_HELP:"Sélectionner",CATEGORIES:"Catégories",CATEGORY_SEARCH_HELP:"Recherche",COMMENT_HELP:"Commentaire",LAST_MODIFICATION_DATE:"Mise à jour le",BTN_LIKE:"J'aime",BTN_FOLLOW:"Suivre",BTN_STOP_FOLLOW:"Ne plus suivre",LIKES_TEXT:"{{total}} personne{{total > 1 ? 's' : ''}} {{total > 1 ? 'ont' : 'a'}} aimé cette page",DISLIKES_TEXT:"{{total}} personne{{total > 1 ? 's' : ''}} {{total > 1 ? 'n\\'ont' : 'n\\'a'}} pas aimé cette page",VIEWS_TEXT:"{{total}} personne{{total > 1 ? 's' : ''}} {{total > 1 ? 'ont' : 'a'}} consulté cette page",FOLLOWS_TEXT:"{{total}} personne{{total > 1 ? 's' : ''}} {{total > 1 ? 'suivent' : 'suit'}} cette page",ABUSES_TEXT:"{{total}} personne{{total > 1 ? 's' : ''}} {{total > 1 ? 'ont' : 'a'}} signalé un problème",BTN_REPORT_ABUSE_DOTS:"Signaler un problème ou un abus...",BTN_REMOVE_REPORTED_ABUSE:"Annuler mon signalement",SUBMIT_BY:"Soumis par",GEO_DISTANCE_SEARCH:"Distance de recherche",GEO_DISTANCE_OPTION:"{{value}} km",BTN_PUBLISH:"Publier",BTN_PICTURE_DELETE:"Supprimer",BTN_PICTURE_FAVORISE:"Principale",BTN_PICTURE_ROTATE:"Tourner",BTN_ADD_PICTURE:"Ajouter une photo",NOTIFICATION:{TITLE:"Nouvelle notification | {{'COMMON.APP_NAME'|translate}}",HAS_UNREAD:"Vous avez {{count}} notification{{count>0?'s':''}} non lue{{count>0?'s':''}}"},NOTIFICATIONS:{TITLE:"Notifications",MARK_ALL_AS_READ:"Tout marquer comme lu",NO_RESULT:"Aucune notification",SHOW_ALL:"Voir tout",LOAD_NOTIFICATIONS_FAILED:"Erreur de chargement des notifications"},REPORT_ABUSE:{TITLE:"Signaler un problème",SUB_TITLE:"Merci d'expliquer succintement le problème :",REASON_HELP:"J'explique le problème...",ASK_DELETE:"Demander la suppression ?",CONFIRM:{SENT:"Signalement envoyé. Merci !"}}},MENU:{REGISTRY:"Pages",USER_PROFILE:"Mon profil",MESSAGES:"Messages",NOTIFICATIONS:"Notifications",INVITATIONS:"Invitations"},ACCOUNT:{NEW:{ORGANIZATION_ACCOUNT:"Compte pour une organisation",ORGANIZATION_ACCOUNT_HELP:"Si vous représentez une entreprise, une association, etc.<br/>Aucun dividende universel ne sera créé par ce compte."},EVENT:{MEMBER_WITHOUT_PROFILE:'Vous pouvez <a ui-sref="app.edit_profile">saisir votre profil Cesium+</a> (optionnel) pour offrir une meilleure visibilité de votre compte. Ce profil sera stocké dans <b>un annuaire indépendant</b> de la monnaie, mais décentralisé.'},ERROR:{WS_CONNECTION_FAILED:"ğchange ne peut pas recevoir les notifications à cause d'une erreur technique (connexion au noeud de données ğchange).<br/><br/>Si le problème persiste, veuillez <b>choisir un autre noeud de données</b> dans les paramètres."}},WOT:{BTN_SUGGEST_CERTIFICATIONS_DOTS:"Suggérer des identités à certifier...",BTN_ASK_CERTIFICATIONS_DOTS:"Demander à des membres de me certifier...",BTN_ASK_CERTIFICATION:"Demander une certification",SUGGEST_CERTIFICATIONS_MODAL:{TITLE:"Suggérer des certifications",HELP:"Sélectionner vos suggestions"},ASK_CERTIFICATIONS_MODAL:{TITLE:"Demander des certifications",HELP:"Sélectionner les destinataires"},SEARCH:{DIVIDER_PROFILE:"Comptes",DIVIDER_PAGE:"Pages",DIVIDER_GROUP:"Groupes"},VIEW:{SENIORITY:"Ancienneté sur {{'COMMON.APP_NAME'|translate}}",STARS:"Niveau de confiance",STAR_HIT_COUNT:"{{total}} note{{total>1 ? 's' : ''}}",BTN_STAR_HELP:"Noter ce profil",BTN_STARS_REMOVE:"Supprimer ma note",BTN_REDO_STAR_HELP:"Actualiser votre note",BTN_FOLLOW:"Suivre l'activité de ce profil",BTN_STOP_FOLLOW:"Ne plus suivre ce profil"}},COMMENTS:{DIVIDER:"Commentaires",SHOW_MORE_COMMENTS:"Afficher les commentaires précédents",COMMENT_HELP:"Votre commentaire, question, etc.",COMMENT_HELP_REPLY_TO:"Votre réponse...",BTN_SEND:"Envoyer",POPOVER_SHARE_TITLE:"Message #{{number}}",REPLY:"Répondre",REPLY_TO:"Réponse à :",REPLY_TO_LINK:"En réponse à ",REPLY_TO_DELETED_COMMENT:"En réponse à un commentaire supprimé",REPLY_COUNT:"{{replyCount}} réponses",DELETED_COMMENT:"Commentaire supprimé",MODIFIED_ON:"modifié le {{time|formatDate}}",MODIFIED_PARENTHESIS:"(modifié ensuite)",ERROR:{FAILED_SAVE_COMMENT:"Erreur lors de la sauvegarde du commentaire",FAILED_REMOVE_COMMENT:"Erreur lors de la suppression du commentaire"}},MESSAGE:{REPLY_TITLE_PREFIX:"Rep: ",FORWARD_TITLE_PREFIX:"Tr: ",BTN_REPLY:"Répondre",BTN_COMPOSE:"Nouveau message",BTN_WRITE:"Ecrire",NO_MESSAGE_INBOX:"Aucun message reçu",NO_MESSAGE_OUTBOX:"Aucun message envoyé",NOTIFICATIONS:{TITLE:"Messages",MESSAGE_RECEIVED:"Vous avez <b>reçu un message</b><br/>de"},LIST:{INBOX:"Boîte de réception",OUTBOX:"Messages envoyés",LAST_INBOX:"Nouveaux messages",LAST_OUTBOX:"Messages envoyés",BTN_LAST_MESSAGES:"Messages récents",TITLE:"Messages",SEARCH_HELP:"Recherche dans les messages",POPOVER_ACTIONS:{TITLE:"Options",DELETE_ALL:"Supprimer tous les messages"}},COMPOSE:{TITLE:"Nouveau message",TITLE_REPLY:"Répondre",SUB_TITLE:"Nouveau message",TO:"A",OBJECT:"Objet",OBJECT_HELP:"Objet",ENCRYPTED_HELP:"Veuillez noter que ce message sera chiffré avant envoi, afin que seul le destinataire puisse le lire, et qu'il soit assuré que vous soyez bien son auteur.",MESSAGE:"Message",MESSAGE_HELP:"Contenu du message",CONTENT_CONFIRMATION:"Le contenu du message est vide.<br/><br/>Voulez-vous néanmoins envoyer le message ?"},VIEW:{TITLE:"Message",SENDER:"Envoyé par",RECIPIENT:"Envoyé à",NO_CONTENT:"Message vide",DELETE:"Supprimer le message"},CONFIRM:{REMOVE:"Êtes-vous sûr de vouloir <b>supprimer ce message</b> ?<br/><br/>Cette opération est irréversible.",REMOVE_ALL:"Êtes-vous sûr de vouloir <b>supprimer tous les messages</b> ?<br/><br/>Cette opération est irréversible.",MARK_ALL_AS_READ:"Êtes-vous sûr de vouloir <b>marquer tous les messages comme lu</b> ?",USER_HAS_NO_PROFILE:"Cette identité n'a aucun profil. Il se peut qu'elle n'utilise pas l'extension de gestion des messages privés, et <b>ne consultera donc pas votre message</b>.<br/><br/>Êtes-vous sûr de vouloir <b>continuer</b> malgré tout ?"},INFO:{MESSAGE_REMOVED:"Message supprimé",All_MESSAGE_REMOVED:"Tous les messages ont été supprimés",MESSAGE_SENT:"Message envoyé"},ERROR:{SEND_MSG_FAILED:"Erreur lors de l'envoi du message.",LOAD_MESSAGES_FAILED:"Erreur lors de la récupération des messages.",LOAD_MESSAGE_FAILED:"Erreur lors de la récupération du message.",MESSAGE_NOT_READABLE:"Lecture du message impossible.",USER_NOT_RECIPIENT:"Vous n'êtes pas le destinataire de ce message : déchiffrement impossible.",NOT_AUTHENTICATED_MESSAGE:"L'authenticité du message est douteuse ou son contenu est corrompu.",REMOVE_MESSAGE_FAILED:"Erreur de suppression du message",MESSAGE_CONTENT_TOO_LONG:"Valeur trop longue ({{maxLength}} caractères max).",MARK_AS_READ_FAILED:"Impossible de marquer le message comme 'lu'.",LOAD_NOTIFICATIONS_FAILED:"Erreur lors de la récupération des notifications de messages.",REMOVE_All_MESSAGES_FAILED:"Erreur lors de la suppression de tous les messages.",MARK_ALL_AS_READ_FAILED:"Erreur lors du marquage des messages comme lu.",RECIPIENT_IS_MANDATORY:"Le destinataire est obligatoire."}},REGISTRY:{CATEGORY:"Activité principale",GENERAL_DIVIDER:"Informations générales",LOCATION_DIVIDER:"Adresse",SOCIAL_NETWORKS_DIVIDER:"Réseaux sociaux et site web",TECHNICAL_DIVIDER:"Informations techniques",BTN_SHOW_WOT:"Personnes",BTN_SHOW_WOT_HELP:"Rechercher des personnes",BTN_SHOW_PAGES:"Pages",BTN_SHOW_PAGES_HELP:"Rechercher des pages",BTN_NEW:"Créer une page",MY_PAGES:"Mes pages",NO_PAGE:"Aucune page",SEARCH:{TITLE:"Pages",SEARCH_HELP:"Quoi, Qui : restaurant, Chez Marcel, ...",BTN_ADD:"Nouveau",BTN_LAST_RECORDS:"Pages récentes",BTN_ADVANCED_SEARCH:"Recherche avancée",BTN_OPTIONS:"Recherche avancée",TYPE:"Type de page",LOCATION_HELP:"Où : Code postal, Ville",RESULTS:"Résultats",RESULT_COUNT_LOCATION:"{{count}} résultat{{count>0?'s':''}}, près de {{location}}",RESULT_COUNT:"{{count}} résultat{{count>0?'s':''}}",LAST_RECORDS:"Pages récentes",LAST_RECORD_COUNT_LOCATION:"{{count}} page{{count>0?'s':''}} récente{{count>0?'s':''}}, près de {{location}}",LAST_RECORD_COUNT:"{{count}} page{{count>0?'s':''}} récente{{count>0?'s':''}}",POPOVER_FILTERS:{BTN_ADVANCED_SEARCH:"Options avancées ?"}},VIEW:{TITLE:"Annuaire",CATEGORY:"Activité principale :",LOCATION:"Adresse :",MENU_TITLE:"Options",POPOVER_SHARE_TITLE:"{{title}}",REMOVE_CONFIRMATION:"Êtes-vous sûr de vouloir supprimer cette page ?<br/><br/>Cette opération est irréversible."},TYPE:{TITLE:"Types",SELECT_TYPE:"Type de page :",ENUM:{SHOP:"Commerce local",COMPANY:"Entreprise",ASSOCIATION:"Association",INSTITUTION:"Institution"}},EDIT:{TITLE:"Edition",TITLE_NEW:"Nouvelle page",RECORD_TYPE:"Type de page",RECORD_TITLE:"Nom",RECORD_TITLE_HELP:"Nom",RECORD_DESCRIPTION:"Description",RECORD_DESCRIPTION_HELP:"Description de l'activité",RECORD_ADDRESS:"Rue",RECORD_ADDRESS_HELP:"Rue, bâtiment...",RECORD_CITY:"Ville",RECORD_CITY_HELP:"Ville",RECORD_SOCIAL_NETWORKS:"Réseaux sociaux et site web",RECORD_PUBKEY:"Clé publique",RECORD_PUBKEY_HELP:"Clé publique de réception des paiements"},WALLET:{REGISTRY_DIVIDER:"Pages",REGISTRY_HELP:"Les pages référencent des activités acceptant la monnaie ou la favorisant : commerces, entreprises, associations, institutions."},ERROR:{LOAD_CATEGORY_FAILED:"Erreur de chargement de la liste des activités",LOAD_RECORD_FAILED:"Erreur lors du chargement de la page",LOOKUP_RECORDS_FAILED:"Erreur lors de l'exécution de la recherche",REMOVE_RECORD_FAILED:"Erreur lors de la suppression de la page",SAVE_RECORD_FAILED:"Erreur lors de la sauvegarde",RECORD_NOT_EXISTS:"Page inexistante",GEO_LOCATION_NOT_FOUND:"Ville ou code postal non trouvé"},INFO:{RECORD_REMOVED:"Page supprimée",RECORD_SAVED:"Page sauvegardée"}},PROFILE:{PROFILE_DIVIDER:"Profil ğchange",PROFILE_DIVIDER_HELP:"Il s'agit de données annexes, stockées sur le réseau ğchange.",NO_PROFILE_DEFINED:"Aucun profil saisi",BTN_ADD:"Saisir mon profil",BTN_EDIT:"Editer mon profil",BTN_DELETE:"Supprimer mon profil",BTN_REORDER:"Réordonner",UID:"Pseudonyme",TITLE:"Nom, Prénom",TITLE_HELP:"Nom, Prénom",DESCRIPTION:"A propos de moi",DESCRIPTION_HELP:"A propos de moi...",SOCIAL_HELP:"http://...",GENERAL_DIVIDER:"Informations générales",SOCIAL_NETWORKS_DIVIDER:"Réseaux sociaux, sites web",STAR:"Niveau de confiance",TECHNICAL_DIVIDER:"Informations techniques",MODAL_AVATAR:{TITLE:"Photo de profil",SELECT_FILE_HELP:"Veuillez <b>choisir un fichier image</b>, en cliquant sur le bouton ci-dessous :",BTN_SELECT_FILE:"Choisir une photo",RESIZE_HELP:"<b>Recadrez l'image</b>, si besoin. Un clic maintenu sur l'image permet de la déplacer. Cliquez sur la zone en bas à gauche pour zoomer.",RESULT_HELP:"<b>Voici le résultat</b> tel que visible sur votre profil :"},CONFIRM:{DELETE:"Êtes-vous sûr de vouloir <b>supprimer votre profil ğchange ?</b><br/><br/>Cette opération est irréversible."},ERROR:{REMOVE_PROFILE_FAILED:"Erreur de suppression du profil",LOAD_PROFILE_FAILED:"Erreur de chargement du profil utilisateur",SAVE_PROFILE_FAILED:"Erreur lors de la sauvegarde",INVALID_SOCIAL_NETWORK_FORMAT:"Format non pris en compte : veuillez indiquer une adresse valide.<br/><br/>Exemples :<ul><li>- Une page Facebook (https://www.facebook.com/user)</li><li>- Une page web (http://www.monsite.fr)</li><li>- Une adresse email (joe@dalton.com)</li></ul>",IMAGE_RESIZE_FAILED:"Erreur lors du redimensionnement de l'image"},INFO:{PROFILE_REMOVED:"Profil supprimé",PROFILE_SAVED:"Profil sauvegardé"},HELP:{WARNING_PUBLIC_DATA:"Les informations renseignées dans votre profil <b>sont publiques</b> : visibles y compris par des personnes <b>non connectées</b>."}},LOCATION:{BTN_GEOLOC_ADDRESS:"Trouver mon adresse sur la carte",USE_GEO_POINT:"Vérifier l'adresse (recommandé) ?",LOADING_LOCATION:"Recherche de l'adresse...",LOCATION_DIVIDER:"Adresse",ADDRESS:"Rue",ADDRESS_HELP:"Rue, complément d'adresse...",CITY:"Ville",CITY_HELP:"Code postal, Ville, Pays",DISTANCE:"Distance maximale autour de la ville",DISTANCE_UNIT:"km",DISTANCE_OPTION:"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}",SEARCH_HELP:"Code postal, Ville",PROFILE_POSITION:"Position du profil",MODAL:{TITLE:"Recherche de l'adresse",SEARCH_HELP:"Ville, Code postal, Pays",ALTERNATIVE_RESULT_DIVIDER:"Résultats alternatifs pour <b>{{address}}</b> :",POSITION:"Lat/Lon : {{lat}}/{{lon}}"},ERROR:{CITY_REQUIRED_IF_STREET:"Champ obligatoire (car une rue est saisie)",REQUIRED_FOR_LOCATION:"Champ obligatoire pour apparaître sur la carte",INVALID_FOR_LOCATION:"Adresse inconnue",GEO_LOCATION_FAILED:"Impossible de récupérer votre position. Veuillez utiliser le bouton de recherche.",ADDRESS_LOCATION_FAILED:"Impossible de récupérer la position à partir de l'adresse"}},SUBSCRIPTION:{SUBSCRIPTION_DIVIDER:"Services en ligne",SUBSCRIPTION_DIVIDER_HELP:"Les services en ligne offrent des services supplémentaires optionnels, délégués à un tiers.",BTN_ADD:"Ajouter un service",BTN_EDIT:"Gérer mes services",NO_SUBSCRIPTION:"Aucun service utilisé",SUBSCRIPTION_COUNT:"Services / Abonnements",EDIT:{TITLE:"Services en ligne",HELP_TEXT:"Gérez ici vos abonnements et autres services en ligne",PROVIDER:"Prestataire :"},TYPE:{ENUM:{EMAIL:"Recevoir les notifications par email"}},CONFIRM:{DELETE_SUBSCRIPTION:"Êtes-vous sûr de vouloir <b>supprimer cet abonnement</b> ?"},ERROR:{LOAD_SUBSCRIPTIONS_FAILED:"Erreur lors du chargement des services en ligne",ADD_SUBSCRIPTION_FAILED:"Erreur de l'envoi de l'abonnement",UPDATE_SUBSCRIPTION_FAILED:"Erreur de la mise à jour de l'abonnement",DELETE_SUBSCRIPTION_FAILED:"Erreur lors de la suppression de l'abonnement"},MODAL_EMAIL:{TITLE:"Notification par email",HELP:"Remplissez ce formulaire pour <b>être notifié par email</b> des événements de votre compte.<br/>Votre adresse email sera chiffrée pour n'être visible que par le prestataire de service.",EMAIL_LABEL:"Votre email :",EMAIL_HELP:"jean.dupond@domaine.com",FREQUENCY_LABEL:"Fréquence des notifications :",FREQUENCY_DAILY:"Journalier",FREQUENCY_WEEKLY:"Hebdomadaire",PROVIDER:"Prestataire du service :"}},DOCUMENT:{HASH:"Hash : ",LOOKUP:{TITLE:"Recherche de documents",BTN_ACTIONS:"Actions",SEARCH_HELP:"issuer:AAA*, time:1508406169",LAST_DOCUMENTS_DOTS:"Derniers documents :",LAST_DOCUMENTS:"Derniers documents",SHOW_QUERY:"Voir la requête",HIDE_QUERY:"Masquer la requête",HEADER_TIME:"Date/Heure",HEADER_ISSUER:"Emetteur",HEADER_RECIPIENT:"Destinataire",READ:"Lu",DOCUMENT_TYPE:"Type",DOCUMENT_TITLE:"Titre",BTN_REMOVE:"Supprimer ce document",BTN_COMPACT:"Compacter",HAS_REGISTERED:"a créé ou modifié son profil",POPOVER_ACTIONS:{TITLE:"Actions",REMOVE_ALL:"Supprimer ces documents..."},TYPE:{USER_PROFILE:"Profil",MARKET_RECORD:"Annonce",MARKET_COMMENT:"Commentaire sur une annonce",PAGE_RECORD:"Page",PAGE_COMMENT:"Commentaire sur une page",GROUP_RECORD:"Groupe",GROUP_COMMENT:"Commentaire sur un groupe"}},INFO:{REMOVED:"Document supprimé"},CONFIRM:{REMOVE:"Êtes-vous sûr de vouloir <b>supprimer ce document</b> ?",REMOVE_ALL:"Êtes-vous sûr de vouloir <b>supprimer ces documents</b> ?"},ERROR:{LOAD_DOCUMENTS_FAILED:"Erreur lors de la recherche de documents",REMOVE_FAILED:"Erreur lors de la suppression du document",REMOVE_ALL_FAILED:"Erreur lors de la suppression des documents"}},ES_SETTINGS:{PLUGIN_NAME:"Paramètres avancés",PLUGIN_NAME_HELP:"Filtrage des notifications, etc.",ENABLE_TOGGLE:"Activer l'extension ?",ENABLE_MESSAGE_TOGGLE:"Activer les messages privés ?",ENABLE_SETTINGS_TOGGLE:"Activer le stockage distant des paramètres ?",PEER:"Adresse du nœud de données",POPUP_PEER:{TITLE:"Nœud de données",HELP:"Saisissez l'adresse du nœud que vous voulez utiliser :",PEER_HELP:"serveur.domaine.com:port"},NOTIFICATIONS:{DIVIDER:"Notifications",HELP_TEXT:"Activez les types de notifications que vous souhaitez recevoir :",ENABLE_TX_SENT:"Notifier les <b>paiements émis</b> ?",ENABLE_TX_RECEIVED:"Notifier les <b>paiements reçus</b> ?",ENABLE_CERT_SENT:"Notifier les <b>certifications émises</b> ?",ENABLE_CERT_RECEIVED:"Notifier les <b>certifications reçues</b> ?"},CONFIRM:{ASK_ENABLE_TITLE:"Fonctionnalités optionnelles",ASK_ENABLE:'L\'extension Cesium+ est <b>désactivée</b> dans vos paramètres, rendant inactives les fonctionnalités : <ul><li>&nbsp;&nbsp;<b><i class="icon ion-person"></i> Profils Cesium+</b>;<li>&nbsp;&nbsp;<b><i class="icon ion-android-notifications"></i> Notifications</b>;<li>&nbsp;&nbsp;<b><i class="icon ion-email"></i> Messages privés</b>.<li>&nbsp;&nbsp;<b><i class="icon ion-location"></i> Cartes, etc.</b>.</ul><br/><b>Souhaitez-vous ré-activer</b> l\'extension ?'}},ES_WALLET:{ERROR:{RECIPIENT_IS_MANDATORY:"Un destinataire est obligatoire pour le chiffrement."}},ES_PEER:{NAME:"Nom",DOCUMENTS:"Documents",SOFTWARE:"Logiciel",DOCUMENT_COUNT:"Nombre de documents",EMAIL_SUBSCRIPTION_COUNT:"{{emailSubscription}} abonnés aux notifications par email"},EVENT:{NODE_STARTED:"Votre noeud ES API <b>{{params[0]}}</b> est démarré",NODE_BMA_DOWN:"Le noeud <b>{{params[0]}}:{{params[1]}}</b> (utilisé par votre noeud ES API) est <b>injoignable</b>.",NODE_BMA_UP:"Le noeud <b>{{params[0]}}:{{params[1]}}</b> est à nouveau accessible.",MEMBER_JOIN:"Vous êtes maintenant <b>membre</b> de la monnaie <b>{{params[0]}}</b> !",MEMBER_LEAVE:"Vous n'êtes <b>plus membre</b> de la monnaie <b>{{params[0]}}</b> !",MEMBER_EXCLUDE:"Vous n'êtes <b>plus membre</b> de la monnaie <b>{{params[0]}}</b>, faute de non renouvellement ou par manque de certifications.",MEMBER_REVOKE:"La révocation de votre compte a été effectuée. Il ne pourra plus être un compte membre de la monnaie <b>{{params[0]}}</b>.",MEMBER_ACTIVE:"Votre renouvellement d'adhésion à la monnaie <b>{{params[0]}}</b> a été <b>pris en compte</b>.",TX_SENT:'Votre <b>paiement</b> à <span class="positive" ><i class="icon ion-person"></i>&thinsp;{{name||uid||params[1]}}</span> a été effectué.',TX_SENT_MULTI:"Votre <b>paiement</b> à <b>{{params[1]}}</b> a été effectué.",TX_RECEIVED:'Vous avez <b>reçu un paiement</b> de <span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||uid||params[1]}}</span>.',TX_RECEIVED_MULTI:"Vous avez <b>reçu un paiement</b> de <b>{{params[1]}}</b>.",CERT_SENT:'Votre <b>certification</b> à <span class="positive" ><i class="icon ion-person"></i>&thinsp;{{name||uid||params[1]}}</span> a été effectuée.',CERT_RECEIVED:'Vous avez <b>reçu une certification</b> de <span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||uid||params[1]}}</span>.',USER:{LIKE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[2]}}</span> aime votre profil',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[2]}}</span> suit votre activité',STAR_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[2]}}</span> vous a noté ({{params[3]}} <b class="ion-star">)',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[2]}}</span> vous demande une modération sur le profil : <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[2]}}</span> a signalé un profil à supprimer : <b>{{params[2]}}</b>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[2]}}</span> a signalé votre profil'},PAGE:{NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> a commenté votre page : <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> a modifié son commentaire sur votre page : <b>{{params[2]}}</b>',NEW_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> a répondu à votre commentaire sur la page : <b>{{params[2]}}</b>',UPDATE_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> a modifié sa réponse à votre commentaire sur la page : <b>{{params[2]}}</b>',FOLLOW_NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> a commenté la page : <b>{{params[2]}}</b>',FOLLOW_UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> a modifié son commentaire sur la page : <b>{{params[2]}}</b>',FOLLOW_NEW:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> a ajouté la page : <b>{{params[2]}}</b>',FOLLOW_UPDATE:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> a modifié la page : <b>{{params[2]}}</b>',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> vous demande une modération sur la page : <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> a signalé une page à supprimer : <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> a signalé votre page : <b>{{params[2]}}</b>'}},CONFIRM:{ES_USE_FALLBACK_NODE:"Nœud de données <b>{{old}}</b> injoignable ou adresse invalide.<br/><br/>Voulez-vous temporairement utiliser le nœud de données <b>{{new}}</b> ?"},ERROR:{ES_CONNECTION_ERROR:'Nœud de données <b>{{server}}</b> injoignable ou adresse invalide.<br/><br/>Vérifiez votre connexion Internet, ou changer de nœud de données dans les <a class="positive" ng-click="doQuickFix(\'settings\')">paramètres avancés</a>.',ES_MAX_UPLOAD_BODY_SIZE:"Le volume des données à envoyer dépasse la limite fixée par le serveur.<br/>Veuillez ré-essayer après avoir, par exemple, supprimer des photos."}}),e.translations("nl-NL",{COMMON:{CATEGORY:"Categorie",CATEGORIES:"Categorieën",CATEGORY_SEARCH_HELP:"Zoeken",LAST_MODIFICATION_DATE:"Vernieuws op ",SUBMIT_BY:"Ingediend door",BTN_PUBLISH:"Publiceren",BTN_PICTURE_DELETE:"Wissen",BTN_PICTURE_FAVORISE:"Default",BTN_ADD_PICTURE:"Afbeelding toevoegen",NOTIFICATIONS:{TITLE:"Notificaties",MARK_ALL_AS_READ:"Markeer alles als gelezen",NO_RESULT:"Geen berichten",SHOW_ALL:"Toon alles",LOAD_NOTIFICATIONS_FAILED:"Kan berichten niet laden"}},MENU:{REGISTRY:"Ondernemingen",USER_PROFILE:"Mijn profiel",MESSAGES:"Berichten"},ACCOUNT:{NEW:{ORGANIZATION_ACCOUNT:"Ondernemingsrekening",ORGANIZATION_ACCOUNT_HELP:"Als je een onderneming, vereniging etc. vertegenwoordigd.<br/>Deze rekening zal geen dividend créeren."},EVENT:{MEMBER_WITHOUT_PROFILE:'Vul <a ui-sref="app.user_edit_profile"je gebruikersprofiel</a> in om sneller een certificering te verkrijgen. Leden zullen een verfifieerbare identiteit eerder vertrouwen.'}},COMMENTS:{DIVIDER:"Commentaren",SHOW_MORE_COMMENTS:"Toon eerder commentaren",COMMENT_HELP:"Jouw commentaar, vraag...",COMMENT_HELP_REPLY_TO:"Jouw antwoord...",BTN_SEND:"Verzenden",POPOVER_SHARE_TITLE:"Bericht #{{number}}",REPLY:"Antwoord",REPLY_TO:"Antwoorden op:",REPLY_TO_LINK:"In antwoord op ",REPLY_TO_DELETED_COMMENT:"In antwoord op een gewist bericht",REPLY_COUNT:"{{replyCount}} antwoorden",DELETED_COMMENT:"Bericht gewist"},MESSAGE:{REPLY_TITLE_PREFIX:"Re: ",FORWARD_TITLE_PREFIX:"Fw: ",BTN_REPLY:"Antwoord",BTN_COMPOSE:"Nieuw bericht",BTN_WRITE:"Schrijven",NO_MESSAGE_INBOX:"Geen bericht ontvangen",NO_MESSAGE_OUTBOX:"Geen bericht verzonden",NOTIFICATIONS:{TITLE:"Berichten",MESSAGE_RECEIVED:"Je hebt een <b>bericht ontvangen</b><br/>van"},LIST:{INBOX:"Inbox",OUTBOX:"Verzonden",TITLE:"Privé",POPOVER_ACTIONS:{TITLE:"Opties",DELETE_ALL:"Alle berichten wissen"}},COMPOSE:{TITLE:"Nieuw bericht",TITLE_REPLY:"Antwoord",SUB_TITLE:"Nieuw bericht",TO:"Aan",OBJECT:"Onderwerp",OBJECT_HELP:"Onderwerp",ENCRYPTED_HELP:"Please note this message will by encrypt before sending zodat alleen de ontvanger het kan lezen en zeker kan zijn dat jij de auteur bent.",MESSAGE:"Bericht",MESSAGE_HELP:"Berichtinhoud",CONTENT_CONFIRMATION:"Geen berichtinhoud.<br/><br/>Weet je zeker dat je dit bericht wil verzenden?"},VIEW:{TITLE:"Bericht",SENDER:"Verzonden door",RECIPIENT:"Verzonden aan",NO_CONTENT:"Leeg bericht"},CONFIRM:{REMOVE:"Weet je zeker dat je <b>dit bericht wil wissen</b>?<br/><br/>Dit kan niet ongedaan gemaakt worden.",REMOVE_ALL:"Weet je zeker dat je <b>alle berichten wil wissen</b>?<br/><br/>Dit kan niet ongedaan gemaakt worden.",MARK_ALL_AS_READ:"Weet je zeker dat je <b>alle berichten als gelezen wil markeren</b>?"},INFO:{MESSAGE_REMOVED:"Bericht succesvol gewist",All_MESSAGE_REMOVED:"Berichten succesvol gewist",MESSAGE_SENT:"Bericht verzonden"},ERROR:{SEND_MSG_FAILED:"Fout tijdens verzending.",LOAD_MESSAGES_FAILED:"Kan berichten niet laden.",LOAD_MESSAGE_FAILED:"Kan bericht niet laden.",MESSAGE_NOT_READABLE:"Kan bericht niet lezen.",USER_NOT_RECIPIENT:"Je bent niet de geadresseerde van dit bericht: het kan niet gelezen worden.",NOT_AUTHENTICATED_MESSAGE:"De authenticiteit van het bericht is onduidelijk of de inhoud is gecorrumpeerd.",REMOVE_MESSAGE_FAILED:"Kan bericht niet wissen.",MESSAGE_CONTENT_TOO_LONG:"Waarde te land (max {{maxLength}} characters).",MARK_AS_READ_FAILED:"Kan bericht niet als gelezen markeren.",LOAD_NOTIFICATIONS_FAILED:"Kan niet alle berichtnotificaties laden.",REMOVE_All_MESSAGES_FAILED:"Kan niet alle berichten wissen.",MARK_ALL_AS_READ_FAILED:"Kan berichten niet als gelezen markeren."}},REGISTRY:{CATEGORY:"Hoofdactiviteit",GENERAL_DIVIDER:"Basisinformatie",LOCATION_DIVIDER:"Adres",SOCIAL_NETWORKS_DIVIDER:"Sociale media en website",TECHNICAL_DIVIDER:"Technische informatie",BTN_NEW:"Toevoegen",SEARCH:{TITLE:"Bedrijfsregister",TITLE_SMALL_DEVICE:"Bedrijfsregister",SEARCH_HELP:"Wie, Wat: kapper, Lili's restaurant, ...",BTN_ADD:"Nieuw",BTN_OPTIONS:"Geavanceerd zoeken",TYPE:"Soort organisatie",LOCATION:"Locatie",LOCATION_HELP:"Plaats",LAST_RECORDS:"Nieuwste referenties:",RESULTS:"Resultaten:"},VIEW:{TITLE:"Register",CATEGORY:"Hoofdactiviteit:",LOCATION:"Adres:",MENU_TITLE:"Opties",POPOVER_SHARE_TITLE:"{{title}}",REMOVE_CONFIRMATION:"Weet je zeker dat je deze referentie wil verwijderen?<br/><br/>Dit kan niet ongedaan worden gemaakt."},TYPE:{TITLE:"Nieuwe referentie",SELECT_TYPE:"Soort organizatie:",ENUM:{SHOP:"Locale winkel",COMPANY:"Onderneming",ASSOCIATION:"Stichting",INSTITUTION:"Instituut"}},EDIT:{TITLE:"Bewerk",TITLE_NEW:"Nieuwe referentie",RECORD_TYPE:"Soort organizatie",RECORD_TITLE:"Naam",RECORD_TITLE_HELP:"Naam",RECORD_DESCRIPTION:"Beschrijving",RECORD_DESCRIPTION_HELP:"Omschrijf activiteit",RECORD_ADDRESS:"Adres",RECORD_ADDRESS_HELP:"Adres: straat, gebouw...",RECORD_CITY:"Plaats",RECORD_CITY_HELP:"Plaats",RECORD_SOCIAL_NETWORKS:"Sociale media en website",RECORD_PUBKEY:"Publieke sleutel",RECORD_PUBKEY_HELP:"Publieke sleutel om betalingen te ontvangen"},ERROR:{LOAD_CATEGORY_FAILED:"Laden hoofdactiveiten mislukt",LOAD_RECORD_FAILED:"Laden datasheet mislukt",LOOKUP_RECORDS_FAILED:"Opzoeken datasheets is mislukt.",REMOVE_RECORD_FAILED:"Verwijderen datasheet mislukt",SAVE_RECORD_FAILED:"Opslaan datasheet mislukt",RECORD_NOT_EXISTS:"Datasheet niet gevonden"},INFO:{RECORD_REMOVED:"Datasheet succesvol verwijderd"}},PROFILE:{UID:"Pseudoniem",TITLE:"Naam",TITLE_HELP:"Naam",DESCRIPTION:"Over mij",DESCRIPTION_HELP:"Over mij...",ADDRESS:"Adres",ADDRESS_HELP:"Adres (optioneel)",CITY:"Plaats",CITY_HELP:"Plaats (optioneel)",SOCIAL_HELP:"http://...",GENERAL_DIVIDER:"Algemene informatie",LOCATION_DIVIDER:"Localisatie",SOCIAL_NETWORKS_DIVIDER:"Sociale media en website",TECHNICAL_DIVIDER:"Technische informatie",ERROR:{LOAD_PROFILE_FAILED:"Kon gebruikersprofiel niet laden.",SAVE_PROFILE_FAILED:"Opslaan profiel mislukt",INVALID_SOCIAL_NETWORK_FORMAT:"Ongeldig formaat: vul een geldig internetadres in.<br/><br/>Voorbeelden:<ul><li>- Een Facebookpagina (https://www.facebook.com/user)</li><li>- Een webpagina (http://www.domain.com)</li><li>- Een emailadres (joe@dalton.com)</li></ul>",IMAGE_RESIZE_FAILED:"Fout tijdens afbeelding schalen"},INFO:{PROFILE_SAVED:"Profiel opgeslagen"},HELP:{WARNING_PUBLIC_DATA:"Let op, de informatie die hier is vastgelegd <b>is publiek</b>: zichtbaar ook voor <b>niet ingelogde gebruikers</b>."}},ES_SETTINGS:{PLUGIN_NAME:"Cesium+",ENABLE_TOGGLE:"Uitbreiding inschakelen?",ENABLE_MESSAGE_TOGGLE:"Berichten inschakelen?",ENABLE_SETTINGS_TOGGLE:"Globale opslag voor instellingen inschakelen?",PEER:"Adres dataknooppunt",POPUP_PEER:{TITLE:"Dataknoop",HELP:"Stel het te gebruiken adres in:",PEER_HELP:"server.domein.com:poort"},NOTIFICATIONS:{DIVIDER:"Notificaties",HELP_TEXT:"Schakel het type notificatie dat je wil ontvangen in:",ENABLE_TX_SENT:"Bericht bij validatie van <b>verzonden betalingen</b>?",ENABLE_TX_RECEIVED:"Bericht bij validatie van <b>ontvangen betalingen</b>?",ENABLE_CERT_SENT:"Bericht bij validatie van <b>verzonden certificaties</b>?",ENABLE_CERT_RECEIVED:"Bericht bij validatie van <b>ontvangen certificaties</b>?"},CONFIRM:{ASK_ENABLE_TITLE:"Nieuwe functies",ASK_ENABLE:'Er zijn nieuwe functies beschikbaar: <ul><li>&nbsp;&nbsp;<b><i class="icon ion-person"></i> Profile Cesium+</b>;<li>&nbsp;&nbsp;<b><i class="icon ion-android-notifcaitions"></i> Notifications</b>;<li>&nbsp;&nbsp;<b><i class="icon ion-email"></i> Privé berichten</b>.</ul><br/>Deze zijn <b>uitgeschakeld</b> in je instellingen.<br/><br/>Wil je deze functies <b>inschakelen</b>?'}},EVENT:{NODE_STARTED:"Je knoop ES API <b>{{params[0]}}</b> is UP",NODE_BMA_DOWN:"Knooppunt <b>{{params[0]}}:{{params[1]}}</b> (gebruikt door je ES API) is <b>onbereikbaar</b>.",NODE_BMA_UP:"Knooppunt <b>{{p0}}:{{params[1]}}</b> is weer onbereikbaar.",MEMBER_JOIN:"Je bent nu <b>lid</b> van valuta <b>{{params[0]}}</b>!",MEMBER_LEAVE:"Je bent <b>geen lid meer</b> van valuta <b>{{params[0]}}</b>!",MEMBER_ACTIVE:"Je lidmaatschap bij <b>{{params[0]}}</b> is met <b>succes verlengd</b>.",TX_SENT:'Je <b>betaling</b> aan <span class="positive" ><i class="icon ion-person"></i>&thinsp;{{name||uid||params[1]}}</span> is uitgevoerd.',TX_SENT_MULTI:"Je <b>betaling</b> aan <b>{{params[1]}}</b> is uitgevoerd.",TX_RECEIVED:'Je hebt een <b>betaling ontvangen</b> van <span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||uid||params[1]}}</span>.',TX_RECEIVED_MULTI:"Je hebt een <b>betaling ontvangen</b> van <b>{{params[1]}}</b>.",CERT_SENT:'Je <b>certificatie</b> van <span class="positive" ><i class="icon ion-person"></i>&thinsp;{{name||uid||params[1]}}</span> is uitgevoerd.',CERT_RECEIVED:'Je hebt een <b>certificatie ontvangen</b> van <span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||uid||params[1]}}</span>.',REGISTRY:{NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||uid||params[1]}}</span> heeft gereageerd op jouw referentie: <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||uid||params[1]}}</span> heeft zijn/aar reactie op jouw referentie bewerkt: <b>{{params[2]}}</b>',NEW_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||uid||params[1]}}</span> hheeft gereageerd op jouw commentaar op referentie: <b>{{params[2]}}</b>',UPDATE_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||uid||params[1]}}</span> heeft zijn/haar reactie op jouw commentaar bewerkt, op referentie: <b>{{params[2]}}</b>'}},ERROR:{}}),e.translations("en-GB",{NETWORK:{VIEW:{BTN_GRAPH:"Statistics"}},GRAPH:{COMMON:{LINEAR_SCALE:"Linear scale",LOGARITHMIC_SCALE:"Logarithmic scale",BTN_SHOW_STATS:"See statistics",BTN_SHOW_DETAILED_STATS:"Detailed statistics",RANGE_DURATION_DIVIDER:"Step unit:",RANGE_DURATION:{HOUR:"Group by <b>hour</b>",DAY:"Group by <b>day</b>",MONTH:"Group by <b>month</b>"}},PEER:{VIEW:{BLOCK_COUNT_LABEL:"Computed blocks count",BLOCK_COUNT:"{{count}} blocks",NO_BLOCK:"No block"}},DOC_STATS:{TITLE:"Data storage statistics",MARKET:{TITLE:"Number of Ads",AD:"Ads",COMMENT:"Comments"},USER:{TITLE:"Number of documents linked to an account",USER_PROFILE:"User profiles",USER_SETTINGS:"Saved settings"},MESSAGE:{TITLE:"Number of documents related to the communication",MESSAGE_INBOX:"Messages in inbox",MESSAGE_OUTBOX:"Messages in outbox",INVITATION_CERTIFICATION:"Invitations to certify"},SOCIAL:{TITLE:"Number of page or group",PAGE_COMMENT:"Comments",PAGE_RECORD:"Pages",GROUP_RECORD:"Groups"},SUBSCRIPTION:{TITLE:"Number of online subscriptions",EMAIL:"Email notifications"},OTHER:{TITLE:"Other documents",HISTORY_DELETE:"Deletion of documents"}}}}),e.translations("en",{NETWORK:{VIEW:{BTN_GRAPH:"Statistics"}},GRAPH:{COMMON:{LINEAR_SCALE:"Linear scale",LOGARITHMIC_SCALE:"Logarithmic scale",BTN_SHOW_STATS:"See statistics",BTN_SHOW_DETAILED_STATS:"Detailed statistics",RANGE_DURATION_DIVIDER:"Step unit:",RANGE_DURATION:{HOUR:"Group by <b>hour</b>",DAY:"Group by <b>day</b>",MONTH:"Group by <b>month</b>"}},PEER:{VIEW:{BLOCK_COUNT_LABEL:"Computed blocks count",BLOCK_COUNT:"{{count}} blocks",NO_BLOCK:"No block"}},DOC_STATS:{TITLE:"Data storage statistics",MARKET:{TITLE:"Number of Ads",AD:"Ads",COMMENT:"Comments"},USER:{TITLE:"Number of documents linked to an account",USER_PROFILE:"User profiles",USER_SETTINGS:"Saved settings"},MESSAGE:{TITLE:"Number of documents related to the communication",MESSAGE_INBOX:"Messages in inbox",MESSAGE_OUTBOX:"Messages in outbox",INVITATION_CERTIFICATION:"Invitations to certify"},SOCIAL:{TITLE:"Number of page or group",PAGE_COMMENT:"Comments",PAGE_RECORD:"Pages",GROUP_RECORD:"Groups"},SUBSCRIPTION:{TITLE:"Number of online subscriptions",EMAIL:"Email notifications"},OTHER:{TITLE:"Other documents",HISTORY_DELETE:"Deletion of documents"}}}}),e.translations("eo-EO",{NETWORK:{VIEW:{BTN_GRAPH:"Statistikoj"}},GRAPH:{COMMON:{LINEAR_SCALE:"Lineara skalo",LOGARITHMIC_SCALE:"Logaritma skalo",BTN_SHOW_STATS:"Vidi la statistikojn",BTN_SHOW_DETAILED_STATS:"Detalaj statistikoj",RANGE_DURATION_DIVIDER:"Tempo-unuo:",RANGE_DURATION:{HOUR:"Horo",DAY:"Tago",MONTH:"Monato"}},PEER:{VIEW:{BLOCK_COUNT_LABEL:"Nombro de blokoj kalkulitaj",BLOCK_COUNT:"{{count}} blokoj",NO_BLOCK:"Neniu bloko"}},DOC_STATS:{TITLE:"Statistikoj pri stokado",MARKET:{TITLE:"Nombro de anoncoj",AD:"Anoncoj",COMMENT:"Komentoj"},MARKET_DELTA:{TITLE:"Variado de la nombro de anoncoj",AD:"Anoncoj",COMMENT:"Komentoj"},USER:{TITLE:"Nombro de dokumentoj ligitaj al konto",USER_PROFILE:"Uzanto-profiloj",USER_SETTINGS:"Parametroj konservitaj"},USER_DELTA:{TITLE:"Variado de la nombro de dokumentoj ligitaj al konto",USER_PROFILE:"Uzanto-profiloj",USER_SETTINGS:"Parametroj konservitaj"},MESSAGE:{TITLE:"Nombro de dokumentoj ligitaj al komunikado",MESSAGE_INBOX:"Mesaĝoj en ricevujo",MESSAGE_OUTBOX:"Senditaj mesaĝoj konservitaj",INVITATION_CERTIFICATION:"Invitoj atestotaj"},SOCIAL:{TITLE:"Nombro de paĝoj aŭ grupoj",PAGE_COMMENT:"Komentoj",PAGE_RECORD:"Paĝoj",GROUP_RECORD:"Grupoj"},SUBSCRIPTION:{TITLE:"Nombro de abonoj",EMAIL:"Avizoj per retmesaĝoj"},OTHER:{TITLE:"Aliaj dokumentoj",HISTORY_DELETE:"Forigoj de dokumentoj"}},SYNCHRO:{TITLE:"Statistikoj pri sinkronigoj",COUNT:{TITLE:"Kvanto sinkronigita",INSERTS:"Enmetoj",UPDATES:"Ĝisdatigoj",DELETES:"Forigoj"},PEER:{TITLE:"Nodoj informpetitaj",ES_USER_API:"Nodoj pri datenoj de uzantoj",ES_SUBSCRIPTION_API:"Nodoj pri retaj servoj"},PERFORMANCE:{TITLE:"Efikecoj pri efektiviĝo",DURATION:"Tempo por efektiviĝo (ms)"}}}}),e.translations("es-ES",{NETWORK:{VIEW:{BTN_GRAPH:"Estadística"}},GRAPH:{COMMON:{LINEAR_SCALE:"Escala lineal",LOGARITHMIC_SCALE:"Escala logarítmica",BTN_SHOW_STATS:"Ver estadísticas",BTN_SHOW_DETAILED_STATS:"Estadísticas detalladas",RANGE_DURATION_DIVIDER:"Unidad de tiempo:",RANGE_DURATION:{HOUR:"Agrupar por <b>horas</b>",DAY:"Agrupar por <b>días</b>",MONTH:"Agrupar por <b>meses</b>"}},PEER:{VIEW:{BLOCK_COUNT_LABEL:"Número de bloques calculados",BLOCK_COUNT:"{{count}} bloques",NO_BLOCK:"Ningún bloque"}}}}),e.translations("fr-FR",{NETWORK:{VIEW:{BTN_GRAPH:"Statistiques"}},GRAPH:{COMMON:{LINEAR_SCALE:"Echelle linéaire",LOGARITHMIC_SCALE:"Echelle logarithmique",BTN_SHOW_STATS:"Voir les statistiques",BTN_SHOW_DETAILED_STATS:"Statistiques détaillées",RANGE_DURATION_DIVIDER:"Unité de temps :",RANGE_DURATION:{HOUR:"Heure",DAY:"Jour",MONTH:"Mois"}},PEER:{VIEW:{BLOCK_COUNT_LABEL:"Nombre de blocs calculés",BLOCK_COUNT:"{{count}} blocs",NO_BLOCK:"Aucun bloc"}},DOC_STATS:{TITLE:"Statistiques de stockage",MARKET:{TITLE:"Nombre d'annonces",AD:"Annonces",COMMENT:"Commentaires"},MARKET_DELTA:{TITLE:"Variation du nombre d'annonces",AD:"Annonces",COMMENT:"Commentaires"},USER:{TITLE:"Nombre de documents liés à un compte",USER_PROFILE:"Profils utilisateur",USER_SETTINGS:"Paramètres sauvegardés"},USER_DELTA:{TITLE:"Variation du nombre de documents liés à un compte",USER_PROFILE:"Profils utilisateur",USER_SETTINGS:"Paramètres sauvegardés"},MESSAGE:{TITLE:"Nombre de documents liés à la communication",MESSAGE_INBOX:"Messages en boîte de réception",MESSAGE_OUTBOX:"Messages envoyés sauvegardés",INVITATION_CERTIFICATION:"Invitations à certifier"},SOCIAL:{TITLE:"Nombre de pages ou groupes",PAGE_COMMENT:"Commentaires",PAGE_RECORD:"Pages",GROUP_RECORD:"Groupes"},SUBSCRIPTION:{TITLE:"Nombre d'abonnements",EMAIL:"Notifications emails"},OTHER:{TITLE:"Autres documents",HISTORY_DELETE:"Suppressions de documents"}},SYNCHRO:{TITLE:"Statistiques de synchronisations",COUNT:{TITLE:"Volume synchronisé",INSERTS:"Insertions",UPDATES:"Mises à jour",DELETES:"Suppressions"},PEER:{TITLE:"Noeuds requêtés",ES_USER_API:"Noeuds données utilisateurs",ES_SUBSCRIPTION_API:"Noeuds services en ligne"},PERFORMANCE:{TITLE:"Performances d'exécution",DURATION:"Temps d'exécution (ms)"}}}}),e.translations("it-IT",{NETWORK:{VIEW:{BTN_GRAPH:"Statistiche"}},GRAPH:{COMMON:{LINEAR_SCALE:"Scala lineare",LOGARITHMIC_SCALE:"Scala logaritmica",BTN_SHOW_STATS:"Vedere le statistiche",BTN_SHOW_DETAILED_STATS:"Statistiche dettagliate",RANGE_DURATION_DIVIDER:"Unità di tempo :",RANGE_DURATION:{HOUR:"Ora",DAY:"Giorno",MONTH:"Mese"}},PEER:{VIEW:{BLOCK_COUNT_LABEL:"Numero di blocchi calcolati",BLOCK_COUNT:"{{count}} blocchi",NO_BLOCK:"Nessun blocco"}},DOC_STATS:{TITLE:"Statistiche di stoccaggio",USER:{TITLE:"Numero di documenti legati ad un conto",USER_PROFILE:"Profili dell'utente",USER_SETTINGS:"Impostazioni salvate"},MESSAGE:{TITLE:"Numero di documenti legati alla conversazione",MESSAGE_INBOX:"Messaggi in arrivo",MESSAGE_OUTBOX:"Messaggi inviati salvati",INVITATION_CERTIFICATION:"Invitazioni da certificare"},SOCIAL:{TITLE:"Numero di pagine o gruppi",PAGE_COMMENT:"Commenti",PAGE_RECORD:"Pagine",GROUP_RECORD:"Gruppi"},OTHER:{TITLE:"Altri documenti",HISTORY_DELETE:"Cronologia eliminazione documenti"}},SYNCHRO:{TITLE:"Statistiche di sincronizzazioni",COUNT:{TITLE:"Volume sincronizzato",INSERTS:"Inserimenti",UPDATES:"Aggiornamenti",DELETES:"Eliminazioni"},PEER:{TITLE:"Nodi interrogati",ES_USER_API:"Nodi dati utenti",ES_SUBSCRIPTION_API:"Noeuds servizi online"},PERFORMANCE:{TITLE:"Prestazioni (performance) di esecuzione",DURATION:"Tempo di esecuzione (ms)"}}}}),e.translations("nl-NL",{NETWORK:{VIEW:{BTN_GRAPH:"Statistieken"}},GRAPH:{COMMON:{LINEAR_SCALE:"Lineaire schaal",LOGARITHMIC_SCALE:"Logaritmische schaal",BTN_SHOW_STATS:"Zie statistieken",BTN_SHOW_DETAILED_STATS:"Gedetailleerde statistieken",RANGE_DURATION_DIVIDER:"Stap eenheid:",RANGE_DURATION:{HOUR:"Groep per <b>uur</b>",DAY:"Groep per <b>dag</b>",MONTH:"Groep per <b>maand</b>"}}}}),e.translations("en-GB",{MAP:{COMMON:{SEARCH_DOTS:"Search...",BTN_SHOW_ON_MAP:"SHow on map",CHOOSE_FILE:"Drop a file (svg, geojson)<br/>or click to select"},SHAPE:{EDIT:{TITLE:"Country map",COUNTRY_DOTS:"Country:",COUNTRY_HELP:"Country code (ISO2)",CONFIG_FORM_DIVIDER:"Configuration :",ERROR_DIVIDER:"Detected errors :",LEFT_LNG:"West",RIGHT_LNG:"East",TOP_LAT:"North",BOTTOM_LAT:"South",SCALE:"Scale",TRANSLATE_X:"Translate X",TRANSLATE_Y:"Translate Y",AREA_FORM_DIVIDER:"Area edit:",ID:"Unique identifier",NAME:"Label",POSITION_DOTS:"Position:",ORDER:"Sort order",BTN_APPLY:"Apply",BTN_DELETE:"Delete the area",CUSTOM_PROJECTION:"Manually set projection settings",BTN_TEST_SEARCH:"Test a search on this area",STRICT_MODE:"Compatible with OCG (hand right rule)",REMOVE_HOLE:"Remove holes inside polygons",APPLY_ROUND:"Round to precision:",DEGREES_PRECISION:"Precision (decimal degrees)",INFO:{SAVED:"The map has been saved"},ERROR:{INVALID_SVG:"Bad SVG format.",INVALID_COUNTRY_CODE:"Country code (need ISO2, in lower case)",SAVE_FAILED:"Error while saving map",SELF_INTERSECTION:"Self-intersection in polygon <b>{{id}}</b>",HOLE_LIES_OUTSIDE:"Hole lies outside shell <b>{{id}}</b>",HOLE_NOT_WITHIN_POLYGON:"Invalid hole (not within polygon) <b>{{id}}</b>"}}},WOT:{LOOKUP:{BTN_MAP:"Map",BTN_MAP_HELP:"Open map"},VIEW:{TITLE:"Members map",LAYER:{MEMBER:"Members",PENDING:"Pending registrations",WALLET:"Simple wallets"}}},PROFILE:{MARKER_HELP:"<b>Drag and drop</b> this marker to <b>update<br/>your position</b>, or use the buttons<br/>on top of the map."},ERROR:{LOCALIZE_ME_FAILED:"Unable to retrieve your current position"}}}),e.translations("en",{MAP:{COMMON:{SEARCH_DOTS:"Search...",BTN_SHOW_ON_MAP:"SHow on map",CHOOSE_FILE:"Drop a file (svg, geojson)<br/>or click to select"},SHAPE:{EDIT:{TITLE:"Country map",COUNTRY_DOTS:"Country:",COUNTRY_HELP:"Country code (ISO2)",CONFIG_FORM_DIVIDER:"Configuration :",ERROR_DIVIDER:"Detected errors :",LEFT_LNG:"West",RIGHT_LNG:"East",TOP_LAT:"North",BOTTOM_LAT:"South",SCALE:"Scale",TRANSLATE_X:"Translate X",TRANSLATE_Y:"Translate Y",AREA_FORM_DIVIDER:"Area edit:",ID:"Unique identifier",NAME:"Label",POSITION_DOTS:"Position:",ORDER:"Sort order",BTN_APPLY:"Apply",BTN_DELETE:"Delete the area",CUSTOM_PROJECTION:"Manually set projection settings",BTN_TEST_SEARCH:"Test a search on this area",STRICT_MODE:"Compatible with OCG (hand right rule)",REMOVE_HOLE:"Remove holes inside polygons",APPLY_ROUND:"Round to precision:",DEGREES_PRECISION:"Precision (decimal degrees)",INFO:{SAVED:"The map has been saved"},ERROR:{INVALID_SVG:"Bad SVG format.",INVALID_COUNTRY_CODE:"Country code (need ISO2, in lower case)",SAVE_FAILED:"Error while saving map",SELF_INTERSECTION:"Self-intersection in polygon <b>{{id}}</b>",HOLE_LIES_OUTSIDE:"Hole lies outside shell <b>{{id}}</b>",HOLE_NOT_WITHIN_POLYGON:"Invalid hole (not within polygon) <b>{{id}}</b>"}}},WOT:{LOOKUP:{BTN_MAP:"Map",BTN_MAP_HELP:"Open map"},VIEW:{TITLE:"Members map",LAYER:{MEMBER:"Members",PENDING:"Pending registrations",WALLET:"Simple wallets"}}},PROFILE:{MARKER_HELP:"<b>Drag and drop</b> this marker to <b>update<br/>your position</b>, or use the buttons<br/>on top of the map."},ERROR:{LOCALIZE_ME_FAILED:"Unable to retrieve your current position"}}}),e.translations("eo-EO",{MAP:{COMMON:{SEARCH_DOTS:"Traserĉi...",BTN_SHOW_ON_MAP:"Vidi surmape",BTN_LOCALIZE_ME:"Lokalizi min",BTN_MOVE_DOWN:"Movi malsupren",BTN_MOVE_UP:"Movi supren",BTN_MOVE_LEFT:"Movi maldekstren",BTN_MOVE_RIGHT:"Movi dekstren",CHOOSE_FILE:"Ŝovmetu vian dosieron (svg, geojson)<br/>aŭ klaku por elekti ĝin"},SHAPE:{EDIT:{TITLE:"Landaj mapoj",COUNTRY_DOTS:"Lando:",COUNTRY_HELP:"Lando-kodo (ISO2)",CONFIG_FORM_DIVIDER:"Agordo:",ERROR_DIVIDER:"Eraroj eltrovitaj:",LEFT_LNG:"Okcidento",RIGHT_LNG:"Oriento",TOP_LAT:"Nordo",BOTTOM_LAT:"Sudo",SCALE:"Skalo",TRANSLATE_X:"X-delokiĝo",TRANSLATE_Y:"Y-delokiĝo",AREA_FORM_DIVIDER:"Eldono de la zono:",ID:"Unika identigilo",NAME:"Nomo",POSITION_DOTS:"Pozicio:",ORDER:"Ordigo-senco",BTN_APPLY:"Apliki",BTN_DELETE:"Forigi la zonon",CUSTOM_PROJECTION:"Mana tajpado de la projekci-parametroj",BTN_TEST_SEARCH:"Testi serĉadon sur tiu ĉi zono",STRICT_MODE:"OCG-kongrueco (regulo de dekstra mano)",REMOVE_HOLE:"Forigi la truojn interne de la poligonoj",APPLY_ROUND:"Rondigi ĝis la precizeco:",DEGREES_PRECISION:"Precizeco (decimalaj gradoj)",INFO:{SAVED:"La mapo estis bone konservita"},ERROR:{INVALID_SVG:"SVG-Formato neĝusta",INVALID_COUNTRY_CODE:"Lando-kodo neĝusta (ISO2 atendata, minuskle)",SAVE_FAILED:"Eraro dum la konservado de la mapo",SELF_INTERSECTION:"Mem-interkruciĝo en la poligono <b>{{id}}</b>",HOLE_LIES_OUTSIDE:"La truo troviĝas ekter la poligono <b>{{id}}</b>",HOLE_NOT_WITHIN_POLYGON:"Truo nevalida (ne en poligono) <b>{{id}}</b>"}}},WOT:{LOOKUP:{BTN_MAP:"Mapo",BTN_MAP_HELP:"Malfermi la mapon pri membroj"},VIEW:{TITLE:"Mapo pri membroj",LAYER:{MEMBER:"Membroj",PENDING:"Aliĝoj atendantaj",WALLET:"Simplaj monujoj"}}},PROFILE:{MARKER_HELP:"<b>Ŝovu-demetu</b> tiun ĉi markilon por <b>aktualigi<br/> vian lokon</b> sur la mapo, aŭ uzu la serĉo-butonon<br/>super la mapo."},ERROR:{LOCALIZE_ME_FAILED:"Neeblas ricevi vian nunan lokon"}}}),e.translations("fr-FR",{MAP:{COMMON:{SEARCH_DOTS:"Rechercher...",BTN_SHOW_ON_MAP:"Voir sur la carte",BTN_LOCALIZE_ME:"Me localiser",BTN_MOVE_DOWN:"Déplacer vers le bas",BTN_MOVE_UP:"Déplacer vers le haut",BTN_MOVE_LEFT:"Déplacer vers la gauche",BTN_MOVE_RIGHT:"Déplacer vers la droite",CHOOSE_FILE:"Déposez votre fichier (svg, geojson)<br/>ou cliquez pour le sélectionner"},SHAPE:{EDIT:{TITLE:"Cartes des pays",COUNTRY_DOTS:"Pays :",COUNTRY_HELP:"Code pays (ISO2)",CONFIG_FORM_DIVIDER:"Configuration :",ERROR_DIVIDER:"Erreurs dectectées :",LEFT_LNG:"Ouest",RIGHT_LNG:"Est",TOP_LAT:"Nord",BOTTOM_LAT:"Sud",SCALE:"Echelle",TRANSLATE_X:"Décalage X",TRANSLATE_Y:"Décalage Y",AREA_FORM_DIVIDER:"Edition de la zone :",ID:"Identifiant unique",NAME:"Libellé",POSITION_DOTS:"Position :",ORDER:"Ordre de tri",BTN_APPLY:"Appliquer",BTN_DELETE:"Supprimer la zone",CUSTOM_PROJECTION:"Saisie manuelle des paramètres de projection",BTN_TEST_SEARCH:"Tester une recherche sur cette zone",STRICT_MODE:"Compatibilité OCG (right-hand rule)",REMOVE_HOLE:"Supprimer les trous intérieurs aux polygones",APPLY_ROUND:"Arrondir à la précision :",DEGREES_PRECISION:"Précision (degrés décimaux)",INFO:{SAVED:"La carte a bien été sauvegardée"},ERROR:{INVALID_SVG:"Format SVG incorrect",INVALID_COUNTRY_CODE:"Code pays incorrect (ISO2 attendu, en minuscule)",SAVE_FAILED:"Erreur lors de la sauvegarde de la carte",SELF_INTERSECTION:"Auto-intersection dans le polygone <b>{{id}}</b>",HOLE_LIES_OUTSIDE:"Le trou se trouve à l'extérieur du polygone <b>{{id}}</b>",HOLE_NOT_WITHIN_POLYGON:"Trou invalide (pas dans un polygone) <b>{{id}}</b>"}}},WOT:{LOOKUP:{BTN_MAP:"Carte",BTN_MAP_HELP:"Ouvrir la carte des membres"},VIEW:{TITLE:"Carte des membres",LAYER:{MEMBER:"Membres",PENDING:"Inscriptions en attente",WALLET:"Simples portefeuilles"}}},PROFILE:{MARKER_HELP:"<b>Glissez-déposez</b> ce marqueur pour <b>mettre<br/>à jour votre position</b>, ou utilisez les boutons<br/>au dessus de la carte."},ERROR:{LOCALIZE_ME_FAILED:"Impossible de récupérer votre position actuelle"}}}),e.translations("en-GB",{MENU:{MARKET:"Ads",MY_RECORDS:"My ads"},MARKET:{COMMON:{PRICE:"Price",BTN_NEW_AD:"New ad",SOLD:"Close ad",LAST_UPDATE:"Last update",AROUND_ME:"Around me",CROWDFUNDING_PROGRESS:"{{pct|formatInteger}}% funded",FREE:"Free",FREE_PRICE:"Free price"},JOIN:{PROFILE:{WARNING:"You now have to complete your user profile.<br/><br/>This is <b>public information</b>, accessible to everyone.",TITLE:"Lastname, Firstname",TITLE_HELP:"Lastname, Firstname or pseudonym",DESCRIPTION:"Abut me",DESCRIPTION_HELP:"Say something about you..."},SUBSCRIPTION:{EMAIL:"Email",EMAIL_HELP:"Email (optional)"},LAST_SLIDE_CONGRATULATION:"You have entered all necessary information: Congratulations!<br/>You can now <b>send the creation request </b>.<br/><br/>For information, the public key below will identify your future account:",CONFIRMATION_WALLET_ACCOUNT:'<b class="assertive">Warning:</b> The identifier and the password can not be changed.<br/><br/>You should <b>always remember it!</b><br/><br/><b>Are you sure</b> you want to continue with these credentials?'},PROFILE:{DEFAULT_TITLE:"User {{pubkey|formatPubkey}}",IDENTITY_RECORDS_TITLE:"User ads"},LOGIN:{HELP:"Please fill your account credentials:",REMEMBER_ME:"Remember me?"},EVENT_LOGIN:{TITLE:"Contact information",HELP:"Please indicate a <b>email or phone number</b>, so that we can contact you during the event:",EMAIL_OR_PHONE:"Email or phone number",EMAIL_OR_PHONE_HELP:"Email or phone number",REMEMBER_ME:"Remember me?",ERROR:{INVALID_USERNAME:"Email or phone number invalid"}},HOME:{BTN_NEW_AD:"Place an ad",BTN_SHOW_MARKET_OFFER:"Explore Ads",LOCATION_LABEL:"Find ads near by:",LOCATION_HELP:"City, Country",ERROR:{GEO_LOCATION_NOT_FOUND:"City or zip code not found"}},CATEGORY:{ALL:"All categories",UNKNOWN:"Unlnown category",EDIT:{TITLE:"Categories management",ID:"Identifier",NAME:"Name",ROOT_CATEGORIES:"Root categories",BTN_ADD:"Add",BTN_REORDER:"Reorder",POPUP:{TITLE_EDIT:"Edit the category",TITLE_NEW:"New category"},CONFIRM:{CANCEL:"Some changes has not been saved.<br/><br/><b>Are you sure</b> you want to continue this operation?"},INFO:{SAVED:"Categories successfully saved"},ERROR:{CANNOT_SAVE:"Erreur lors de la sauvegarde des categories",INVALID_ID_PATTERN:"Format 'catNNN' not respected",ID_ALREADY_USED:"Identifier already in use"}}},SEARCH:{TITLE:"Market",CATEGORY:"Category: ",SEARCH_HELP:"Search (car, sweat...)",BY:"by",BTN_ADD:"New",BTN_CATEGORIES:"Categories",BTN_OPTIONS:"Advanced search",BTN_AROUND_ME:"Around me",GEO_DISTANCE:"Maximum distance around the city",GEO_DISTANCE_OPTION:"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}",SHOW_MORE:"Show more",SHOW_MORE_COUNT:"(current limit to {{limit}})",LOCATION:"City",LOCATION_HELP:"City, Country",RESULTS:"Results",RESULT_COUNT_LOCATION:"{{count}} result{{count>0?'s':''}}, near {{location}}",RESULT_COUNT:"{{count}} result{{count>0?'s':''}}",LAST_RECORDS:"Recent ads:",LAST_RECORD_COUNT_LOCATION:"{{count}} recent ad{{count>0?'s':''}}, near {{location}}",LAST_RECORD_COUNT:"{{count}} recent ad{{count>0?'s':''}}",BTN_LAST_RECORDS:"Recent ads",BTN_SHOW_CATEGORIES:"Show categories",BTN_OFFERS:"Offers",BTN_CROWDFUNDING:"Crowdfunding",BTN_FAVORITES:"Favorites",BTN_AUCTION:"Auction",BTN_NEEDS:"Needs",SHOW_CLOSED_RECORD:"Display closed ads?",SHOW_OLD_RECORD:"Display old ads?",RECORD_STOCK:"Stock:",SORT:{PREFIX:"Sort: ",DATE:"Date",PRICE:"Price",DATE_ASC:"Older",DATE_DESC:"Most recent",PRICE_ASC:"Increasing prices",PRICE_DESC:"Descending prices"}},GALLERY:{TITLE:"Slideshow",BTN_START:"Start",BTN_CONTINUE:"Resume",BTN_PAUSE:"Pause",BTN_STOP:"Stop",SLIDE_DURATION:"Display time:",AD_TYPE:"Ad type:",ALL_AD_TYPES:"All",SLIDE_DURATION_OPTION:"{{value}} seconds"},VIEW:{TITLE:"Ad",BTN_SOLD_AD:"Close the ad",BTN_SOLD:"Close",BTN_REOPEN:"Reopen the ad",BTN_WRITE:"Write a message",BTN_FOLLOW:"Follow this ad",BTN_STOP_FOLLOW:"Stop following this ad",BTN_PAYMENT_HELP:"How to make a payment?",MENU_TITLE:"Options",RECORD_FEES_PARENTHESIS:"(fees)",RECORD_STOCK:"Available stock:",POPOVER_SHARE_TITLE:"Ad {{title}}",REMOVE_CONFIRMATION:"Are you sure you want to delete this ad?<br/><br/> This is irreversible.",SOLD_CONFIRMATION:"<b>Are you sure</b> you want to close this ad?",REOPEN_CONFIRMATION:"<b>Are you sure</b> you want to repoen this ad?",NEW_MESSAGE_TITLE:'About your ad "{{title}}"...',MORE_LIKE_THIS:"This might interest you:",PAYMENT:'<b> To make a payment </b>, send {{currency | abbreviate}}:<ul><li> - to the public key <a class="positive" copy-on-click="{{pubkeyWithChecksum || pubkey}} "title="Copy key">{{pubkey}}</a></li></p>',PAYMENT_WITH_COMMENT:'<b> To make a payment </b>, send {{currency | abbreviate}}:<ul><li> - to the public key <a class="positive" copy-on-click="{{pubkeyWithChecksum || pubkey}} "title="Copy key">{{pubkey}}</a></li>- with the comment <a class="positive" copy-on-click="{{comment}}" title="Copy the comment">{{comment}}</a> for monitoring.</li></p>',CROWDFUNDING_ISSUERS:"{{issuers.length}} donor{{issuers.length > 1 ? 's' : ''}}",SHOW_CROWDFUNDING_ISSUERS:"Show donors"},WALLET:{DUNITER_PUBKEY:"Public key to receive payments",DUNITER_ACCOUNT:"Receipt of payments in {{currency|currencySymbol}}",DUNITER_ACCOUNT_HELP:"The public key (above) indicates the destination of the payments you will receive.",DUNITER_ACCOUNT_NO_PUBKEY_HELP:"No public account key has been entered. You will need to give it to prospective buyers.<br/>You can enter it at any time, <b>by editing your profile</b>."},TYPE:{TITLE:"New ad",SELECT_TYPE:"Kind of ad:",OFFER:"Offer",OFFER_SHORT:"Offer",CROWDFUNDING:"Crowdfunding",CROWDFUNDING_SHORT:"Crowdfunding",NEED:"Need",NEED_SHORT:"Need",AUCTION:"Auction",AUCTION_SHORT:"Auction"},LOCAL_SALE:{LOCATION:"Stand number",LOCATION_HELP:"Stand number: 1, 2, ...",LOCATION_PREFIX:"Stand #"},EDIT:{TITLE:"Edit",RECORD_TITLE:"Title",RECORD_TITLE_HELP:"Title",RECORD_DESCRIPTION:"Description",RECORD_DESCRIPTION_HELP:"Description",RECORD_LOCATION:"Address",RECORD_LOCATION_HELP:"City, Country",RECORD_PRICE:"Price",RECORD_PRICE_HELP:"Price (optional)",FREE_PRICE:"Free price ?",RECORD_CURRENCY:"Currency",RECORD_FEES:"Fees",RECORD_FEES_HELP:"Fees (optional)",RECORD_STOCK:"Available stock",RECORD_STOCK_HELP:"Available stock",AUCTION:{TITLE_NEW:"New auction",START_PRICE_HELP:"Starting price (optional)"},OFFER:{TITLE_NEW:"New ad"},NEED:{TITLE_NEW:"Nouvelle demande",MAX_PRICE_HELP:"Prix maximum (optionnel)"},CROWDFUNDING:{TITLE_NEW:"New crowdfunding campaign",TITLE_HELP:"Campaign title",DESCRIPTION_HELP:"Description: Describe your project here",PRICE_HELP:"Expected amount"},WARNING:{NO_GEO_POINT:"Your ad <b>will not be visible</b> in spatial searches."}},WOT:{VIEW:{BTN_RECORDS:"Ads",DUNITER_PUBKEY:"Public key to receive payments",DUNITER_ACCOUNT:"Receipt of payments in {{currency|currencySymbol}}",DUNITER_ACCOUNT_HELP:"The public key (above) is the account to be used to pay for this user.",DUNITER_ACCOUNT_HELP_ASK_USER:'This user has not communicated their account public key. <a ng-click="showNewMessageModal()">Contact him</a> to get it.'},ERROR:{FAILED_STAR_PROFILE:"Error sending your rate. Please try again later."}},PAYMENT:{MODAL:{TITLE:"Make a payment",SOFTWARE_HELP:'Don\'t know <b> how to send {{currency | abbreviate}}?</b><ul><li> - <a ng-click="openHelpSite($event)"> Consult the user forum;</a><li> - Install compatible software: <a ng-click="openLink($event,\'https://cesium.app\')"> Cesium </a> (Linux, Windows, Mac), Silkaj (Linux) or Sakia (Linux).</li>',PAYMENT_LINK_HELP:"Payment links (bêta) :"}},ERROR:{INVALID_LOGIN_CREDENTIALS:"Invalid credentials.<br/>Please try again.",FAILED_SAVE_RECORD:"Saving ad failed",FAILED_UPDATE_RECORD:"Updating Ad failed",LOAD_CATEGORY_FAILED:"Loading categories failed",LOOKUP_RECORDS_FAILED:"Error while loading records.",LOAD_RECORD_FAILED:"Loading ad failed",REMOVE_RECORD_FAILED:"Deleting ad failed",SOLD_RECORD_FAILED:"Error while closing the ad",REOPEN_RECORD_FAILED:"Error while reopening the ad",FAILED_SAVE_COMMENT:"Saving comment failed",FAILED_REMOVE_COMMENT:"Deleting comment failed",RECORD_NOT_EXISTS:"Ad not found",RECORD_EXCEED_UPLOAD_SIZE:"It seems that your <b> ad is too big </ b> to be accepted by the data node.<br/><br/>You can delete <b>delete photos</b> again.",GEO_LOCATION_NOT_FOUND:"City or zip code not found"},INFO:{RECORD_REMOVED:"Ad successfully deleted",RECORD_SOLD:"Ad closed",RECORD_REOPEN:"Ad reopen"}},EVENT:{MARKET:{NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> has commented on your ad: <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> has modified his/her comment on your ad: <b>{{params[2]}}</b>',NEW_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> has replied to your comment on the ad: <b>{{params[2]}}</b>',UPDATE_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> has modified his/her answer to your comment on the ad: <b>{{params[2]}}</b>',FOLLOW_NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> has commented on the ad: <b>{{params[2]}}</b>',FOLLOW_UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> has modified his/her comment on the ad: <b>{{params[2]}}</b>',FOLLOW_NEW:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> added the ad: <b>{{params[2]}}</b>',FOLLOW_UPDATE:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> updated the ad: <b>{{params[2]}}</b>',FOLLOW_CLOSE:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> sold the ad: <b>{{params[2]}}</b>',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> asks for moderation on the ad: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> posted an ad to moderate: <b>{{params[2]}}</b>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span>reported abuse on your ad: <b>{{params[2]}}</b>',LIKE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> liked your ad: <b>{{params[2]}}</b>',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> follows your ad: <b>{{params[2]}}</b>'}}}),e.translations("en",{MENU:{MARKET:"Ads",MY_RECORDS:"My ads"},MARKET:{COMMON:{PRICE:"Price",BTN_NEW_AD:"New ad",SOLD:"Close ad",LAST_UPDATE:"Last update",AROUND_ME:"Around me",CROWDFUNDING_PROGRESS:"{{pct|formatInteger}}% funded",FREE:"Free",FREE_PRICE:"Free price"},JOIN:{PROFILE:{WARNING:"You now have to complete your user profile.<br/><br/>This is <b>public information</b>, accessible to everyone.",TITLE:"Lastname, Firstname",TITLE_HELP:"Lastname, Firstname or pseudonym",DESCRIPTION:"Abut me",DESCRIPTION_HELP:"Say something about you..."},SUBSCRIPTION:{EMAIL:"Email",EMAIL_HELP:"Email (optional)"},LAST_SLIDE_CONGRATULATION:"You have entered all necessary information: Congratulations!<br/>You can now <b>send the creation request </b>.<br/><br/>For information, the public key below will identify your future account:",CONFIRMATION_WALLET_ACCOUNT:'<b class="assertive">Warning:</b> The identifier and the password can not be changed.<br/><br/>You should <b>always remember it!</b><br/><br/><b>Are you sure</b> you want to continue with these credentials?'},PROFILE:{DEFAULT_TITLE:"User {{pubkey|formatPubkey}}",IDENTITY_RECORDS_TITLE:"User ads"},LOGIN:{HELP:"Please fill your account credentials:",REMEMBER_ME:"Remember me?"},EVENT_LOGIN:{TITLE:"Contact information",HELP:"Please indicate a <b>email or phone number</b>, so that we can contact you during the event:",EMAIL_OR_PHONE:"Email or phone number",EMAIL_OR_PHONE_HELP:"Email or phone number",REMEMBER_ME:"Remember me?",ERROR:{INVALID_USERNAME:"Email or phone number invalid"}},HOME:{BTN_NEW_AD:"Place an ad",BTN_SHOW_MARKET_OFFER:"Explore Ads",LOCATION_LABEL:"Find ads near by:",LOCATION_HELP:"City, Country",ERROR:{GEO_LOCATION_NOT_FOUND:"City or zip code not found"}},CATEGORY:{ALL:"All categories",UNKNOWN:"Unlnown category",EDIT:{TITLE:"Categories management",ID:"Identifier",NAME:"Name",ROOT_CATEGORIES:"Root categories",BTN_ADD:"Add",BTN_REORDER:"Reorder",POPUP:{TITLE_EDIT:"Edit the category",TITLE_NEW:"New category"},CONFIRM:{CANCEL:"Some changes has not been saved.<br/><br/><b>Are you sure</b> you want to continue this operation?"},INFO:{SAVED:"Categories successfully saved"},ERROR:{CANNOT_SAVE:"Erreur lors de la sauvegarde des categories",INVALID_ID_PATTERN:"Format 'catNNN' not respected",ID_ALREADY_USED:"Identifier already in use"}}},SEARCH:{TITLE:"Market",CATEGORY:"Category: ",SEARCH_HELP:"Search (car, sweat...)",BY:"by",BTN_ADD:"New",BTN_CATEGORIES:"Categories",BTN_OPTIONS:"Advanced search",BTN_AROUND_ME:"Around me",GEO_DISTANCE:"Maximum distance around the city",GEO_DISTANCE_OPTION:"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}",SHOW_MORE:"Show more",SHOW_MORE_COUNT:"(current limit to {{limit}})",LOCATION:"City",LOCATION_HELP:"City, Country",RESULTS:"Results",RESULT_COUNT_LOCATION:"{{count}} result{{count>0?'s':''}}, near {{location}}",RESULT_COUNT:"{{count}} result{{count>0?'s':''}}",LAST_RECORDS:"Recent ads:",LAST_RECORD_COUNT_LOCATION:"{{count}} recent ad{{count>0?'s':''}}, near {{location}}",LAST_RECORD_COUNT:"{{count}} recent ad{{count>0?'s':''}}",BTN_LAST_RECORDS:"Recent ads",BTN_SHOW_CATEGORIES:"Show categories",BTN_OFFERS:"Offers",BTN_CROWDFUNDING:"Crowdfunding",BTN_FAVORITES:"Favorites",BTN_AUCTION:"Auction",BTN_NEEDS:"Needs",SHOW_CLOSED_RECORD:"Display closed ads?",SHOW_OLD_RECORD:"Display old ads?",RECORD_STOCK:"Stock:",SORT:{PREFIX:"Sort: ",DATE:"Date",PRICE:"Price",DATE_ASC:"Older",DATE_DESC:"Most recent",PRICE_ASC:"Increasing prices",PRICE_DESC:"Descending prices"}},GALLERY:{TITLE:"Slideshow",BTN_START:"Start",BTN_CONTINUE:"Resume",BTN_PAUSE:"Pause",BTN_STOP:"Stop",SLIDE_DURATION:"Display time:",AD_TYPE:"Ad type:",ALL_AD_TYPES:"All",SLIDE_DURATION_OPTION:"{{value}} seconds"},VIEW:{TITLE:"Ad",BTN_SOLD_AD:"Close the ad",BTN_SOLD:"Close",BTN_REOPEN:"Reopen the ad",BTN_WRITE:"Write a message",BTN_FOLLOW:"Follow this ad",BTN_STOP_FOLLOW:"Stop following this ad",BTN_PAYMENT_HELP:"How to make a payment?",MENU_TITLE:"Options",RECORD_FEES_PARENTHESIS:"(fees)",RECORD_STOCK:"Available stock:",POPOVER_SHARE_TITLE:"Ad {{title}}",REMOVE_CONFIRMATION:"Are you sure you want to delete this ad?<br/><br/> This is irreversible.",SOLD_CONFIRMATION:"<b>Are you sure</b> you want to close this ad?",REOPEN_CONFIRMATION:"<b>Are you sure</b> you want to repoen this ad?",NEW_MESSAGE_TITLE:'About your ad "{{title}}"...',MORE_LIKE_THIS:"This might interest you:",PAYMENT:'<b> To make a payment </b>, send {{currency | abbreviate}}:<ul><li> - to the public key <a class="positive" copy-on-click="{{pubkeyWithChecksum || pubkey}} "title="Copy key">{{pubkey}}</a></li></p>',PAYMENT_WITH_COMMENT:'<b> To make a payment </b>, send {{currency | abbreviate}}:<ul><li> - to the public key <a class="positive" copy-on-click="{{pubkeyWithChecksum || pubkey}} "title="Copy key">{{pubkey}}</a></li>- with the comment <a class="positive" copy-on-click="{{comment}}" title="Copy the comment">{{comment}}</a> for monitoring.</li></p>',CROWDFUNDING_ISSUERS:"{{issuers.length}} donor{{issuers.length > 1 ? 's' : ''}}",SHOW_CROWDFUNDING_ISSUERS:"Show donors"},WALLET:{DUNITER_PUBKEY:"Public key to receive payments",DUNITER_ACCOUNT:"Receipt of payments in {{currency|currencySymbol}}",DUNITER_ACCOUNT_HELP:"The public key (above) indicates the destination of the payments you will receive.",DUNITER_ACCOUNT_NO_PUBKEY_HELP:"No public account key has been entered. You will need to give it to prospective buyers.<br/>You can enter it at any time, <b>by editing your profile</b>."},TYPE:{TITLE:"New ad",SELECT_TYPE:"Kind of ad:",OFFER:"Offer",OFFER_SHORT:"Offer",CROWDFUNDING:"Crowdfunding",CROWDFUNDING_SHORT:"Crowdfunding",NEED:"Need",NEED_SHORT:"Need",AUCTION:"Auction",AUCTION_SHORT:"Auction"},LOCAL_SALE:{LOCATION:"Stand number",LOCATION_HELP:"Stand number: 1, 2, ...",LOCATION_PREFIX:"Stand #"},EDIT:{TITLE:"Edit",RECORD_TITLE:"Title",RECORD_TITLE_HELP:"Title",RECORD_DESCRIPTION:"Description",RECORD_DESCRIPTION_HELP:"Description",RECORD_LOCATION:"Address",RECORD_LOCATION_HELP:"City, Country",RECORD_PRICE:"Price",RECORD_PRICE_HELP:"Price (optional)",FREE_PRICE:"Free price ?",RECORD_CURRENCY:"Currency",RECORD_FEES:"Fees",RECORD_FEES_HELP:"Fees (optional)",RECORD_STOCK:"Available stock",RECORD_STOCK_HELP:"Available stock",AUCTION:{TITLE_NEW:"New auction",START_PRICE_HELP:"Starting price (optional)"},OFFER:{TITLE_NEW:"New ad"},NEED:{TITLE_NEW:"Nouvelle demande",MAX_PRICE_HELP:"Prix maximum (optionnel)"},CROWDFUNDING:{TITLE_NEW:"New crowdfunding campaign",TITLE_HELP:"Campaign title",DESCRIPTION_HELP:"Description: Describe your project here",PRICE_HELP:"Expected amount"},WARNING:{NO_GEO_POINT:"Your ad <b>will not be visible</b> in spatial searches."}},WOT:{VIEW:{BTN_RECORDS:"Ads",DUNITER_PUBKEY:"Public key to receive payments",DUNITER_ACCOUNT:"Receipt of payments in {{currency|currencySymbol}}",DUNITER_ACCOUNT_HELP:"The public key (above) is the account to be used to pay for this user.",DUNITER_ACCOUNT_HELP_ASK_USER:'This user has not communicated their account public key. <a ng-click="showNewMessageModal()">Contact him</a> to get it.'},ERROR:{FAILED_STAR_PROFILE:"Error sending your rate. Please try again later."}},PAYMENT:{MODAL:{TITLE:"Make a payment",SOFTWARE_HELP:'Don\'t know <b> how to send {{currency | abbreviate}}?</b><ul><li> - <a ng-click="openHelpSite($event)"> Consult the user forum;</a><li> - Install compatible software: <a ng-click="openLink($event,\'https://cesium.app\')"> Cesium </a> (Linux, Windows, Mac), Silkaj (Linux) or Sakia (Linux).</li>',PAYMENT_LINK_HELP:"Payment links (bêta) :"}},ERROR:{INVALID_LOGIN_CREDENTIALS:"Invalid credentials.<br/>Please try again.",FAILED_SAVE_RECORD:"Saving ad failed",FAILED_UPDATE_RECORD:"Updating Ad failed",LOAD_CATEGORY_FAILED:"Loading categories failed",LOOKUP_RECORDS_FAILED:"Error while loading records.",LOAD_RECORD_FAILED:"Loading ad failed",REMOVE_RECORD_FAILED:"Deleting ad failed",SOLD_RECORD_FAILED:"Error while closing the ad",REOPEN_RECORD_FAILED:"Error while reopening the ad",FAILED_SAVE_COMMENT:"Saving comment failed",FAILED_REMOVE_COMMENT:"Deleting comment failed",RECORD_NOT_EXISTS:"Ad not found",RECORD_EXCEED_UPLOAD_SIZE:"It seems that your <b> ad is too big </ b> to be accepted by the data node.<br/><br/>You can delete <b>delete photos</b> again.",GEO_LOCATION_NOT_FOUND:"City or zip code not found"},INFO:{RECORD_REMOVED:"Ad successfully deleted",RECORD_SOLD:"Ad closed",RECORD_REOPEN:"Ad reopen"}},EVENT:{MARKET:{NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> has commented on your ad: <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> has modified his/her comment on your ad: <b>{{params[2]}}</b>',NEW_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> has replied to your comment on the ad: <b>{{params[2]}}</b>',UPDATE_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> has modified his/her answer to your comment on the ad: <b>{{params[2]}}</b>',FOLLOW_NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> has commented on the ad: <b>{{params[2]}}</b>',FOLLOW_UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> has modified his/her comment on the ad: <b>{{params[2]}}</b>',FOLLOW_NEW:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> added the ad: <b>{{params[2]}}</b>',FOLLOW_UPDATE:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> updated the ad: <b>{{params[2]}}</b>',FOLLOW_CLOSE:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> sold the ad: <b>{{params[2]}}</b>',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> asks for moderation on the ad: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> posted an ad to moderate: <b>{{params[2]}}</b>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span>reported abuse on your ad: <b>{{params[2]}}</b>',LIKE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> liked your ad: <b>{{params[2]}}</b>',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> follows your ad: <b>{{params[2]}}</b>'}}}),e.translations("eo-EO",{MENU:{MARKET:"Anoncoj",MY_RECORDS:"Miaj anoncoj"},MARKET:{COMMON:{PRICE:"Prezo",BTN_NEW_AD:"Mi metas anoncon",SOLD:"Anonco fermita",LAST_UPDATE:"Lasta ĝisdatigo",AROUND_ME:"Ĉirkaŭ mi",CROWDFUNDING_PROGRESS:"Financita ĝis {{pct|formatInteger}} %",FREE:"Senpaga",FREE_PRICE:"Prezo libera"},JOIN:{PROFILE:{WARNING:"Nun restas al vi kompletigi vian uzant-profilon.<br/><br/>Temas pri <b>publikaj informoj</b>, alireblaj de ĉiuj.",TITLE:"Familia nomo, Persona nomo",TITLE_HELP:"Familia nomo, Persona nomo aŭ pseŭdonimo",DESCRIPTION:"Pri mi",DESCRIPTION_HELP:"Diru ion pri vi..."},SUBSCRIPTION:{EMAIL:"Retadreso",EMAIL_HELP:"Retadreso (nedeviga)"},LAST_SLIDE_CONGRATULATION:"Vi tajpis ĉiujn necesajn informojn: Gratulon!<br/>Vi nun povas <b>sendi la peton pri kreado</b> de konto.<br/><br/>Ne forgesu viajn identigilojn, vi ne povos ŝanĝi ilin!",CONFIRMATION_WALLET_ACCOUNT:'<b class="assertive">Averto:</b> la identigilo kaj la pasvorto ne plu povos esti modifitaj.<br/><br/><b>Certiĝu, ke vi ĉiam rememoros ilin!</b><br/><br/><b>Ĉu vi certas</b>, ke vi volas daŭrigi per tiuj identigiloj?'},PROFILE:{DEFAULT_TITLE:"Uzanto {{pubkey|formatPubkey}}",IDENTITY_RECORDS_TITLE:"Uzanto-anoncoj"},LOGIN:{HELP:"Bonvolu tajpi viajn identigilojn por konektiĝi:",REMEMBER_ME:"Memori min?"},EVENT_LOGIN:{TITLE:"Kontakteblecoj",HELP:"Bonvolu indiki <b>retadreson aŭ poŝtelefon-numeron</b>, tiel ke la organizantoj povu kontakti vin dum la evento:",EMAIL_OR_PHONE:"Retadreso aŭ telefono",EMAIL_OR_PHONE_HELP:"Retadreso aŭ telefon-numero",REMEMBER_ME:"Memori min?",ERROR:{INVALID_USERNAME:"Retadreso aŭ telefon-numero nevalida"}},HOME:{BTN_NEW_AD:"Meti anoncon",BTN_SHOW_MARKET_OFFER:"Vidi la anoncojn",LOCATION_LABEL:"Serĉado de anoncoj laŭ urbo:",LOCATION_HELP:"Poŝt-kodo, Urbo",ERROR:{GEO_LOCATION_NOT_FOUND:"Urbo aŭ poŝt-kodo ne trovita"}},CATEGORY:{ALL:"Ĉiuj kategorioj",UNKNOWN:"Kategorio nekonata",EDIT:{TITLE:"Mastrumado de la kategorioj",ID:"Identigilo",NAME:"Nomo",ROOT_CATEGORIES:"Supraj kategorioj",BTN_ADD:"Aldoni",BTN_REORDER:"Reordigi",POPUP:{TITLE_EDIT:"Modifi la kategorion",TITLE_NEW:"Nova kategorio"},CONFIRM:{CANCEL:"Iuj modifoj ne estis registritaj.<br/><br/><b>Ĉu vi certas</b>, ke vi volas daŭrigi tiun ĉi agon?"},INFO:{SAVED:"Kategorioj sukcese registritaj"},ERROR:{CANNOT_SAVE:"Eraro dum la konservado de la kategorioj",INVALID_ID_PATTERN:"Nekonforma al la formato 'catNNN'",ID_ALREADY_USED:"Identigilo jam uzata"}}},SEARCH:{TITLE:"Anoncoj",CATEGORY:"Kategorio: ",SEARCH_HELP:"Serĉado (biciklo, ŝuoj...)",BY:"de",BTN_ADD:"Nova",BTN_CATEGORIES:"Kategorioj",BTN_OPTIONS:"Detala serĉado",BTN_AROUND_ME:"Ĉirkaŭ mi",GEO_DISTANCE:"Maksimuma distanco ĉirkaŭ la urbo:",GEO_DISTANCE_OPTION:"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}",SHOW_MORE:"Afiŝi pli",SHOW_MORE_COUNT:"(nuna limo je {{limit}})",LOCATION:"Urbo",LOCATION_HELP:"Poŝt-kodo, Urbo",RESULTS:"Rezultoj",RESULT_COUNT_LOCATION:"{{count}} rezulto{{count>0?'j':''}}, proksime de {{location}}",RESULT_COUNT:"{{count}} rezulto{{count>0?'j':''}}",LAST_RECORDS:"Lastaj anoncoj",LAST_RECORD_COUNT_LOCATION:"{{count}} freŝdata{{count>0?'j':''}} anonco{{count>0?'j':''}}, proksime de {{location}}",LAST_RECORD_COUNT:"{{count}} freŝdata{{count>0?'j':''}} anonco{{count>0?'j':''}}",BTN_LAST_RECORDS:"Lastaj anoncoj",BTN_SHOW_CATEGORIES:"Trarigardi la kategoriojn",BTN_OFFERS:"Proponoj",BTN_CROWDFUNDING:"Financadoj",BTN_FAVORITES:"Preferoj",BTN_AUCTION:"Aŭkcioj",BTN_NEEDS:"Petoj",SHOW_CLOSED_RECORD:"Afiŝi la fermitajn anoncojn?",SHOW_OLD_RECORD:"Afiŝi la malnovajn anoncojn?",RECORD_STOCK:"Stoko:",SORT:{PREFIX:"Ordigo: ",DATE:"Dato",PRICE:"Prezo",DATE_ASC:"Pli malnovaj",DATE_DESC:"Pli freŝdataj",PRICE_ASC:"Kreskantaj prezoj",PRICE_DESC:"Malkreskantaj prezoj"}},GALLERY:{TITLE:"Bildaro",BTN_START:"Komenci",BTN_CONTINUE:"Malpaŭzi",BTN_PAUSE:"Paŭzi",BTN_STOP:"Ĉesi",SLIDE_DURATION:"Afiŝo-daŭro:",AD_TYPE:"Anonco-tipo:",ALL_AD_TYPES:"Ĉiuj",SLIDE_DURATION_OPTION:"{{value}} sekundoj"},VIEW:{TITLE:"Anonco",BTN_SOLD_AD:"Fermi la anoncon",BTN_SOLD:"Fermi",BTN_REOPEN:"Reaperigi la anoncon",BTN_WRITE:"Skribi mesaĝon",BTN_FOLLOW:"Sekvi tiun ĉi anoncon",BTN_STOP_FOLLOW:"Ne plu sekvi tiun ĉi anoncon",BTN_PAYMENT_HELP:"Kiel fari pagon?",MENU_TITLE:"Kromeblecoj",RECORD_FEES_PARENTHESIS:"(kostoj)",RECORD_STOCK:"Stoko disponebla:",POPOVER_SHARE_TITLE:"Anonco {{title}}",REMOVE_CONFIRMATION:"Ĉu vi certas, ke vi volas forigi tiun ĉi anoncon?<br/><br/>Tiu ago estas neinversigebla.",SOLD_CONFIRMATION:"<b>Ĉu vi certas</b>, ke vi volas fermi tiun ĉi anoncon?",REOPEN_CONFIRMATION:"<b>Ĉu vi certas</b>, ke vi volas reaperigi tiun ĉi anoncon?",NEW_MESSAGE_TITLE:'Pri la anonco "{{title}}"...',MORE_LIKE_THIS:"Tio ĉi povus interesi vin:",PAYMENT:'<b>Por fari pagon</b>, sendi monon {{currency|abbreviate}}:<ul><li>- al la publika ŝlosilo <a class="positive" copy-on-click="{{pubkeyWithChecksum||pubkey}}" title="Kopii la ŝlosilon">{{pubkey}}</a></li></p>',PAYMENT_WITH_COMMENT:'<b>Por fari pagon</b>, sendi monon {{currency|abbreviate}}:<ul><li>- al la publika ŝlosilo <a class="positive" copy-on-click="{{pubkeyWithChecksum||pubkey}}" title="Kopii la ŝlosilon">{{pubkey}}</a></li><li> - kun la komento <a class="positive" copy-on-click="{{comment}}" title="Kopii la komenton">{{comment}}</a> por la sekvado.</li></ul></p>',CROWDFUNDING_ISSUERS:"{{issuers.length}} donacinto{{issuers.length > 1 ? 'j': ''}}",SHOW_CROWDFUNDING_ISSUERS:"Vidi la donacintojn"},WALLET:{DUNITER_PUBKEY:"Publika ŝlosilo por ricevi la pagojn",DUNITER_ACCOUNT:"Ricevo de la pagoj en {{currency|currencySymbol}}",DUNITER_ACCOUNT_HELP:"La publika ŝlosilo (ĉi-supre) indikas la celkonton de la pagoj, kiujn vi ricevos.",DUNITER_ACCOUNT_NO_PUBKEY_HELP:"Neniu publika ŝlosilo de konto estis sciigita. Vi devos doni ĝin al la eventualaj aĉetontoj.<br/>Vi povas tajpi ĝin iam ajn, <b>redaktante vian profilon</b>."},TYPE:{TITLE:"Nova anonco",SELECT_TYPE:"Tipo de anonco:",OFFER:"Propono, Vendo",OFFER_SHORT:"Propono",CROWDFUNDING:"Multpersona financado",CROWDFUNDING_SHORT:"Financado",NEED:"Peto, Serĉo",NEED_SHORT:"Peto",AUCTION:"Aŭkcia vendado",AUCTION_SHORT:"Aŭkcio"},LOCAL_SALE:{LOCATION:"Numero de budo",LOCATION_HELP:"Numero de budo: 1, 2, ...",LOCATION_PREFIX:"Budo n°"},EDIT:{TITLE:"Redaktado",RECORD_TITLE:"Titolo",RECORD_TITLE_HELP:"Titolo: biciklo, libro...",RECORD_DESCRIPTION:"Priskribo",RECORD_DESCRIPTION_HELP:"Priskribo",RECORD_LOCATION:"Urbo",RECORD_LOCATION_HELP:"Poŝt-kodo, Urbo",RECORD_PRICE:"Prezo",RECORD_PRICE_HELP:"Prezo (nedeviga)",FREE_PRICE:"Libera prezo?",RECORD_CURRENCY:"Mono",RECORD_FEES:"Sendo-kostoj",RECORD_FEES_HELP:"Kostoj (nedeviga)",RECORD_STOCK:"Stoko disponebla",RECORD_STOCK_HELP:"Stoko disponebla",AUCTION:{TITLE_NEW:"Nova aŭkcio",START_PRICE_HELP:"Komenca prezo (nedeviga)"},OFFER:{TITLE_NEW:"Nova anonco"},NEED:{TITLE_NEW:"Nova peto",MAX_PRICE_HELP:"Maksimuma prezo (nedeviga)"},CROWDFUNDING:{TITLE_NEW:"Nova financada kampanjo",TITLE_HELP:"Titolo de la kampanjo",DESCRIPTION_HELP:"Priskribo: detaligu vian projekton ĉi tie",PRICE_HELP:"Sumo dezirata"},WARNING:{NO_GEO_POINT:"Via anonco <b>ne estos videbla</b> dum la geografiaj serĉadoj."}},WOT:{VIEW:{BTN_RECORDS:"Anoncoj",DUNITER_PUBKEY:"Publika ŝlosilo por ricevi la pagojn",DUNITER_ACCOUNT:"Ricevo de la pagoj en {{currency|currencySymbol}}",DUNITER_ACCOUNT_HELP:"La publika ŝlosilo (ĉi-supre) rilatas al la konto uzota por pagi tiun ĉi anoncanton.",DUNITER_ACCOUNT_HELP_ASK_USER:'Tiu ĉi anoncanto ne sciigis la publikan ŝlosilon de sia konto. <a ng-click="showNewMessageModal()">Kontaktu lin/ŝin</a> por ekhavi ĝin.'},ERROR:{FAILED_STAR_PROFILE:"Eraro dum la sendo de via noto. Bonvolu reprovi pli poste."}},PAYMENT:{MODAL:{TITLE:"Fari pagon",SOFTWARE_HELP:'Vi ne scias <b>kiel sendi monon {{currency|abbreviate}}?</b><ul><li>- <a ng-click="openHelpSite($event)">Konsulti la forumon por uzantoj;</a><li>- Instali kongruan programon: <a ng-click="openLink($event, \'https://cesium.app/eo/\')">Cesium</a> (Linukso, Vindozo, Makintoŝo), Silkaj (Linukso) aŭ Sakia (Linukso).</li>',PAYMENT_LINK_HELP:"Ligoj por pago (provaĵo):"}},ERROR:{INVALID_LOGIN_CREDENTIALS:"Identigilo aŭ pasvorto nevalida.<br/><br/>Kontrolu, ke ili ja rilatas al konto <b>kreita ĉe ğchange</b>.",FAILED_SAVE_RECORD:"Eraro dum la registrado de la anonco",FAILED_UPDATE_RECORD:"Eraro dum la ĝisdatigo de la anonco",LOAD_CATEGORY_FAILED:"Eraro dum la ekstarigo de la kategorioj",LOOKUP_RECORDS_FAILED:"Eraro dum la disvolviĝo de la serĉado",LOAD_RECORD_FAILED:"Eraro dum la ŝarĝado de la anonco",REMOVE_RECORD_FAILED:"Eraro dum la forigo de la anonco",SOLD_RECORD_FAILED:"Eraro dum la fermo de la anonco",REOPEN_RECORD_FAILED:"Eraro dum la reaperigo de la anonco",FAILED_SAVE_COMMENT:"Eraro dum la konservo de la komento",FAILED_REMOVE_COMMENT:"Eraro dum la forigo de la komento",RECORD_NOT_EXISTS:"Anonco neekzistanta",RECORD_EXCEED_UPLOAD_SIZE:"Ŝajnas, ke via anonco <b>estas tro ampleksa</b> por esti akceptata de la daten-nodo.<br/><br/>Vi povas ekzemple <b>forigi fotojn</b>, kaj poste provi denove.",GEO_LOCATION_NOT_FOUND:"Urbo aŭ post-kodo ne trovita"},INFO:{RECORD_REMOVED:"Anonco forigita",RECORD_SOLD:"Anonco fermita",RECORD_REOPEN:"Anonco reaperigita"}},EVENT:{MARKET:{NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> komentis vian anoncon: <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> modifis sian komenton ĉe via anonco: <b>{{params[2]}}</b>',NEW_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> respondis al via komento ĉe la anonco: <b>{{params[2]}}</b>',UPDATE_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> modifis la respondon al via komento ĉe la anonco: <b>{{params[2]}}</b>',FOLLOW_NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> komentis la anoncon: <b>{{params[2]}}</b>',FOLLOW_UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> modifis sian komenton ĉe la anonco: <b>{{params[2]}}</b>',FOLLOW_NEW:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> aldonis la anoncon: <b>{{params[2]}}</b>',FOLLOW_UPDATE:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> modifis la anoncon: <b>{{params[2]}}</b>',FOLLOW_CLOSE:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> fermis la anoncon: <b>{{params[2]}}</b>',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> petas de vi moderigon ĉe la anonco: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> atentigis pri anonco moderiginda: <b>{{params[2]}}</b>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> atentigis pri via anonco: <b>{{params[2]}}</b>',LIKE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> ŝatis vian anoncon: <b>{{params[2]}}</b>',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> sekvas vian anoncon: <b>{{params[2]}}</b>'}}}),e.translations("es-ES",{EVENT:{MARKET:{ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> ha reportardo su anuncio : <b>{{params[2]}}</b>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> ha reportado un anuncio para moderar : <b>{{params[2]}}</b>',FOLLOW_CLOSE:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> ha cerrado el anuncio : <b>{{params[2]}}</b>',FOLLOW_NEW:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> ha añadido el anuncio : <b>{{params[2]}}</b>',FOLLOW_NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> ha comentado el anuncio : <b>{{params[2]}}</b>',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> sigue su anuncio : <b>{{params[2]}}</b>',FOLLOW_UPDATE:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> ha modificado el anuncio : <b>{{params[2]}}</b>',FOLLOW_UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> ha modificado su comentario en el anuncio : <b>{{params[2]}}</b>',LIKE_RECEIVED:'A <span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> le ha gustado su anuncio : <b>{{params[2]}}</b>',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> os pide moderación sobre el anuncio : <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> ha comentado su anuncio : <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> ha modificado su comentario sobre su anuncio : <b>{{params[2]}}</b>',NEW_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> ha contestado a su comentario sobre el anuncio : <b>{{params[2]}}</b>',UPDATE_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> ha modificado la repuesta a su comentario sobre el anuncio : <b>{{params[2]}}</b>'}},MARKET:{CATEGORY:{ALL:"Todas las categorías",EDIT:{BTN_ADD:"Añadir",BTN_REORDER:"Reordenar",CONFIRM:{CANCEL:"Las modificaciones no han sido guardadas.<br/><br/>¿<b>Desea</b> continuar con esta operación?"},ERROR:{CANNOT_SAVE:"Error al guardar las categorías",ID_ALREADY_USED:"Identificador ya utilizado",INVALID_ID_PATTERN:"Formato 'catNNN' no respetado"},ID:"Identificador",INFO:{SAVED:"Categorías guardadas con éxito"},NAME:"Edición",POPUP:{TITLE_EDIT:"Modificar la categoría",TITLE_NEW:"Nueva categoría"},ROOT_CATEGORIES:"Categorias superiores",TITLE:"Gestión de las categorias"},UNKNOWN:"Categoriá desconocida"},COMMON:{PRICE:"Precio",BTN_NEW_AD:"Poner un anuncio",SOLD:"Cerrar anuncio",LAST_UPDATE:"Última actualización",AROUND_ME:"Alrededor mío",CROWDFUNDING_PROGRESS:"Financiado al {{pct|formatInteger}} %",FREE:"Gratuito",FREE_PRICE:"Precio libre"},EDIT:{TITLE:"Edición",RECORD_TITLE:"Título",RECORD_TITLE_HELP:"Título",RECORD_DESCRIPTION:"Descripción",RECORD_DESCRIPTION_HELP:"Descripción",RECORD_LOCATION:"Dirección",RECORD_LOCATION_HELP:"Ciudad, País",RECORD_PRICE:"Precio",RECORD_PRICE_HELP:"Precio (opcional)",FREE_PRICE:"¿Precio libre?",RECORD_CURRENCY:"Moneda",RECORD_FEES:"Gastos de envío",RECORD_FEES_HELP:"Gastos de envío (opcional)",RECORD_STOCK:"Stock disponible",RECORD_STOCK_HELP:"Stock disponible",AUCTION:{TITLE_NEW:"Nueva subasta",START_PRICE_HELP:"Precio inicial (opcional)"},OFFER:{TITLE_NEW:"Anuncio nuevo"},NEED:{TITLE_NEW:"Nouvelle demande",MAX_PRICE_HELP:"Precio máximo (opcional)"},CROWDFUNDING:{TITLE_NEW:"Nueva campaña de crowdfunding",TITLE_HELP:"Título de la campaña",DESCRIPTION_HELP:"Descripción: Describa su proyecto aquí",PRICE_HELP:"Cantidad necesitada"},WARNING:{NO_GEO_POINT:"Su anuncio <b> no será visible </b> en búsquedas espaciales."}},ERROR:{GEO_LOCATION_NOT_FOUND:"Localidad o código postal no encontrados",RECORD_EXCEED_UPLOAD_SIZE:"Parece que su anuncio <b>ha excedido el tamaño máximo</b>.<br/><br/>Puede por ejemplo <b>suprimir fotos</b>, y reintentarlo.",INVALID_LOGIN_CREDENTIALS:"Identificador o contraseña no válidos.<br/>Por favor, inténtelo de nuevo.",FAILED_SAVE_RECORD:"Hubo un fallo guardando el anuncio",FAILED_UPDATE_RECORD:"Fallo durante la actualización del anuncio",LOAD_CATEGORY_FAILED:"Error cargando las categorías",LOOKUP_RECORDS_FAILED:"Fallo durante la ejecución de la búsqueda.",LOAD_RECORD_FAILED:"Fallo durante la carga del anuncio.",REMOVE_RECORD_FAILED:"Error de la supresión del anuncio",SOLD_RECORD_FAILED:"Error del cierre del anuncio",REOPEN_RECORD_FAILED:"Error de la reapertura del anuncio",FAILED_SAVE_COMMENT:"Fallo mientras se guardaba el comentario",FAILED_REMOVE_COMMENT:"Fallo durante la supresión del comentario",RECORD_NOT_EXISTS:"Anuncio inexistente"},EVENT_LOGIN:{EMAIL_OR_PHONE:"Correo electrónico o teléfono",EMAIL_OR_PHONE_HELP:"Correo electrónico o teléfono",ERROR:{INVALID_USERNAME:"Correo electrónico o teléfono no válidos"},HELP:"Introduce un <b>correo electrónico o teléfono</b>, para poder contactarle durante el evento:",REMEMBER_ME:"Recordarme",TITLE:"Coordenadas"},GALLERY:{TITLE:"Galería",BTN_START:"Comenzar",BTN_CONTINUE:"Continuar",BTN_PAUSE:"Pausar",BTN_STOP:"Detener",SLIDE_DURATION:"Duración de visionado :",SLIDE_DURATION_OPTION:"{{value}} segundos"},HOME:{BTN_NEW_AD:"Poner un anuncio",BTN_SHOW_MARKET_OFFER:"Consultar los anuncios",LOCATION_LABEL:"Buscar anuncios por localidad :",LOCATION_HELP:"Código postal, Localidad",ERROR:{GEO_LOCATION_NOT_FOUND:"Localidad o código postal no encontrados"}},INFO:{RECORD_REMOVED:"Anuncio suprimido",RECORD_SOLD:"Anuncio cerrado",RECORD_REOPEN:"Anuncio reabierto"},JOIN:{PROFILE:{WARNING:"Complete su perfil con <b>información pública</b>, accesible por todo el mundo.",TITLE:"Nombre, Apellidos",TITLE_HELP:"Nombre, Apellidos",DESCRIPTION:"Sobre mí",DESCRIPTION_HELP:"Escriba algo sobre usted…"},SUBSCRIPTION:{EMAIL:"Correo electrónico",EMAIL_HELP:"Correo electrónico (opcional)"},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.",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?'},LOCAL_SALE:{LOCATION:"Número de stand",LOCATION_HELP:"Número de stand : 1, 2, …",LOCATION_PREFIX:"Stand n°"},PAYMENT:{MODAL:{PAYMENT_LINK_HELP:"Enlaces de pago (en beta) :",SOFTWARE_HELP:'¿ No sabe <b>cómo pagar con la moneda {{currency|abbreviate}} ?</b><ul><li>- <a ng-click="openHelpSite($event)">Consulte el foro de usuaries;</a><li>- Instale un programa compatible : <a ng-click="openLink($event, \'https://cesium.app\')">Cesium</a> (GNU/Linux, Windows, Mac), Silkaj (GNU/Linux) o Sakia (GNU/Linux).</li>',TITLE:"Hacer un pago"}},LOGIN:{HELP:"Introduzca sus credenciales de conexión :",REMEMBER_ME:"Recordar mi sesión"},PROFILE:{DEFAULT_TITLE:"Usuario/a {{pubkey|formatPubkey}}"},SEARCH:{GEO_DISTANCE:"Distancia máxima desde la localidad :",GEO_DISTANCE_OPTION:"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}",LAST_RECORD_COUNT:"{{count}} anuncio{{count>0?'s':''}} reciente{{count>0?'s':''}}",LAST_RECORD_COUNT_LOCATION:"{{count}} anuncio{{count>0?'s':''}} recente{{count>0?'s':''}}, cerca de {{location}}",RESULT_COUNT:"{{count}} resultado{{count>0?'s':''}}",RESULT_COUNT_LOCATION:"{{count}} resultado{{count>0?'s':''}}, cerca de {{location}}",TITLE:"Anuncios",CATEGORY:"Categoría: ",SEARCH_HELP:"Búsqueda (coche, libro...)",BY:"por",BTN_ADD:"Nuevo",BTN_OPTIONS:"Búsqueda avanzada",BTN_AROUND_ME:"Alrededor mío",SHOW_MORE:"Mostrar más",SHOW_MORE_COUNT:"(mostrar sólo {{limit}})",LOCATION:"localidad",LOCATION_HELP:"Ciudad",LAST_RECORDS:"Anuncios recientes:",SHOW_OLD_RECORD:"Mostrar anuncios viejos",RESULTS:"Resultados :",BTN_CROWDFUNDING:"Crowdfunding",BTN_FAVORITES:"Favoritas",BTN_AUCTION:"Auction",BTN_LAST_RECORDS:"Anuncios recientes",BTN_SHOW_CATEGORIES:"Mostrar categorías",BTN_OFFERS:"Ofertas",BTN_NEEDS:"Demandas",SHOW_CLOSED_RECORD:"Mostrar anuncios cerrados",RECORD_STOCK:"Stock :"},TYPE:{TITLE:"Nuevo anuncio",SELECT_TYPE:"Tipo de anuncio :",OFFER:"Oferta, Venta",OFFER_SHORT:"Oferta",CROWDFUNDING:"Financiamiento participativo",CROWDFUNDING_SHORT:"Financiamiento participativo",NEED:"Demanda, Necesidad",NEED_SHORT:"Demanda",AUCTION:"Subasta",AUCTION_SHORT:"Subasta"},VIEW:{BTN_FOLLOW:"Seguir este anuncio",BTN_STOP_FOLLOW:"Dejar de seguir este anuncio",BTN_PAYMENT_HELP:"¿ Cómo hacer un pago ?",CROWDFUNDING_ISSUERS:"{{issuers.length}} contribuidor{{issuers.length > 1 ? 'es' : ''}}",PAYMENT:'<b>Para hacer un pago</b>, envía moneda {{currency|abbreviate}} :<ul><li>- a la llave pública <a class="positive" copy-on-click="{{pubkeyWithChecksum||pubkey}}" title="Copiar la llave">{{pubkey}}</a></li></p>',PAYMENT_WITH_COMMENT:'<b>Para hacer un pago</b>, envía moneda {{currency|abbreviate}} :<ul><li>- a la llave pública <a class="positive" copy-on-click="{{pubkeyWithChecksum||pubkey}}" title="Copiar la llave">{{pubkey}}</a></li><li> - con el comentario <a class="positive" copy-on-click="{{comment}}" title="Copiar el comentario">{{comment}}</a> para hacer seguimiento.</li></ul></p>',SHOW_CROWDFUNDING_ISSUERS:"Ver contribuidores",MORE_LIKE_THIS:"Esto le podría interesar :",NEW_MESSAGE_TITLE:'Sobre el anuncio "{{title}}"...',REOPEN_CONFIRMATION:"¿<b>Desea</b> reabrir este anuncio ?",SOLD_CONFIRMATION:"¿<b>Desea</b> cerrar este anuncio ?",TITLE:"Anuncio",BTN_SOLD_AD:"Cerrar anuncio",BTN_SOLD:"Cerrado",BTN_REOPEN:"Reabrir anuncio",BTN_WRITE:"Escribir",MENU_TITLE:"Opciones",RECORD_FEES_PARENTHESIS:"(costes)",RECORD_STOCK:"Stock disponible :",POPOVER_SHARE_TITLE:"Anuncio {{title}}",REMOVE_CONFIRMATION:"¿ Desea suprimir este anuncio ?<br/><br/>Esta operación es irreversible."},WALLET:{DUNITER_PUBKEY:"Llave pública de recepción de pagos",DUNITER_ACCOUNT:"Recepción de pagos en {{currency|currencySymbol}}",DUNITER_ACCOUNT_HELP:"La llave pública (de arriba) indica el destino de los pagos que recibirá.",DUNITER_ACCOUNT_NO_PUBKEY_HELP:"Ninguna llave pública ha sido introducida. Deberá enviársela a los eventuales compradores.<br/>La puede obtener en cualquier momento <b>editando su perfil</b>."},WOT:{ERROR:{FAILED_STAR_PROFILE:"Error durante el envío de su nota. Inténtelo más tarde."},VIEW:{BTN_RECORDS:"Anuncios",DUNITER_ACCOUNT:"Recepción de pagos en {{currency|currencySymbol}}",DUNITER_ACCOUNT_HELP:"La llave pública (de arriba) indica el destino de los pagos que recibirá.",DUNITER_ACCOUNT_HELP_ASK_USER:'Este usuario no ha comunicado su llave pública. <a ng-click="showNewMessageModal()">Contáctelo</a> para obtenerla.',DUNITER_PUBKEY:"Llave pública para recepción de pagos"}}},MENU:{MARKET:"Anuncios",MY_RECORDS:"Mis anuncios"}}),e.translations("fr-FR",{MENU:{MARKET:"Annonces",MY_RECORDS:"Mes annonces",FAVORITES:"Favoris"},MARKET:{COMMON:{PRICE:"Prix",BTN_NEW_AD:"Je dépose une annonce",SOLD:"Annonce close",LAST_UPDATE:"Dernière mise à jour",AROUND_ME:"Autour de moi",CROWDFUNDING_PROGRESS:"Financé à {{pct|formatInteger}} %",FREE:"Gratuit",FREE_PRICE:"Prix libre"},JOIN:{PROFILE:{WARNING:"Il vous reste maintenant à compléter votre profil utilisateur.<br/><br/>Il s'agit <b>d'informations publiques</b>, accessibles par tous.",TITLE:"Nom, Prénom",TITLE_HELP:"Nom, Prénom ou pseudonyme",DESCRIPTION:"A propos de moi",DESCRIPTION_HELP:"Dites quelque chose à propos de vous..."},SUBSCRIPTION:{EMAIL:"Email",EMAIL_HELP:"Email (optionnel)"},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.<br/><br/>N'oubliez pas vos identifiants, vous ne pourrez pas en changer !",CONFIRMATION_WALLET_ACCOUNT:'<b class="assertive">Avertissement :</b> l\'identifiant 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>Etes-vous sûr</b> de vouloir continuer avec ces identifiants ?'},PROFILE:{DEFAULT_TITLE:"Utilisateur {{pubkey|formatPubkey}}",IDENTITY_RECORDS_TITLE:"Annonces utilisateur"},LOGIN:{HELP:"Veuillez saisir vos identifiants de connexion :",REMEMBER_ME:"Se souvenir de moi ?"},EVENT_LOGIN:{TITLE:"Coordonnées",HELP:"Veuillez indiquer un <b>email ou numéro de téléphone</b> portable, afin que les organisateurs puissent vous contacter durant l'événement :",EMAIL_OR_PHONE:"Email ou téléphone",EMAIL_OR_PHONE_HELP:"Email ou numéro de téléphone",REMEMBER_ME:"Se souvenir de moi ?",ERROR:{INVALID_USERNAME:"Email ou numéro de téléphone non valide"}},HOME:{BTN_NEW_AD:"Déposer une annonce",BTN_SHOW_MARKET_OFFER:"Voir les annonces",LOCATION_LABEL:"Recherche d'annonces par ville :",LOCATION_HELP:"Code postal, Ville",ERROR:{GEO_LOCATION_NOT_FOUND:"Ville ou code postal non trouvé"}},CATEGORY:{ALL:"Toutes les catégories",UNKNOWN:"Catégorie inconnue",EDIT:{TITLE:"Gestion des catégories",ID:"Identifiant",NAME:"Libellé",ROOT_CATEGORIES:"Catégories parentes",BTN_ADD:"Ajouter",BTN_REORDER:"Réordonner",POPUP:{TITLE_EDIT:"Modifier la catégorie",TITLE_NEW:"Nouvelle catégorie"},CONFIRM:{CANCEL:"Des modifications n'ont pas été enregistrées.<br/><br/><b>Êtes-vous sûr</b> de vouloir continuer cette opération ?"},INFO:{SAVED:"Catégories enregistrées avec succès"},ERROR:{CANNOT_SAVE:"Erreur lors de la sauvegarde des catégories",INVALID_ID_PATTERN:"Format 'catNNN' non respecté",ID_ALREADY_USED:"Identifiant déjà utilisé"}}},SEARCH:{TITLE:"Annonces",CATEGORY:"Catégorie : ",SEARCH_HELP:"Recherche (vélo, rollers...)",BY:"par",BTN_ADD:"Nouveau",BTN_CATEGORIES:"Catégories",BTN_OPTIONS:"Recherche avancée",BTN_AROUND_ME:"Autour de moi",GEO_DISTANCE:"Distance maximale autour de la ville :",GEO_DISTANCE_OPTION:"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}",SHOW_MORE:"Afficher plus",SHOW_MORE_COUNT:"(limite actuelle à {{limit}})",LOCATION:"Ville",LOCATION_HELP:"Code postal, Ville",RESULTS:"Résultats",RESULT_COUNT_LOCATION:"{{count}} résultat{{count>0?'s':''}}, près de {{location}}",RESULT_COUNT:"{{count}} résultat{{count>0?'s':''}}",LAST_RECORDS:"Dernières annonces",LAST_RECORD_COUNT_LOCATION:"{{count}} annonce{{count>0?'s':''}} récente{{count>0?'s':''}}, près de {{location}}",LAST_RECORD_COUNT:"{{count}} annonce{{count>0?'s':''}} récente{{count>0?'s':''}}",BTN_LAST_RECORDS:"Dernières annonces",BTN_SHOW_CATEGORIES:"Parcourir les catégories",BTN_OFFERS:"Offres",BTN_CROWDFUNDING:"Financements",BTN_FAVORITES:"Favoris",BTN_AUCTION:"Enchères",BTN_NEEDS:"Demandes",SHOW_CLOSED_RECORD:"Afficher les annonces closes ?",SHOW_OLD_RECORD:"Afficher les anciennes annonces ?",RECORD_STOCK:"Stock :",SORT:{PREFIX:"Tri: ",DATE:"Date",PRICE:"Prix",DATE_ASC:"Plus anciennes",DATE_DESC:"Plus récentes",PRICE_ASC:"Prix croissants",PRICE_DESC:"Prix décroissants"}},GALLERY:{TITLE:"Diaporama",BTN_START:"Démarrer",BTN_CONTINUE:"Reprendre",BTN_PAUSE:"Pause",BTN_STOP:"Arrêter",SLIDE_DURATION:"Durée d'affichage :",AD_TYPE:"Type d'annonce :",ALL_AD_TYPES:"Tous",SLIDE_DURATION_OPTION:"{{value}} secondes"},VIEW:{TITLE:"Annonce",BTN_SOLD_AD:"Clore l'annonce",BTN_SOLD:"Clore",BTN_REOPEN:"Réouvrir l'annonce",BTN_WRITE:"Ecrire un message",BTN_FOLLOW:"Suivre cette annonce",BTN_STOP_FOLLOW:"Ne plus suivre cette annonce",BTN_PAYMENT_HELP:"Comment faire un paiement ?",MENU_TITLE:"Options",RECORD_FEES_PARENTHESIS:"(frais)",RECORD_STOCK:"Stock disponible :",POPOVER_SHARE_TITLE:"Annonce {{title}}",REMOVE_CONFIRMATION:"Êtes-vous sûr de vouloir supprimer cette annonce ?<br/><br/>Cette opération est irréversible.",SOLD_CONFIRMATION:"<b>Êtes-vous sûr</b> de vouloir clore cette annonce ?",REOPEN_CONFIRMATION:"<b>Êtes-vous sûr</b> de vouloir réouvrir cette annonce ?",NEW_MESSAGE_TITLE:'Au sujet de l\'annonce "{{title}}"...',MORE_LIKE_THIS:"Ceci pourrait vous intéresser :",PAYMENT:'<b>Pour faire un paiement</b>, envoyer de la monnaie {{currency|abbreviate}} :<ul><li>- à la clé publique <a class="positive" copy-on-click="{{pubkeyWithChecksum||pubkey}}" title="Copier la clef">{{pubkey}}</a></li></p>',PAYMENT_WITH_COMMENT:'<b>Pour faire un paiement</b>, envoyer de la monnaie {{currency|abbreviate}} :<ul><li>- à la clé publique <a class="positive" copy-on-click="{{pubkeyWithChecksum||pubkey}}" title="Copier la clef">{{pubkey}}</a></li><li> - avec le commentaire <a class="positive" copy-on-click="{{comment}}" title="Copier le commentaire">{{comment}}</a> pour le suivi.</li></ul></p>',CROWDFUNDING_ISSUERS:"{{issuers.length}} donateur{{issuers.length > 1 ? 's' : ''}}",SHOW_CROWDFUNDING_ISSUERS:"Voir les donateurs"},WALLET:{DUNITER_PUBKEY:"Clé publique de réception des paiements",DUNITER_ACCOUNT:"Réception des paiements en {{currency|currencySymbol}}",DUNITER_ACCOUNT_HELP:"La clef publique (ci-dessus) indique la destination des paiements que vous recevrez.",DUNITER_ACCOUNT_NO_PUBKEY_HELP:"Aucune clé publique de compte n'a été renseignée. Vous devrez la donner aux acheteurs éventuels.<br/>Vous pouvez la saisir à tout moment, <b>en éditant votre profil</b>."},TYPE:{TITLE:"Nouvelle annonce",SELECT_TYPE:"Type d'annonce :",OFFER:"Offre, Vente",OFFER_SHORT:"Offre",CROWDFUNDING:"Financement participatif",CROWDFUNDING_SHORT:"Financement",NEED:"Demande, Recherche",NEED_SHORT:"Demande",AUCTION:"Vente aux enchères",AUCTION_SHORT:"Enchère"},LOCAL_SALE:{LOCATION:"Numéro du stand",LOCATION_HELP:"Numéro du stand : 1, 2, ...",LOCATION_PREFIX:"Stand n°"},EDIT:{TITLE:"Edition",RECORD_TITLE:"Titre",RECORD_TITLE_HELP:"Titre : vélo, livre...",RECORD_DESCRIPTION:"Description",RECORD_DESCRIPTION_HELP:"Description",RECORD_LOCATION:"Ville",RECORD_LOCATION_HELP:"Code postal, Ville",RECORD_PRICE:"Prix",RECORD_PRICE_HELP:"Prix (optionnel)",FREE_PRICE:"Prix libre ?",RECORD_CURRENCY:"Monnaie",RECORD_FEES:"Frais d'envoi",RECORD_FEES_HELP:"Frais (optionnel)",RECORD_STOCK:"Stock disponible",RECORD_STOCK_HELP:"Stock disponible",AUCTION:{TITLE_NEW:"Nouvelle enchère",START_PRICE_HELP:"Prix de départ (optionnel)"},OFFER:{TITLE_NEW:"Nouvelle annonce"},NEED:{TITLE_NEW:"Nouvelle demande",MAX_PRICE_HELP:"Prix maximum (optionnel)"},CROWDFUNDING:{TITLE_NEW:"Nouvelle campagne de financement",TITLE_HELP:"Titre de la campagne",DESCRIPTION_HELP:"Description : Décrivez votre projet ici",PRICE_HELP:"Montant recherché"},WARNING:{NO_GEO_POINT:"Votre annonce <b>ne sera pas visible</b> dans les recherches spatiales."}},WOT:{VIEW:{BTN_RECORDS:"Annonces",DUNITER_PUBKEY:"Clé publique de réception des paiements",DUNITER_ACCOUNT:"Réception des paiements en {{currency|currencySymbol}}",DUNITER_ACCOUNT_HELP:"La clef publique (ci-dessus) correspond au compte à utiliser pour payer cet utilisateur.",DUNITER_ACCOUNT_HELP_ASK_USER:"Cet utilisateur n'a pas communiqué sa clef publique de compte. <a ng-click=\"showNewMessageModal()\">Contactez-le</a> pour l'obtenir."},ERROR:{FAILED_STAR_PROFILE:"Erreur lors de l'envoi de votre note. Veuillez réessayer ultérieurement."}},PAYMENT:{MODAL:{TITLE:"Faire un paiement",SOFTWARE_HELP:'Vous ne savez pas <b>comment envoyer de la monnaie {{currency|abbreviate}} ?</b><ul><li>- <a ng-click="openHelpSite($event)">Consulter le forum utilisateur;</a><li>- Installer un logiciel compatible : <a ng-click="openLink($event, \'https://cesium.app\')">Cesium</a> (Linux, Windows, Mac), Silkaj (Linux) ou Sakia (Linux).</li>',PAYMENT_LINK_HELP:"Liens de paiement (bêta) :"}},ERROR:{INVALID_LOGIN_CREDENTIALS:"Identifiant ou mot de passe invalide.<br/><br/>Vérifiez qu'ils correspondent bien à un compte <b>créé sur ğchange</b>.",FAILED_SAVE_RECORD:"Erreur lors de l'enregistrement de l'annonce",FAILED_UPDATE_RECORD:"Erreur lors de la mise à jour de l'annonce",LOAD_CATEGORY_FAILED:"Erreur d'initialisation des catégories",LOOKUP_RECORDS_FAILED:"Erreur lors de l'exécution de la recherche",LOAD_RECORD_FAILED:"Erreur lors du chargement de l'annonce",REMOVE_RECORD_FAILED:"Erreur de la suppression de l'annonce",SOLD_RECORD_FAILED:"Erreur lors de la fermeture de l'annonce",REOPEN_RECORD_FAILED:"Erreur lors de la réouverture de l'annonce",FAILED_SAVE_COMMENT:"Erreur lors de la sauvegarde du commentaire",FAILED_REMOVE_COMMENT:"Erreur lors de la suppression du commentaire",RECORD_NOT_EXISTS:"Annonce inexistante",RECORD_EXCEED_UPLOAD_SIZE:"Il semble que votre annonce <b>soit trop volumineuse</b> pour être acceptée par le noeud de données.<br/><br/>Vous pouvez par exemple <b>supprimer des photos</b>, puis essayer à nouveau.",GEO_LOCATION_NOT_FOUND:"Ville ou code postal non trouvé"},INFO:{RECORD_REMOVED:"Annonce supprimée",RECORD_SOLD:"Annonce close",RECORD_REOPEN:"Annonce réouverte"}},EVENT:{MARKET:{NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> a commenté votre annonce : <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> a modifié son commentaire sur votre annonce : <b>{{params[2]}}</b>',NEW_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> a répondu à votre commentaire sur l\'annonce : <b>{{params[2]}}</b>',UPDATE_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> a modifié la réponse à votre commentaire sur l\'annonce : <b>{{params[2]}}</b>',FOLLOW_NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> a commenté l\'annonce : <b>{{params[2]}}</b>',FOLLOW_UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> a modifié son commentaire sur l\'annonce : <b>{{params[2]}}</b>',FOLLOW_NEW:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> a ajouté l\'annonce : <b>{{params[2]}}</b>',FOLLOW_UPDATE:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> a modifié l\'annonce : <b>{{params[2]}}</b>',FOLLOW_CLOSE:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> a clôturé l\'annonce : <b>{{params[2]}}</b>',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> vous demande une modération sur l\'annonce : <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> a signalé une annonce à modérer : <b>{{params[2]}}</b>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> a signalé votre annonce : <b>{{params[2]}}</b>',LIKE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> a aimé votre annonce : <b>{{params[2]}}</b>',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||params[1]}}</span> suit votre annonce : <b>{{params[2]}}</b>'}}}),e.translations("nl-NL",{MENU:{MARKET:"Advertenties"},MARKET:{COMMON:{PRICE:"Prijs",BTN_BUY:"Koop",BTN_BUY_DOTS:"Koop...",BTN_NEW_AD:"Nieuwe advertentie",AROUND_ME:"In mijn omgeving"},SEARCH:{TITLE:"Markt",SEARCH_HELP:"Wat, waar: auto, Utrecht, ...",BTN_ADD:"Nieuw",BTN_OPTIONS:"Geavanceerd zoeken",BTN_AROUND_ME:"In mijn omgeving",SHOW_MORE:"Toon meer",SHOW_MORE_COUNT:"(huidige limiet op {{limit}})",LOCATION:"Locatie",LOCATION_HELP:"Plaats",LAST_RECORDS:"Nieuwste advertenties:",RESULTS:"Resultaat:",BTN_OFFERS:"Aangeboden",BTN_NEEDS:"Gezocht"},VIEW:{TITLE:"Advertentie",MENU_TITLE:"Opties",POPOVER_SHARE_TITLE:"Advertentie {{title}}",REMOVE_CONFIRMATION:"Weet je zeker dat je deze advertentie wil wissen?<br/><br/>Dit kan niet ongedaan worden gemaakt."},TYPE:{TITLE:"Nieuwe advertentie",SELECT_TYPE:"Soort advertentie:",OFFER:"Aanbod",NEED:"Vraag"},EDIT:{TITLE:"Bewerk",TITLE_NEW:"Nieuwe advertentie",RECORD_TITLE:"Titel",RECORD_TITLE_HELP:"Titel",RECORD_DESCRIPTION:"Beschrijving",RECORD_DESCRIPTION_HELP:"Beschrijving",RECORD_LOCATION:"Adres",RECORD_LOCATION_HELP:"Straat, Plaats",RECORD_PRICE:"Prijs",RECORD_PRICE_HELP:"Prijs (optioneel)",RECORD_CURRENCY:"Valuta"},ERROR:{FAILED_SAVE_RECORD:"Advertentie opslaan mislukt",FAILED_UPDATE_RECORD:"Advertentie aanpassen mislukt",LOAD_CATEGORY_FAILED:"Categorieên laden mislukt",LOOKUP_RECORDS_FAILED:"Fout tijdens laden van advertenties.",LOAD_RECORD_FAILED:"Advertentie laden mislukt",REMOVE_RECORD_FAILED:"Advertentie wissen mislukt",FAILED_SAVE_COMMENT:"Commentaar opslaan mislukt",FAILED_REMOVE_COMMENT:"Commentaar wissen mislukt",RECORD_NOT_EXISTS:"Advertentie niet gevonden"},INFO:{RECORD_REMOVED:"Advertentie succesvol verwijderd"}},EVENT:{MARKET:{NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||uid||params[1]}}</span> heeft gereageerd op jouw advertentie: <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||uid||params[1]}}</span> heeft zijn/aar reactie op jouw advertentie bewerkt: <b>{{params[2]}}</b>',NEW_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||uid||params[1]}}</span> heeft gereageerd op jouw commentaar op advertentie: <b>{{params[2]}}</b>',UPDATE_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i>&thinsp;{{name||uid||params[1]}}</span> heeft zijn/haar reactie op jouw commentaar bewerkt, op advertentie: <b>{{params[2]}}</b>'}}})}]),angular.module("cesium.plugins.templates",[]).run(["$templateCache",function(e){e.put("plugins/es/templates/common/dropdown_locations.html",'\n \x3c!-- dropdown --\x3e\n <ul class="item no-padding list dropdown-list" ng-if="locations" scroll="true">\n\n <div ng-if="!locations.length" class="item padding assertive">\n <span translate>COMMON.SEARCH_NO_RESULT</span>\n </div>\n\n <a ng-repeat="res in locations" class="item item-border-large item-text-wrap ink done in {{res.selected && \'active\' || \'\'}}" ng-class="::{\'item-divider\': !res.address, \'item-icon-left\': res.address}" ng-click="::res.address ? selectLocation(res) : false">\n\n \x3c!-- if divider --\x3e\n <h4 class="text-italic" ng-if="::!res.address" ng-bind-html="res.name"></h4>\n\n \x3c!-- if divider --\x3e\n <ng-if ng-if="::res.address">\n\n <i class="icon ion-location"></i>\n\n <h3 ng-if="res.address.road">\n {{::res.address.road}}\n </h3>\n <h3>\n <span ng-if="res.address.postcode">{{::res.address.postcode}}</span>\n {{::res.address.city||res.address.village}}\n <span class="gray">| {{::res.address.country}}</span>\n </h3>\n <h5 class="gray">\n {{\'LOCATION.MODAL.POSITION\'|translate:res }}\n </h5>\n </ng-if>\n\n </a>\n\n </ul>\n'),e.put("plugins/es/templates/common/edit_pictures.html",'<div class="gallery" ng-controller="ESPicturesEditCtrl as ctrl">\n\n \x3c!-- Picture list --\x3e\n <div ng-repeat="picture in pictures" class="item card card-gallery stable-bg" ng-class="{\'in done\': picture.isnew}">\n <div>\n <h2 ng-if="picture.title">{{picture.title}}</h2>\n <img ng-src="{{picture.src}}">\n </div>\n <div class="item done in tabs tabs-secondary tabs-icon-left">\n <a class="tab-item stable-bg assertive" ng-click="removePicture($index)" title="{{\'COMMON.BTN_PICTURE_DELETE\' | translate}}"><i class="icon ion-trash-a"></i>{{\'COMMON.BTN_PICTURE_DELETE\'|translate}}</a>\n <a class="tab-item stable-bg dark" ng-click="rotatePicture($index)" title="{{\'COMMON.BTN_PICTURE_ROTATE\' | translate}}"><i class="icon ion-forward"></i>{{\'COMMON.BTN_PICTURE_ROTATE\'|translate}}</a>\n <a class="tab-item stable-bg" ng-click="favoritePicture($index)" ng-class="{\'gray\': $index !== 0, \'positive\': $index === 0}" title="{{\'COMMON.BTN_PICTURE_FAVORISE\' | translate}}"><i class="icon ion-star"></i>{{\'COMMON.BTN_PICTURE_FAVORISE\'|translate}}</a>\n </div>\n </div>\n\n \x3c!-- Add picture button --\x3e\n <div class="item card card-gallery card-gallery-new text-center padding ink" file-select="onFileChanged(file)" accept="image/*">\n <i class="ion-image stable" style="font-size:150px"></i>\n <b class="ion-plus gray" style="font-size:80px; position:absolute; top:25px; right: 5px;"></b>\n <p translate>COMMON.BTN_ADD_PICTURE</p>\n </div>\n\n</div>\n\n'),
e.put("plugins/es/templates/common/edit_position.html",'<div class="item item-divider" translate>LOCATION.LOCATION_DIVIDER</div>\n\n\x3c!-- street --\x3e\n<ion-item class="item-input item-floating-label item-button-right">\n <span class="input-label">{{\'LOCATION.ADDRESS\' | translate}}</span>\n <textarea placeholder="{{\'LOCATION.ADDRESS_HELP\' | translate}}" ng-model="formData.address" ng-model-options="{ debounce: 350 }" rows="4" cols="10">\n </textarea>\n</ion-item>\n\n\x3c!-- city --\x3e\n<div class="item item-input item-floating-label" ng-class="{\'item-input-error\': form.$submitted && form.geoPoint.$invalid}">\n <span class="input-label" translate>LOCATION.CITY</span>\n <input type="text" placeholder="{{\'LOCATION.CITY_HELP\'|translate}}" name="city" ng-model="formData.city" ng-model-options="{ updateOn: \'blur\' }" required-if="formData.address" ng-change="onCityChanged()">\n</div>\n<input type="hidden" name="geoPoint" ng-model="formData.geoPoint" required-if="formPosition.enable" geo-point>\n<div class="form-errors" ng-show="form.$submitted && form.city.$error" ng-messages="form.city.$error">\n <div class="form-error" ng-message="required">\n <span translate="LOCATION.ERROR.CITY_REQUIRED_IF_STREET"></span>\n </div>\n</div>\n<div class="form-errors" ng-show="form.$submitted && form.geoPoint.$error" ng-messages="form.geoPoint.$error">\n <div class="form-error" ng-message="required">\n <span translate="LOCATION.ERROR.REQUIRED_FOR_LOCATION" ng-if="!formData.city"></span>\n <span translate="LOCATION.ERROR.INVALID_FOR_LOCATION" ng-if="formData.city"></span>\n </div>\n <div class="form-error" ng-message="geoPoint">\n <span translate="LOCATION.ERROR.REQUIRED_FOR_LOCATION" ng-if="!formData.city"></span>\n <span translate="LOCATION.ERROR.INVALID_FOR_LOCATION" ng-if="formData.city"></span>\n </div>\n</div>\n\n\n\x3c!-- Position (lat/lon) --\x3e\n<div class="item row item-text-wrap no-padding">\n\n <div class="col no-padding">\n\n \x3c!-- appear on map ? --\x3e\n <ion-checkbox ng-if="options.position.showCheckbox" ng-model="formPosition.enable" ng-change="onUseGeopointChanged()" class="item item-border-large done in">\n <div class="item-content">\n <span translate>LOCATION.USE_GEO_POINT</span>\n\n \x3c!-- warning if no position--\x3e\n <h4 class="assertive" ng-if="options.position.warningMessage && !formPosition.enable">\n <i class="icon ion-android-warning"></i>\n <span ng-bind-html="options.position.warningMessage|translate"></span>\n </h4>\n\n \x3c!-- loading --\x3e\n <h4 class="gray" ng-if="formPosition.loading">\n <ion-spinner class="icon ion-spinner-small" icon="android"></ion-spinner>\n <span translate>LOCATION.LOADING_LOCATION</span>\n </h4>\n </div>\n </ion-checkbox>\n </div>\n\n <div class="col col-10 no-padding" style="min-width: 60px;">\n <div class="row text-center">\n\n <a class="button button-stable button-small-padding" title="{{\'LOCATION.BTN_GEOLOC_ADDRESS\'|translate}}" ng-disabled="!formPosition.enable" ng-click="openSearchLocationModal()">\n <i class="icon ion-home" style="left: 15px;"></i>\n <b class="icon-secondary ion-search" style="top: -9px; left:32px; font-size: 18px;"></b>\n </a>\n\n </div>\n </div>\n</div>\n\n<cs-extension-point name="after-position"></cs-extension-point>\n'),e.put("plugins/es/templates/common/edit_socials.html",'<div class="list no-padding {{::motion.ionListClass}}">\n \x3c!-- divider --\x3e\n <div class="item item-divider">\n\n <span translate>PROFILE.SOCIAL_NETWORKS_DIVIDER</span>\n\n <a class="badge button button-text button-small button-small-padding" ng-class="{\'button-text-positive\': socialData.reorder}" ng-if="formData.socials && formData.socials.length &gt; 1" ng-click="socialData.reorder=!socialData.reorder">\n <span translate>PROFILE.BTN_REORDER</span>\n </a>\n </div>\n</div>\n\n<ion-list show-reorder="socialData.reorder">\n\n <ion-item class="item-icon-left item-social-edit done in" type="no-padding item-text-wrap" ng-if="formData.socials && formData.socials.length" ng-repeat="social in formData.socials | filter:filterFn track by social.url" id="social-{{social.url|formatSlug}}">\n <i class="icon ion-social-{{social.type}}" ng-class="{\'ion-bookmark\': social.type === \'other\', \'ion-link\': social.type === \'web\', \'ion-email\': social.type === \'email\', \'ion-iphone\': social.type === \'phone\'}"></i>\n <p ng-if="social.type && social.type != \'web\'">\n {{social.type}}\n <i class="ion-locked" ng-if="social.recipient"></i>\n </p>\n <h2>\n <a href="{{social.url}}" ng-if="social.type != \'email\' && social.type != \'phone\'" target="_blank">{{social.url}}</a>\n <a href="mailto:{{social.url}}" ng-if="social.type == \'email\'">{{social.url}}</a>\n <a href="tel:{{social.url}}" ng-if="social.type == \'phone\'">{{social.url}}</a>\n <a class="gray hidden-device" ng-if="!social.recipient && !socialData.reorder" ng-click="formData.socials.splice($index, 1); dirty = true;">\n &nbsp;<b class="ion ion-trash-a"></b>&nbsp;\n </a>\n <a class="gray hidden-device" ng-if="!social.recipient && !socialData.reorder" ng-click="editSocialNetwork($index)">\n &nbsp;<b class="ion ion-edit"></b>&nbsp;\n </a>\n </h2>\n <ion-option-button class="button-assertive" ng-if="!social.recipient" ng-click="formData.socials.splice($index, 1); dirty = true;">\n {{\'COMMON.BTN_DELETE\'|translate}}\n </ion-option-button>\n <ion-option-button class="button-info" ng-if="!social.recipient" ng-click="editSocialNetwork($index)">\n {{\'COMMON.BTN_EDIT\'|translate}}\n </ion-option-button>\n <ion-reorder-button class="ion-drag" on-reorder="reorderSocialNetwork(social, $fromIndex, $toIndex)">\n </ion-reorder-button>\n </ion-item>\n</ion-list>\n\n<ion-list class="no-padding">\n <div class="item item-complex item-input-inset">\n <label class="item-input-wrapper">\n <input type="text" style="width:100%" placeholder="{{\'PROFILE.SOCIAL_HELP\'|translate}}" id="socialUrl" on-return="addSocialNetwork($event);" ng-model="socialData.url">\n </label>\n <button class="button button-small hidden-xs" type="button" ng-click="addSocialNetwork($event)" translate>COMMON.BTN_ADD</button>\n <button class="button button-small button-icon icon ion-android-add visible-xs" type="button" ng-click="addSocialNetwork($event)">\n </button>\n </div>\n\n</ion-list>\n'),e.put("plugins/es/templates/common/item_comment_content.html",'\n <div class="item item-avatar done in">\n <span class="avatar avatar-member" ng-if="::!comment.avatar"></span>\n <span class="avatar" ng-if="::comment.avatar" style="background-image: url({{::comment.avatar.src}})"></span>\n\n <a class="pull-left" ui-sref="app.user_identity({pubkey:comment.issuer, name: comment.name})">\n <span class="positive" ng-if="::comment.name">\n {{::comment.name}}\n </span>\n <span ng-if="::!comment.name" class="gray">\n <i class="icon ion-key gray"></i>\n {{::comment.issuer|formatPubkey}}\n </span>\n </a>&nbsp;\n <span trust-as-html="comment.html"></span>\n </div>\n'),e.put("plugins/es/templates/common/item_comment.html",'<ng-init ng-init="level = level + 1; hash=(comment.id|formatHash)">\n <a name="{{::hash}}"></a>\n\n <ion-item id="comment-{{::comment.id|formatHash}}" class="card card-comment card-avatar stable-900-bg item-text-wrap no-padding" ng-class="{\'in done\': comment.isnew, \'positive-100-bg\': (hash == anchor)}">\n\n \x3c!-- Parent comment --\x3e\n <div class="card-header padding-left" ng-if="comment.parent && !hideParent">\n <h5 class="gray underline">\n <ng-if ng-if="!comment.parent.issuer">\n {{\'COMMENTS.REPLY_TO_DELETED_COMMENT\'|translate}}\n </ng-if>\n <ng-if ng-if="comment.parent.issuer">\n <a ng-click="toggleExpandedParent(comment, $index)">\n {{\'COMMENTS.REPLY_TO_LINK\'|translate}}\n <ng-if ng-if="::comment.parent.name">\n {{::comment.parent.name}}\n </ng-if>\n <ng-if ng-if="::!comment.parent.name">\n <i class="ion-key"></i>\n {{::comment.parent.issuer|formatPubkey}}\n </ng-if>\n </a>\n <i ng-class="::{\'ion-arrow-down-b\': !comment.expandedParent[$index], \'ion-arrow-up-b\': comment.expandedParent[$index]}"></i>\n </ng-if>\n </h5>\n <div class="padding-left" ng-if="comment.expandedParent[$index]">\n <div class="card card-avatar card-avatar-small stable-bg item-text-wrap no-padding in done">\n <ng-include ng-init="comment = comment.parent" src="\'plugins/es/templates/common/item_comment_content.html\'">\n </ng-include>\n </div>\n </div>\n </div>\n\n <ng-include src="\'plugins/es/templates/common/item_comment_content.html\'"></ng-include>\n\n <div class="card-footer gray">\n <small class="underline">\n <a ng-click="share($event, comment, $index)" title="{{comment.creationTime | formatDate}}{{ (comment.creationTime != comment.time) ? (\' - \' + (\'COMMENTS.MODIFIED_ON\'|translate:comment)) : \'\'}}">{{comment.creationTime | formatFromNow}}\n <span ng-if="comment.time && comment.creationTime != comment.time" translate>COMMENTS.MODIFIED_PARENTHESIS</span>\n </a>\n\n <ng-if ng-if="comment.replyCount">\n | <a class="dark" ng-click="toggleExpandedReplies(comment, $index)">{{\'COMMENTS.REPLY_COUNT\'|translate:comment}}</a>\n <i ng-class="{\'ion-arrow-down-b\': !comment.showReplies, \'ion-arrow-up-b\': comment.showReplies}"></i>\n </ng-if>\n </small>\n\n <div class="pull-right">\n <a class="ion-android-share-alt" ng-click="share($event, comment)">\n </a>\n <a class="ion-edit" ng-if="isUserPubkey(comment.issuer)" ng-click="edit(comment)">\n </a>\n <a class="ion-trash-a" ng-if="isUserPubkey(comment.issuer)" ng-click="remove(comment, $index)">\n </a>\n <a class="ion-reply" ng-click="reply(comment)">\n {{::\'COMMENTS.REPLY\'|translate}}\n </a>\n </div>\n </div>\n </ion-item>\n\n \x3c!-- replies --\x3e\n <div ng-if="comment.expandedReplies[$index]" class="padding-left card-avatar-small expanded" ng-init="hideParent=true">\n <ng-include ng-repeat="comment in comment.replies track by comment.id" src="\'plugins/es/templates/common/item_comment.html\'">\n </ng-include>\n </div>\n\n</ng-init>\n'),e.put("plugins/es/templates/common/item_location_search.html",' \x3c!-- search text --\x3e\n <div class="item no-padding">\n <div class="item-input light-bg item-button-right">\n <div class="animate-show-hide selected-values ng-hide" ng-show="entered">\n\n \x3c!-- selected location --\x3e\n <div ng-show="search.location && (search.geoPoint || search.geoShape)" class="button button-small button-text button-stable button-icon-event stable-900-bg" style="margin-right: 10px;">\n &nbsp;<i class="icon ion-location"></i>\n {{search.location.split(\',\')[0]}}\n <i class="icon ion-close" ng-click="removeLocation()">&nbsp;&nbsp;</i>\n </div>\n\n </div>\n\n <i class="icon ion-ios-location placeholder-icon" ng-if="!search.geoPoint && !search.geoShape"></i>\n <input type="text" ng-if="!search.geoPoint && !search.geoShape" id="searchLocationInput" autocomplete="off" placeholder="{{(options.location.help||\'LOCATION.SEARCH_HELP\')|translate}}" ng-model-options="{ debounce: 350 }" ng-model="search.location" ng-keydown="onKeydown($event)" ng-change="onLocationChanged()" ng-blur="hideDropdown()">\n\n <a class="button button-clear button-small button-stable gray ink no-padding" tabindex="-1" ng-click="showDistancePopover($event)">\n <span>{{\'COMMON.GEO_DISTANCE_OPTION\' | translate: {value: search.geoDistance} }}</span>\n &nbsp;<b class="ion-arrow-down-b" style="font-size: 12pt;"></b>\n </a>\n\n </div>\n </div>\n\n \x3c!-- dropdown --\x3e\n <ng-include src="\'plugins/es/templates/common/dropdown_locations.html\'"></ng-include>\n\n'),e.put("plugins/es/templates/common/modal_category.html",'<ion-modal-view class="modal-full-height">\n <ion-header-bar class="bar-positive">\n <button class="button button-clear" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button>\n <h1 class="title">{{ (ctrl.title || \'COMMON.CATEGORIES\') | translate}}</h1>\n </ion-header-bar>\n\n <ion-content class="categoryModal">\n\n <div class="center padding" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="list">\n <label class="item item-input">\n <i class="icon ion-search placeholder-icon"></i>\n <input type="text" placeholder="{{\'COMMON.CATEGORY_SEARCH_HELP\'|translate}}" ng-model="ctrl.searchText" ng-model-options="{ debounce: 350 }" ng-change="ctrl.doSearch()">\n </label>\n\n\n <div ng-repeat="cat in categories" class="item item-category item-text-wrap" ng-class="{\'item-divider\': !cat.parent}" ng-click="cat.parent ? closeModal(cat) : false">\n <h2 ng-bind-html="cat.name"></h2>\n </div>\n </div>\n </ion-content>\n</ion-modal-view>\n'),e.put("plugins/es/templates/common/modal_edit_avatar.html",'<ion-modal-view>\n <ion-header-bar class="bar-positive">\n <button class="button button-clear visible-xs visible-sm" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button>\n\n <h1 class="title" translate>PROFILE.MODAL_AVATAR.TITLE</h1>\n\n <button class="button button-clear icon-right visible-xs" ng-click="doCrop()" ng-disabled="formData.imageCropStep == 1" ng-if="formData.imageCropStep <= 2">\n <span translate>COMMON.BTN_NEXT</span>\n <i class="icon ion-ios-arrow-right"></i>\n </button>\n <button class="button button-clear icon-right visible-xs" ng-click="closeModal(formData.result)" ng-if="formData.imageCropStep == 3">\n <i class="icon ion-android-done"></i>\n </button>\n </ion-header-bar>\n\n <ion-content class="modal-avatar padding">\n\n\n <div ng-show="formData.imageCropStep == 1">\n\n <p translate>PROFILE.MODAL_AVATAR.SELECT_FILE_HELP</p>\n\n \x3c!-- Add picture drop zone --\x3e\n <div drop-zone="onFileChanged(file)">\n <div file-select="onFileChanged(file)" accept="image/*">\n <i class="ion-image stable" style="font-size:150px"></i>\n <b class="ion-plus gray" style="position:relative; font-size:80px; top:-51px; right: 19px;"></b>\n <p class="gray" translate>COMMON.CHOOSE_FILE</p>\n </div>\n </div>\n </div>\n\n <div ng-show="formData.imageCropStep == 2">\n <p translate>PROFILE.MODAL_AVATAR.RESIZE_HELP</p>\n\n \x3c!-- <image-crop\n data-height="200" //shape\'s height\n data-width="150" //shape\'s width\n data-shape="square" //the shape.. square or circle\n data-step="imageCropStep"//scope variable that will contain the current step of the crop (1. Waiting for source image; 2. Image loaded, waiting for crop; 3. Crop done)\n src="imgSrc" //scope variable that will be the source image for the crop (may be a Blob or base64 string)\n data-result-blob="result" //scope variable that will contain the Blob information\n data-result="resultDataUrl" //scope variable that will contain the image\'s base64 string representation\n crop="initCrop" //scope variable that must be set to true when the image is ready to be cropped\n padding="250" //space, in pixels, rounding the shape\n max-size="1024" //max of the image, in pixels\n ></image-crop> --\x3e\n\n <div class="item card text-center padding ink">\n <image-crop data-height="200" data-width="200" data-shape="circle" data-step="formData.imageCropStep" src="formData.imgSrc" data-result="formData.result" data-result-blob="formData.resultBlob" crop="formData.initCrop" padding="150" max-size="1024">\n </image-crop>\n </div>\n </div>\n\n <div ng-show="formData.imageCropStep == 3">\n <p translate>PROFILE.MODAL_AVATAR.RESULT_HELP</p>\n\n <div class="item card padding hero" style="height: 110px;">\n <div class="content">\n <img class="avatar" ng-src="{{formData.result|trustAsHtml}}" style="height: 88px; width: 88px;">\n </div>\n </div>\n </div>\n\n \x3c!-- buttons bar --\x3e\n <div class="padding hidden-xs text-right">\n <button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" ng-if="formData.imageCropStep <= 2" translate>\n COMMON.BTN_CANCEL\n </button>\n <button class="button button-stable icon-left ion-chevron-left ink" ng-click="doPrevious()" translate ng-if="formData.imageCropStep >= 2">\n COMMON.BTN_BACK\n </button>\n <button class="button button-calm icon-right ion-chevron-right ink" ng-click="doCrop()" translate ng-disabled="formData.imageCropStep === 1" ng-if="formData.imageCropStep <= 2">\n COMMON.BTN_NEXT\n </button>\n <button class="button button-positive ink" ng-click="closeModal(formData.result)" translate ng-if="formData.imageCropStep === 3">\n COMMON.BTN_CONTINUE\n </button>\n </div>\n\n </ion-content>\n</ion-modal-view>\n'),e.put("plugins/es/templates/common/modal_location.html",'<ion-modal-view class="modal-full-height modal-search-location">\n <ion-header-bar class="bar-positive">\n <button class="button button-clear" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button>\n <h1 class="title" translate>LOCATION.MODAL.TITLE</h1>\n </ion-header-bar>\n\n <ion-content class="padding no-padding-xs" scroll="true">\n\n\n \x3c!-- search text --\x3e\n <div class="item item-input">\n <i class="icon ion-search placeholder-icon"></i>\n\n <input type="text" class="visible-xs visible-sm" placeholder="{{\'LOCATION.MODAL.SEARCH_HELP\'|translate}}" ng-model="search.text" ng-model-options="{ debounce: 650 }" ng-change="doSearch()">\n <input type="text" class="hidden-xs hidden-sm" placeholder="{{\'LOCATION.MODAL.SEARCH_HELP\'|translate}}" ng-model="search.text" on-return="doSearch()">\n </div>\n\n <div class="padding-top padding-xs" style="display: block; height: 60px;">\n <div class="pull-left" ng-if="!search.loading && search.results">\n <h4 translate>COMMON.RESULTS_LIST</h4>\n </div>\n\n <div class="pull-right hidden-xs hidden-sm">\n <button class="button button-small button-stable ink" ng-click="doSearch()">\n {{\'COMMON.BTN_SEARCH\' | translate}}\n </button>\n </div>\n\n </div>\n\n <div class="center padding" ng-if="search.loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div ng-if="!search.loading && search.results && (!search.results.length || !search.results[0].address)" class="assertive padding">\n <span translate>COMMON.SEARCH_NO_RESULT</span>\n </div>\n\n <ion-list ng-if="!search.loading" class="padding-top {{::motion.ionListClass}}">\n <div ng-repeat="res in search.results" class="item item-border-large item-text-wrap ink" ng-class="::{\'item-divider\': !res.address, \'item-icon-left item-icon-right\': res.address}" ng-click="res.address ? closeModal(res) : false">\n\n \x3c!-- if divider --\x3e\n <h4 class="text-italic" ng-if="::!res.address" ng-bind-html="res.name"></h4>\n\n \x3c!-- if divider --\x3e\n <ng-if ng-if="::res.address">\n\n <i class="icon ion-location"></i>\n\n <h2 ng-if="res.address.road">\n {{::res.address.road}}\n </h2>\n <h3>\n <span ng-if="res.address.postcode">{{::res.address.postcode}}</span>\n {{::res.address.city||res.address.village}}\n <span class="gray">| {{::res.address.country}}</span>\n </h3>\n <h5 class="gray">\n {{\'LOCATION.MODAL.POSITION\'|translate:res }}\n </h5>\n\n <i class="icon ion-ios-arrow-right"></i>\n </ng-if>\n\n </div>\n </ion-list>\n </ion-content>\n\n <ion-footer-bar class="stable-bg padding-left padding-right block" ng-if="license">\n <div class="pull-right copyright">\n <span class="dark">© </span>\n <a class="positive" href="{{license.url}}" target="_blank">{{license.name}}</a>\n </div>\n </ion-footer-bar>\n</ion-modal-view>\n'),e.put("plugins/es/templates/common/popover_distances.html",'<ion-popover-view class="popover-light popover-distance" style="height: {{33 + 5 * 53}}px">\n <ion-header-bar class="bar bar-header stable-bg">\n <div class="title" translate>COMMON.GEO_DISTANCE_SEARCH</div>\n </ion-header-bar>\n <ion-content scroll="true">\n <a class="item ink" ng-repeat="value in geoDistances" ng-click="selectDistance(value)">\n <b class="ion-checkmark" ng-if="search.geoDistance==value"></b>\n <b ng-if="search.geoDistance==value">{{\'COMMON.GEO_DISTANCE_OPTION\' | translate: {value: value} }}</b>\n <span ng-if="search.geoDistance!=value">{{\'COMMON.GEO_DISTANCE_OPTION\' | translate: {value: value} }}</span>\n </a>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/es/templates/common/popover_profile_extend.html",' \x3c!-- profile --\x3e\n <button ng-if="enable" class="button button-positive button-small ink" ng-click="showEditUserProfile()">\n {{\'PROFILE.BTN_EDIT\' | translate}}\n </button>\n\n'),e.put("plugins/es/templates/common/popover_star.html",'<ion-popover-view class="popover-star" style="height: {{likeData.stars.wasHit ? 90 : 50}}px">\n <ion-content scroll="false" class="padding-left padding-right">\n <h1>\n <a ng-repeat="level in [1,2,3,4,5]" ng-click="addStar(level)">\n <b class="dark ion-android-star" ng-if="level <= likeData.stars.level"></b>\n <b class="dark ion-android-star-half" ng-if="level > likeData.stars.level && level - 0.5 <= likeData.stars.level"></b>\n <b class="dark ion-android-star-outline" ng-if="level > likeData.stars.level && level - 0.5 > likeData.stars.level"></b>\n </a>\n </h1>\n <a ng-if="likeData.stars.wasHit" ng-click="removeStar(event)" translate>WOT.VIEW.BTN_STARS_REMOVE</a>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/es/templates/common/popup_report_abuse.html",'<form name="abuseForm" ng-submit="">\n <div class="list" ng-init="setAbuseForm(abuseForm)">\n\n \x3c!-- reason --\x3e\n <label class="item item-input" ng-class="{\'item-input-error\': abuseForm.$submitted && abuseForm.comment.$invalid}">\n <textarea class="padding" style="background-color: transparent;" name="comment" type="text" placeholder="{{\'COMMON.REPORT_ABUSE.REASON_HELP\' | translate}}" rows="3" ng-model="abuseData.comment" ng-minlength="8" required></textarea>\n </label>\n <div class="form-errors" ng-if="abuseForm.$submitted && abuseForm.comment.$error" ng-messages="abuseForm.comment.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT"></span>\n </div>\n </div>\n\n <div class="item item-toggle item-text-wrap dark">\n <div class="input-label" translate>COMMON.REPORT_ABUSE.ASK_DELETE</div>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="abuseData.delete">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div>\n </div>\n</form>\n\n\n'),e.put("plugins/es/templates/common/view_comments.html",'\n<form class="comments" ng-controller="ESCommentsCtrl" ng-submit="save()">\n\n <div class="item item-divider">\n <i class="icon ion-chatboxes"></i>\n <span translate>COMMENTS.DIVIDER</span>\n <span class="gray" ng-if="comments.total">({{comments.total}})</span>\n </div>\n\n <span class="item item-more-comments" ng-if="comments.hasMore">\n <small><a ng-click="showMore()" translate>COMMENTS.SHOW_MORE_COMMENTS</a></small>\n </span>\n\n <div class="padding-right">\n <ng-repeat ng-repeat="comment in comments.result track by comment.id" ng-include="\'plugins/es/templates/common/item_comment.html\'">\n </ng-repeat>\n </div>\n\n <div class="hidden-xs hidden-sm padding-right">\n <div class="card card-comment item item-input item-button-right">\n\n \x3c!-- reply to comment--\x3e\n <ng-if ng-if="formData.parent">\n <div class="padding card-header text-right pull-left" translate>COMMENTS.REPLY_TO</div><br>\n <div class="padding-left">\n <div class="card card-avatar card-avatar-small stable-900-bg item-text-wrap no-padding in done">\n <ng-include ng-if="formData.parent.message" ng-init="comment = formData.parent" src="\'plugins/es/templates/common/item_comment_content.html\'">\n </ng-include>\n <div class="item dark done in gray" ng-if="!formData.parent.message">\n {{::\'COMMENTS.DELETED_COMMENT\'|translate}}\n </div>\n <div class="card-footer text-right gray">\n <div class="pull-right">\n <a class="ion-close" ng-click="removeParentLink()">\n {{::\'COMMON.BTN_CANCEL\'|translate}}\n </a>\n </div>\n </div>\n </div>\n </div>\n </ng-if>\n <textarea class="padding" style="background-color: transparent;" id="comment-form-textarea" rows="3" placeholder="{{formData.replyTo ? \'COMMENTS.COMMENT_HELP_REPLY_TO\' : \'COMMENTS.COMMENT_HELP\'|translate}}" ng-model="formData.message" ng-keypress="onKeypress($event)">\n </textarea>\n <div class="card-footer text-right">\n <button type="button" class="button button-small button-small-padding" ng-class="{\'button-positive\': formData.message.length}" ng-if="!formData.id" ng-click="save()" translate>\n COMMON.BTN_SEND\n </button>\n \x3c!-- Edit buttons --\x3e\n <ng-if ng-if="formData.id">\n <button type="button" class="button button-small button-small-padding" ng-click="cancel()" translate>\n COMMON.BTN_CANCEL\n </button>\n <button type="button" class="button button-small button-small-padding button-positive" ng-click="save()" translate>\n COMMON.BTN_SAVE\n </button>\n </ng-if>\n </div>\n </div>\n </div>\n\n <div class="visible-xs visible-sm" style="margin-bottom">\n <div class="block">\n \x3c!-- reply to comment--\x3e\n <div class="item item-input-inset done in" ng-if="formData.parent">\n <div class="padding text-right pull-left" translate>COMMENTS.REPLY_TO</div><br>\n <div class="padding-left expanded">\n <div class="card card-comment stable-900-bg item-text-wrap no-padding in done">\n <ng-include ng-if="::formData.parent.message" ng-init="comment = formData.parent" src="\'plugins/es/templates/common/item_comment_content.html\'">\n </ng-include>\n <span ng-if="::!formData.parent.message" translate>\n COMMENTS.DELETED_COMMENT\n </span>\n <div class="card-footer text-right gray">\n <div class="pull-right">\n <a class="ion-close" ng-click="removeParentLink()">\n {{::\'COMMON.BTN_CANCEL\'|translate}}\n </a>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class="item item-input-inset">\n <div class="item-input-wrapper">\n <input type="text" id="comment-form-input" style="width: 100%" placeholder="{{\'COMMENTS.COMMENT_HELP\'|translate}}" on-return="save();" ng-model="formData.message">\n <button type="submit" class="button button-small button-small-padding button-icon button-dark button-icon gray">\n <i class="icon ion-android-send"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n</form>\n'),e.put("plugins/es/templates/common/view_likes.html",'\n<div class="likes">\n \x3c!-- views --\x3e\n <span class="gray" ng-if="likeData.views" title="{{\'COMMON.VIEWS_TEXT\'|translate: likeData.views }}">\n {{likeData.views.total || 0}}\n <i class="icon ion-eye"></i>\n <ng-if ng-if="likeData.likes||likeData.dislikes">&nbsp;|&nbsp;</ng-if>\n </span>\n\n \x3c!-- likes / dislikes --\x3e\n <ng-if ng-if="likeData.likes||likeData.dislikes">\n <span ng-class="{\'gray\': !likeData.likes.wasHit, \'positive\': likeData.likes.wasHit}">\n <a title="{{\'COMMON.LIKES_TEXT\'|translate: likeData.likes }}" ng-click="!canEdit && toggleLike($event, {kind: \'like\'})">\n {{likeData.likes.total || 0}}\n <i class="icon ion-heart"></i>\n </a>\n </span>\n <span ng-if="likeData.dislikes" ng-class="{\'gray\': !likeData.dislikes.wasHit, \'positive\': likeData.dislikes.wasHit}">\n <a title="{{\'COMMON.DISLIKES_TEXT\'|translate: likeData.dislikes }}" ng-click="!canEdit && toggleLike($event, {kind: \'dislike\'})">\n {{likeData.dislikes.total || 0}}\n <i class="icon ion-heart-broken"></i>\n </a>\n </span>\n </ng-if>\n\n \x3c!-- follow--\x3e\n <span class="gray" ng-if="likeData.follows">&nbsp;|&nbsp;</span>\n <a ng-if="likeData.follows" ng-click="!canEdit && toggleLike($event, {kind: \'follow\'})">\n <span ng-class="{\'gray\': !likeData.follows.wasHit, \'positive\': likeData.follows.wasHit}" title="{{\'COMMON.FOLLOWS_TEXT\'|translate: follows }}">\n {{likeData.follows.total || 0}}\n <i class="icon ion-android-people"></i>&nbsp;\n </span>\n <span ng-if="!canEdit" class="hidden-xs" ng-class="{\'assertive\': likeData.follows.wasHit, \'positive\': !likeData.follows.wasHit}">\n ({{likeData.follows.wasHit ? \'COMMON.BTN_STOP_FOLLOW\': \'COMMON.BTN_FOLLOW\' | translate }})\n </span>\n </a>\n <span class="gray" ng-if="likeData.abuses.total">&nbsp;|&nbsp;</span>\n <a ng-if="likeData.abuses.total && !likeData.abuses.wasHit" ng-click="!canEdit && reportAbuse($event)" title="{{\'COMMON.ABUSES_TEXT\'|translate: likeData.abuses }}">\n {{likeData.abuses.total || 0}}\n <i class="icon ion-android-warning"></i>\n </a>\n <span ng-if="likeData.abuses.total && likeData.abuses.wasHit" class="assertive" title="{{\'COMMON.ABUSES_TEXT\'|translate: likeData.abuses }}">\n {{likeData.abuses.total || 0}}\n <i class="icon ion-android-warning"></i>\n </span>\n</div>\n'),e.put("plugins/es/templates/common/view_pictures.html",'<div ng-if="pictures && pictures.length>0" class="item gallery done in">\n <div ng-repeat="picture in pictures" class="item card card-gallery">\n <h2 ng-if="::picture.title">{{::picture.title}}</h2>\n <img ng-src="{{::picture.src}}">\n </div>\n</div>\n'),e.put("plugins/es/templates/document/item_document_comment.html",'<ion-item id="doc-{{::doc.id}}" class="item item-document item-document-comment item-icon-left ink {{::ionItemClass}} no-padding-top no-padding-bottom" ng-class="{\'compacted\': compactMode}" ng-click="selectDocument($event, doc)">\n\n <i ng-show=":rebind:!compactMode" ng-if=":rebind:!doc.avatar" class="icon ion-ios-chatbubble-outline stable"></i>\n <i ng-show=":rebind:!compactMode" ng-if=":rebind:doc.avatar" class="avatar" style="background-image: url(\'{{:rebind:doc.avatar.src}}\')"></i>\n\n <div class="row no-padding">\n <div class="col">\n <h4>\n <i class="ion-ios-chatbubble-outline dark"></i>\n <span class="gray" ng-if=":rebind:doc.name">\n <i class="ion-person" ng-show=":rebind:!compactMode"></i>\n {{:rebind:doc.name}}:\n </span>\n <span class="dark">\n <i class="ion-quote" ng-if=":rebind:!compactMode"></i>\n {{:rebind:doc.message|truncText:50}}\n </span>\n </h4>\n <h4 class="gray"> <i class="ion-clock"></i> {{:rebind:doc.time|formatDate}}</h4>\n </div>\n\n <div class="col">\n <h3>\n <a ui-sref="app.user_identity({pubkey: doc.pubkey, name: doc.name})">\n\n </a>\n </h3>\n </div>\n\n <div class="col" ng-if=":rebind:!compactMode">\n <a ng-if=":rebind:login && doc.pubkey==walletData.pubkey" ng-click="remove($event, $index)" class="gray pull-right hidden-xs hidden-sm" title="{{\'DOCUMENT.LOOKUP.BTN_REMOVE\'|translate}}">\n <i class="ion-trash-a"></i>\n </a>\n </div>\n\n </div>\n</ion-item>\n'),e.put("plugins/es/templates/document/item_document_profile.html",'<ion-item id="doc-{{::doc.id}}" class="item item-document item-icon-left ink {{::ionItemClass}} no-padding-top no-padding-bottom" ng-class="{\'compacted\': compactMode}" ng-click="selectDocument($event, doc)">\n\n <i ng-show=":rebind:!compactMode" ng-if=":rebind:doc.avatar" class="avatar" style="background-image: url({{:rebind:doc.avatar.src}})"></i>\n <i ng-show=":rebind:!compactMode" ng-if=":rebind:!doc.avatar" class="icon ion-person stable"></i>\n\n <div class="row no-padding">\n <div class="col">\n <h4 ng-if=":rebind:doc.title">\n <i class="ion-person gray"></i>\n <span class="dark">\n {{:rebind:doc.title}}\n </span>\n <span class="gray">\n {{:rebind:\'DOCUMENT.LOOKUP.HAS_REGISTERED\'|translate}}\n </span>\n </h4>\n <h4>\n <span class="dark" ng-if=":rebind:doc.city">\n <i class="ion-location"></i> {{:rebind:doc.city}}\n </span>\n <span class="gray">\n <i class="ion-clock"></i> {{:rebind:doc.time|formatDate}}\n </span>\n </h4>\n </div>\n\n <div class="col" ng-if=":rebind:!compactMode">\n <a ng-if=":rebind:login && doc.pubkey==walletData.pubkey" ng-click="remove($event, $index)" class="gray pull-right" title="{{\'DOCUMENT.LOOKUP.BTN_REMOVE\'|translate}}">\n <i class="ion-trash-a"></i>\n </a>\n </div>\n\n </div>\n</ion-item>\n'),e.put("plugins/es/templates/document/item_document.html",'<ion-item id="doc-{{::doc.id}}" class="item item-document item-icon-left ink item-text-wrap {{::ionItemClass}} no-padding-top no-padding-bottom" ng-click="selectDocument($event, doc)">\n\n <i class="icon ion-document stable" ng-if=":rebind:!doc.avatar"></i>\n <i class="avatar" ng-if=":rebind:doc.avatar" style="background-image: url(\'{{:rebind:doc.avatar.src}}\')"></i>\n\n <div class="row no-padding">\n\n <div class="col">\n <h3>\n <a ui-sref="app.user_identity({pubkey: doc.pubkey, name: doc.name})">\n <span class="positive" ng-if=":rebind:doc.name">\n <i class="ion-person"></i> {{:rebind:doc.name}}\n </span>\n </a>\n </h3>\n </div>\n\n <div class="col">\n <h3 class="dark">\n <i class="ion-locked" ng-if=":rebind:doc.nonce"></i>\n {{:rebind:doc.time|formatDate}}</h3>\n <h4 class="gray">{{:rebind:\'DOCUMENT.HASH\'|translate}} {{:rebind:doc.hash|formatHash}}</h4>\n </div>\n\n <div class="col col-50">\n <h4 class="gray">\n {{:rebind:\'DOCUMENT.LOOKUP.TYPE.\' + (doc.index + \'_\' + doc.type | uppercase) | translate}}\n </h4>\n <h4 ng-if="doc.type!=\'profile\'">\n {{:rebind:doc.title||doc.message|truncText: 150}}\n </h4>\n </div>\n\n\n\n \x3c!--<div class="col">--\x3e\n \x3c!--<a--\x3e\n \x3c!--ng-if=":rebind:login && doc.pubkey==walletData.pubkey"--\x3e\n \x3c!--ng-click="remove($event, $index)"--\x3e\n \x3c!--class="gray pull-right"--\x3e\n \x3c!--title="{{\'DOCUMENT.LOOKUP.BTN_REMOVE\'|translate}}">--\x3e\n \x3c!--<i class="ion-trash-a"></i>--\x3e\n \x3c!--</a>--\x3e\n \x3c!--<h3 ng-if=":rebind:doc.recipient">--\x3e\n \x3c!--<a ui-sref="app.user_identity({pubkey: doc.recipient.pubkey, name: doc.recipient.name})">--\x3e\n \x3c!--<span class="gray">--\x3e\n \x3c!--<i class="ion-key"></i> {{:rebind:doc.recipient.pubkey|formatPubkey}}--\x3e\n \x3c!--</span>--\x3e\n \x3c!--<span class="positive" ng-if=":rebind:doc.recipient.name">--\x3e\n \x3c!--<i class="ion-person"></i> {{:rebind:doc.recipient.name}}--\x3e\n \x3c!--</span>--\x3e\n \x3c!--</a>--\x3e\n \x3c!--</h3>--\x3e\n \x3c!--<h4 class="gray" ng-if=":rebind:doc.read_signature">--\x3e\n \x3c!--<i class="ion-checkmark"></i>--\x3e\n \x3c!--<span translate>DOCUMENT.LOOKUP.READ</span>--\x3e\n \x3c!--</h4>--\x3e\n\n \x3c!--</div>--\x3e\n\n </div>\n</ion-item>\n'),e.put("plugins/es/templates/document/items_documents.html",'\n<div class="item row row-header done in hidden-xs hidden-sm">\n\n <a class="no-padding dark col col-header" ng-if=":rebind:expertMode" ng-click="toggleSort(\'issuer\')">\n <cs-sort-icon asc="search.asc" sort="search.sort" toggle="\'issuer\'"></cs-sort-icon>\n {{\'DOCUMENT.LOOKUP.HEADER_ISSUER\' | translate}}\n </a>\n <a class="no-padding dark col col-header" ng-if=":rebind:expertMode" ng-click="toggleSort(\'time\')">\n <cs-sort-icon asc="search.asc" sort="search.sort" toggle="\'time\'"></cs-sort-icon>\n {{\'DOCUMENT.LOOKUP.HEADER_TIME\' | translate}}\n </a>\n <div class="no-padding dark col col-50 col-header" ng-if=":rebind:expertMode">\n <span class="gray">{{\'DOCUMENT.LOOKUP.DOCUMENT_TYPE\' | translate}} /</span> {{\'DOCUMENT.LOOKUP.DOCUMENT_TITLE\' | translate}}\n </div>\n</div>\n\n<div class="padding gray" ng-if=":rebind:!search.loading && !search.results.length" translate>\n COMMON.SEARCH_NO_RESULT\n</div>\n\n\x3c!-- for each doc --\x3e\n<ng-repeat ng-repeat="doc in :rebind:search.results track by doc.id" ng-switch on="doc.type">\n <div ng-switch-when="comment">\n <ng-include src="::\'plugins/es/templates/document/item_document_comment.html\'"></ng-include>\n </div>\n <div ng-switch-when="profile">\n <ng-include src="::\'plugins/es/templates/document/item_document_profile.html\'"></ng-include>\n </div>\n <div ng-switch-default>\n <ng-include src="::\'plugins/es/templates/document/item_document.html\'"></ng-include>\n </div>\n</ng-repeat>\n'),e.put("plugins/es/templates/document/lookup_form.html",'<div class="lookupForm">\n\n\n <div class="item no-padding">\n\n \x3c!--<div class="button button-small button-text button-stable button-icon-event padding no-padding-right ink"\n ng-repeat="filter in search.filters" ng-if="filter">\n <span ng-bind-html="\'DOCUMENT.LOOKUP.TX_SEARCH_FILTER.\'+filter.type|translate:filter"></span>\n <i class="icon ion-close" ng-click="itemRemove($index)"></i>\n\n </div>--\x3e\n\n <label class="item-input">\n <i class="icon ion-search placeholder-icon"></i>\n <input type="text" class="visible-xs visible-sm" placeholder="{{\'DOCUMENT.LOOKUP.SEARCH_HELP\'|translate}}" ng-model="search.text" ng-model-options="{ debounce: 650 }" ng-change="doSearchText()">\n <input type="text" class="hidden-xs hidden-sm" id="{{searchTextId}}" placeholder="{{\'DOCUMENT.LOOKUP.SEARCH_HELP\'|translate}}" ng-model="search.text" on-return="doSearchText()">\n <div class="helptip-anchor-center">\n <a id="{{helptipPrefix}}-search-text"></a>\n </div>\n\n </label>\n </div>\n\n\n <div class="padding-top padding-xs" style="display: block; height: 60px;">\n <div class="pull-left">\n <h4 ng-if="search.last" translate>\n DOCUMENT.LOOKUP.LAST_DOCUMENTS\n </h4>\n <h4 ng-if="!search.last">\n {{\'COMMON.RESULTS_LIST\'|translate}}\n </h4>\n <h5 class="dark" ng-if="!search.loading && search.total">\n <span translate="COMMON.RESULTS_COUNT" translate-values="{count: search.total}"></span>\n <small class="gray" ng-if=":rebind:search.took && expertMode">\n - {{:rebind:\'COMMON.EXECUTION_TIME\'|translate: {duration: search.took} }}\n </small>\n <small class="gray" ng-if=":rebind:expertMode && search.filters && search.filters.length">\n - <a ng-click="toggleShowQuery()" ng-if="!showQuery">\n <span translate>DOCUMENT.LOOKUP.SHOW_QUERY</span>\n <i class="icon ion-arrow-down-b gray"></i>\n </a>\n <a ng-click="toggleShowQuery()" ng-if="showQuery">\n <span translate>DOCUMENT.LOOKUP.HIDE_QUERY</span>\n <i class="icon ion-arrow-up-b gray"></i>\n </a>\n </small>\n </h5>\n <h5 class="gray" ng-if="search.loading">\n <ion-spinner class="icon ion-spinner-small" icon="android"></ion-spinner>\n <span translate>COMMON.SEARCHING</span>\n <br>\n </h5>\n </div>\n\n <div class="pull-right hidden-xs hidden-sm">\n <a class="button button-text button-small ink" ng-if="login" ng-click="showActionsPopover($event)">\n {{\'DOCUMENT.LOOKUP.BTN_ACTIONS\' | translate}}\n <i class="icon ion-arrow-down-b"></i>\n </a>\n &nbsp;\n <button class="button button-small button-stable ink" ng-click="doSearchText()">\n {{\'COMMON.BTN_SEARCH\' | translate:search}}\n </button>\n </div>\n </div>\n\n <div class="item no-border no-padding" ng-if=":rebind:search.filters && search.filters.length && expertMode">\n <small class="no-padding no-margin" ng-if="showQuery">\n <span class="gray text-wrap dark">{{:rebind:search.query}}</span>\n </small>\n </div>\n\n <ion-list class="list" ng-class="::motion.ionListClass">\n\n <ng-include src="\'plugins/es/templates/document/items_documents.html\'"></ng-include>\n\n </ion-list>\n\n <ion-infinite-scroll ng-if="search.hasMore" spinner="android" on-infinite="showMore()" distance="1%">\n </ion-infinite-scroll>\n\n</div>'),e.put("plugins/es/templates/document/lookup_popover_actions.html",'<ion-popover-view class="fit has-header">\n <ion-header-bar>\n <h1 class="title" translate>DOCUMENT.LOOKUP.POPOVER_ACTIONS.TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n <a class="item item-icon-left assertive ink" ng-class="{\'gray\': !search.total}" ng-click="removeAll()">\n <i class="icon ion-trash-a"></i>\n {{\'DOCUMENT.LOOKUP.POPOVER_ACTIONS.REMOVE_ALL\' | translate}}\n </a>\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/es/templates/document/lookup.html",'<ion-view>\n <ion-nav-title>\n <span translate>DOCUMENT.LOOKUP.TITLE</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n\n <button class="button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showActionsPopover($event)">\n </button>\n\n </ion-nav-buttons>\n\n <ion-content class="padding no-padding-xs" scroll="true">\n\n <ng-include src="\'plugins/es/templates/document/lookup_form.html\'"></ng-include>\n </ion-content>\n</ion-view>\n'),e.put("plugins/es/templates/group/edit_group.html",'<ion-view left-buttons="leftButtons">\n <ion-nav-title>\n <span class="visible-xs" ng-if="id" ng-bind-html="formData.title"></span>\n <span class="visible-xs" ng-if="!loading && !id" translate>GROUP.EDIT.TITLE_NEW</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <button class="button button-icon button-clear visible-xs visible-sm" ng-class="{\'ion-android-send\':!id, \'ion-android-done\': id}" ng-click="save()">\n </button>\n </ion-nav-buttons>\n\n <ion-content scroll="true">\n <div class="row no-padding">\n\n <div class="col col-20 hidden-xs hidden-sm">&nbsp;</div>\n\n <div class="col">\n \x3c!-- loading --\x3e\n <div class="center padding" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <form name="recordForm" novalidate="" ng-submit="save()">\n\n \x3c!-- --\x3e\n <div class="list" ng-class="motion.ionListClass" ng-init="setForm(recordForm)">\n\n <div class="item hidden-xs">\n <h1 ng-if="id" ng-bind-html="formData.title"></h1>\n <h1 ng-if="!id" translate>GROUP.EDIT.TITLE_NEW</h1>\n <h2 class="balanced" ng-if="!id">\n <i class="icon ion-android-people"></i>\n <i class="icon ion-android-lock" ng-if="formData.type==\'managed\'"></i>\n {{\'GROUP.TYPE.ENUM.\'+formData.type|upper|translate}}\n </h2>\n </div>\n <div class="item" ng-if="id">\n <h4 class="gray">\n <i class="icon ion-calendar"></i>\n {{\'COMMON.LAST_MODIFICATION_DATE\'|translate}}&nbsp;{{formData.time | formatDate}}\n </h4>\n <div class="badge badge-balanced badge-editable" ng-click="showRecordTypeModal()">\n {{\'GROUP.TYPE.ENUM.\'+formData.type|upper|translate}}\n </div>\n </div>\n\n \x3c!-- pictures --\x3e\n <ng-include src="\'plugins/es/templates/common/edit_pictures.html\'"></ng-include>\n\n <div class="item item-divider" translate>GROUP.GENERAL_DIVIDER</div>\n\n \x3c!-- title --\x3e\n <div class="item item-input item-floating-label" ng-class="{\'item-input-error\': form.$submitted && form.title.$invalid}">\n <span class="input-label" translate>GROUP.EDIT.RECORD_TITLE</span>\n <input type="text" placeholder="{{\'GROUP.EDIT.RECORD_TITLE_HELP\'|translate}}" name="title" id="group-record-title" ng-model="formData.title" ng-minlength="3" ng-required="true">\n </div>\n <div class="form-errors" ng-if="form.$submitted && form.title.$error" ng-messages="form.title.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT"></span>\n </div>\n </div>\n\n \x3c!-- description --\x3e\n <div class="item item-input item-floating-label">\n <span class="input-label" translate>GROUP.EDIT.RECORD_DESCRIPTION</span>\n <textarea placeholder="{{\'GROUP.EDIT.RECORD_DESCRIPTION_HELP\'|translate}}" ng-model="formData.description" rows="8" cols="10">\n </textarea>\n </div>\n\n \x3c!-- social networks --\x3e\n <ng-include src="\'plugins/es/templates/common/edit_socials.html\'"></ng-include>\n\n </div>\n\n <div class="padding hidden-xs hidden-sm text-right">\n <button class="button button-clear button-dark ink" ng-click="cancel()" type="button" translate>\n COMMON.BTN_CANCEL\n </button>\n <button class="button button-positive button-raised ink" type="submit" ng-if="!id" translate>\n COMMON.BTN_PUBLISH\n </button>\n <button class="button button-assertive button-raised ink" type="submit" ng-if="id" translate>\n COMMON.BTN_SAVE\n </button>\n </div>\n </form>\n </div>\n\n <div class="col col-20 hidden-xs hidden-sm">&nbsp;</div>\n\n </div>\n \n </ion-content>\n</ion-view>\n'),e.put("plugins/es/templates/group/item_group.html",'<a name="group-{{:rebind:group.hash}}"></a>\n<ion-item id="group-{{:rebind:block.hash}}" class="item item-icon-left item-group {{ionItemClass}}" ng-click="select(group)">\n\n <i class="icon ion-cube stable" ng-if=":rebind:(!group.empty && !group.avatar)"></i>\n <i class="avatar" ng-if=":rebind:!group.empty && group.avatar" style="background-image: url(\'{{:rebind:block.avatar.src}}\')"></i>\n\n <div class="row no-padding">\n <div class="col">\n <h4 class="dark">\n <i class="ion-clock"></i>\n {{:rebind:group.creationTime|formatDate}}\n </h4>\n <h4>\n \x3c!-- membersCount --\x3e\n <i class="dark ion-person"></i>\n <span class="dark" ng-if=":rebind:group.membersCount">+{{:rebind:group.membersCount}}</span>\n </h4>\n </div>\n\n <div class="col col-33 positive hidden-md">\n <h4><i class="ion-person"></i> <span ng-bind-html=":rebind:group.title"></span></h4>\n </div>\n\n </div>\n</ion-item>\n'),e.put("plugins/es/templates/group/items_groups.html",'\n\n<div class="item row row-header hidden-xs hidden-sm" ng-if="expertMode">\n\n <a class="no-padding dark col col-header" ng-click="toggleSort(\'medianTime\')">\n <cs-sort-icon asc="search.asc" sort="search.sort" toggle="\'medianTime\'"></cs-sort-icon>\n {{\'GROUP.LOOKUP.HEADER_CREATION_TIME\' | translate}}\n </a>\n <a class="no-padding dark col col-header" ng-click="toggleSort(\'issuer\')">\n <cs-sort-icon asc="search.asc" sort="search.sort" toggle="\'issuer\'"></cs-sort-icon>\n {{\'GROUP.LOOKUP.HEADER_ISSUER\' | translate}}\n </a>\n <div class="col col-20">&nbsp;\n </div>\n <a class="no-padding dark col col-20 col-header" ng-click="toggleSort(\'number\')">\n <cs-sort-icon asc="search.asc" sort="search.sort" toggle="\'number\'"></cs-sort-icon>\n {{\'GROUP.LOOKUP.HEADER_NAME\' | translate}}\n </a>\n</div>\n\n<div class="padding gray" ng-if=":rebind:!search.loading && !search.results.length" translate>\n COMMON.SEARCH_NO_RESULT\n</div>\n\n<ng-repeat ng-repeat="group in :rebind:search.results" ng-include="\'plugins/es/templates/group/item_group.html\'">\n</ng-repeat>\n'),e.put("plugins/es/templates/group/list.html",'<ion-list class="{{::motion.ionListClass}}">\n\n <ion-item ng-repeat="notification in search.results" class="item-border-large item-text-wrap ink item-avatar" ng-class="{\'unread\': !notification.read}" ng-click="select(notification)">\n\n <i ng-if="!notification.avatar" class="item-image icon {{::notification.avatarIcon}}"></i>\n <i ng-if="notification.avatar" class="item-image avatar" style="background-image: url({{::notification.avatar.src}})"></i>\n\n <h3 trust-as-html="notification.message | translate:notification"></h3>\n <h4>\n <i class="icon {{notification.icon}}"></i>&thinsp;<span class="dark">{{notification.time|formatFromNow}}</span>\n <span class="gray">| {{notification.time|formatDate}}</span>\n </h4>\n </ion-item>\n</ion-list>\n\n<ion-infinite-scroll ng-if="!search.loading && search.hasMore" spinner="android" on-infinite="showMore()" distance="1%">\n</ion-infinite-scroll>\n'),e.put("plugins/es/templates/group/lookup_form.html",'<div class="lookupForm">\n\n <button class="button button-small button-positive button-clear ink pull-right padding-right hidden-sm hidden-xs" ng-click="showNewRecordModal()">\n <i class="icon ion-plus"></i>\n {{\'GROUP.LOOKUP.BTN_NEW\' | translate}}\n </button>\n\n \x3c!-- search text--\x3e\n <label class="item item-input">\n <i class="icon ion-search placeholder-icon"></i>\n <input type="text" class="visible-xs visible-sm" placeholder="{{\'GROUP.LOOKUP.SEARCH_HELP\'|translate}}" ng-model="search.text" ng-model-options="{ debounce: 650 }" ng-change="doSearchText()">\n <input type="text" class="hidden-xs hidden-sm" id="{{searchTextId}}" placeholder="{{\'GROUP.LOOKUP.SEARCH_HELP\'|translate}}" ng-model="search.text" on-return="doSearchText()">\n <div class="helptip-anchor-center">\n <a id="helptip-group-search-text"></a>\n </div>\n\n </label>\n\n <div class="padding-top padding-xs" style="display: block; height: 60px;">\n <div class="pull-left">\n <h4 ng-if="search.type==\'open\'" translate>\n GROUP.LOOKUP.OPEN_RESULTS_LIST\n </h4>\n <h4 ng-if="search.type==\'last\'" translate>\n GROUP.LOOKUP.LAST_RESULTS_LIST\n </h4>\n <h4 ng-if="search.type==\'managed\'" translate>\n GROUP.LOOKUP.MANAGED_RESULTS_LIST\n </h4>\n <h4 ng-if="search.type==\'text\'">\n {{\'COMMON.RESULTS_LIST\'|translate}}\n </h4>\n <h5 class="dark" ng-if="!search.loading && search.total">\n <span translate="COMMON.RESULTS_COUNT" translate-values="{count: search.total}"></span>\n <small class="gray" ng-if=":rebind:search.took && expertMode">\n - {{:rebind:\'COMMON.EXECUTION_TIME\'|translate: {duration: search.took} }}\n </small>\n </h5>\n <h5 class="gray" ng-if="search.loading">\n <ion-spinner class="icon ion-spinner-small" icon="android"></ion-spinner>\n <span translate>COMMON.SEARCHING</span>\n <br>\n </h5>\n </div>\n\n <div class="pull-right hidden-xs hidden-sm">\n <a ng-if="enableFilter" class="button button-text button-small ink icon ion-clock" ng-class="{\'button-text-positive\': search.type==\'last\'}" ng-click="doSearchLast()">\n {{\'GROUP.LOOKUP.BTN_LAST\' | translate}}\n </a>\n &nbsp;\n <button class="button button-small button-stable ink" ng-click="doSearchText()">\n {{\'COMMON.BTN_SEARCH\' | translate:search}}\n </button>\n </div>\n </div>\n\n <ion-list class="list {{ionListClass}}">\n\n <ng-include src="\'plugins/es/templates/group/items_groups.html\'"></ng-include>\n\n </ion-list>\n\n <ion-infinite-scroll ng-if="search.hasMore" spinner="android" on-infinite="showMore()" distance="1%">\n </ion-infinite-scroll>\n\n</div>'),e.put("plugins/es/templates/group/lookup.html",'<ion-view class="view-group">\n <ion-nav-title>\n <span translate>GROUP.LOOKUP.TITLE</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n\n <button class="button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showActionsPopover($event)">\n </button>\n\n </ion-nav-buttons>\n\n <ion-content class="padding no-padding-xs" scroll="true">\n <ng-include src="\'plugins/es/templates/group/lookup_form.html\'"></ng-include>\n </ion-content>\n</ion-view>\n'),e.put("plugins/es/templates/group/modal_record_type.html",'<ion-modal-view>\n <ion-header-bar class="bar-positive">\n <button class="button button-clear" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button>\n <h1 class="title" translate>GROUP.TYPE.TITLE</h1>\n </ion-header-bar>\n\n <ion-content class="lookupForm padding">\n <h3 translate>GROUP.TYPE.SELECT_TYPE</h3>\n\n \t<div class="list">\n\n \x3c!-- open group --\x3e\n <div class="item item-complex card stable-bg item-icon-left ink" ng-click="closeModal(\'open\')">\n <div class="item-content item-text-wrap">\n <i class="item-image icon ion-android-people dark"></i>\n <h2 translate>GROUP.TYPE.OPEN_GROUP</h2>\n <h4 class="gray" translate>GROUP.TYPE.OPEN_GROUP_HELP</h4>\n </div>\n </div>\n\n \x3c!-- managed group --\x3e\n <div class="item item-complex card stable-bg item-icon-left ink" ng-click="closeModal(\'managed\')">\n <div class="item-content item-text-wrap">\n <i class="item-image icon ion-android-people dark"></i>\n <i class="icon-secondary ion-android-lock dark" style="left: 10px; top: -8px;"></i>\n <h2 translate>GROUP.TYPE.MANAGED_GROUP</h2>\n <h4 class="gray" translate>GROUP.TYPE.MANAGED_GROUP_HELP</h4>\n </div>\n </div>\n\n </div>\n</ion-content>\n</ion-modal-view>\n'),e.put("plugins/es/templates/group/view_record.html",'<ion-view left-buttons="leftButtons">\n <ion-nav-title>\n\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <button class="button button-bar button-icon button-clear visible-xs visible-sm" ng-click="edit()" ng-if="canEdit">\n <i class="icon ion-android-create"></i>\n </button>\n <button class="button button-bar button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showActionsPopover($event)">\n </button>\n </ion-nav-buttons>\n\n <ion-content scroll="true">\n <div class="positive-900-bg hero">\n <div class="content" ng-if="!loading">\n <i class="avatar cion-registry-{{formData.type}}" ng-if="!formData.thumbnail"></i>\n <i class="avatar" style="background-image: url({{::formData.thumbnail.src}})" ng-if="formData.thumbnail"></i>\n <h3 ng-bind-html="formData.title"></h3>\n <h4>&nbsp;</h4>\n </div>\n <h4 class="content light" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </h4>\n </div>\n\n <div class="row no-padding-xs">\n <div class="col col-20 hidden-xs hidden-sm">&nbsp;\n </div>\n\n <div class="col list item-text-wrap no-padding-xs" ng-class="motion.ionListClass">\n\n <div class="item">\n <h2 class="gray">\n <a ng-if="formData.city" ui-sref="app.groups({location:formData.city})">\n <i class="icon ion-location"></i>\n <span ng-bind-html="formData.city"></span>\n </a>\n <span ng-if="formData.city && formData.type">&nbsp;|&nbsp;</span>\n <a ng-if="formData.type" ui-sref="app.groups({type:formData.type})">\n <i class="icon ion-flag"></i>\n {{\'GROUP.TYPE.ENUM.\'+formData.type|upper|translate}}\n </a>\n </h2>\n <h4>\n <i class="icon ion-clock" ng-if="formData.time"></i>\n <span translate>COMMON.SUBMIT_BY</span>\n <a ng-class="{\'positive\': issuer.name, \'gray\': !issuer.name}" ui-sref="app.user_identity({pubkey:issuer.pubkey, name: issuer.name})">\n <ng-if ng-if="issuer.name">\n <i class="icon ion-person"></i>\n {{::issuer.name}}\n </ng-if>\n <span ng-if="!issuer.name">\n <i class="icon ion-key"></i>\n {{issuer.pubkey|formatPubkey}}\n </span>\n </a>\n <span>\n {{formData.time|formatFromNow}}\n <h4 class="gray hidden-xs">|\n {{formData.time | formatDate}}\n </h4>\n </span>\n </h4>\n </div>\n\n \x3c!-- Buttons bar--\x3e\n <div class="item large-button-bar hidden-xs hidden-sm">\n <button class="button button-stable button-small-padding icon ion-android-share-alt" ng-click="showSharePopover($event)">\n </button>\n <button class="button button-stable icon-left ink-dark" ng-if="canEdit" ng-click="delete()">\n <i class="icon ion-trash-a assertive"></i>\n <span class="assertive"> {{\'COMMON.BTN_DELETE\' | translate}}</span>\n </button>\n <button class="button button-calm icon-left ion-android-create ink" ng-if="canEdit" ng-click="edit()">\n {{\'COMMON.BTN_EDIT\' | translate}}\n </button>\n </div>\n\n <ion-item>\n <h2>\n <span class="text-keep-lines" ng-bind-html="formData.description"></span>\n </h2>\n </ion-item>\n\n <ion-item>\n <h4 ng-if="formData.address">\n <span class="gray" translate>REGISTRY.VIEW.LOCATION</span>\n <a class="positive" target="_blank" href="https://www.google.fr/maps/?q={{formData.address}},%20{{formData.city}}">\n <span ng-bind-html="formData.address"></span>\n <span ng-if="formData.city"> - </span>\n <span ng-bind-html="formData.city"></span>\n </a>\n </h4>\n </ion-item>\n\n \x3c!-- Socials networks --\x3e\n <ng-if ng-if="formData.socials && formData.socials.length>0">\n <ion-item class="item-icon-left" type="no-padding item-text-wrap" ng-repeat="social in formData.socials track by social.url" id="social-{{social.url|formatSlug}}">\n <i class="icon ion-social-{{social.type}}" ng-class="{\'ion-bookmark\': social.type == \'other\', \'ion-link\': social.type == \'web\', \'ion-email\': social.type == \'email\'}"></i>\n <p ng-if="social.type && social.type != \'web\'">{{social.type}}</p>\n <h2>\n <a href="{{social.url}}" ng-if="social.type != \'email\'" target="_blank">{{social.url}}</a>\n <a href="mailto:{{social.url}}" ng-if="social.type == \'email\'">{{social.url}}</a>\n </h2>\n </ion-item>\n </ng-if>\n\n <div class="lazy-load">\n\n \x3c!-- pictures --\x3e\n <ng-include src="\'plugins/es/templates/common/view_pictures.html\'"></ng-include>\n\n\n <span class="item item-divider" ng-if="formData.pubkey">\n <span translate>REGISTRY.TECHNICAL_DIVIDER</span>\n </span>\n\n \x3c!-- pubkey --\x3e\n <div class="item item-icon-left item-text-wrap ink" ng-if="formData.pubkey" copy-on-click="{{::formData.pubkey}}">\n <i class="icon ion-key"></i>\n <span translate>REGISTRY.EDIT.RECORD_PUBKEY</span>\n <h4 class="dark">{{::formData.pubkey}}</h4>\n </div>\n\n \x3c!-- comments --\x3e\n <ng-include src="\'plugins/es/templates/common/view_comments.html\'"></ng-include>\n </div>\n </div>\n\n <div class="col col-20 hidden-xs hidden-sm">&nbsp;\n </div>\n </div>\n </ion-content>\n\n\n\n</ion-view>\n'),e.put("plugins/es/templates/home/home_extend.html",'\x3c!-- notifications --\x3e\n<ng-if ng-if=":state:extensionPoint=== \'header-buttons\'" class="visible-xs visible-sm">\n \x3c!-- messages --\x3e\n <button class="button button-clear icon ion-email" ng-if="login && $root.walletData.messages.unreadCount" ui-sref="app.user_message">\n <span ng-if="$root.walletData.messages.unreadCount" class="badge badge-button badge-positive">{{$root.walletData.messages.unreadCount}}</span>\n </button>\n\n \x3c!-- notifications --\x3e\n <button class="button button-clear icon ion-android-notifications" ng-if="login && $root.walletData.notifications.unreadCount" ui-sref="app.view_notifications">\n <span class="badge badge-button badge-positive">{{$root.walletData.notifications.unreadCount}}</span>\n </button>\n</ng-if>\n'),e.put("plugins/es/templates/join/modal_join_extend.html",'<ng-if ng-if=":state:enable && extensionPoint === \'select-account-type\'">\n\n \x3c!-- ornigzation wallet --\x3e\n <div class="item item-complex card stable-bg item-icon-left item-icon-right ink" ng-class="{ activated: accountTypeMember != null && !accountTypeMember }" ng-click="selectAccountType(\'organization\')">\n <div class="item-content item-text-wrap">\n <i class="item-image icon dark cion-registry-association"></i>\n <h2 translate>ACCOUNT.NEW.ORGANIZATION_ACCOUNT</h2>\n <h4 class="gray" translate>ACCOUNT.NEW.ORGANIZATION_ACCOUNT_HELP</h4>\n <i class="icon dark ion-ios-arrow-right"></i>\n </div>\n </div>\n\n</ng-if>\n\n\x3c!-- Add a slide --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'last-slide\'">\n\n \x3c!-- STEP 6: organization type --\x3e\n <ion-slide-page>\n <ion-content class="has-header" scroll="false">\n\n <p>TOTO</p>\n\n </ion-content>\n </ion-slide-page>\n\n</ng-if>\n'),e.put("plugins/es/templates/menu_extend.html",'\n\x3c!-- Main section --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'menu-discover\'">\n <ion-item menu-close ng-if="$root.settings.expertMode" class="item item-icon-left" active-link="active" active-link-path-prefix="#/app/network/data" ui-sref="app.es_network">\n <i class="icon ion-cloud"></i>\n <span translate>MENU.NETWORK</span>\n </ion-item>\n <a id="helptip-menu-btn-network"></a>\n\n</ng-if>\n\n\x3c!-- Toolbar section --\x3e\n<div ng-if=":state:enable && extensionPoint === \'nav-buttons-right\'" class="hidden-xs hidden-sm">\n\n \x3c!-- messages --\x3e\n <button class="button button-clear icon ion-email" ng-if="login" active-link="gray" active-link-path-prefix="#/app/message" ng-click="showMessagesPopover($event)">\n <span ng-if="$root.walletData.messages.unreadCount" class="badge badge-button badge-positive">{{walletData.messages.unreadCount}}</span>\n </button>\n\n \x3c!-- notifications --\x3e\n <button class="button button-clear icon ion-android-notifications" ng-if="login" active-link="gray" active-link-path-prefix="#/app/notifications" ng-click="showNotificationsPopover($event)">\n <span ng-if="walletData.notifications.unreadCount" class="badge badge-button badge-positive">{{walletData.notifications.unreadCount}}</span>\n </button>\n</div>\n\n\x3c!-- User section --\x3e\n<div ng-if=":state:enable && extensionPoint === \'menu-user\'" class="visible-xs visible-sm">\n\n <a menu-close class="item item-icon-left" active-link="active" active-link-path-prefix="#/app/message" ng-class="{\'item-menu-disable\': !login}" ng-click="loginAndGo(\'app.user_message\')">\n <i class="icon ion-email"></i>\n <span translate>MENU.MESSAGES</span>\n <span class="badge badge-positive" ng-if="walletData.messages.unreadCount">{{walletData.messages.unreadCount}}</span>\n </a>\n\n <a menu-close class="item item-icon-left" active-link="active" active-link-path-prefix="#/app/notifications" ng-class="{\'item-menu-disable\': !login}" ng-click="loginAndGo(\'app.view_notifications\')">\n <i class="icon ion-android-notifications"></i>\n <span translate>MENU.NOTIFICATIONS</span>\n <span class="badge badge-positive" ng-if="walletData.notifications.unreadCount">{{walletData.notifications.unreadCount}}</span>\n </a>\n\n</div>\n'),e.put("plugins/es/templates/message/compose_form.html",' <form name="messageForm" novalidate="" ng-submit="doSend()">\n\n <div class="list no-margin" ng-init="setForm(messageForm)">\n\n <a class="item item-icon-right gray ink" ng-class="{\'item-input-error\': form.$submitted && !formData.destPub}" ng-click="showWotLookupModal()">\n <span class="gray" translate>MESSAGE.COMPOSE.TO</span>\n <span class="badge badge-royal" ng-if="destUid"><i class="ion-person"></i>&nbsp;{{destUid}}</span>&nbsp;\n <i class="gray icon ion-ios-arrow-right"></i>\n </a>\n <div class="form-errors" ng-if="form.$submitted && !formData.destPub">\n <div class="form-error">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n <div class="item item-text-wrap">\n <span class="gray" translate>TRANSFER.FROM</span>\n <span class="badge badge-balanced">\n <ion-spinner icon="android" ng-if="!$root.walletData.pubkey"></ion-spinner>\n <span ng-if="$root.walletData.pubkey && !$root.walletData.name">\n {{$root.walletData.pubkey| formatPubkey}}&nbsp;&nbsp;\n </span>\n <span ng-if="$root.walletData.pubkey && $root.walletData.name">\n {{$root.walletData.name}}\n </span>\n </span>\n </div>\n\n \x3c!-- Object --\x3e\n <div class="item item-input" ng-class="{\'item-input-error\': form.$submitted && form.title.$invalid}">\n \x3c!--<span class="input-label">{{\'MESSAGE.COMPOSE.OBJECT\' | translate}}</span>--\x3e\n <input type="text" placeholder="{{\'MESSAGE.COMPOSE.OBJECT_HELP\' | translate}}" name="title" ng-model="formData.title" ng-maxlength="256" required>\n \n </div>\n <div class="form-errors" ng-show="form.$submitted && form.title.$error" ng-messages="form.title.$error">\n <div class="form-error" ng-message="maxlength">\n <span translate="MESSAGE.ERROR.MESSAGE_CONTENT_TOO_LONG" translate-values="{maxLength: 256}"></span>\n </div>\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n \x3c!-- Content --\x3e\n <div class="item item-input item-floating-label" ng-class="{\'item-input-error\': form.$submitted && form.content.$invalid}">\n <span class="input-label">{{\'MESSAGE.COMPOSE.MESSAGE\' | translate}}</span>\n <textarea placeholder="{{\'MESSAGE.COMPOSE.MESSAGE_HELP\' | translate}}" name="content" ng-model="formData.content" rows="8" ng-maxlength="5000">\n </textarea>\n </div>\n <div class="form-errors" ng-show="form.$submitted && form.content.$error" ng-messages="form.content.$error">\n <div class="form-error" ng-message="maxlength">\n <span translate="MESSAGE.ERROR.MESSAGE_CONTENT_TOO_LONG" translate-values="{maxLength: 5000}"></span>\n </div>\n </div>\n\n </div>\n\n <div class="padding hidden-xs text-right">\n <button class="button button-clear button-dark ink" ng-click="cancel()" type="button" translate>COMMON.BTN_CANCEL</button>\n <button class="button button-positive ink" type="submit" translate>TRANSFER.BTN_SEND</button>\n </div>\n\n \x3c!-- Encryption info --\x3e\n <div class="list no-padding">\n <div class="item item-icon-left item-text-wrap">\n <i class="icon ion-ios-information-outline positive"></i>\n <h4 class="positive" translate>MESSAGE.COMPOSE.ENCRYPTED_HELP</h4>\n </div>\n </div>\n </form>\n\n'),e.put("plugins/es/templates/message/compose.html",'<ion-view left-buttons="leftButtons" id="composeMessage">\n <ion-nav-title>\n <span class="visible-xs visible-sm" nf-if="!isReply" translate>MESSAGE.COMPOSE.TITLE</span>\n <span class="visible-xs visible-sm" nf-if="isReply" translate>MESSAGE.COMPOSE.TITLE_REPLY</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <button class="button button-icon button-clear icon ion-android-send visible-xs" ng-click="doSend()">\n </button>\n </ion-nav-buttons>\n\n <ion-content scroll="true">\n <div class="row">\n <div class="col col-20 hidden-xs hidden-sm">&nbsp;</div>\n <div class="col">\n <h2 class="hidden-xs hidden-sm">\n {{\'MESSAGE.COMPOSE.SUB_TITLE\'|translate}}\n </h2>\n <h4 class="hidden-xs hidden-sm">&nbsp;</h4>\n <ng-include src="\'plugins/es/templates/message/compose_form.html\'"></ng-include>\n </div>\n <div class="col col-20 hidden-xs hidden-sm">&nbsp;</div>\n </div>\n </ion-content>\n</ion-view>\n'),e.put("plugins/es/templates/message/list.html",'<ion-view left-buttons="leftButtons" class="view-messages">\n <ion-nav-title>\n <span translate>MESSAGE.LIST.TITLE</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n\n <button class="button button-icon button-clear icon ion-loop visible-xs visible-sm" ng-click="load()">\n </button>\n\n <button class="button button-icon button-clear visible-xs visible-sm" ng-click="showActionsPopover($event)">\n <i class="icon ion-android-more-vertical"></i>\n </button>\n </ion-nav-buttons>\n\n <ion-content class="padding no-padding-xs">\n <ion-refresher pulling-text="{{\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="refresh(true)">\n </ion-refresher>\n\n \x3c!-- Buttons bar--\x3e\n <ion-list>\n <div class="item large-button-bar hidden-xs hidden-sm">\n\n <button class="button button-stable button-small-padding icon ion-loop" ng-click="load()">\n </button>\n\n <button class="button button-calm icon ion-compose" ng-click="showNewMessageModal()">\n {{\'MESSAGE.BTN_COMPOSE\' | translate}}\n </button>\n\n <button class="button button-stable icon-right ink" ng-click="showActionsPopover($event)">\n &nbsp; <i class="icon ion-android-more-vertical"></i>&nbsp;\n {{\'COMMON.BTN_OPTIONS\' | translate}}\n </button>\n </div>\n\n <div class="pull-right hidden-xs hidden-sm">\n <a class="button button-text button-small ink icon ion-archive" ng-class="{\'button-text-positive\': type==\'inbox\'}" ng-click="setType(\'inbox\')">\n {{\'MESSAGE.LIST.INBOX\' | translate}}\n </a>\n &nbsp;\n <a class="button button-text button-small ink icon ion-paper-airplane" ng-class="{\'button-text-positive\': type==\'outbox\'}" ng-click="setType(\'outbox\')" class="badge-balanced">\n {{\'MESSAGE.LIST.OUTBOX\' | translate}}\n </a>\n </div>\n\n <div class="center padding" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n </ion-list>\n\n <ion-list class="{{::motion.ionListClass}}" can-swipe="$root.device.enable" ng-hide="loading">\n\n <div class="padding gray" ng-if="!messages.length">\n <span ng-if="type==\'inbox\'" translate>MESSAGE.NO_MESSAGE_INBOX</span>\n <span ng-if="type==\'outbox\'" translate>MESSAGE.NO_MESSAGE_OUTBOX</span>\n </div>\n\n <ion-item class="item item-border-large item-avatar item-icon-right ink" ng-repeat="msg in messages" ui-sref="app.user_view_message({type:type, id:msg.id})">\n\n <i ng-if="::!msg.avatar" class="item-image icon" ng-class="{\'ion-person\': msg.name, \'ion-email\': !msg.name}"></i>\n <i ng-if="::msg.avatar" class="item-image avatar" style="background-image: url({{::msg.avatar.src}})"></i>\n\n <h4 class="pull-right hidden-xs hidden-sm">\n <span class="dark"><i class="ion-clock"></i> {{::msg.time|formatFromNow}}</span>\n <span class="gray">| {{::msg.time|formatDate}}</span>\n </h4>\n <h4 class="pull-right visible-xs visible-sm dark"><i class="ion-clock"></i> {{::msg.time|formatFromNow}}</h4>\n <h3>\n <a class="positive" ng-if="::msg.name" ui-sref="app.user_identity({pubkey:msg.issuer, name:msg.name})">\n <i class="ion-person"></i>\n {{::msg.name}}\n </a>\n <a class="gray" ng-if="::!msg.name" ui-sref="app.user_identity({pubkey:msg.issuer})">\n <i class="ion-key"></i>\n {{::msg.issuer|formatPubkey}}\n </a>\n </h3>\n <h2 ng-class="{\'unread\': !msg.read}">{{::msg.title}}</h2>\n <p>{{::msg.summary||msg.content}}</p>\n <i class="icon ion-ios-arrow-right"></i>\n <ion-option-button class="button-stable" ng-click="showReplyModal($index)" translate>MESSAGE.BTN_REPLY</ion-option-button>\n <ion-option-button class="button-assertive" ng-click="delete($index)" translate>COMMON.BTN_DELETE</ion-option-button>\n\n </ion-item>\n </ion-list>\n </ion-content>\n\n <button id="fab-add-message-record" class="button button-fab button-fab-bottom-right button-assertive icon ion-compose visible-xs visible-sm spin" ng-click="showNewMessageModal()">\n </button>\n</ion-view>\n'),e.put("plugins/es/templates/message/lookup_popover_actions.html",'<ion-popover-view class="fit has-header">\n <ion-header-bar>\n <h1 class="title" translate>MESSAGE.LIST.POPOVER_ACTIONS.TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n <a class="item item-icon-left ink" ng-class="{\'gray\': (type != \'inbox\' && !messages.length)}" ng-click="markAllAsRead()">\n <i class="icon ion-android-checkmark-circle"></i>\n {{\'COMMON.NOTIFICATIONS.MARK_ALL_AS_READ\' | translate}}\n </a>\n\n <a class="item item-icon-left assertive ink" ng-class="{\'gray\': !messages.length}" ng-click="deleteAll()">\n <i class="icon ion-trash-a"></i>\n {{\'MESSAGE.LIST.POPOVER_ACTIONS.DELETE_ALL\' | translate}}\n </a>\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/es/templates/message/modal_compose.html",'<ion-modal-view id="composeMessage" class="modal-full-height">\n <ion-header-bar class="bar-positive">\n <button class="button button-clear visible-xs" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button>\n <h1 class="title" ng-if="!isReply" translate>MESSAGE.COMPOSE.TITLE</h1>\n <h1 class="title" ng-if="isReply" translate>MESSAGE.COMPOSE.TITLE_REPLY</h1>\n\n <button class="button button-icon button-clear icon ion-android-send visible-xs" ng-click="doSend()">\n </button>\n </ion-header-bar>\n\n <ion-content scroll="true">\n <ng-include src="\'plugins/es/templates/message/compose_form.html\'"></ng-include>\n </ion-content>\n</ion-modal-view>\n'),e.put("plugins/es/templates/message/popover_message.html",'<ion-popover-view class="fit hidden-xs hidden-sm popover-notification" ng-controller="PopoverMessageCtrl">\n <ion-header-bar class="stable-bg block">\n <div class="title" translate>MESSAGE.NOTIFICATIONS.TITLE</div>\n\n <div class="pull-right">\n <a class="positive" ng-click="showNewMessageModal()" translate>MESSAGE.BTN_COMPOSE</a>\n </div>\n </ion-header-bar>\n <ion-content scroll="true">\n <div class="center" ng-if="search.loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n <div class="padding gray" ng-if="!search.loading && !search.results.length" translate>\n MESSAGE.NO_MESSAGE_INBOX\n </div>\n\n <ion-list>\n\n <ion-item ng-repeat="notification in search.results" class="item-border-large item-text-wrap ink item-avatar" ng-class="{\'unread\': !notification.read}" ng-click="select(notification)">\n\n <i ng-if="::!notification.avatar" class="item-image icon ion-email"></i>\n <i ng-if="::notification.avatar" class="item-image avatar" style="background-image: url({{::notification.avatar.src}})"></i>\n\n <h3>\n <span translate>MESSAGE.NOTIFICATIONS.MESSAGE_RECEIVED</span>\n <span class="positive" ng-if="::notification.name"><i class="ion-person"></i>&thinsp;{{::notification.name}}</span>\n <span class="gray" ng-if="::!notification.name"><i class="ion-key"></i>&thinsp;{{::notification.issuer|formatPubkey}}</span>\n </h3>\n <h4>\n <i class="icon ion-archive balanced"></i>&thinsp;<span class="dark">{{notification.time|formatFromNow}}</span>\n <span class="gray">| {{::notification.time|formatDate}}</span>\n </h4>\n </ion-item>\n </ion-list>\n\n <ion-infinite-scroll ng-if="!search.loading && search.hasMore" spinner="android" on-infinite="showMore()" distance="1%">\n </ion-infinite-scroll>\n </ion-content>\n\n <ion-footer-bar class="stable-bg block">\n\n \x3c!-- show all --\x3e\n <div class="pull-right">\n <a class="positive" ui-sref="app.user_message" ng-click="closePopover()" translate>COMMON.NOTIFICATIONS.SHOW_ALL</a>\n </div>\n </ion-footer-bar>\n</ion-popover-view>\n'),e.put("plugins/es/templates/message/view_message.html",'<ion-view left-buttons="leftButtons" class="view-message">\n <ion-nav-title>\n <span translate>MESSAGE.VIEW.TITLE</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n\n <button class="button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showActionsPopover($event)">\n </button>\n </ion-nav-buttons>\n\n <ion-content scroll="true">\n\n <div class="row no-padding">\n <div class="col col-20 hidden-xs hidden-sm">&nbsp;</div>\n\n <div class="col no-padding">\n\n <div class="center padding" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="list animate-fade-slide-in item-text-wrap">\n\n \x3c!-- Buttons bar--\x3e\n <div class="item large-button-bar hidden-xs hidden-sm">\n <button class="button button-stable icon-left ink-dark" ng-click="delete()">\n <i class="icon ion-trash-a assertive"></i>\n <span class="assertive"> {{\'COMMON.BTN_DELETE\' | translate}}</span>\n </button>\n <button class="button button-stable icon ion-reply" ng-click="showReplyModal()">\n {{\'MESSAGE.BTN_REPLY\' | translate}}\n </button>\n \x3c!--<button class="button button-small button-stable icon ion-reply"\n ng-click="showForwardModal()">\n {{\'MESSAGE.BTN_FORWARD\' | translate}}\n </button>--\x3e\n </div>\n\n <div class="item item-avatar" ng-class="{\'item-avatar\': formData.avatar}">\n\n <i ng-if="!formData.avatar" class="item-image ion-person"></i>\n <i ng-if="formData.avatar" class="item-image avatar" style="background-image: url({{::formData.avatar.src}})"></i>\n\n <h1 class="title hidden-xs hidden-sm" ng-bind-html="formData.title"></h1>\n <h4>\n {{type == \'inbox\' ? \'MESSAGE.VIEW.SENDER\': \'MESSAGE.VIEW.RECIPIENT\'|translate}}\n <a class="positive" ui-sref="app.user_identity({pubkey: (type == \'inbox\') ? formData.issuer : formData.recipient, uid: formData.name||formData.uid})">\n <span ng-if="formData.name||formData.uid">\n <i class="ion-person"></i>\n {{formData.name||formData.uid}}\n </span>\n <span ng-if="!formData.name&&!formData.uid" class="gray">\n <i class="ion-key gray"></i>\n {{formData.issuer|formatPubkey}}\n </span>\n </a>\n <span class="hidden-xs hidden-sm">\n <i class="ion-clock"></i>\n {{formData.time|formatFromNow}}\n <span class="gray">|\n {{formData.time | formatDate}}\n </span>\n </span>\n </h4>\n <h5 class="gray visible-xs visible-sm">\n <i class="ion-clock"></i> {{formData.time | formatDate}}\n </h5>\n </div>\n\n \x3c!-- content --\x3e\n <ion-item class="visible-xs visible-sm">\n <h1 class="title" ng-bind-html="formData.title"></h1>\n </ion-item>\n\n \x3c!-- content --\x3e\n <ion-item>\n <p ng-bind-html="formData.html">\n </p>\n\n <div class="padding gray" ng-if="!formData.content" translate>\n MESSAGE.VIEW.NO_CONTENT\n </div>\n </ion-item>\n\n\n </div>\n </div>\n\n <div class="col col-20 hidden-xs hidden-sm">&nbsp;</div>\n </div>\n </ion-content>\n\n <button id="fab-view-message-reply" class="button button-fab button-fab-bottom-right button-calm icon ion-reply visible-xs visible-sm spin" ng-click="showReplyModal()">\n </button>\n</ion-view>\n'),e.put("plugins/es/templates/message/view_popover_actions.html",'<ion-popover-view class="fit has-header">\n <ion-header-bar>\n <h1 class="title" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n\n <a class="item item-icon-left assertive ink" ng-click="delete()">\n <i class="icon ion-trash-a"></i>\n {{\'MESSAGE.VIEW.DELETE\' | translate}}\n </a>\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/es/templates/network/item_content_peer.html",'\n <i class="icon ion-android-desktop" ng-class=":rebind:{\'balanced\': peer.online && peer.hasMainConsensusBlock, \'energized\': peer.online && peer.hasConsensusBlock, \'gray\': peer.online && !peer.hasConsensusBlock && !peer.hasMainConsensusBlock, \'stable\': !peer.online}" ng-if=":rebind:!peer.avatar"></i>\n <b class="icon-secondary ion-person" ng-if=":rebind:!peer.avatar" ng-class=":rebind:{\'balanced\': peer.online && peer.hasMainConsensusBlock, \'energized\': peer.online && peer.hasConsensusBlock, \'gray\': peer.online && !peer.hasConsensusBlock && !peer.hasMainConsensusBlock, \'stable\': !peer.online}" style="left: 26px; top: -3px;"></b>\n <i class="avatar" ng-if=":rebind:peer.avatar" style="background-image: url(\'{{:rebind:peer.avatar.src}}\')"></i>\n <b class="icon-secondary assertive ion-close-circled" ng-if=":rebind:!peer.online" style="left: 37px; top: -10px;"></b>\n\n <div class="row no-padding">\n <div class="col no-padding">\n <h3 class="dark">{{:rebind:peer.dns || peer.server}}</h3>\n <h4>\n <span class="gray" ng-if=":rebind:!peer.name">\n <i class="ion-key"></i> {{:rebind:peer.pubkey|formatPubkey}}\n </span>\n <span class="positive" ng-if=":rebind:peer.name">\n <i class="ion-person"></i> {{:rebind:peer.name}}\n </span>\n <span class="gray">{{:rebind:peer.dns && (\' | \' + peer.server) + (peer.ep.path||\'\') }}</span>\n </h4>\n </div>\n <div class="col col-15 no-padding text-center hidden-xs hidden-sm" ng-if="::expertMode">\n <div style="min-width: 50px; padding-top: 5px;">\n <span ng-if=":rebind:peer.isSsl()" title="SSL">\n <i class="ion-locked"></i><small class="hidden-md"> SSL</small>\n </span>\n <span ng-if=":rebind:peer.hasEndpoint(\'GCHANGE_SUBSCRIPTION_API\')" title="{{\'ES_PEER.EMAIL_SUBSCRIPTION_COUNT\'|translate: peer.docCount }}">\n <i class="ion-email"></i> {{:rebind:peer.docCount.emailSubscription || \'?\'}}\n </span>\n </div>\n <div ng-if=":rebind:peer.isTor()">\n <i class="ion-bma-tor-api"></i>\n </div>\n <div ng-if=":rebind:peer.isWs2p()&&peer.isTor()" ng-click="showWs2pPopover($event, peer)">\n <i class="ion-bma-tor-api"></i>\n </div>\n </div>\n <div class="col col-20 no-padding text-center" ng-if="::!expertMode && search.type != \'offline\'">\n <div style="min-width: 50px; padding-top: 5px;" ng-if=":rebind:peer.docCount.emailSubscription!==undefined">\n <span ng-if=":rebind:peer.hasEndpoint(\'GCHANGE_SUBSCRIPTION_API\')" title="{{\'ES_PEER.EMAIL_SUBSCRIPTION_COUNT\'|translate: peer.docCount }}">\n <i class="ion-email"></i> {{:rebind:peer.docCount.emailSubscription || \'?\'}}\n </span>\n </div>\n </div>\n <div class="col col-20 no-padding text-center" ng-if="::expertMode && search.type != \'offline\'">\n <h4 class="hidden-sm hidden-xs gray">\n {{:rebind:peer.software||\'?\'}}\n </h4>\n <h4 class="hidden-sm hidden-xs gray">{{:rebind: peer.version ? (\'v\'+peer.version) : \'\'}}</h4>\n </div>\n <div class="col col-20 no-padding text-center" id="{{$index === 0 ? helptipPrefix + \'-peer-0-block\' : \'\'}}">\n <span class="badge badge-stable">\n {{:rebind:peer.docCount.record !== undefined ? (peer.docCount.record|formatInteger) : \'?\'}}\n <span ng-if=":rebind:!expertMode && peer.docCount.record!==undefined">\n {{::\'ES_PEER.DOCUMENTS\'|translate|lowercase }}\n </span>\n </span>\n <span class="badge badge-secondary" ng-class=":rebind:{\'balanced\': peer.hasMainConsensusBlock, \'energized\': peer.hasConsensusBlock, \'ng-hide\': !peer.currentNumber }" ng-if="::expertMode">\n {{:rebind:\'BLOCKCHAIN.VIEW.TITLE\'|translate: {number:peer.currentNumber} }}\n </span>\n\n </div>\n </div>\n'),e.put("plugins/es/templates/network/items_peers.html",'<div ng-class="::motion.ionListClass" class="no-padding">\n\n <div class="item item-text-wrap no-border done in gray no-padding-top no-padding-bottom inline text-italic" ng-if="::isHttps && expertMode">\n <small><i class="icon ion-alert-circled"></i> {{::\'NETWORK.INFO.ONLY_SSL_PEERS\'|translate}}</small>\n </div>\n\n <div class="item row row-header hidden-xs hidden-sm done in" ng-if="::expertMode">\n <a class="col col-header no-padding dark" ng-click="toggleSort(\'name\')">\n <cs-sort-icon asc="search.asc" sort="search.sort" toggle="\'name\'"></cs-sort-icon>\n {{::\'ES_PEER.NAME\' | translate}} / {{::\'COMMON.PUBKEY\' | translate}}\n </a>\n <a class="no-padding dark hidden-md col col-15 col-header" ng-click="toggleSort(\'api\')">\n <cs-sort-icon asc="search.asc" sort="search.sort" toggle="\'api\'"></cs-sort-icon>\n {{::\'PEER.API\' | translate}}\n </a>\n <a class="no-padding dark col col-20 col-header" ng-click="toggleSort(\'difficulty\')">\n <cs-sort-icon asc="search.asc" sort="search.sort" toggle="\'software\'"></cs-sort-icon>\n {{::\'ES_PEER.SOFTWARE\' | translate}}\n </a>\n <a class="col col-20 col-header no-padding dark" ng-click="toggleSort(\'doc_count\')">\n <cs-sort-icon asc="search.asc" sort="search.sort" toggle="\'doc_count\'"></cs-sort-icon>\n {{::\'ES_PEER.DOCUMENTS\' | translate}}\n </a>\n </div>\n\n <div ng-repeat="peer in :rebind:search.results track by peer.id" class="item item-peer item-icon-left ink" ng-class="::ionItemClass" id="{{helptipPrefix}}-peer-{{$index}}" ng-click="selectPeer(peer)" ng-include="\'plugins/es/templates/network/item_content_peer.html\'">\n </div>\n\n</div>\n'),e.put("plugins/es/templates/network/lookup_popover_actions.html",'<ion-popover-view class="fit has-header">\n <ion-header-bar>\n <h1 class="title" translate>PEER.POPOVER_FILTER_TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n\n <a class="item item-icon-left item-icon-right ink" ng-click="toggleSearchType(\'member\')">\n <i class="icon ion-person"></i>\n {{\'PEER.MEMBERS\' | translate}}\n <i class="icon ion-ios-checkmark-empty" ng-show="search.type==\'member\'"></i>\n </a>\n\n <a class="item item-icon-left item-icon-right ink" ng-click="toggleSearchType(\'mirror\')">\n <i class="icon ion-radio-waves"></i>\n {{\'PEER.MIRRORS\' | translate}}\n <i class="icon ion-ios-checkmark-empty" ng-show="search.type==\'mirror\'"></i>\n </a>\n\n <a class="item item-icon-left item-icon-right ink" ng-click="toggleSearchType(\'offline\')">\n <i class="icon ion-eye-disabled"></i>\n {{\'PEER.OFFLINE\' | translate}}\n <i class="icon ion-ios-checkmark-empty" ng-show="search.type==\'offline\'"></i>\n </a>\n\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/es/templates/network/modal_network.html",'<ion-modal-view id="nodes" class="modal-full-height" cache-view="false">\n <ion-header-bar class="bar-positive">\n <button class="button button-clear" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button>\n <h1 class="title" translate>PEER.PEER_LIST</h1>\n <div class="buttons buttons-right header-item">\n <span class="secondary">\n <button class="button button-clear icon ion-loop button-clear" ng-click="refresh()">\n\n </button>\n <button class="button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showActionsPopover($event)">\n </button>\n </span>\n </div>\n </ion-header-bar>\n\n <ion-content>\n <div class="list">\n <div class="padding padding-xs" style="display: block; height: 60px;">\n\n <div class="pull-left">\n <h4>\n <span ng-if="!enableFilter || !search.type" translate>PEER.ALL_PEERS</span>\n <span ng-if="!search.loading">({{search.results.length}})</span>\n </h4>\n </div>\n\n <div class="pull-right">\n <ion-spinner class="icon" icon="android" ng-if="search.loading"></ion-spinner>&nbsp;\n </div>\n </div>\n\n <ng-include src="\'plugins/es/templates/network/items_peers.html\'"></ng-include>\n\n\t </div>\n </ion-content>\n</ion-modal-view>\n'),e.put("plugins/es/templates/network/popover_endpoints.html",'<ion-popover-view class="popover-endpoints popover-light" style="height: {{(titleKey?30:0)+((!items || items.length &lt;= 1) ? 55 : 3+items.length*52)}}px">\n <ion-header-bar class="bar bar-header stable-bg" ng-if="titleKey">\n <div class="title">\n {{titleKey | translate:titleValues }}\n </div>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list" ng-class="{\'has-header\': titleKey}">\n <div class="item item-text-wrap" ng-repeat="item in items">\n <div class="item-label" ng-if="item.label">{{item.label | translate}}</div>\n <div id="endpoint_{{$index}}" class="badge item-note dark">{{item.value}}\n </div>\n </div>\n </div></ion-content>\n</ion-popover-view>\n'),e.put("plugins/es/templates/network/popover_network.html",'<ion-popover-view class="fit hidden-xs hidden-sm popover-notification popover-network" ng-controller="NetworkLookupPopoverCtrl">\n <ion-header-bar class="stable-bg block">\n <div class="title">\n {{\'MENU.NETWORK\'|translate}}\n <ion-spinner class="ion-spinner-small" icon="android" ng-if="search.loading"></ion-spinner>\n </div>\n\n <div class="pull-right">\n <a ng-class="{\'positive\': search.type==\'member\', \'dark\': search.type!==\'member\'}" ng-click="toggleSearchType(\'member\')" translate>PEER.MEMBERS</a>\n </div>\n </ion-header-bar>\n <ion-content scroll="true">\n <div class="list no-padding">\n <ng-include src="\'plugins/es/templates/network/items_peers.html\'"></ng-include>\n </div>\n </ion-content>\n\n <ion-footer-bar class="stable-bg block">\n \x3c!-- settings --\x3e\n <div class="pull-left">\n <a class="positive" ui-sref="app.settings" ng-click="closePopover()" translate>COMMON.NOTIFICATIONS.SETTINGS</a>\n </div>\n\n \x3c!-- show all --\x3e\n <div class="pull-right">\n <a class="positive" ui-sref="app.es_network" ng-click="closePopover()" translate>COMMON.NOTIFICATIONS.SHOW_ALL</a>\n </div>\n </ion-footer-bar>\n</ion-popover-view>\n'),e.put("plugins/es/templates/network/popover_peer_info.html",'<ion-popover-view class="fit hidden-xs hidden-sm popover-notification popover-peer-info" ng-controller="PeerInfoPopoverCtrl">\n <ion-header-bar class="stable-bg block">\n <div class="title">\n {{\'PEER.VIEW.TITLE\'|translate}}\n </div>\n </ion-header-bar>\n <ion-content scroll="true">\n <div class="center padding" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="list no-padding" ng-if="!loading">\n\n <div class="item" ng-if=":rebind:formData.software">\n <i class="ion-outlet"></i>\n {{\'NETWORK.VIEW.SOFTWARE\'|translate}}\n <div class="badge" ng-class=":rebind:{\'badge-energized\': formData.isPreRelease, \'badge-assertive\': formData.hasNewRelease }">\n {{formData.software}} v{{:rebind:formData.version}}\n </div>\n <div class="gray badge badge-secondary" ng-if="formData.isPreRelease">\n <i class="ion-alert-circled"></i>\n <span ng-bind-html="\'NETWORK.VIEW.WARN_PRE_RELEASE\'|translate: formData.latestRelease"></span>\n </div>\n <div class="gray badge badge-secondary" ng-if="formData.hasNewRelease">\n <i class="ion-alert-circled"></i>\n <span ng-bind-html="\'NETWORK.VIEW.WARN_NEW_RELEASE\'|translate: formData.latestRelease"></span>\n </div>\n </div>\n\n <div class="item">\n <i class="ion-locked"></i>\n {{\'NETWORK.VIEW.ENDPOINTS.BMAS\'|translate}}\n <div class="badge badge-balanced" ng-if=":rebind:formData.useSsl" translate>COMMON.BTN_YES</div>\n <div class="badge badge-assertive" ng-if=":rebind:!formData.useSsl" translate>COMMON.BTN_NO</div>\n </div>\n\n <div class="item">\n <i class="ion-cube"></i>\n {{\'BLOCKCHAIN.VIEW.TITLE_CURRENT\'|translate}}\n <div class="badge badge-balanced">\n {{:rebind:formData.number | formatInteger}}\n </div>\n </div>\n\n <div class="item">\n <i class="ion-clock"></i>\n {{\'CURRENCY.VIEW.MEDIAN_TIME\'|translate}}\n <div class="badge dark">\n {{:rebind:formData.medianTime | medianDate}}\n </div>\n </div>\n\n <div class="item">\n <i class="ion-lock-combination"></i>\n {{\'CURRENCY.VIEW.POW_MIN\'|translate}}\n <div class="badge dark">\n {{:rebind:formData.powMin | formatInteger}}\n </div>\n </div>\n\n \x3c!-- Allow extension here --\x3e\n <cs-extension-point name="default"></cs-extension-point>\n\n </div>\n </ion-content>\n\n <ion-footer-bar class="stable-bg block">\n \x3c!-- settings --\x3e\n <div class="pull-left">\n <a class="positive" ui-sref="app.settings" ng-click="closePopover()" translate>MENU.SETTINGS</a>\n </div>\n\n \x3c!-- show all --\x3e\n <div class="pull-right">\n <a class="positive" ui-sref="app.view_es_peer" ng-click="closePopover()" translate>PEER.BTN_SHOW_PEER</a>\n </div>\n </ion-footer-bar>\n</ion-popover-view>\n'),e.put("plugins/es/templates/network/view_es_network.html",'<ion-view>\n <ion-nav-title>\n <span translate>MENU.NETWORK</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <button class="button button-icon button-clear icon ion-loop visible-xs visible-sm" ng-click="refresh()">\n </button>\n </ion-nav-buttons>\n\n\n <ion-content scroll="true" ng-init="enableFilter=true; ionItemClass=\'item-border-large\';">\n\n <div class="row responsive-sm responsive-md responsive-lg">\n <div class="col list col-border-right">\n <div class="padding padding-xs" style="display: block; height: 60px;">\n <div class="pull-left">\n <h4>\n <span ng-if="enableFilter && !search.online" translate>PEER.OFFLINE_PEERS</span>\n <span ng-if="!enableFilter || search.online" translate>PEER.ALL_PEERS</span>\n <span ng-if="search.results.length">({{search.results.length}})</span>\n <ion-spinner ng-if="search.loading" class="icon ion-spinner-small" icon="android"></ion-spinner>\n </h4>\n </div>\n\n <div class="pull-right">\n\n <div class="pull-right" ng-if="enableFilter">\n\n <a class="button button-text button-small hidden-xs hidden-sm ink" ng-class="{\'button-text-positive\': !search.online, \'button-text-stable\': search.online}" ng-click="toggleOnline(!search.online)">\n <i class="icon ion-close-circled light-gray"></i>\n <span>{{\'PEER.OFFLINE\'|translate}}</span>\n </a>\n\n \x3c!-- Allow extension here --\x3e\n <cs-extension-point name="filter-buttons"></cs-extension-point>\n </div>\n </div>\n </div>\n\n <div id="helptip-network-peers" style="display: block"></div>\n\n <ng-include src="\'plugins/es/templates/network/items_peers.html\'"></ng-include>\n </div>\n\n <div class="col col-33" ng-controller="MkLastDocumentsCtrl">\n <div class="padding padding-xs" style="display: block;">\n <h4 translate>DOCUMENT.LOOKUP.LAST_DOCUMENTS_DOTS</h4>\n\n <div class="pull-right hidden-xs hidden-sm">\n <a class="button button-text button-small ink" ng-class="{\'button-text-positive\': compactMode, \'button-text-stable\': !compactMode}" ng-click="toggleCompactMode()">\n <i class="icon ion-navicon"></i>\n <b class="icon-secondary ion-arrow-down-b" style="top: -8px; left: 5px; font-size: 8px;"></b>\n <b class="icon-secondary ion-arrow-up-b" style="top: 3px; left: 5px; font-size: 8px;"></b>\n <span>{{\'DOCUMENT.LOOKUP.BTN_COMPACT\'|translate}}</span>\n </a>\n\n \x3c!-- Allow extension here --\x3e\n <cs-extension-point name="buttons"></cs-extension-point>\n\n <a class="button button-text button-small ink" ui-sref="app.document_search({index: search.index, type: search.type})">\n <i class="icon ion-android-search"></i>\n <span>{{\'COMMON.BTN_SEARCH\'|translate}}</span>\n </a>\n\n </div>\n </div>\n\n <ng-include src="\'plugins/market/templates/document/list_documents.html\'"></ng-include>\n\n </div>\n </div>\n </ion-content>\n</ion-view>\n'),e.put("plugins/es/templates/network/view_es_peer.html",'<ion-view>\n <ion-nav-title>\n <span translate>PEER.VIEW.TITLE</span>\n </ion-nav-title>\n\n <ion-content class="has-header" scroll="true">\n\n <div class="row no-padding">\n <div class="col col-20 hidden-xs hidden-sm">&nbsp;\n </div>\n\n <div class="col list">\n\n <ion-item>\n <h1>\n <span translate>PEER.VIEW.TITLE</span>\n <span class="gray">\n {{node.host}}\n </span>\n </h1>\n <h2 class="gray">\n <i class="gray icon ion-android-globe"></i>\n {{node.ep.dns || node.server}}\n <span class="gray" ng-if="!loading && node.useSsl">\n <i class="gray ion-locked"></i> <small>SSL</small>\n </span>\n <span class="gray" ng-if="!loading && node.useTor">\n <i class="gray ion-bma-tor-api"></i>\n </span>\n </h2>\n\n \x3c!-- node owner --\x3e\n <h3>\n <span class="dark">\n <i class="icon ion-android-desktop"></i>\n {{\'PEER.VIEW.OWNER\'|translate}}\n </span>\n <a class="positive" ng-if="node.name" ui-sref="app.user_identity({pubkey: node.pubkey, uid: node.name})">\n <i class="ion-person"></i> {{node.name}}\n </a>\n <span ng-if="!loading && !node.name">\n <a class="gray" ui-sref="app.user_identity({pubkey: node.pubkey})">\n <i class="ion-key"></i>\n {{node.pubkey|formatPubkey}}\n </a>\n </span>\n </h3>\n\n <h3>\n <a ng-click="openRawPeering($event)">\n <i class="icon ion-share"></i> {{\'PEER.VIEW.SHOW_RAW_PEERING\'|translate}}\n </a>\n\n <span class="gray" ng-if="!isReachable"> | </span>\n <a ng-if="!isReachable" ng-click="openRawCurrentBlock($event)">\n <i class="icon ion-share"></i> <span translate>PEER.VIEW.SHOW_RAW_CURRENT_BLOCK</span>\n </a>\n </h3>\n </ion-item>\n\n\n <div class="item item-divider" translate>\n PEER.VIEW.GENERAL_DIVIDER\n </div>\n\n <ion-item class="item-icon-left item-text-wrap ink" copy-on-click="{{node.pubkey}}">\n <i class="icon ion-key"></i>\n <span translate>COMMON.PUBKEY</span>\n <h4 class="dark text-left">{{node.pubkey}}</h4>\n </ion-item>\n\n <ion-item class="item item-icon-left item-text-wrap ink" ng-if="isReachable">\n <i class="icon ion-cube"></i>\n <span translate>BLOCKCHAIN.VIEW.TITLE_CURRENT</span>\n <div class="badge badge-calm" ng-if="!loading">\n {{current.number|formatInteger}}\n </div>\n </ion-item>\n\n <ion-item class="item item-icon-left item-text-wrap" ng-if="isReachable">\n <i class="icon ion-document"></i>\n <span translate>ES_PEER.DOCUMENT_COUNT</span>\n <div class="badge badge-stable" ng-if="!loading">\n {{node.docCount|formatInteger}}\n </div>\n </ion-item>\n\n <a class="item item-icon-left item-icon-right item-text-wrap ink" ng-if="isReachable" ui-sref="app.document_search(options.document)">\n <i class="icon ion-document" style="font-size: 25px;"></i>\n <i class="icon-secondary ion-clock" style="font-size: 18px; left: 33px; top: -12px;"></i>\n <span translate>DOCUMENT.LOOKUP.LAST_DOCUMENTS</span>\n <i class="gray icon ion-ios-arrow-right"></i>\n </a>\n\n \x3c!-- Allow extension here --\x3e\n <cs-extension-point name="general"></cs-extension-point>\n\n <div class="item item-divider" ng-hide="loading || !isReachable" translate>\n PEER.VIEW.KNOWN_PEERS\n </div>\n\n <ion-item class="item item-text-wrap no-border done in gray no-padding-top no-padding-bottom inline text-italic" ng-show="!loading && !isReachable">\n <small><i class="icon ion-alert-circled"></i> {{\'NETWORK.INFO.ONLY_SSL_PEERS\'|translate}}</small>\n </ion-item>\n\n <div class="item center" ng-if="loading">\n <ion-spinner class="icon" icon="android"></ion-spinner>\n </div>\n\n <div class="list no-padding {{::motion.ionListClass}}" ng-if="isReachable">\n\n <div ng-repeat="peer in :rebind:peers track by peer.id" class="item item-peer item-icon-left ink" ng-class="::ionItemClass" ng-click="selectPeer(peer)" ng-include="\'plugins/es/templates/network/item_content_peer.html\'">\n </div>\n\n </div>\n </div>\n\n <div class="col col-20 hidden-xs hidden-sm">&nbsp;\n </div>\n </div>\n\n </ion-content>\n</ion-view>\n'),e.put("plugins/es/templates/notification/list_notification.html",'<ion-list class="{{::motion.ionListClass}}">\n\n <ion-item ng-repeat="notification in search.results" class="item-border-large item-text-wrap ink item-avatar" ng-class="{\'unread\': !notification.read}" ng-click="select(notification)">\n\n <i ng-if="!notification.avatar" class="item-image icon {{::notification.avatarIcon}}"></i>\n <i ng-if="notification.avatar" class="item-image avatar" style="background-image: url({{::notification.avatar.src}})"></i>\n\n <h3 trust-as-html="notification.message | translate:notification"></h3>\n <h4>\n <i class="icon {{notification.icon}}"></i>&thinsp;<span class="dark">{{notification.time|formatFromNow}}</span>\n <span class="gray">| {{notification.time|formatDate}}</span>\n </h4>\n </ion-item>\n</ion-list>\n\n<ion-infinite-scroll ng-if="!search.loading && search.hasMore" spinner="android" on-infinite="showMore()" distance="1%">\n</ion-infinite-scroll>\n'),e.put("plugins/es/templates/notification/popover_actions.html",'<ion-popover-view class="fit has-header">\n <ion-header-bar>\n <h1 class="title" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n\n <a class="item item-icon-left ink" ng-disabled="!search.results.length" ng-click="markAllAsRead()">\n <i class="icon ion-android-checkmark-circle"></i>\n {{\'COMMON.NOTIFICATIONS.MARK_ALL_AS_READ\' | translate}}\n </a>\n\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/es/templates/notification/popover_notification.html",'<ion-popover-view class="fit popover-notification" ng-controller="PopoverNotificationsCtrl">\n <ion-header-bar class="stable-bg block">\n <div class="title" translate>COMMON.NOTIFICATIONS.TITLE</div>\n\n <div class="pull-right">\n <a class="positive" ng-click="markAllAsRead()" translate>COMMON.NOTIFICATIONS.MARK_ALL_AS_READ</a>\n </div>\n </ion-header-bar>\n\n <ion-content scroll="true">\n <div class="center" ng-if="search.loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n <div class="padding gray" ng-if="!search.loading && !search.results.length" translate>\n COMMON.NOTIFICATIONS.NO_RESULT\n </div>\n\n <ng-include src="\'plugins/es/templates/notification/list_notification.html\'"></ng-include>\n\n </ion-content>\n\n <ion-footer-bar class="stable-bg block">\n \x3c!-- settings\n <div class="pull-left">\n <a class="positive"\n ui-sref="app.es_settings"\n ng-click="closePopover()"\n translate>MENU.SETTINGS</a>\n </div> --\x3e\n\n \x3c!-- show all --\x3e\n <div class="pull-right">\n <a class="positive" ui-sref="app.view_notifications" ng-click="closePopover()" translate>COMMON.NOTIFICATIONS.SHOW_ALL</a>\n </div>\n </ion-footer-bar>\n</ion-popover-view>\n'),e.put("plugins/es/templates/notification/view_notifications.html",'<ion-view left-buttons="leftButtons" class="view-notification">\n <ion-nav-title>\n {{\'COMMON.NOTIFICATIONS.TITLE\' | translate}}\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n\n <button class="button button-icon button-clear icon ion-loop visible-xs visible-sm" ng-click="load()">\n </button>\n\n <button class="button button-icon button-clear visible-xs visible-sm" ng-click="showActionsPopover($event)">\n <i class="icon ion-android-more-vertical"></i>\n </button>\n </ion-nav-buttons>\n\n <ion-content class="padding no-padding-xs" scroll="true">\n\n \x3c!-- Buttons bar--\x3e\n <div class="hidden-xs hidden-sm padding text-center">\n\n <button class="button button-stable button-small-padding icon ion-loop ink" ng-click="load()">\n </button>\n\n <button class="button button-raised icon-left ion-checkmark ink" ng-click="markAllAsRead()">\n {{\'COMMON.NOTIFICATIONS.MARK_ALL_AS_READ\' | translate}}\n </button>\n </div>\n\n <div class="row no-padding">\n <div class="col col-20 hidden-xs hidden-sm">&nbsp;</div>\n\n <div class="col">\n\n <div class="center" ng-if="search.loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="padding gray" ng-if="!search.loading && !search.results.length" translate>\n COMMON.NOTIFICATIONS.NO_RESULT\n </div>\n\n <ng-include src="\'plugins/es/templates/notification/list_notification.html\'"></ng-include>\n\n\n </div>\n\n <div class="col col-20 hidden-xs hidden-sm">&nbsp;</div>\n\n </div>\n\n </ion-content>\n\n</ion-view>\n'),e.put("plugins/es/templates/registry/edit_record.html",'<ion-view left-buttons="leftButtons" class="view-page">\n <ion-nav-title>\n <span class="visible-xs" ng-if="id" ng-bind-html="formData.title"></span>\n <span class="visible-xs" ng-if="!loading && !id" translate>REGISTRY.EDIT.TITLE_NEW</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <button class="button button-icon button-clear visible-xs visible-sm" ng-class="{\'ion-android-send\':!id, \'ion-android-done\': id}" ng-click="save()">\n </button>\n </ion-nav-buttons>\n\n <ion-content scroll="true">\n\n <div class="hero">\n <div class="content">\n <i class="avatar" ng-class="avatarClass" ng-style="avatarStyle">\n <button class="button button-positive button-large button-clear flat icon ion-camera visible-xs visible-sm" style="display: inline-block;" ng-click="showAvatarModal()"></button>\n <button ng-if="avatar.src" class="button button-positive button-large button-clear flat visible-xs visible-sm" style="display: inline-block; left: 85px; bottom:15px;" ng-click="rotateAvatar()">\n <i class="icon-secondary ion-image" style="left: 24px; top: 3px; font-size: 24px;"></i>\n <i class="icon-secondary ion-forward" style="left: 26px; top: -13px;"></i>\n </button>\n <button class="button button-positive button-large button-clear icon ion-camera hidden-xs hidden-sm" ng-click="showAvatarModal()"></button>\n </i>\n <h3 class="dark">\n <span ng-if="!loading && formData.title">{{formData.title}}</span>\n <span ng-if="!loading && !id && !formData.title" translate>REGISTRY.EDIT.TITLE_NEW</span>\n </h3>\n <h4 class="dark">\n <ion-spinner ng-if="loading" icon="android"></ion-spinner>\n </h4>\n </div>\n </div>\n\n <div class="row no-padding">\n\n <div class="col col-20 hidden-xs hidden-sm">&nbsp;</div>\n\n <div class="col no-padding-xs">\n\n <form name="recordForm" novalidate="" ng-submit="save()">\n <div class="list {{::motion.ionListClass}}" ng-init="setForm(recordForm)">\n <div class="item" ng-if="id">\n <h4 class="gray">\n <i class="icon ion-calendar"></i>\n {{\'COMMON.LAST_MODIFICATION_DATE\'|translate}}&nbsp;{{formData.time | formatDate}}\n </h4>\n <div class="badge badge-balanced badge-editable" ng-click="showRecordTypeModal()">\n {{\'REGISTRY.TYPE.ENUM.\'+formData.type|upper|translate}}\n </div>\n </div>\n\n \x3c!-- pictures --\x3e\n <ng-include src="\'plugins/es/templates/common/edit_pictures.html\'"></ng-include>\n\n <div class="item item-divider" translate>REGISTRY.GENERAL_DIVIDER</div>\n\n \x3c!-- title --\x3e\n <div class="item item-input item-floating-label" ng-class="{\'item-input-error\': form.$submitted && form.title.$invalid}">\n <span class="input-label" translate>REGISTRY.EDIT.RECORD_TITLE</span>\n <input type="text" placeholder="{{\'REGISTRY.EDIT.RECORD_TITLE_HELP\'|translate}}" name="title" id="registry-record-title" ng-model="formData.title" ng-minlength="3" ng-required="true">\n </div>\n <div class="form-errors" ng-if="form.$submitted && form.title.$error" ng-messages="form.title.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT"></span>\n </div>\n </div>\n\n \x3c!-- description --\x3e\n <div class="item item-input item-floating-label">\n <span class="input-label" translate>REGISTRY.EDIT.RECORD_DESCRIPTION</span>\n <textarea placeholder="{{\'REGISTRY.EDIT.RECORD_DESCRIPTION_HELP\'|translate}}" ng-model="formData.description" rows="8" cols="10">\n </textarea>\n </div>\n\n \x3c!-- category --\x3e\n <div class="item item-icon-right ink" ng-if="loading || formData.type===\'company\' || formData.type===\'shop\'" ng-class="{\'item-input-error\': form.$submitted && !formData.category.id, \'done in\': !loading}" ng-click="showCategoryModal()">\n <span translate>REGISTRY.CATEGORY</span>\n <span class="badge badge-royal">{{formData.category.name | formatCategory}}</span>&nbsp;\n <i class="gray icon ion-ios-arrow-right"></i>\n </div>\n <input type="hidden" name="category" ng-model="formData.category.id" required-if="formData.type==\'company\' || formData.type==\'shop\'">\n <div class="form-errors" ng-if="form.$submitted && form.category.$error" ng-messages="form.category.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n \x3c!-- position --\x3e\n <ng-include src="\'plugins/es/templates/common/edit_position.html\'"></ng-include>\n\n \x3c!-- social networks --\x3e\n <ng-include src="\'plugins/es/templates/common/edit_socials.html\'" ng-controller="ESSocialsEditCtrl"></ng-include>\n\n <div class="item item-divider" translate>REGISTRY.TECHNICAL_DIVIDER</div>\n\n \x3c!-- pubkey --\x3e\n <div class="item item-input item-floating-label">\n <span class="input-label" translate>REGISTRY.EDIT.RECORD_PUBKEY</span>\n <input type="text" placeholder="{{\'REGISTRY.EDIT.RECORD_PUBKEY_HELP\'|translate}}" ng-model="formData.pubkey">\n </div>\n\n </div>\n\n <div class="padding hidden-xs hidden-sm text-right">\n <button class="button button-clear button-dark ink" ng-click="cancel()" type="button" translate>\n COMMON.BTN_CANCEL\n </button>\n <button class="button button-positive button-raised ink" type="submit" ng-if="!id" translate>\n COMMON.BTN_PUBLISH\n </button>\n <button class="button button-assertive button-raised ink" type="submit" ng-if="id" translate>\n COMMON.BTN_SAVE\n </button>\n </div>\n </form>\n </div>\n\n <div class="col col-20 hidden-xs hidden-sm">&nbsp;</div>\n\n </div>\n \n </ion-content>\n</ion-view>\n'),e.put("plugins/es/templates/registry/item_record.html",'<a class="item item-record ink no-padding" ui-sref="app.view_page({id: item.id, title: item.urlTitle})">\n\n <div class="row row-record">\n <div class="col item-text-wrap item-thumbnail-left">\n <i ng-if="::item.avatar" class="item-image" style="background-image: url({{::item.avatar.src}})"></i>\n <i ng-if="::!item.avatar" class="item-image icon cion-page-{{item.type}}"></i>\n\n \x3c!-- title --\x3e\n <h2 title="{{item.title|noHtml}}" ng-bind-html="::item.title"></h2>\n\n \x3c!-- category --\x3e\n <h4 class="gray text-nowrap">\n <ng-if ng-if="::item.category">\n <span class="visible-xs">\n {{::item.category.name|noHtml|truncText:60}}\n </span>\n <span class="hidden-xs">\n {{::item.category.name}}\n </span>\n </ng-if>\n <ng-if ng-if="::!item.category">{{::\'REGISTRY.TYPE.ENUM.\'+item.type|uppercase|translate}}</ng-if>\n </h4>\n\n <br class="hidden-xxs hidden-xs hidden-sm">\n\n <h4>\n <span class="positive" ng-if="::item.city">\n <b class="ion-location"></b>\n <span ng-bind-html="::item.city"></span>\n </span>\n <span class="gray" ng-if="::item.distance">\n ({{::item.distance|formatDecimal}} {{::geoUnit}})\n </span>\n </h4>\n\n \x3c!-- creation date --\x3e\n <h4>\n <span class="gray" ng-if="::item.creationTime">\n <i class="icon ion-clock"></i>\n {{::item.creationTime | formatFromNow}}\n </span>\n <span ng-if="::item.tags" class="dark">\n <ng-repeat ng-repeat="tag in ::item.tags">\n #<ng-bind-html ng-bind-html="::tag"></ng-bind-html>\n </ng-repeat>\n </span>\n </h4>\n <span ng-if="::item.picturesCount > 1" class="badge badge-balanced badge-picture-count hidden-xxs">{{::item.picturesCount}}&nbsp;<i class="icon ion-camera"></i></span>\n </div>\n\n <div class="col" ng-if="options.description.show">\n <p class="gray text-italic" ng-if="::!!item.description">\n <i class="icon ion-quote"></i>\n <span ng-bind-html="::item.description | truncText:500"></span>\n </p>\n </div>\n </div>\n\n</a>\n'),e.put("plugins/es/templates/registry/lookup_form_options.html",'\n <div class="item item-icon-left item-icon-right item-input stable-bg" ng-click="showRecordTypeModal($event)" ng-if="search.advanced && !search.type">\n <b class="icon-secondary ion-help gray" style="left:10px; top: -8px;"></b>\n <b class="icon-secondary cion-page-association gray" style="left:14px; top: 2px;"></b>\n <b class="icon-secondary cion-page-company gray" style="left:28px; top: -6px;"></b>\n\n <span class="input-label item-icon-left-padding" translate>REGISTRY.SEARCH.TYPE</span>\n <i class="gray icon ion-ios-arrow-right"></i>\n </div>\n\n <div class="item item-icon-left item-icon-right item-input stable-bg" ng-click="showCategoryModal($event)" ng-if="search.advanced && !search.category">\n <i class="icon ion-flag gray"></i>\n <span class="input-label item-icon-left-padding" translate>REGISTRY.CATEGORY</span>\n <i class="gray icon ion-ios-arrow-right"></i>\n </div>\n'),
e.put("plugins/es/templates/registry/lookup_form.html",'\n<form ng-submit="doSearch()" class="light-bg">\n <div class="row no-padding responsive-lg">\n\n \x3c!-- search text --\x3e\n <div class="col no-padding no-margin">\n <div class="item no-padding">\n <div class="item-input light-bg">\n\n <div class="animate-show-hide selected-values ng-hide" ng-show="entered">\n\n \x3c!-- selected type --\x3e\n <div ng-show="search.type" class="button button-small button-text button-stable button-icon-event stable-900-bg">\n &nbsp;<i class="icon cion-page-{{search.type}}"></i>\n <span>{{\'REGISTRY.TYPE.ENUM.\'+search.type|uppercase|translate}}</span>\n <i class="icon ion-close" ng-click="removeType()">&nbsp;&nbsp;</i>\n </div>\n\n \x3c!-- selected category --\x3e\n <div ng-show="search.category.name" class="button button-small button-text button-stable button-icon-event stable-900-bg">\n &nbsp;<i class="icon ion-flag"></i>\n <span>{{search.category.name|truncText:40}}</span>\n <i class="icon ion-close" ng-click="removeCategory()">&nbsp;&nbsp;</i>\n </div>\n </div>\n\n <i class="icon ion-search placeholder-icon"></i>\n <input type="text" class="visible-xs visible-sm" placeholder="{{\'REGISTRY.SEARCH.SEARCH_HELP\'|translate}}" ng-model="search.text" ng-model-options="{ debounce: 650 }" ng-change="doSearch()" on-return="doSearchText()" select-on-click>\n <input type="text" class="hidden-xs hidden-sm" placeholder="{{\'REGISTRY.SEARCH.SEARCH_HELP\'|translate}}" id="registrySearchText" ng-model="search.text" on-return="doSearchText()">\n\n <button type="button" class="button button-icon button-small pull-left button-small-padding ink" ng-if="search.text" tabindex="-1" ng-click="removeText()">\n <i class="gray ion-close"></i>\n </button>\n </div>\n </div>\n\n </div>\n\n \x3c!-- location --\x3e\n <div class="col col-40 no-padding no-margin" ng-include="::\'plugins/es/templates/common/item_location_search.html\'" ng-controller="ESSearchPositionItemCtrl">\n </div>\n\n </div>\n\n \x3c!-- options --\x3e\n <ng-include src="::\'plugins/es/templates/registry/lookup_form_options.html\'"></ng-include>\n</form>\n\n<div class="padding-top hidden-xs hidden-sm disable-user-behavior" style="display: block; height: 60px;">\n <div class="pull-left">\n\n <a class="button button-text button-small ink" ng-class="{\'button-text-stable\': !search.advanced, \'button-text-positive\': search.advanced}" ng-click="search.advanced=!search.advanced">\n {{\'REGISTRY.SEARCH.BTN_ADVANCED_SEARCH\' | translate}}\n <i class="icon" ng-class="{\'ion-arrow-down-b\': !search.advanced, \'ion-arrow-up-b\': search.advanced}"></i>\n </a>\n\n &nbsp;\n\n </div>\n\n <div class="pull-right">\n\n <a ng-if="enableFilter" class="button button-text button-small ink" ng-class="{\'button-text-positive\': search.lastRecords}" ng-click="doGetLastRecords()">\n <i class="icon ion-clock"></i>\n {{\'REGISTRY.SEARCH.BTN_LAST_RECORDS\' | translate}}\n </a>\n &nbsp;\n\n \x3c!-- Allow extension here --\x3e\n <cs-extension-point name="filter-buttons"></cs-extension-point>\n\n &nbsp;\n\n <button class="button button-small button-stable ink" ng-click="doSearchText()">\n {{\'COMMON.BTN_SEARCH\' | translate}}\n </button>\n </div>\n</div>\n\n<div class="padding-xs padding-sm" style="display: block; height: 60px;">\n <div class="pull-left ng-hide" ng-show="!search.loading">\n <ng-if ng-if="search.lastRecords">\n <h4 translate>REGISTRY.SEARCH.LAST_RECORDS</h4>\n <small class="gray no-padding" ng-if="search.total">\n <span ng-if="search.geoPoint && search.total">{{\'REGISTRY.SEARCH.LAST_RECORD_COUNT_LOCATION\'|translate:{count: search.total, location: search.location} }}</span>\n <span ng-if="!search.geoPoint && search.total">{{\'REGISTRY.SEARCH.LAST_RECORD_COUNT\'|translate:{count: search.total} }}</span>\n </small>\n </ng-if>\n\n <ng-if ng-if="!search.lastRecords">\n <h4 translate>COMMON.RESULTS_LIST</h4>\n <small class="gray no-padding" ng-if="search.total">\n <span ng-if="search.geoPoint && search.total">{{\'REGISTRY.SEARCH.RESULT_COUNT_LOCATION\'|translate:{count: search.total, location: search.location} }}</span>\n <span ng-if="!search.geoPoint && search.total">{{\'REGISTRY.SEARCH.RESULT_COUNT\'|translate:{count: search.total} }}</span>\n </small>\n </ng-if>\n\n </div>\n\n\n <div class="pull-right ng-hide padding-top" ng-show="!search.loading && search.total">\n <a class="button button-text button-small hidden-xs hidden-sm ink" ng-class="{\'button-text-positive\': search.compactMode}" ng-click="toggleCompactMode()">\n <i class="icon ion-navicon"></i>\n <b class="icon-secondary ion-arrow-down-b" style="top: -8px; left: 5px; font-size: 8px;"></b>\n <b class="icon-secondary ion-arrow-up-b" style="top: 3px; left: 5px; font-size: 8px;"></b>\n {{\'DOCUMENT.LOOKUP.BTN_COMPACT\' | translate}}\n </a>\n </div>\n</div>\n\n<div class="center" ng-if="search.loading">\n <ion-spinner icon="android"></ion-spinner>\n</div>\n\n<div class="padding assertive" ng-if="!search.loading && !search.results.length" translate>\n COMMON.SEARCH_NO_RESULT\n</div>\n'),e.put("plugins/es/templates/registry/lookup_lg.html",'<ion-view left-buttons="leftButtons" class="view-registry-search">\n <ion-nav-title>\n <span translate>REGISTRY.SEARCH.TITLE</span>\n </ion-nav-title>\n\n <ion-content class="lookupForm padding no-padding-xs stable-100-bg">\n\n <div class="hidden-xs hidden-sm" style="display: block; height: 45px;">\n <div class="pull-right">\n <button class="button button-small button-positive button-clear ink padding-right" ng-click="showNewPageModal()">\n <i class="icon ion-plus"></i>\n <span translate>REGISTRY.BTN_NEW</span>\n </button>\n </div>\n </div>\n\n <ng-include src="::\'plugins/es/templates/registry/lookup_form.html\'"></ng-include>\n\n <ng-include src="::\'plugins/es/templates/registry/lookup_list_lg.html\'"></ng-include>\n\n </ion-content>\n\n <button id="fab-add-registry-record" class="button button-fab button-fab-bottom-right button-assertive icon ion-plus hidden-md hidden-lg spin" ng-click="showNewPageModal()">\n </button>\n</ion-view>\n'),e.put("plugins/es/templates/registry/lookup_list_lg.html",'<div class="row no-padding" ng-class="{\'ng-hide\': !search.total}">\n \x3c!-- left margin (when NOT compact mode) --\x3e\n <div class="col col-15 no-padding hidden-xs hidden-sm" ng-if="!search.compactMode">&nbsp;</div>\n\n <div class="col no-padding">\n\n <div class="list {{::motion.ionListClass}}" ng-class="{\'flex-row\': search.compactMode}" ng-if="!search.loading && search.results.length">\n\n <div class="no-padding" ng-repeat="item in search.results" ng-include="::\'plugins/es/templates/registry/item_record.html\'">\n </div>\n </div>\n\n </div>\n\n \x3c!-- right margin (when NOT compact mode) --\x3e\n <div class="col col-15 no-padding hidden-xs hidden-sm" ng-if="!search.compactMode">&nbsp;</div>\n</div>\n\n<ion-infinite-scroll ng-if="!search.loading && search.hasMore" spinner="android" on-infinite="showMore()" distance="10%">\n</ion-infinite-scroll>\n'),e.put("plugins/es/templates/registry/lookup_list.html",'<div class="list {{::motion.ionListClass}}" ng-if="!search.loading && search.results.length" ng-init="options.description.show=false">\n\n <div class="no-padding" ng-repeat="item in search.results" ng-include="::\'plugins/es/templates/registry/item_record.html\'">\n </div>\n</div>\n\n<ion-infinite-scroll ng-if="!search.loading && search.hasMore" spinner="android" on-infinite="showMore()" distance="10%">\n</ion-infinite-scroll>\n'),e.put("plugins/es/templates/registry/lookup_popover_actions.html",'<ion-popover-view class="fit has-header">\n <ion-header-bar>\n <h1 class="title" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n\n \x3c!-- new page --\x3e\n <a class="item item-icon-left ink" ng-click="showNewPageModal();">\n <i class="icon ion-plus"></i>\n <span translate>REGISTRY.BTN_NEW</span>\n </a>\n\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/es/templates/registry/lookup_popover_filters.html",'<ion-popover-view class="fit has-header">\n <ion-header-bar>\n <h1 class="title" translate>COMMON.POPOVER_FILTER_TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n\n \x3c!-- new page --\x3e\n <a class="item item-icon-left ink" ng-click="doGetLastRecords()">\n <i class="icon ion-clock"></i>\n {{\'REGISTRY.SEARCH.BTN_LAST_RECORDS\' | translate}}\n </a>\n\n \x3c!-- advanced options --\x3e\n <a class="item item-icon-left ink" ng-click="toggleAdvanced();">\n <i class="icon ion-android-checkbox-outline-blank" ng-show="!search.advanced"></i>\n <i class="icon ion-android-checkbox-outline" ng-show="search.advanced"></i>\n <span translate>REGISTRY.SEARCH.POPOVER_FILTERS.BTN_ADVANCED_SEARCH</span>\n </a>\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/es/templates/registry/lookup.html",'<ion-view left-buttons="leftButtons">\n <ion-nav-title>\n <span translate>REGISTRY.SEARCH.TITLE</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <button class="button button-icon button-clear icon ion-loop visible-xs visible-sm" ng-click="doUpdate()">\n </button>\n <button class="button button-icon button-clear visible-xs visible-sm" ng-click="showFiltersPopover($event)">\n <i class="icon ion-android-funnel"></i>\n </button>\n </ion-nav-buttons>\n\n <ion-content class="lookupForm padding no-padding-xs no-padding-sm stable-100-bg">\n\n <ng-include src="::\'plugins/es/templates/registry/lookup_form.html\'"></ng-include>\n\n <ng-include src="::\'plugins/es/templates/registry/lookup_list.html\'"></ng-include>\n\n </ion-content>\n\n <button id="fab-add-registry-record" class="button button-fab button-fab-bottom-right button-assertive icon ion-plus hidden-md hidden-lg spin" ng-click="showNewPageModal()">\n </button>\n</ion-view>\n'),e.put("plugins/es/templates/registry/modal_record_type.html",'<ion-modal-view>\n <ion-header-bar class="bar-positive">\n <button class="button button-clear" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button>\n <h1 class="title" translate>{{getParameters().title||\'REGISTRY.TYPE.TITLE\'|translate}}</h1>\n </ion-header-bar>\n\n <ion-content class="lookupForm">\n <div class="list padding">\n <h3 translate>REGISTRY.TYPE.SELECT_TYPE</h3>\n <button class="button button-block button-stable icon-left cion-page-shop" ng-click="closeModal(\'shop\')" translate>REGISTRY.TYPE.ENUM.SHOP</button>\n\n <button class="button button-block button-stable icon-left cion-page-association" ng-click="closeModal(\'association\')" translate>REGISTRY.TYPE.ENUM.ASSOCIATION</button>\n\n <button class="button button-block button-stable icon-left cion-page-company" ng-click="closeModal(\'company\')" translate>REGISTRY.TYPE.ENUM.COMPANY</button>\n\n <button class="button button-block button-stable icon-left cion-page-institution" ng-click="closeModal(\'institution\')" translate>REGISTRY.TYPE.ENUM.INSTITUTION</button>\n </div>\n </ion-content>\n</ion-modal-view>\n'),e.put("plugins/es/templates/registry/view_popover_actions.html",'<ion-popover-view class="fit has-header">\n <ion-header-bar>\n <h1 class="title" translate>REGISTRY.VIEW.MENU_TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n\n <a class="item item-icon-left ink" ng-click="showSharePopover($event)">\n <i class="icon ion-android-share-alt"></i>\n {{\'COMMON.BTN_SHARE\' | translate}}\n </a>\n\n <a class="item item-icon-left assertive ink" ng-if="canEdit" ng-click="delete()">\n <i class="icon ion-trash-a"></i>\n {{\'COMMON.BTN_DELETE\' | translate}}\n </a>\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/es/templates/registry/view_record.html",'<ion-view left-buttons="leftButtons" class="view-page">\n <ion-nav-title>\n\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <button class="button button-bar button-icon button-clear visible-xs visible-sm" ng-click="edit()" ng-if="canEdit">\n <i class="icon ion-android-create"></i>\n </button>\n <button class="button button-bar button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showActionsPopover($event)">\n </button>\n </ion-nav-buttons>\n\n <ion-content scroll="true" class="refresher-top-bg">\n\n <ion-refresher pulling-text="{{\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="load()">\n </ion-refresher>\n\n <div class="hero">\n <div class="content" ng-if="!loading">\n <i class="avatar cion-page-{{formData.type}}" ng-if="!formData.avatar"></i>\n <i class="avatar" ng-style="{{avatarStyle}}" ng-if="formData.avatar"></i>\n <h3><span class="dark" ng-bind-html="formData.title"></span></h3>\n <h4>&nbsp;</h4>\n </div>\n <h4 class="content dark" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </h4>\n <h4 class="content gray hidden-xs hidden-sm" ng-if="formData.city">\n <i class="icon ion-location"></i>\n <span ng-bind-html="formData.city"></span>\n </h4>\n </div>\n\n <div class="row no-padding-xs">\n <div class="col col-20 hidden-xs hidden-sm">&nbsp;\n </div>\n\n <div class="col list animate-fade-slide-in item-text-wrap no-padding-xs">\n\n <div class="item">\n <h2 class="gray">\n <a ng-if="formData.city" ui-sref="app.registry_lookup({location:formData.city})">\n <i class="icon ion-location"></i>\n <span ng-bind-html="formData.city"></span>\n </a>\n <span ng-if="formData.city && formData.type">&nbsp;|&nbsp;</span>\n <a ng-if="formData.type" ui-sref="app.registry_lookup({type:formData.type})">\n <i class="cion-page-{{formData.type}}"></i>\n {{\'REGISTRY.TYPE.ENUM.\'+formData.type|upper|translate}}\n </a>\n </h2>\n <h4>\n <i class="icon ion-clock" ng-if="formData.time"></i>\n <span translate>COMMON.SUBMIT_BY</span>\n <a ng-class="{\'positive\': issuer.name, \'gray\': !issuer.name}" ui-sref="app.user_identity({pubkey:issuer.pubkey, name: issuer.name})">\n <ng-if ng-if="issuer.name">\n <i class="icon ion-person"></i>\n {{::issuer.name}}\n </ng-if>\n <span ng-if="!issuer.name">\n <i class="icon ion-key"></i>\n {{issuer.pubkey|formatPubkey}}\n </span>\n </a>\n <span>\n {{formData.time|formatFromNow}}\n <h4 class="gray hidden-xs">|\n {{formData.time | formatDate}}\n </h4>\n </span>\n </h4>\n </div>\n\n \x3c!-- Buttons bar--\x3e\n <a id="registry-share-anchor-{{id}}"></a>\n <div class="item large-button-bar hidden-xs hidden-sm">\n <button class="button button-stable button-small-padding icon ion-android-share-alt" ng-click="showSharePopover($event)">\n </button>\n\n <button class="button button-stable icon-left ink-dark" ng-if="canEdit" ng-click="delete()">\n <i class="icon ion-trash-a assertive"></i>\n <span class="assertive"> {{\'COMMON.BTN_DELETE\' | translate}}</span>\n </button>\n <button class="button button-calm icon-left ion-android-create ink" ng-if="canEdit" ng-click="edit()">\n {{\'COMMON.BTN_EDIT\' | translate}}\n </button>\n </div>\n\n <ion-item>\n <h2 trust-as-html="formData.description"></h2>\n </ion-item>\n\n <ion-item ng-if="formData.category || formData.address">\n <h4 ng-if="formData.category">\n <span class="gray" translate>REGISTRY.VIEW.CATEGORY</span>\n <a class="positive" ng-if="formData.category" ui-sref="app.registry_lookup({category:formData.category.id})">\n <span ng-bind-html="formData.category.name"></span>\n </a>\n </h4>\n <h4 ng-if="formData.address">\n <span class="gray" translate>REGISTRY.VIEW.LOCATION</span>\n <a class="positive" target="_system" href="https://www.openstreetmap.org/search?query={{formData.address}},%20{{formData.city}}">\n <span ng-bind-html="formData.address"></span>\n <span ng-if="formData.city"> - </span>\n <span ng-bind-html="formData.city"></span>\n </a>\n </h4>\n </ion-item>\n\n \x3c!-- Socials networks --\x3e\n <ng-if ng-if="formData.socials && formData.socials.length>0">\n <ion-item class="item-icon-left" type="no-padding item-text-wrap" ng-repeat="social in formData.socials track by social.url" id="social-{{social.url|formatSlug}}">\n <i class="icon ion-social-{{social.type}}" ng-class="{\'ion-bookmark\': social.type == \'other\', \'ion-link\': social.type == \'web\', \'ion-email\': social.type == \'email\'}"></i>\n <p ng-if="social.type && social.type != \'web\'">{{social.type}}</p>\n <h2>\n <a ng-click="openLink($event, social.url, social.type)">{{social.url}}</a>\n </h2>\n </ion-item>\n </ng-if>\n\n \x3c!-- pubkey --\x3e\n <div class="item item-icon-left item-text-wrap ink" ng-if="formData.pubkey" copy-on-click="{{::formData.pubkey}}">\n <i class="icon ion-key"></i>\n <span translate>REGISTRY.EDIT.RECORD_PUBKEY</span>\n <h4 class="dark">{{::formData.pubkey}}</h4>\n </div>\n\n <div class="lazy-load">\n\n \x3c!-- pictures --\x3e\n <ng-include src="\'plugins/es/templates/common/view_pictures.html\'"></ng-include>\n\n \x3c!-- comments --\x3e\n <ng-include src="\'plugins/es/templates/common/view_comments.html\'"></ng-include>\n </div>\n </div>\n\n <div class="col col-20 hidden-xs hidden-sm">&nbsp;\n </div>\n </div>\n </ion-content>\n\n\n\n</ion-view>\n'),e.put("plugins/es/templates/registry/view_wallet_pages.html",'<ion-view left-buttons="leftButtons" class="view-notification">\n <ion-nav-title>\n {{\'REGISTRY.MY_PAGES\' | translate}}\n </ion-nav-title>\n\n <ion-content class="padding no-padding-xs" scroll="true">\n\n <ion-refresher pulling-text="{{:locale:\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="doUpdate()">\n </ion-refresher>\n\n \x3c!-- Buttons bar --\x3e\n <div class="hidden-xs hidden-sm padding text-center">\n\n <button class="button button-stable button-small-padding icon ion-loop ink" ng-click="doUpdate()" title="{{\'COMMON.BTN_REFRESH\' | translate}}">\n </button>\n\n <button class="button button-calm icon-left ink" ng-click="showNewPageModal()">\n {{\'REGISTRY.BTN_NEW\' | translate}}\n </button>\n </div>\n\n <div class="center padding" ng-if="search.loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="center padding gray" ng-if="!search.loading && !search.results.length" translate>\n REGISTRY.NO_PAGE\n </div>\n\n <ng-include src="\'plugins/es/templates/registry/lookup_list.html\'"></ng-include>\n\n </ion-content>\n\n <button id="fab-wallet-add-registry-record" class="button button-fab button-fab-bottom-right button-assertive hidden-md hidden-lg spin" ng-click="showNewPageModal()">\n <i class="icon ion-plus"></i>\n </button>\n</ion-view>\n'),e.put("plugins/es/templates/settings/plugin_settings.html",'<ion-view left-buttons="leftButtons" class="settings">\n <ion-nav-title translate>ES_SETTINGS.PLUGIN_NAME</ion-nav-title>\n\n <ion-content scroll="true">\n\n <span class="item item-divider" translate>SETTINGS.NETWORK_SETTINGS</span>\n\n <div class="item ink" ng-click="formData.enable && changeEsNode()" ng-disabled="!formData.enable">\n <div class="input-label" ng-class="{\'gray\': !formData.enable}">\n {{\'ES_SETTINGS.PEER\' | translate}}\n </div>\n <span class="item-note" ng-class="{\'dark\': formData.enable}">{{getServer()}}</span>\n </div>\n\n \x3c!--span class="item item-divider" translate>ES_SETTINGS.NOTIFICATIONS.DIVIDER</span>\n\n <span class="item gray item-text-wrap" translate>ES_SETTINGS.NOTIFICATIONS.HELP_TEXT</span>\n\n <div class="item item-toggle dark" >\n <div class="input-label" ng-class="{\'gray\': !formData.enable}" translate>ES_SETTINGS.NOTIFICATIONS.ENABLE_TX_SENT</div>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="formData.notifications.txSent" ng-disabled="!formData.enable">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div>\n <div class="item item-toggle dark" >\n <div class="input-label" ng-class="{\'gray\': !formData.enable}" translate>ES_SETTINGS.NOTIFICATIONS.ENABLE_TX_RECEIVED</div>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="formData.notifications.txReceived" ng-disabled="!formData.enable">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div>\n <div class="item item-toggle dark" >\n <div class="input-label" ng-class="{\'gray\': !formData.enable}" translate>ES_SETTINGS.NOTIFICATIONS.ENABLE_CERT_SENT</div>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="formData.notifications.certSent" ng-disabled="!formData.enable">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div>\n <div class="item item-toggle dark" >\n <div class="input-label" ng-class="{\'gray\': !formData.enable}" translate>ES_SETTINGS.NOTIFICATIONS.ENABLE_CERT_RECEIVED</div>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="formData.notifications.certReceived" ng-disabled="!formData.enable">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div--\x3e\n\n </ion-content>\n</ion-view>\n'),e.put("plugins/es/templates/settings/settings_extend.html",'\n\x3c!--<span class="item item-divider" translate>SETTINGS.PLUGINS_SETTINGS</span>--\x3e\n\n<div class="item item-text-wrap ink item-icon-right" ui-sref="app.es_settings">\n <div class="input-label ng-binding" translate>ES_SETTINGS.PLUGIN_NAME</div>\n \x3c!--<h4 class="gray" translate>ES_SETTINGS.PLUGIN_NAME_HELP</h4>--\x3e\n <i class="gray icon ion-ios-arrow-right"></i>\n</div>\n'),e.put("plugins/es/templates/subscription/edit_subscriptions.html",'<ion-view left-buttons="leftButtons" class="view-notification">\n <ion-nav-title>\n {{\'SUBSCRIPTION.EDIT.TITLE\' | translate}}\n </ion-nav-title>\n\n <ion-content class="padding no-padding-xs" scroll="true">\n\n <ion-refresher pulling-text="{{:locale:\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="load()">\n </ion-refresher>\n\n \x3c!-- Buttons bar --\x3e\n <div class="hidden-xs hidden-sm padding text-center">\n\n <button class="button button-stable button-small-padding icon ion-loop ink" ng-click="load()" title="{{\'COMMON.BTN_REFRESH\' | translate}}">\n </button>\n\n <button class="button button-calm ink" ng-click="addSubscription()">\n {{\'SUBSCRIPTION.BTN_ADD\' | translate}}\n </button>\n </div>\n\n <div class="center padding" ng-if="search.loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="center padding gray" ng-if="!search.loading && !search.results.length" translate>\n SUBSCRIPTION.NO_SUBSCRIPTION\n </div>\n\n <div class="row no-padding">\n <div class="col col-20 hidden-xs hidden-sm">&nbsp;</div>\n\n <div class="col list {{::motion.ionListClass}} item-border-large">\n\n \x3c!-- emails --\x3e\n <ng-repeat ng-repeat="subscriptions in search.results | filter: { type: \'email\' }" ng-include="\'plugins/es/templates/subscription/item_\' + subscriptions.type.toLowerCase() + \'_subscription.html\'">>\n </ng-repeat>\n\n </div>\n\n <div class="col col-20 hidden-xs hidden-sm">&nbsp;</div>\n\n </div>\n\n </ion-content>\n\n <button id="fab-add-subscription-record" class="button button-fab button-fab-bottom-right button-assertive icon ion-plus hidden-md hidden-lg spin" ng-click="addSubscription()">\n </button>\n</ion-view>\n'),e.put("plugins/es/templates/subscription/item_email_subscription.html",'<div class="item item-avatar">\n <i class="item-image icon ion-email"></i>\n <h3>\n {{\'SUBSCRIPTION.TYPE.ENUM.\' + subscriptions.type.toUpperCase() | translate}}\n </h3>\n <h4 class="gray">\n {{\'SUBSCRIPTION.EDIT.PROVIDER\'|translate}}\n <a ui-sref="app.user_identity({pubkey: subscriptions.recipient, name: subscriptions.name})">\n <span ng-class="{\'positive\': subscriptions.name, \'dark\': !subscriptions.name}" ng-if="subscriptions.name">\n <i class="ion-person" ng-if="subscriptions.name"></i>\n {{subscriptions.name}}\n </span>\n <span class="gray" ng-if="!subscriptions.name">\n <i class="ion-key"></i>\n {{subscriptions.recipient | formatPubkey}}\n </span>\n </a>\n </h4>\n <div class="item-note text-right">\n <span ng-repeat="item in subscriptions.items">\n {{item.content.email}}\n <a class="ion-trash-a gray padding-left" ng-click="deleteSubscription(item)"></a>\n <a class="ion-edit gray padding-left" ng-click="editSubscription(item)"></a>\n <br>\n </span>\n </div>\n</div>\n'),e.put("plugins/es/templates/subscription/modal_email.html",'\n<ion-modal-view id="composeMessage" class="modal-full-height">\n <ion-header-bar class="bar-positive">\n <button class="button button-clear visible-xs" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button>\n <h1 class="title" translate>SUBSCRIPTION.MODAL_EMAIL.TITLE</h1>\n\n <button class="button button-icon button-clear icon ion-android-send visible-xs" ng-click="doSubmit()">\n </button>\n </ion-header-bar>\n\n <ion-content scroll="true">\n\n \x3c!-- Encryption info --\x3e\n <div class="item item-icon-left item-text-wrap">\n <i class="icon ion-ios-information-outline positive"></i>\n <h4 class="positive" translate>SUBSCRIPTION.MODAL_EMAIL.HELP</h4>\n </div>\n\n <form name="subscriptionForm" novalidate="" ng-submit="doSubmit()">\n\n <div class="list" ng-init="setForm(subscriptionForm)">\n\n \x3c!-- email --\x3e\n <label class="item item-input" ng-class="{\'item-input-error\': form.$submitted && (form.email.$invalid || form.email.$error)}">\n <span class="input-label" translate>SUBSCRIPTION.MODAL_EMAIL.EMAIL_LABEL</span>\n <input name="email" type="text" placeholder="{{\'SUBSCRIPTION.MODAL_EMAIL.EMAIL_HELP\' | translate}}" ng-model="formData.content.email" ng-minlength="3" required email>\n </label>\n <div class="form-errors" ng-if="form.$submitted && (form.email.$invalid || form.email.$error)" ng-messages="form.email.$error">\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT"></span>\n </div>\n <div class="form-error" ng-message="email">\n <span translate="ERROR.FIELD_NOT_EMAIL"></span>\n </div>\n </div>\n\n \x3c!-- Frequency --\x3e\n <label class="item item-input item-select" ng-class="{\'item-input-error\': form.$submitted && !formData.content.frequency}">\n <span class="input-label" translate>SUBSCRIPTION.MODAL_EMAIL.FREQUENCY_LABEL</span>\n <select name="frequency" ng-model="formData.content.frequency" style="height: 46px;margin-top: 1px;">\n <option value="weekly" translate>SUBSCRIPTION.MODAL_EMAIL.FREQUENCY_WEEKLY</option>\n <option value="daily" translate>SUBSCRIPTION.MODAL_EMAIL.FREQUENCY_DAILY</option>\n </select>\n </label>\n <div class="form-errors" ng-if="form.$submitted && !formData.content.frequency">\n <div class="form-error">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n \x3c!-- Recipient (service provider) --\x3e\n <a class="item item-input item-icon-right gray ink" ng-class="{\'item-input-error\': form.$submitted && !formData.recipient}" ng-click="showNetworkLookup()" style="height: 67px;">\n <span class="input-label" translate>SUBSCRIPTION.MODAL_EMAIL.PROVIDER</span>\n <span class="badge animate-fade-in animate-show-hide ng-hide" ng-class="{\'badge-royal\': recipient.name, \'badge-stable\': !recipient.name}" ng-show="recipient && (recipient.name)">\n <i class="ion-person" ng-if="recipient.name"></i> {{recipient.name}}\n </span>\n <span class="badge badge-secondary animate-fade-in animate-show-hide ng-hide" ng-show="formData.recipient">\n <i class="ion-key"></i> {{formData.recipient | formatPubkey}}\n </span>\n <i class="gray icon ion-ios-arrow-right"></i>\n </a>\n <div class="form-errors" ng-if="form.$submitted && !formData.recipient">\n <div class="form-error">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n </div>\n\n <div class="padding hidden-xs text-right">\n <button class="button button-clear button-dark ink" ng-click="cancel()" type="button" translate>COMMON.BTN_CANCEL\n </button>\n <button class="button button-positive ink" type="submit">\n {{\'COMMON.BTN_ADD\' | translate}}\n </button>\n </div>\n\n </form>\n </ion-content>\n</ion-modal-view>\n\n\n\n\n'),e.put("plugins/es/templates/user/edit_popover_actions.html",'<ion-popover-view class="fit has-header">\n <ion-header-bar>\n <h1 class="title" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n\n \x3c!-- delete profile --\x3e\n <a class="item item-icon-left assertive ink" ng-click="removeProfile()">\n <i class="icon ion-trash-a"></i>\n {{\'PROFILE.BTN_DELETE\' | translate}}\n </a>\n\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/es/templates/user/edit_profile.html",'<ion-view left-buttons="leftButtons">\n <ion-nav-title>\n \x3c!-- no title--\x3e\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n \x3c!-- remove button --\x3e\n <button class="button button-icon button-clear button-assertive ion-trash-a visible-xs visible-sm" ng-click="removeProfile()" ng-if="existing">\n </button>\n \x3c!-- save button --\x3e\n <button class="button button-icon button-clear ion-android-done visible-xs visible-sm" ng-click="submitAndSaveAndClose()">\n </button>\n </ion-nav-buttons>\n\n <ion-content scroll="true">\n\n <div class="positive-900-bg hero">\n <div class="content">\n <i class="avatar" ng-style="avatarStyle" ng-class="{\'avatar-wallet\': !loading && !avatar && walletData && !walletData.isMember, \'avatar-member\': !loading && !avatar && walletData.isMember}">\n <button class="button button-positive button-large button-clear flat icon ion-camera visible-xs visible-sm" style="display: inline-block;" ng-click="showAvatarModal()"></button>\n <button ng-if="avatar.src" class="button button-positive button-large button-clear flat visible-xs visible-sm" style="display: inline-block; left: 85px; bottom:15px;" ng-click="rotateAvatar()">\n <i class="icon-secondary ion-image" style="left: 24px; top: 3px; font-size: 24px;"></i>\n <i class="icon-secondary ion-forward" style="left: 26px; top: -13px;"></i>\n </button>\n <button class="button button-positive button-large button-clear icon ion-camera hidden-xs hidden-sm" ng-click="showAvatarModal()"></button>\n </i>\n <h3 class="light">\n <ng-if ng-if="!loading && formData.title">{{formData.title}}</ng-if>\n <ng-if ng-if="!loading && !formData.title && walletData">{{::walletData.pubkey | formatPubkey}}</ng-if>\n </h3>\n <h4 class="light">\n <ion-spinner ng-if="loading" icon="android"></ion-spinner>\n </h4>\n </div>\n </div>\n\n\n <div class="row no-padding">\n <div class="col col-20 hidden-xs hidden-sm">&nbsp;\n </div>\n\n <div class="col">\n\n \x3c!-- Buttons bar--\x3e\n <div class="hidden-xs hidden-sm padding text-center animate-show-hide ng-hide" ng-show="existing">\n\n <button class="button button-stable icon-right ink" ng-disabled="saving" ng-click="showActionsPopover($event)">\n &nbsp; <i class="icon ion-android-more-vertical"></i>&nbsp;\n {{\'COMMON.BTN_OPTIONS\' | translate}}\n </button>\n </div>\n\n <form name="profileForm" novalidate="" ng-submit="saveAndClose()">\n\n <div class="list item-text-wrap {{::motion.ionListClass}}" ng-init="setForm(profileForm)">\n\n \x3c!-- Public info --\x3e\n <div class="item item-icon-left item-text-wrap">\n <i class="icon ion-ios-information-outline positive"></i>\n <h4 class="positive" translate>PROFILE.HELP.WARNING_PUBLIC_DATA</h4>\n </div>\n\n <div class="item item-divider" translate>PROFILE.GENERAL_DIVIDER</div>\n\n \x3c!-- title --\x3e\n <ion-item class="item-input item-floating-label item-button-right" ng-class="{\'item-input-error\': form.$submitted && form.title.$invalid}">\n <span class="input-label">{{\'PROFILE.TITLE\' | translate}}</span>\n <input type="text" name="title" placeholder="{{\'PROFILE.TITLE_HELP\' | translate}}" id="profile-name" ng-model="formData.title" ng-model-options="{ debounce: 350 }" ng-minlength="3" ng-maxlength="50" required>\n </ion-item>\n <div class="form-errors" ng-show="form.$submitted && form.title.$error" ng-messages="form.title.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT"></span>\n </div>\n <div class="form-error" ng-message="maxlength">\n <span translate="ERROR.FIELD_TOO_LONG_WITH_LENGTH" translate-values="{maxLength: 50}"></span>\n </div>\n </div>\n\n \x3c!-- description --\x3e\n <ion-item class="item-input item-floating-label item-button-right">\n <span class="input-label" style="width: 100%">{{\'PROFILE.DESCRIPTION\' | translate}}</span>\n <textarea placeholder="{{\'PROFILE.DESCRIPTION_HELP\' | translate}}" ng-model="formData.description" ng-model-options="{ debounce: 350 }" rows="4" cols="10">\n </textarea>\n </ion-item>\n\n \x3c!-- position --\x3e\n <ng-include src="::\'plugins/es/templates/common/edit_position.html\'" ng-controller="ESPositionEditCtrl"></ng-include>\n </div>\n\n \x3c!-- social networks --\x3e\n <ng-include src="::\'plugins/es/templates/common/edit_socials.html\'" ng-controller="ESSocialsEditCtrl"></ng-include>\n\n <div class="list item-text-wrap {{::motion.ionListClass}}">\n\n <div class="item item-divider" translate>PROFILE.TECHNICAL_DIVIDER</div>\n\n \x3c!-- pubkey --\x3e\n <div class="item item-input item-floating-label" ng-class="{\'item-input-error\': form.$submitted && form.pubkey.$invalid}">\n <span class="input-label" translate>REGISTRY.EDIT.RECORD_PUBKEY</span>\n <input type="text" name="pubkey" placeholder="{{\'REGISTRY.EDIT.RECORD_PUBKEY_HELP\'|translate}}" ng-model="formData.pubkey" autocomplete="off" ng-pattern="pubkeyPattern" ng-model-options="{ debounce: 250 }">\n </div>\n <div class="form-errors" ng-show="form.pubkey.$error" ng-messages="form.pubkey.$error">\n <div class="form-error" ng-message="pattern">\n <span translate="ERROR.INVALID_PUBKEY"></span>\n </div>\n </div>\n\n <div class="item padding hidden-xs hidden-sm text-right">\n <button class="button button-clear button-dark ink" ng-click="cancel()" type="button" translate>COMMON.BTN_CANCEL\n </button>\n <button class="button button-calm ink" ng-class="{\'button-assertive\': dirty}" type="submit">\n {{\'COMMON.BTN_SAVE\' | translate}}\n </button>\n </div>\n </div>\n </form>\n </div>\n\n <div class="col col-20 hidden-xs hidden-sm">&nbsp;\n </div>\n </div>\n\n </ion-content>\n\n</ion-view>\n'),e.put("plugins/es/templates/user/items_profile.html",'<div ng-if="!formData.profile && !formData.name" class="item gray" translate>PROFILE.NO_PROFILE_DEFINED</div>\n\n\x3c!-- name --\x3e\n<div class="item" ng-if="formData.name && showName">\n <span class="gray" translate>PROFILE.TITLE</span>\n <h3>{{formData.name}}</h3>\n</div>\n\n\x3c!-- About me --\x3e\n<div class="item item-text-wrap" ng-if="formData.profile && formData.profile.description">\n <span class="gray" translate>PROFILE.DESCRIPTION</span>\n <h3 trust-as-html="formData.profile.description"></h3>\n</div>\n\n\x3c!-- Localisation --\x3e\n<div class="item" ng-if="formData.profile.address || formData.profile.city" copy-on-click="{{formData.profile.address ? formData.profile.address + \'&#10;\' : \'\'}}{{formData.profile.city}}">\n <span class="gray" translate>LOCATION.LOCATION_DIVIDER</span>\n <h3>\n <span class="text-keep-lines" ng-if="formData.profile.address">{{formData.profile.address}}<br></span>\n {{formData.profile.city}}\n </h3>\n</div>\n\n\x3c!-- Socials networks --\x3e\n<div class="item" ng-if="formData.profile.socials && formData.profile.socials.length" ng-controller="ESSocialsViewCtrl">\n <span class="gray" translate>PROFILE.SOCIAL_NETWORKS_DIVIDER</span>\n <div class="list no-padding">\n <ion-item ng-repeat="social in formData.profile.socials | filter:filterFn track by social.url " id="social-{{::social.url|formatSlug}}" class="item-icon-left item-text-wrap no-padding-bottom ink" ng-click="openSocial($event, social)">\n <i class="icon ion-social-{{social.type}}" ng-class="{\'ion-bookmark\': social.type == \'other\', \'ion-link\': social.type == \'web\', \'ion-email\': social.type == \'email\', \'ion-iphone\': social.type == \'phone\'}"></i>\n <p ng-if="social.type && social.type != \'web\'">\n {{social.type}}\n <i class="ion-locked" ng-if="social.recipient"></i>\n </p>\n <h4>\n <a>{{::social.url}}</a>\n </h4>\n </ion-item>\n </div>\n</div>\n\n\n'),e.put("plugins/es/templates/wallet/view_wallet_extend.html",'<ng-if ng-if=":state:enable && extensionPoint === \'hero\'">\n \x3c!-- likes --\x3e\n <h4 class="light">\n <small ng-include="\'plugins/es/templates/common/view_likes.html\'" ng-init="canEdit=true"></small>\n </h4>\n</ng-if>\n\n<ng-if ng-if=":state:enable && extensionPoint === \'after-general\'">\n\n \x3c!-- profile --\x3e\n <div class="item item-divider item-divider-top-border">\n <span ng-bind-html="\'PROFILE.PROFILE_DIVIDER\' | translate"></span>\n <a class="badge button button-text button-small button-small-padding" ui-sref="app.user_edit_profile">\n <i class="icon ion-edit"></i>\n <span ng-if="!formData.profile" translate>PROFILE.BTN_ADD</span>\n <span ng-if="formData.profile" translate>PROFILE.BTN_EDIT</span>\n </a>\n </div>\n\n <ng-include src="\'plugins/es/templates/user/items_profile.html\'" ng-init="showName=true"></ng-include>\n\n \x3c!-- subscriptions --\x3e\n <div class="item item-divider item-divider-top-border">\n <span>\n {{\'SUBSCRIPTION.SUBSCRIPTION_DIVIDER\' | translate}}\n <i style="font-size: 12pt; cursor: pointer;" ng-click="showSubscriptionHelp=!showSubscriptionHelp" class="icon positive ion-ios-help-outline" title="{{\'SUBSCRIPTION.SUBSCRIPTION_DIVIDER_HELP\' | translate}}"></i>\n <span>\n\n <a class="badge button button-text button-small button-small-padding" ng-if="!formData.subscriptions.count" ui-sref="app.edit_subscriptions">\n <i class="icon ion-edit"></i>\n <span translate>SUBSCRIPTION.BTN_ADD</span>\n </a>\n </span></span></div>\n\n <div class="item item-text-wrap positive item-small-height" ng-show="showSubscriptionHelp">\n <small translate>SUBSCRIPTION.SUBSCRIPTION_DIVIDER_HELP</small>\n </div>\n\n <div ng-if="!formData.subscriptions.count" class="item gray" translate>SUBSCRIPTION.NO_SUBSCRIPTION</div>\n\n <a class="item item-icon-left item-text-wrap item-icon-right ink" ng-if="formData.subscriptions.count" ui-sref="app.edit_subscriptions">\n <i class="icon ion-gear-a"></i>\n <span translate>SUBSCRIPTION.SUBSCRIPTION_COUNT</span>\n <span class="badge badge-calm">{{formData.subscriptions.count}}</span>\n\n <i class="gray icon ion-ios-arrow-right"></i>\n </a>\n\n \x3c!-- page --\x3e\n <div class="item item-divider item-divider-top-border">\n <span>\n {{\'REGISTRY.WALLET.REGISTRY_DIVIDER\' | translate}}\n <i style="font-size: 12pt; cursor: pointer;" ng-click="showPagesHelp=!showPagesHelp" class="icon positive ion-ios-help-outline" title="{{\'REGISTRY.WALLET.REGISTRY_HELP\' | translate}}"></i>\n <span>\n\n <a class="badge button button-text button-small button-small-padding" ng-if="!formData.pages.count" ng-click="showNewPageModal($event)">\n <i class="icon ion-edit"></i>\n <span translate>REGISTRY.BTN_NEW</span>\n </a>\n </span></span></div>\n\n <div class="item item-text-wrap positive item-small-height" ng-show="showPagesHelp">\n <small translate>REGISTRY.WALLET.REGISTRY_HELP</small>\n </div>\n\n <div ng-if="!formData.pages.count" class="item gray" translate>REGISTRY.NO_PAGE</div>\n\n <a class="item item-icon-left item-text-wrap item-icon-right ink" ng-if="formData.pages.count" ui-sref="app.wallet_pages">\n <i class="icon ion-social-buffer"></i>\n <span translate>REGISTRY.MY_PAGES</span>\n <span class="badge badge-calm">{{formData.pages.count}}</span>\n\n <i class="gray icon ion-ios-arrow-right"></i>\n </a>\n</ng-if>\n'),e.put("plugins/es/templates/wot/view_identity_extend.html",'\x3c!-- Hero --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'hero\'">\n \x3c!-- likes --\x3e\n <h4 class="light">\n <small ng-include="\'plugins/es/templates/common/view_likes.html\'"></small>\n </h4>\n</ng-if>\n\n\x3c!-- Top fab buttons --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'buttons-top-fab\'">\n <button id="fab-compose-{{:rebind:formData.pubkey}}" class="button button-fab button-fab-top-left button-fab-hero mini button-stable spin" style="left: 88px;" ng-click="showNewMessageModal()">\n <i class="icon ion-compose"></i>\n </button>\n</ng-if>\n\n\x3c!-- Buttons section --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'buttons\'">\n\n \x3c!-- message --\x3e\n <button class="button button-calm button-raised icon icon-left icon ion-compose ink" ng-click="showNewMessageModal()" title="{{\'MESSAGE.BTN_WRITE\' | translate}}" translate>\n MESSAGE.BTN_WRITE\n </button>\n \x3c!-- Star --\x3e\n <button class="button button-stable button-small-padding ink" ng-if="likeData.stars && !likeData.stars.wasHit" title="{{\'WOT.VIEW.BTN_STAR_HELP\'|translate: likeData.stars }}" ng-click="showStarPopover($event)">\n <i class="icon ion-android-star-outline"></i>\n </button>\n <button class="button button-stable button-small-padding ink" ng-if="likeData.stars.wasHit" title="{{\'WOT.VIEW.BTN_REDO_STAR_HELP\'|translate: likeData.stars }}" ng-click="showStarPopover($event)">\n <i class="icon" ng-class="{\'ion-android-star-half\': likeData.stars.level > 0 && likeData.stars.level <=3, \'ion-android-star\': likeData.stars.level > 3}"></i>\n <span>{{likeData.stars.level}}/5</span>\n </button>\n\n \x3c!-- options --\x3e\n <button class="button button-stable button-small-padding icon ion-android-more-vertical" ng-click="showActionsPopover($event)">\n </button>\n</ng-if>\n\n\x3c!-- General section --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'general\'">\n\n \x3c!-- star level --\x3e\n <div class="item item-icon-left item-text-wrap" ng-if="likeData.stars" ng-click="smallscreen && showStarPopover($event)">\n\n <i class="icon" ng-class="{\'ion-android-star-outline\': likeData.stars.levelAvg <= 2, \'ion-android-star-half\': likeData.stars.levelAvg > 2 && likeData.stars.levelAvg <= 3, \'ion-android-star energized\': likeData.stars.levelAvg > 3}"></i>\n\n <span translate>WOT.VIEW.STARS</span>\n <h4 class="dark">{{\'WOT.VIEW.STAR_HIT_COUNT\' | translate: likeData.stars }}</h4>\n\n <div class="badge" ng-if="likeData.stars.loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n <div class="badge" ng-if="!likeData.stars.loading">\n <span ng-repeat="value in [1,2,3,4,5]" ng-class="{\'energized\': likeData.stars.levelAvg > 3, \'assertive\': likeData.stars.levelAvg <= 2}">\n <b class="ion-android-star" ng-if="value <= likeData.stars.levelAvg"></b>\n <b class="ion-android-star-half" ng-if="value > likeData.stars.levelAvg && value - 0.5 <= likeData.stars.levelAvg"></b>\n <b class="ion-android-star-outline" ng-if="value > likeData.stars.levelAvg && value - 0.5 > likeData.stars.levelAvg"></b>\n </span>\n <small class="dark">({{likeData.stars.levelAvg}}/5)</small>\n </div>\n </div>\n\n \x3c!-- Registration date --\x3e\n <ion-item class="item-icon-left" ng-if="formData.profile.creationTime">\n <i class="icon ion-person"></i>\n <b class="ion-clock icon-secondary" style="font-size: 16px; left: 35px; top: -7px;"></b>\n <span translate>WOT.VIEW.SENIORITY</span>\n <h5 class="dark">\n <span translate>WOT.REGISTERED_SINCE</span>\n {{formData.profile.creationTime | formatDate}}\n </h5>\n <span class="badge badge-stable">{{formData.profile.creationTime | formatFromNowShort }}</span>\n </ion-item>\n</ng-if>\n\n\x3c!-- After general section --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'after-general\'">\n\n <span class="item item-divider item-divider-top-border" translate>PROFILE.PROFILE_DIVIDER</span>\n\n <div class="double-padding-x padding-bottom">\n <ng-include src="\'plugins/es/templates/user/items_profile.html\'" ng-init="showName=false;"></ng-include>\n </div>\n\n</ng-if>\n'),e.put("plugins/es/templates/wot/view_popover_actions.html",'<ion-popover-view class="fit has-header">\n <ion-header-bar>\n <h1 class="title" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n\n <a class="item item-icon-left ink visible-xs visible-sm" ng-click="showSharePopover($event)">\n <i class="icon ion-android-share-alt"></i>\n {{\'COMMON.BTN_SHARE\' | translate}}\n </a>\n\n \x3c!--<a class="item item-icon-left assertive ink "\n ng-if="canEdit"\n ng-click="delete()">\n <i class="icon ion-trash-a"></i>\n {{\'COMMON.BTN_DELETE\' | translate}}\n </a>--\x3e\n\n \x3c!-- Follow --\x3e\n <a class="item item-icon-left ink" ng-if="!canEdit && likeData.follows" ng-click="hideActionsPopover() && toggleLike($event, {kind: \'follow\'})">\n <i class="icon" ng-class="{\'ion-android-notifications-off\': likeData.follows.wasHit, \'ion-android-notifications\': !likeData.follows.wasHit}"></i>\n <b class="ion-plus icon-secondary" ng-if="!likeData.follows.wasHit" style="font-size: 16px; left: 38px; top: -7px;"></b>\n {{(!likeData.follows.wasHit ? \'WOT.VIEW.BTN_FOLLOW\' : \'WOT.VIEW.BTN_STOP_FOLLOW\' )| translate}}\n </a>\n\n \x3c!-- report abuse --\x3e\n <a class="item item-icon-left ink" ng-if="!canEdit && likeData.abuses && !likeData.abuses.wasHit" ng-click="hideActionsPopover() && reportAbuse($event)">\n <i class="icon ion-android-warning"></i>\n {{\'COMMON.BTN_REPORT_ABUSE_DOTS\' | translate}}\n </a>\n <a class="item item-icon-left ink" ng-if="!canEdit && likeData.abuses && likeData.abuses.wasHit" ng-click="hideActionsPopover() && toggleLike($event, {kind: \'abuse\'})">\n <i class="icon ion-android-warning"></i>\n <b class="ion-close icon-secondary" style="font-size: 16px; left: 38px; top: -7px;"></b>\n {{\'COMMON.BTN_REMOVE_REPORTED_ABUSE\' | translate}}\n </a>\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/graph/templates/account/graph_balance.html",'\n \x3c!-- button bar --\x3e\n <div class="button-bar-inline" style="top: 33px; margin-top:-33px; position: relative;">\n <button class="button button-stable button-clear no-padding-xs pull-right" ng-click="showActionsPopover($event)">\n <i class="icon ion-navicon-round"></i>\n </button>\n </div>\n\n <div class="padding-left padding-right">\n <canvas id="account-balance" class="chart-bar" height="{{height}}" width="{{width}}" chart-data="data" chart-dataset-override="datasetOverride" chart-colors="colors" chart-options="options" chart-labels="labels" chart-click="onChartClick">\n </canvas>\n </div>\n\n <ng-include src="\'plugins/graph/templates/common/graph_range_bar.html\'"></ng-include>\n'),e.put("plugins/graph/templates/account/graph_certifications.html",'\n <div class="padding-left padding-right">\n <canvas id="account-certifications" class="chart-bar" height="{{height}}" width="{{width}}" chart-data="data" chart-dataset-override="datasetOverride" chart-colors="colors" chart-options="options" chart-labels="labels" chart-click="onChartClick">\n </canvas>\n </div>\n'),e.put("plugins/graph/templates/account/graph_sum_tx.html",'<div class="row responsive-sm" ng-if="!loading">\n\n <div class="col col-10 hidden-xs hidden-sm">&nbsp;</div>\n\n <div class="col text-center">\n\n \x3c!-- [NEW] TX input chart --\x3e\n <p class="gray padding text-wrap" ng-if="inputChart.data.length" translate>GRAPH.ACCOUNT.INPUT_CHART_TITLE</p>\n <canvas id="chart-received-pie" class="chart-pie" chart-data="inputChart.data" chart-labels="inputChart.labels" chart-colors="inputChart.colors" chart-click="onInputChartClick">\n </canvas>\n\n </div>\n\n <div class="col col-10 hidden-xs hidden-sm">&nbsp;</div>\n\n <div class="col text-center">\n\n \x3c!-- [NEW] TX input chart --\x3e\n <p class="gray padding text-wrap" ng-if="outputChart.data.length" translate>GRAPH.ACCOUNT.OUTPUT_CHART_TITLE</p>\n <canvas id="chart-sent-pie" class="chart-pie" chart-data="outputChart.data" chart-labels="outputChart.labels" chart-colors="outputChart.colors" chart-click="onOutputChartClick">\n </canvas>\n\n </div>\n\n <div class="col col-10 hidden-xs hidden-sm">&nbsp;</div>\n\n</div>\n'),e.put("plugins/graph/templates/account/view_stats.html",'<ion-view left-buttons="leftButtons" cache-view="false">\n <ion-nav-title>\n {{\'GRAPH.ACCOUNT.TITLE\' | translate}}{{id}}\n </ion-nav-title>\n\n <ion-content scroll="true" class="no-padding">\n\n\n\n <div class="list">\n\n \x3c!-- - - - - Balance - - - - --\x3e\n <ng-controller ng-controller="GpAccountBalanceCtrl">\n <div class="center padding" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="item item-divider" ng-if="!loading">\n {{\'GRAPH.ACCOUNT.BALANCE_DIVIDER\'|translate}}\n <ion-spinner ng-if="loadingRange" class="ion-spinner-small" icon="android"></ion-spinner>\n </div>\n\n <div class="item no-padding-xs" ng-if="!loading" ng-include="\'plugins/graph/templates/account/graph_balance.html\'" ng-init="setSize(350, 1000)">\n </div>\n </ng-controller>\n\n </div>\n\n <div class="item no-padding-xs" ng-include="\'plugins/graph/templates/account/graph_sum_tx.html\'" ng-controller="GpAccountSumTxCtrl">\n </div>\n\n\n </ion-content>\n\n</ion-view>\n'),e.put("plugins/graph/templates/common/graph_range_bar.html",'\n <div class="range range-positive no-padding-left no-padding-right">\n <a class="button button-stable button-clear no-padding pull-left" ng-click="goPreviousRange($event)">\n <i class="icon ion-chevron-left"></i>\n </a>\n <input type="range" ng-model="formData.timePct" name="timePct" min="0" max="100" value="{{formData.timePct}}" ng-change="onRangeChanged();" ng-model-options="{ debounce: 250 }">\n <a class="button button-stable button-clear no-padding pull-right" ng-click="goNextRange($event)">\n <i class="icon ion-chevron-right"></i>\n </a>\n </div>\n'),e.put("plugins/graph/templates/common/popover_range_actions.html",'<ion-popover-view class="has-header popover-graph-currency">\n <ion-header-bar>\n <h1 class="title" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n\n \x3c!-- duration divider --\x3e\n <div class="item item-divider">\n {{\'GRAPH.COMMON.RANGE_DURATION_DIVIDER\'|translate}}\n </div>\n\n \x3c!-- duration: hour --\x3e\n <a class="item item-icon-left ink" ng-click="setRangeDuration(\'hour\')">\n <i class="icon ion-ios-checkmark-empty" ng-show="formData.rangeDuration==\'hour\'"></i>\n <span ng-bind-html="\'GRAPH.COMMON.RANGE_DURATION.HOUR\' | translate"></span>\n </a>\n\n \x3c!-- duration: day --\x3e\n <a class="item item-icon-left ink" ng-click="setRangeDuration(\'day\')">\n <i class="icon ion-ios-checkmark-empty" ng-show="formData.rangeDuration==\'day\'"></i>\n <span ng-bind-html="\'GRAPH.COMMON.RANGE_DURATION.DAY\' | translate"></span>\n </a>\n\n \x3c!-- duration: month --\x3e\n <a class="item item-icon-left ink" ng-click="setRangeDuration(\'month\')">\n <i class="icon ion-ios-checkmark-empty" ng-show="formData.rangeDuration==\'month\'"></i>\n <span ng-bind-html="\'GRAPH.COMMON.RANGE_DURATION.MONTH\' | translate"></span>\n </a>\n\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/graph/templates/docstats/graph.html",'\n \x3c!-- graphs button bar --\x3e\n <div class="button-bar-inline" style="top: 33px; margin-top:-33px; position: relative;">\n <button class="button button-stable button-clear no-padding-xs pull-right" ng-click="showActionsPopover($event)">\n <i class="icon ion-navicon-round"></i>\n </button>\n </div>\n\n <canvas id="{{::chartIdPrefix}}{{chart.id}}" class="chart-line" height="{{height}}" width="{{width}}" chart-data="chart.data" chart-labels="labels" chart-dataset-override="chart.datasetOverride" chart-options="chart.options" chart-click="onChartClick">\n </canvas>\n\n <ng-include src="\'plugins/graph/templates/common/graph_range_bar.html\'"></ng-include>\n'),e.put("plugins/graph/templates/docstats/view_stats.html",'<ion-view left-buttons="leftButtons" cache-view="false">\n <ion-nav-title>\n {{\'GRAPH.DOC_STATS.TITLE\' | translate}}\n </ion-nav-title>\n\n <ion-content scroll="true" class="padding">\n\n <div class="list">\n\n \x3c!-- Doc stat --\x3e\n <div class="center padding" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="item no-padding-xs" ng-if="!loading" ng-repeat="chart in charts" ng-include="\'plugins/graph/templates/docstats/graph.html\'" ng-init="setSize(250, 1000)">\n </div>\n\n </div>\n\n </ion-content>\n\n</ion-view>\n'),e.put("plugins/graph/templates/network/view_es_network_extend.html",'\x3c!-- Buttons section --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'buttons\'">\n <a class="button button-text button-small ink" ui-sref="app.doc_stats_lg">\n <i class="icon ion-stats-bars"></i>\n <span>{{\'NETWORK.VIEW.BTN_GRAPH\'|translate}}</span>\n </a>\n</ng-if>\n'),e.put("plugins/graph/templates/network/view_es_peer_extend.html",'\x3c!-- Buttons section --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'general\'">\n\n <a class="item item-icon-left item-icon-right item-text-wrap ink" ng-if="isReachable" ui-sref="app.doc_stats_lg">\n <i class="icon ion-stats-bars"></i>\n <span translate>GRAPH.DOC_STATS.TITLE</span>\n <i class="gray icon ion-ios-arrow-right"></i>\n </a>\n\n <a class="item item-icon-left item-icon-right item-text-wrap ink" ng-if="isReachable" ui-sref="app.doc_synchro_lg">\n <i class="icon ion-stats-bars"></i>\n <span translate>GRAPH.SYNCHRO.TITLE</span>\n <i class="gray icon ion-ios-arrow-right"></i>\n </a>\n</ng-if>\n\n'),e.put("plugins/graph/templates/synchro/graph.html",'\n \x3c!-- graphs button bar --\x3e\n <div class="button-bar-inline" style="top: 33px; margin-top:-33px; position: relative;">\n <button class="button button-stable button-clear no-padding-xs pull-right" ng-click="showActionsPopover($event)">\n <i class="icon ion-navicon-round"></i>\n </button>\n </div>\n\n <canvas id="synchro-chart-{{chart.id}}" class="chart-bar" height="{{height}}" width="{{width}}" chart-data="chart.data" chart-labels="labels" chart-dataset-override="chart.datasetOverride" chart-options="chart.options">\n </canvas>\n\n <ng-include src="\'plugins/graph/templates/common/graph_range_bar.html\'"></ng-include>\n'),e.put("plugins/graph/templates/synchro/view_stats.html",'<ion-view left-buttons="leftButtons" cache-view="false">\n <ion-nav-title>\n {{\'GRAPH.SYNCHRO.TITLE\' | translate}}\n </ion-nav-title>\n\n <ion-content scroll="true" class="padding">\n\n <div class="list">\n\n <div class="center padding" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="item no-padding-xs" ng-if="!loading" ng-repeat="chart in charts" ng-include="\'plugins/graph/templates/synchro/graph.html\'" ng-init="setSize(250, 1000)">\n </div>\n\n </div>\n\n </ion-content>\n\n</ion-view>\n'),e.put("plugins/map/templates/shape/edit_shape.html",'<ion-view left-buttons="leftButtons">\n <ion-nav-title>\n <span translate>MAP.SHAPE.EDIT.TITLE</span>\n </ion-nav-title>\n\n \x3c!-- country form --\x3e\n <form name="countryForm" novalidate="" ng-submit="save()">\n\n <ion-header-bar class="stable-bg has-header" style="top:45px;" ng-init="setCountryForm(countryForm)">\n\n <div class="row no-padding no-margin">\n <div class="col no-padding no-margin">&nbsp;\n </div>\n <div class="col no-margin floating">\n\n \x3c!-- country (select) --\x3e\n <label ng-if="!map.geojson.data" class="item item-input item-select stable-bg no-padding">\n <div class="input-label padding-left" translate>MAP.SHAPE.EDIT.COUNTRY_DOTS</div>\n <input type="text" name="country" ng-model="formData.country" class="ng-hide" required>\n <select ng-model="formData.country" ng-change="onCountryChange(formData.country)" ng-options="country as (countriesMap[country] || country) for country in countries track by country">\n </select>\n </label>\n\n \x3c!-- country (input) --\x3e\n <div ng-if="map.geojson.data" class="item item-input stable-bg no-padding" ng-class="{\'item-input-error\': countryForm.$submitted && countryForm.country.$invalid}">\n <span class="input-label padding-left" translate>MAP.SHAPE.EDIT.COUNTRY_DOTS</span>\n <input type="text" name="country" placeholder="{{\'MAP.SHAPE.EDIT.COUNTRY_HELP\'|translate}}" ng-model="formData.country" autocomplete="off" ng-pattern="iso2Pattern" required>\n </div>\n <div class="form-errors light-bg" ng-show="countryForm.$submitted && countryForm.country.$invalid" ng-messages="countryForm.country.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n <div class="form-error" ng-message="pattern">\n <span translate="MAP.SHAPE.EDIT.ERROR.INVALID_COUNTRY_CODE"></span>\n </div>\n </div>\n </div>\n\n <div class="col no-padding no-margin">\n\n <div class="pull-right ng-hide" ng-show="map.geojson.data">\n <button class="button button-clear button-small ink" type="button" ng-click="download()">\n <span class="dark" translate>COMMON.BTN_DOWNLOAD</span>\n </button>\n <button class="button button-clear button-small ink" type="button" ng-click="cancel()">\n <span class="dark" translate>COMMON.BTN_CANCEL</span>\n </button>\n </div>\n </div>\n </div>\n\n </ion-header-bar>\n </form>\n\n <ion-content style="top:90px;">\n\n \x3c!-- Add file drop zone --\x3e\n <div class="block padding" ng-if="!map.geojson.data">\n <div drop-zone="onFileChanged(file)">\n <div file-select="onFileChanged(file)" accept="*.json">\n <i class="ion-map stable" style="font-size:150px"></i>\n <b class="ion-plus gray" style="position:relative; font-size:80px; top:-51px; right: 19px;"></b>\n <p class="gray" translate>MAP.COMMON.CHOOSE_FILE</p>\n </div>\n </div>\n </div>\n\n <div class="row no-padding no-margin" style="height: calc(100vh - 90px);">\n\n <div class="col col-75 no-padding" ng-style="{\'overflow-y\': map.geojson.data ? \'scroll\' : \'\'}">\n\n \x3c!-- leaflet map --\x3e\n <leaflet ng-if="map.geojson.data" height="40%" id="{{::mapId}}" lf-center="map.center" bounds="map.bounds" geojson="map.geojson">\n </leaflet>\n\n \x3c!-- Shape --\x3e\n <div id="{{::shapeId}}" class="shape-container compacted"></div>\n </div>\n\n\n <div class="col col-25 no-margin" style="border-left: 1px solid lightgrey;" ng-if="elementData.element || map.geojson.data">\n\n \x3c!-- ******** Config form ******** --\x3e\n\n <form name="configForm" novalidate="" ng-submit="applySvgConfig()" class="list">\n <div class="item item-divider" ng-init="setConfigForm(configForm)" translate>\n MAP.SHAPE.EDIT.CONFIG_FORM_DIVIDER\n </div>\n\n \x3c!-- top lat --\x3e\n <div class="item col-50 col-offset-25 item-input item-floating-label" ng-if="showConfig" ng-class="{\'item-input-error\': configForm.$submitted && configForm.topLat.$invalid}">\n <span class="input-label" translate>MAP.SHAPE.EDIT.TOP_LAT</span>\n <input type="number" name="topLat" class="" placeholder="{{\'MAP.SHAPE.EDIT.TOP_LAT\'|translate}}" ng-model="configData.geoViewBox.topLat" step="0.001" min="-90" max="90" required>\n </div>\n <div class="form-errors" ng-show="configForm.$submitted && configForm.topLat.$invalid" ng-messages="configForm.topLat.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n <div class="item row no-margin no-padding" ng-if="showConfig">\n <div class="col col-50">\n \x3c!-- left lng --\x3e\n <div class="item-input item-floating-label" ng-class="{\'item-input-error\': configForm.$submitted && configForm.leftLng.$invalid}">\n <span class="input-label" translate>MAP.SHAPE.EDIT.LEFT_LNG</span>\n <input type="number" name="leftLng" placeholder="{{\'MAP.SHAPE.EDIT.LEFT_LNG\'|translate}}" ng-model="configData.geoViewBox.leftLng" step="0.001" min="-180" max="180" required>\n </div>\n <div class="form-errors" ng-show="configForm.$submitted && configForm.leftLng.$invalid" ng-messages="configForm.leftLng.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n </div>\n\n <div class="col col-50" ng-if="showConfig">\n \x3c!-- right lng --\x3e\n <div class="item-input item-floating-label" ng-class="{\'item-input-error\': configForm.$submitted && configForm.rightLng.$invalid}">\n <span class="input-label" translate>MAP.SHAPE.EDIT.RIGHT_LNG</span>\n <input type="number" name="rightLng" placeholder="{{\'MAP.SHAPE.EDIT.RIGHT_LNG\'|translate}}" ng-model="configData.geoViewBox.rightLng" step="0.001" min="-180" max="180" required>\n </div>\n <div class="form-errors" ng-show="configForm.$submitted && configForm.rightLng.$invalid" ng-messages="configForm.rightLng.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n </div>\n </div>\n\n \x3c!-- bottom lat --\x3e\n <div class="row no-margin no-padding" ng-if="showConfig">\n <div class="item col col-offset-25 col-50 item-input item-floating-label" ng-class="{\'item-input-error\': configForm.$submitted && configForm.bottomLat.$invalid}">\n <span class="input-label" translate>MAP.SHAPE.EDIT.BOTTOM_LAT</span>\n <input type="number" name="leftLng" placeholder="{{\'MAP.SHAPE.EDIT.BOTTOM_LAT\'|translate}}" ng-model="configData.geoViewBox.bottomLat" step="0.001" min="-90" max="90" required>\n </div>\n <div class="form-errors" ng-show="configForm.$submitted && configForm.leftLng.$invalid" ng-messages="configForm.leftLng.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n </div>\n\n \x3c!-- Remove hole --\x3e\n <ion-checkbox ng-model="configData.removeHole" class="item ink item-text-wrap">\n <div class="item-content dark" translate>MAP.SHAPE.EDIT.REMOVE_HOLE</div>\n </ion-checkbox>\n\n \x3c!-- Strict mode --\x3e\n <ion-checkbox ng-model="configData.strictMode" class="item ink item-text-wrap">\n <div class="item-content dark" translate>MAP.SHAPE.EDIT.STRICT_MODE</div>\n </ion-checkbox>\n\n \x3c!-- Max precision --\x3e\n <ion-checkbox ng-if="showConfig" ng-model="configData.applyRound" class="item ink item-text-wrap">\n <div class="item-content dark" translate>MAP.SHAPE.EDIT.APPLY_ROUND</div>\n </ion-checkbox>\n\n \x3c!-- precision --\x3e\n <div class="item-input item-floating-label" ng-if="configData.applyRound" ng-class="{\'item-input-error\': configForm.$submitted && configForm.degreePrecision.$invalid}">\n <span class="input-label" translate>MAP.SHAPE.EDIT.DEGREES_PRECISION</span>\n <input type="number" name="degreePrecision" ng-model="configData.degreePrecision" placeholder="{{\'MAP.SHAPE.EDIT.DEGREES_PRECISION\'|translate}}" min="0" required>\n </div>\n <div class="form-errors" ng-show="configForm.$submitted && configForm.degreePrecision.$invalid" ng-messages="configForm.degreePrecision.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n \x3c!-- Auto compute projection --\x3e\n <ion-checkbox ng-if="showConfig" ng-model="configData.customProjection" class="item ink item-text-wrap">\n <div class="item-content dark" translate>MAP.SHAPE.EDIT.CUSTOM_PROJECTION</div>\n </ion-checkbox>\n\n \x3c!-- translate--\x3e\n <div class="item row no-margin no-padding" ng-if="showConfig && configData.customProjection">\n <div class="col col-50">\n \x3c!-- translate X --\x3e\n <div class="item-input item-floating-label" ng-class="{\'item-input-error\': configForm.$submitted && configForm.translateX.$invalid}">\n <span class="input-label" translate>MAP.SHAPE.EDIT.TRANSLATE_X</span>\n <input type="number" name="translateX" placeholder="{{\'MAP.SHAPE.EDIT.TRANSLATE_X\'|translate}}" ng-model="configData.translateX" required>\n </div>\n <div class="form-errors" ng-show="configForm.$submitted && configForm.translateX.$invalid" ng-messages="configForm.translateX.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n </div>\n\n <div class="col col-50">\n \x3c!-- translate Y --\x3e\n <div class="item-input item-floating-label" ng-class="{\'item-input-error\': configForm.$submitted && configForm.translateY.$invalid}">\n <span class="input-label" translate>MAP.SHAPE.EDIT.TRANSLATE_Y</span>\n <input type="number" name="translateY" placeholder="{{\'MAP.SHAPE.EDIT.TRANSLATE_Y\'|translate}}" ng-model="configData.translateY" required>\n </div>\n <div class="form-errors" ng-show="configForm.$submitted && configForm.translateY.$invalid" ng-messages="configForm.translateY.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n </div>\n </div>\n\n \x3c!-- scale --\x3e\n <div class="item item-input item-floating-label item-button-right" ng-if="configData.customProjection" ng-class="{\'item-input-error\': configForm.$submitted && configForm.scale.$invalid}">\n <span class="input-label" translate>MAP.SHAPE.EDIT.SCALE</span>\n <input type="number" name="scale" placeholder="{{\'MAP.SHAPE.EDIT.SCALE\'|translate}}" ng-model="configData.scale" required>\n </div>\n <div class="form-errors" ng-show="configForm.$submitted && configForm.scale.$invalid" ng-messages="configForm.scale.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n \x3c!-- config form buttons --\x3e\n <div class="padding-top text-right">\n \x3c!-- apply --\x3e\n <button ng-if="showConfig" class="button button-positive button-small button-small-padding ink" type="submit" translate>MAP.SHAPE.EDIT.BTN_APPLY</button>\n\n <button class="button button-assertive button-small button-small-padding ink" type="button" ng-disabled="!dirty" ng-click="save()">\n <span translate>COMMON.BTN_SAVE</span>\n </button>\n </div>\n\n \x3c!-- errors --\x3e\n <div class="item item-divider padding-top" ng-if="formData.errors" translate>MAP.SHAPE.EDIT.ERROR_DIVIDER\n </div>\n <div class="item item-text-wrap" ng-if="formData.errors" ng-repeat="err in formData.errors">\n\n <div class="assertive">\n <i class="icon ion-close-circled"></i>\n <span ng-bind-html="err.message | translate: err.messageParams"></span>\n </div>\n <h4>\n <a ng-if="err.lat && err.lon" ng-click="centerMap({lat: err.lat, lon: err.lon})">\n {{\'MAP.COMMON.BTN_SHOW_ON_MAP\'|translate}}\n </a>\n </h4>\n </div>\n\n </form>\n\n \x3c!-- Edit properties form --\x3e\n <form name="elementForm" novalidate="" ng-submit="confirmEditElement()" class="list" ng-if="elementData.element">\n <div class="item item-divider" ng-init="setElementForm(elementForm)" translate>\n MAP.SHAPE.EDIT.AREA_FORM_DIVIDER\n </div>\n\n \x3c!-- ID --\x3e\n <div class="item item-input" ng-class="{\'item-input-error\': elementForm.$submitted && elementForm.id.$invalid}">\n <span class="input-label" translate>MAP.SHAPE.EDIT.ID</span>\n <input type="text" name="id" autocomplete="off" placeholder="{{\'MAP.SHAPE.EDIT.ID\'|translate}}" ng-model="elementData.id" required>\n </div>\n <div class="form-errors" ng-show="elementForm.$submitted && elementForm.id.$invalid" ng-messages="elementForm.id.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n \x3c!-- element title --\x3e\n <div class="item item-input item-floating-label" ng-class="{\'item-input-error\': elementForm.$submitted && elementForm.title.$invalid}">\n <span class="input-label" translate>MAP.SHAPE.EDIT.NAME</span>\n <input type="text" name="title" autocomplete="off" placeholder="{{\'MAP.SHAPE.EDIT.NAME\'|translate}}" ng-model="elementData.title" required>\n </div>\n <div class="form-errors" ng-show="elementForm.$submitted && elementForm.title.$invalid" ng-messages="elementForm.title.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n \x3c!-- element position --\x3e\n <label class="item item-input item-select" style="margin-top: 2px;" ng-class="{\'item-input-error\': elementForm.$submitted && elementForm.position.$invalid}">\n <div class="input-label pull-right" translate>MAP.SHAPE.EDIT.POSITION_DOTS</div>\n <input type="text" name="position" ng-model="elementData.position" class="ng-hide" required>\n <select ng-model="elementData.position" ng-change="onPositionChange(elementData.position)" ng-options="position for position in positions track by position">\n </select>\n </label>\n <div class="form-errors" ng-show="elementForm.$submitted && elementForm.position.$invalid" ng-messages="elementForm.position.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n \x3c!-- order --\x3e\n <div class="item item-input item-floating-label" ng-class="{\'item-input-error\': elementForm.$submitted && elementForm.order.$invalid}">\n <span class="input-label" translate>MAP.SHAPE.EDIT.ORDER</span>\n <input type="number" name="order" min="1" autocomplete="off" ng-disabled="elementData.position === \'main\'" placeholder="{{\'MAP.SHAPE.EDIT.ORDER\'|translate}}" ng-model="elementData.order" required-if="elementData.position !== \'main\'">\n </div>\n <div class="form-errors" ng-show="elementForm.$submitted && elementForm.order.$invalid" ng-messages="elementForm.order.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n <div class="form-error" ng-message="min">\n <span translate="ERROR.FIELD_MIN" translate-values="{min: 1}"></span>\n </div>\n </div>\n\n \x3c!-- element form buttons --\x3e\n <div class="padding-top text-right">\n \x3c!-- cancel --\x3e\n <button class="button button-clear button-dark button-small button-small-padding ink" type="button" ng-click="cancelEditElement()" translate>COMMON.BTN_CANCEL</button>\n \x3c!-- apply --\x3e\n <button class="button button-positive button-small button-small-padding ink" type="submit" translate>MAP.SHAPE.EDIT.BTN_APPLY</button>\n </div>\n\n \x3c!-- more actions (delete, test search) --\x3e\n <div class="block padding-top text-center">\n <p>\n <a class="assertive" ng-click="deleteElement()" translate>MAP.SHAPE.EDIT.BTN_DELETE</a>\n <br>\n <a ng-click="searchOnPath()" translate>MAP.SHAPE.EDIT.BTN_TEST_SEARCH</a>\n </p>\n </div>\n\n </form>\n </div>\n\n\n </div>\n\n\n </ion-content>\n\n\n</ion-view>\n'),e.put("plugins/map/templates/shape/view_shape.html",'\n<div class="padding">\n <div class="center padding" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n \x3c!-- Shape --\x3e\n <div id="{{::shapeId}}" class="shape-container compacted"></div>\n\n \x3c!-- Country links --\x3e\n <p ng-if="!loading && countries.length &gt; 1" class="padding-top">\n <ng-repeat ng-repeat="country in countries">\n <span ng-if="$index">&nbsp;|&nbsp;</span>\n <a ng-class="{\'bold\': country === selectedCountry}" ng-click="onCountryChange(country)">\n {{countriesMap[country] || (country|uppercase) }}\n </a>\n </ng-repeat>\n </p>\n\n \x3c!-- DEV ONLY\n <br/>\n <p>\n <a href="" id="demolink" target="_blank">View on a map, as GeoJSON</a>\n </p>--\x3e\n</div>\n'),e.put("plugins/map/templates/user/edit_profile_extend.html",'<div class="item no-padding {{ionItemClass}}" ng-if="formData.geoPoint && formData.geoPoint.lat && formData.geoPoint.lon">\n <leaflet height="250px" center="map.center" markers="map.markers" defaults="map.defaults">\n </leaflet>\n</div>\n'),e.put("plugins/market/templates/category/card_category_lg.html",'\n <div class="item card card-category stable-bg padding-bottom">\n \x3c!-- header: parent category --\x3e\n <div class="card-header">\n <a class="item block padding text-left" ng-class="{\'bold\': cat.count}" ng-click="onCategoryClick(cat)">\n <h3 class="dark bold"><span ng-bind-html="cat.name"></span>\n </h3>\n </a>\n </div>\n\n \x3c!-- children categories--\x3e\n <div class="list no-padding">\n <a ng-repeat="cat in cat.children" class="item item-small-height item-text-wrap positive ink" ng-click="onCategoryClick(cat)">\n <span ng-bind-html="cat.name"></span><ng-if ng-if="cat.count">&nbsp;({{cat.count}})</ng-if></a>\n </div>\n </div>\n'),e.put("plugins/market/templates/category/edit_categories.html",'<ion-view left-buttons="leftButtons">\n <ion-nav-title>\n <span translate>MARKET.CATEGORY.EDIT.TITLE</span>\n </ion-nav-title>\n <ion-content>\n\n <div class="row">\n <div class="col col-20 hidden-xs hidden-sm">&nbsp;</div>\n <div class="col">\n\n\n <div class="center" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="padding assertive" ng-if="!loading && categories.length===0" translate>\n COMMON.SEARCH_NO_RESULT\n </div>\n\n \x3c!-- filter: locales and add/reorder buttons --\x3e\n <div class="list no-padding {{::motion.ionListClass}}">\n <div class="item item-text-wrap">\n <div class="col-60">\n <ng-repeat ng-repeat="l in locales">\n <span class="gray" ng-if="$index">|&nbsp;</span>\n <a class="button button-text button-small no-padding-bottom ink" ng-click="onChangeLocale(l)" ng-class="{\'button-text-positive\': l.id === locale, \'gray\': l.id !== locale}">{{l.label}}</a>\n </ng-repeat>\n </div>\n <div class="badge">\n <a class="button button-text button-small button-small-padding" ng-click="addRootCategory()">\n <span translate>MARKET.CATEGORY.EDIT.BTN_ADD</span>\n </a>\n\n <a class="button button-text button-small button-small-padding" ng-class="{\'button-text-positive\': reorderRoot}" ng-click="reorderRoot=!reorderRoot">\n <span translate>MARKET.CATEGORY.EDIT.BTN_REORDER</span>\n </a>\n </div>\n\n </div>\n </div>\n\n \x3c!-- List of root categories ONLY, when reorderRoot enable --\x3e\n <ion-list show-reorder="true" ng-if="reorderRoot">\n\n \x3c!-- loop on root categories --\x3e\n <ion-item ng-repeat="rootCat in categories track by rootCat.id" class="item-no-border item-icon-right stable-bg dark" ng-class="{\'bold\': rootCat.count}">\n <span ng-bind-html="getName(rootCat)"></span><ng-if ng-if="rootCat.count">&nbsp;({{rootCat.count}})</ng-if>\n <ion-reorder-button class="ion-drag" on-reorder="reorderRootCategory(rootCat, $fromIndex, $toIndex)">\n </ion-reorder-button>\n </ion-item>\n\n </ion-list>\n\n \x3c!-- Categories tree --\x3e\n <ng-if ng-if="!reorderRoot">\n\n \x3c!-- loop on root categories --\x3e\n <div class="card stable-bg padding" ng-repeat="rootCat in categories track by rootCat.id">\n <div class="item item-no-border item-icon-right bold">\n <span ng-bind-html="getName(rootCat, true)"></span><ng-if ng-if="rootCat.count">&nbsp;({{rootCat.count}})</ng-if>\n <a class="gray hidden-device" ng-click="removeRootCategory($index)">\n &nbsp;<b class="ion ion-trash-a"></b>&nbsp;\n </a>\n <a class="gray hidden-device" ng-click="editRootCategory($index)">\n &nbsp;<b class="ion ion-edit"></b>&nbsp;\n </a>\n\n <div class="badge">\n <a class="button button-text button-small button-small-padding" ng-click="addChildCategory(rootCat)">\n <span translate>MARKET.CATEGORY.EDIT.BTN_ADD</span>\n </a>\n <a class="button button-text button-small button-small-padding" ng-class="{\'button-text-positive\': reorderChildren === rootCat.id}" ng-click="reorderChildren=!(reorderChildren === rootCat.id) && rootCat.id">\n <span translate>MARKET.CATEGORY.EDIT.BTN_REORDER</span>\n </a>\n </div>\n </div>\n\n <ion-list show-reorder="reorderChildren === rootCat.id">\n\n\n \x3c!-- children categories--\x3e\n <ion-item ng-repeat="child in rootCat.children track by child.id" class="item item-icon-right item-border" id="{{child.id}}">\n <span ng-bind-html="getName(child, true)"></span><span ng-if="child.count">&nbsp;({{child.count}})</span>\n\n <a class="gray hidden-device" ng-if="reorderChildren !== rootCat.id" ng-click="removeChildCategory(rootCat, $index)">\n &nbsp;<b class="ion ion-trash-a"></b>&nbsp;\n </a>\n <a class="gray hidden-device" ng-if="reorderChildren !== rootCat.id" ng-click="editChildCategory(rootCat, $index)">\n &nbsp;<b class="ion ion-edit"></b>&nbsp;\n </a>\n\n <ion-reorder-button class="ion-drag" on-reorder="reorderChildrenCategory(rootCat, child, $fromIndex, $toIndex)">\n </ion-reorder-button>\n\n </ion-item>\n </ion-list>\n </div>\n\n </ng-if>\n\n\n <div class="item hidden-xs hidden-sm text-right no-border ng-hide" ng-show="!loading">\n <button class="button button-clear button-dark ink" ng-click="cancel()" type="button" translate>COMMON.BTN_CANCEL</button>\n <button class="button button-calm ink" ng-class="{\'button-assertive\': dirty}" ng-click="save()" type="button" translate>COMMON.BTN_SAVE</button>\n </div>\n </div>\n <div class="col col-20 hidden-xs hidden-sm">&nbsp;</div>\n </div>\n\n\n </ion-content>\n</ion-view>\n'),e.put("plugins/market/templates/category/list_categories_lg.html",'<div class="row">\n <div class="col col-33">\n <ng-repeat ng-repeat="cat in categories track by cat.id" ng-if="$index % 3 == 0" ng-include="\'plugins/market/templates/category/card_category_lg.html\'">\n </ng-repeat>\n </div>\n\n <div class="col col-33">\n <ng-repeat ng-repeat="cat in categories track by cat.id" ng-if="$index % 3 == 1" ng-include="\'plugins/market/templates/category/card_category_lg.html\'">\n </ng-repeat>\n </div>\n\n <div class="col col-33">\n <ng-repeat ng-repeat="cat in categories track by cat.id" ng-if="$index % 3 == 2" ng-include="\'plugins/market/templates/category/card_category_lg.html\'">\n </ng-repeat>\n </div>\n</div>\n'),e.put("plugins/market/templates/category/popup_edit_category.html",'<form name="editForm" ng-submit="">\n <div class="list" ng-init="setEditForm(editForm)">\n \x3c!-- id --\x3e\n <label class="item item-input item-floating-label" ng-class="{\'item-input-error\': editForm.$submitted && editForm.id.$invalid}">\n <span class="input-label">{{\'MARKET.CATEGORY.EDIT.ID\' | translate}}</span>\n <input name="id" type="text" placeholder="{{\'MARKET.CATEGORY.EDIT.ID\' | translate}}" ng-model="formData.id" ng-minlength="4" ng-pattern="idPattern" required>\n </label>\n <div class="form-errors" ng-if="editForm.$submitted && editForm.id.$error" ng-messages="editForm.id.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT"></span>\n </div>\n <div class="form-error" ng-message="pattern">\n <span translate="MARKET.CATEGORY.EDIT.ERROR.INVALID_ID_PATTERN"></span>\n </div>\n <div class="form-error" ng-message="duplicated">\n <span translate="MARKET.CATEGORY.EDIT.ERROR.ID_ALREADY_USED"></span>\n </div>\n </div>\n\n \x3c!-- name --\x3e\n <label class="item item-input item-floating-label" ng-class="{\'item-input-error\': editForm.$submitted && editForm.name.$invalid}">\n <span class="input-label">{{\'MARKET.CATEGORY.EDIT.NAME\' | translate}}</span>\n <input name="name" type="text" placeholder="{{\'MARKET.CATEGORY.EDIT.NAME\' | translate}}" ng-model="formData.name" ng-minlength="3" required>\n </label>\n <div class="form-errors" ng-if="editForm.$submitted && editForm.name.$error" ng-messages="editForm.name.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT"></span>\n </div>\n </div>\n\n \x3c!-- TODO: parent --\x3e\n </div>\n</form>\n'),e.put("plugins/market/templates/category/view_categories_lg.html",'<ion-view left-buttons="leftButtons" class="market view-record">\n <ion-nav-title>\n \x3c!--<span translate>MARKET.VIEW.TITLE</span>--\x3e\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n\n \x3c!--<button class="button button-bar button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm"\n ng-click="showActionsPopover($event)">\n </button>--\x3e\n </ion-nav-buttons>\n\n <ion-content class="padding">\n\n <ng-include src="\'plugins/market/templates/category/list_categories_lg.html\'"></ng-include>\n\n </ion-content>\n</ion-view>\n'),e.put("plugins/market/templates/category/view_categories.html",'<ion-view left-buttons="leftButtons" class="market view-record">\n <ion-nav-title>\n \x3c!--<span translate>MARKET.VIEW.TITLE</span>--\x3e\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n\n <button class="button button-icon button-clear icon ion-loop visible-xs visible-sm" ng-click="refresh()">\n </button>\n </ion-nav-buttons>\n\n <ion-content>\n\n <div class="center padding" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="list {{::motion.ionListClass}}" ng-if="!loading">\n\n \x3c!-- all categories --\x3e\n <a class="item item-border item-icon-left item-icon-right bold" ng-class="{\'bold\': totalCount}" ng-click="onCategoryClick()">\n <span translate>MARKET.CATEGORY.ALL</span> ({{totalCount}})\n <i class="icon ion-ios-arrow-right"></i>\n </a>\n\n \x3c!-- loop on root categories --\x3e\n <ng-repeat ng-repeat="cat in categories track by cat.id">\n <a class="item stable-bg item-border item-icon-right" ng-class="{\'bold\': cat.count}" ng-click="onCategoryClick(cat)">\n <span ng-bind-html="cat.name"></span><ng-if ng-if="cat.count">&nbsp;({{cat.count}})</ng-if>\n <i class="icon ion-ios-arrow-right"></i>\n </a>\n\n \x3c!-- children categories--\x3e\n <a ng-repeat="cat in cat.children track by cat.id" class="item item-border item-icon-right" ng-class="{\'text-italic\': !cat.count}" ng-click="onCategoryClick(cat)">\n <span ng-bind-html="cat.name"></span><span ng-if="cat.count">&nbsp;({{cat.count}})</span>\n <i class="icon ion-ios-arrow-right"></i>\n </a>\n </ng-repeat>\n </div>\n\n </ion-content>\n</ion-view>\n'),e.put("plugins/market/templates/document/item_document_comment.html",'<ion-item id="doc-{{::doc.id}}" class="item item-document item-document-comment item-icon-left ink {{::ionItemClass}} no-padding-top no-padding-bottom" ng-class="{\'compacted\': compactMode}" ng-click="selectDocument($event, doc)">\n\n <i ng-show=":rebind:!compactMode" ng-if=":rebind:!doc.avatar" class="icon ion-ios-chatbubble-outline stable"></i>\n <i ng-show=":rebind:!compactMode" ng-if=":rebind:doc.avatar" class="avatar" style="background-image: url(\'{{:rebind:doc.avatar.src}}\')"></i>\n\n <div class="row no-padding">\n <div class="col">\n <h4>\n <i class="ion-ios-chatbubble-outline dark"></i>\n <span class="gray" ng-if=":rebind:doc.name">\n <i class="ion-person" ng-show=":rebind:!compactMode"></i>\n {{:rebind:doc.name}}:\n </span>\n <span class="dark">\n <i class="ion-quote" ng-if=":rebind:!compactMode"></i>\n {{:rebind:doc.message|truncText:50}}\n </span>\n </h4>\n <h4 class="gray"> <i class="ion-clock"></i> {{:rebind:doc.time|formatDate}}</h4>\n </div>\n\n <div class="col">\n\n </div>\n\n <div class="col" ng-if=":rebind:!compactMode">\n <a ng-if=":rebind:login && doc.pubkey==walletData.pubkey" ng-click="remove($event, $index)" class="gray pull-right hidden-xs hidden-sm" title="{{\'DOCUMENT.LOOKUP.BTN_REMOVE\'|translate}}">\n <i class="ion-trash-a"></i>\n </a>\n </div>\n\n </div>\n</ion-item>\n'),e.put("plugins/market/templates/document/item_document_profile.html",'<ion-item id="doc-{{::doc.id}}" class="item item-document item-icon-left ink {{::ionItemClass}} no-padding-top no-padding-bottom" ng-class="{\'compacted\': compactMode}" ng-click="selectDocument($event, doc)">\n\n <i ng-show=":rebind:!compactMode" ng-if=":rebind:doc.avatar" class="avatar" style="background-image: url({{:rebind:doc.avatar.src}})"></i>\n <i ng-show=":rebind:!compactMode" ng-if=":rebind:!doc.avatar" class="icon ion-person stable"></i>\n\n <div class="row no-padding">\n <div class="col">\n <h4 ng-if=":rebind:doc.title">\n <i class="ion-person gray"></i>\n <span class="dark">\n {{:rebind:doc.title}}\n </span>\n <span class="gray">\n {{:rebind:\'DOCUMENT.LOOKUP.HAS_REGISTERED\'|translate}}\n </span>\n </h4>\n <h4>\n <span class="dark" ng-if=":rebind:doc.city">\n <i class="ion-location"></i> {{:rebind:doc.city}}\n </span>\n <span class="gray">\n <i class="ion-clock"></i> {{:rebind:doc.time|formatDate}}\n </span>\n </h4>\n </div>\n\n <div class="col" ng-if=":rebind:!compactMode">\n <a ng-if=":rebind:login && doc.pubkey==walletData.pubkey" ng-click="remove($event, $index)" class="gray pull-right" title="{{\'DOCUMENT.LOOKUP.BTN_REMOVE\'|translate}}">\n <i class="ion-trash-a"></i>\n </a>\n </div>\n\n </div>\n</ion-item>\n'),e.put("plugins/market/templates/document/item_document_record.html",'<ion-item id="doc-{{::doc.id}}" class="item item-document item-icon-left item-text-wrap ink {{::ionItemClass}} no-padding-top no-padding-bottom" ng-class="{\'positive-100-bg\': doc.updated}" ng-click="selectDocument($event, doc)">\n\n <i ng-if=":rebind:doc.thumbnail" class="avatar" style="background-image: url({{:rebind:doc.thumbnail.src}})"></i>\n <i ng-if=":rebind:!doc.thumbnail" class="icon ion-speakerphone stable"></i>\n\n <div class="row no-padding">\n <div class="col">\n <h3 ng-if="doc.title">\n <i class="ion-speakerphone dark"></i>\n {{:rebind:doc.title}}\n </h3>\n <h4>\n <span class="dark" ng-if=":rebind:doc.picturesCount > 1">\n <i class="ion-camera"></i> {{:rebind:doc.picturesCount}}\n </span>\n <span class="dark" ng-if=":rebind:doc.city">\n <i class="ion-location"></i> {{:rebind:doc.city}}\n </span>\n <span class="gray" ng-if=":rebind:doc.name">\n <i class="ion-person"></i> {{:rebind:doc.name}}\n </span>\n\n\n </h4>\n </div>\n\n <div class="col col-33">\n <small class="gray pull-right"><i class="ion-clock"></i> {{:rebind:doc.time|formatDate}}\n </small>\n <a ng-if=":rebind:login && doc.pubkey==walletData.pubkey" ng-click="remove($event, $index)" class="gray pull-right hidden-xs hidden-sm" title="{{\'DOCUMENT.LOOKUP.BTN_REMOVE\'|translate}}">\n <i class="ion-trash-a"></i>\n </a>\n </div>\n\n </div>\n</ion-item>\n'),e.put("plugins/market/templates/document/list_documents.html",'\n<ion-list class="list" ng-class="::motion.ionListClass">\n\n <ng-repeat ng-repeat="doc in :rebind:search.results track by doc.id" ng-switch on="doc.type">\n <div ng-switch-when="record">\n <ng-include src="::\'plugins/market/templates/document/item_document_record.html\'"></ng-include>\n </div>\n <div ng-switch-when="comment">\n <ng-include src="::\'plugins/market/templates/document/item_document_comment.html\'"></ng-include>\n </div>\n <div ng-switch-when="profile">\n <ng-include src="::\'plugins/market/templates/document/item_document_profile.html\'"></ng-include>\n </div>\n <div ng-switch-default>\n <ng-include src="::\'plugins/es/templates/document/item_document.html\'"></ng-include>\n </div>\n </ng-repeat>\n\n</ion-list>\n\n<ion-infinite-scroll ng-if="!search.loading && search.hasMore" spinner="android" on-infinite="showMore()" distance="1%">\n</ion-infinite-scroll>\n'),e.put("plugins/market/templates/gallery/modal_slideshow.html",'<ion-modal-view class="modal modal-pictures" on-swipe-down="stopAndCloseModal()">\n\n <ion-header-bar class="transparent">\n \x3c!-- start/stop buttons --\x3e\n <a class="button button-icon button-small-padding pull-left icon ion-play hidden-xs hidden-sm ink" ng-class="{\'light\': !interval, \'gray\': interval}" title="{{\'MARKET.GALLERY.BTN_START\'|translate}}" ng-click="startTimer()">\n </a>\n <a class="button button-icon button-small-padding pull-left icon ion-pause hidden-xs hidden-sm ink" ng-class="{\'light\': interval, \'gray\': !interval}" title="{{\'MARKET.GALLERY.BTN_PAUSE\'|translate}}" ng-click="stopTimer()">\n </a>\n\n <h1 class="title">\n <span class="balanced" ng-bind-html="category.name"></span>\n </h1>\n\n <div class="buttons buttons-right header-item">\n <span class="website gray">\n www.<span translate>COMMON.APP_NAME</span>.fr</span>\n <a class="button button-icon icon-right button-small-padding gray hidden-xs hidden-sm ink" ng-click="stopAndCloseModal()">\n <i class="icon ion-close gray"></i>\n </a>\n </div>\n </ion-header-bar>\n\n <ion-slide-box on-slide-changed="slideChanged(index)" active-slide="activeSlide" class="has-header">\n <ion-slide ng-repeat="record in category.pictures">\n <div class="image" ng-style="::{\'background-image\': record.src ? (\'url(\'+record.src+\')\') : \'\' }">\n <div class="item no-border item-text-wrap dark padding-left">\n <h1 class="item-text-wrap" ng-class="::{\'col-75\': (record.price && record.type === \'offer\' || record.type=== \'need\') }">\n <span ng-bind-html="::record.title"></span>\n </h1>\n\n <div class="badge badge-balanced badge-price" ng-if="::record.price && (record.type === \'offer\' || record.type === \'crowdfunding\')" ng-class="{\'sold\': !record.stock}">\n <span ng-bind-html="::record.price|formatAmount:record"></span>\n </div>\n <div class="badge badge-energized badge-price" ng-if="::record.type===\'need\'">\n <i class="cion-market-need"></i>\n <span translate>MARKET.TYPE.NEED_SHORT</span>\n </div>\n <span class="badge badge-assertive badge-secondary" ng-if="::!record.stock" translate>\n MARKET.COMMON.SOLD\n </span>\n </div>\n\n <div class="card card-avatar card-description animate-fade-in" ng-class="{\'done in\': record.showDescription}" ng-if="record.description">\n\n <div class="item item-avatar done in">\n <span class="avatar avatar-member" ng-if="::!record.avatar"></span>\n <span class="avatar" ng-if="::record.avatar" style="background-image: url({{::record.avatar.src}})"></span>\n <a class="pull-left" ui-sref="app.user_identity({pubkey:comment.issuer, name: record.name})">\n <span class="positive" ng-if="::record.name">\n {{::record.name}}\n </span>\n <span ng-if="::!record.name" class="gray">\n <i class="icon ion-key gray"></i>\n {{::record.name || (record.issuer|formatPubkey)}}\n </span>\n </a>&nbsp;\n\n <h3 ng-if="::record.city && record.stock">\n <i class="ion-location"></i> {{::options.location.prefix|translate}} {{::record.city}}\n </h3>\n </div>\n\n <div class="card-content">\n <div class="item item-text-wrap done in">\n <i class="ion-quote"></i>\n <span ng-bind-html="::record.description"></span>\n </div>\n </div>\n </div>\n </div>\n\n\n\n </ion-slide>\n </ion-slide-box>\n</ion-modal-view>\n'),e.put("plugins/market/templates/gallery/view_gallery.html",'<ion-view left-buttons="leftButtons" class="market view-record">\n <ion-nav-title>\n <span translate>MARKET.GALLERY.TITLE</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n \x3c!--<button class="button button-bar button-icon button-clear visible-xs visible-sm" ng-click="edit()" ng-if="canEdit">\n <i class="icon ion-android-create"></i>\n </button>\n <button class="button button-bar button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm"\n ng-click="showActionsPopover($event)">\n </button>--\x3e\n </ion-nav-buttons>\n\n <ion-content class="has-header padding no-padding-xs stable-100-bg">\n\n <form ng-submit="start()" class="lookupForm">\n\n <div class="row no-padding responsive-lg">\n \x3c!-- search text --\x3e\n <div class="col no-padding no-margin">\n <div class="item no-padding light-bg">\n <div class="item-input light-bg">\n <i class="icon ion-search placeholder-icon"></i>\n <input type="text" autocomplete="off" class="visible-xs visible-sm" placeholder="{{\'MARKET.SEARCH.SEARCH_HELP\'|translate}}" ng-model="search.text" ng-model-options="{ debounce: 950 }">\n <input type="text" autocomplete="off" class="hidden-xs hidden-sm" placeholder="{{\'MARKET.SEARCH.SEARCH_HELP\'|translate}}" id="marketSearchText" ng-model="search.text">\n </div>\n </div>\n </div>\n\n \x3c!-- location --\x3e\n <div class="col col-40 no-padding no-margin">\n <ng-include src="::\'plugins/es/templates/common/item_location_search.html\'" ng-controller="ESSearchPositionItemCtrl"></ng-include>\n </div>\n\n </div>\n\n <div class="row no-padding no-margin responsive-lg">\n\n <div class="col no-padding no-margin">\n\n \x3c!-- Ad type --\x3e\n <div class="item item-icon-left item-input item-select stable-bg">\n\n <b class="icon-secondary ion-help gray" style="left:10px; top: -8px;"></b>\n <b class="icon-secondary cion-market-crowdfunding gray" style="left:15px; top: 4px;"></b>\n <b class="icon-secondary cion-market-need gray" style="left:28px; top: -6px;"></b>\n\n <div class="input-label item-icon-left-padding" translate>MARKET.GALLERY.AD_TYPE</div>\n <select ng-model="search.type" ng-options="i as (adTypeLabels[i] | translate ) for i in adTypes track by i">\n </select>\n </div>\n </div>\n\n <div class="col no-padding no-margin">\n\n \x3c!-- slide duration --\x3e\n <div class="item item-icon-left item-input item-select stable-bg">\n <i class="icon ion-ios-timer-outline gray"></i>\n <div class="input-label item-icon-left-padding" translate>MARKET.GALLERY.SLIDE_DURATION</div>\n <select ng-model="options.slideDuration" ng-options="i as (slideDurationLabels[i].labelKey | translate:slideDurationLabels[i].labelParams ) for i in slideDurations track by i">\n </select>\n </div>\n </div>\n </div>\n\n \x3c!-- advanced options --\x3e\n <ng-include src="::\'plugins/market/templates/search/lookup_options.html\'"></ng-include>\n\n <div class="padding-top padding-xs" style="display: block; height: 60px;">\n <div class="hidden-xs hidden-sm pull-left">\n\n <a class="button button-text button-small ink" ng-class="{\'button-text-positive\': search.advanced, \'button-text-stable\': !search.advanced}" ng-click="search.advanced=!search.advanced">\n {{\'MARKET.SEARCH.BTN_OPTIONS\' | translate}}\n <i class="icon" ng-class="{\'ion-arrow-down-b\': !search.advanced, \'ion-arrow-up-b\': search.advanced}"></i>\n </a>\n &nbsp;\n\n </div>\n\n <div class="pull-right">\n\n <button type="submit" class="button button-small button-raised icon icon-left ion-play ink" ng-disabled="search.loading" title="{{!categories.length ? \'MARKET.GALLERY.BTN_START\' : \'MARKET.GALLERY.BTN_CONTINUE\' | translate}}">\n {{!categories.length ? \'MARKET.GALLERY.BTN_START\' : \'MARKET.GALLERY.BTN_CONTINUE\' | translate}}\n </button>\n &nbsp;\n <button type="button" class="button button-small button-raised icon icon-left ion-stop ink" title="{{\'MARKET.GALLERY.BTN_STOP\' | translate}}" ng-if="search.loading || categories.length" ng-click="stop()">\n {{\'MARKET.GALLERY.BTN_STOP\' | translate}}\n </button>\n </div>\n </div>\n </form>\n\n <div class="center" ng-if="search.loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="list ng-hide" ng-show="!search.loading">\n <ng-repeat ng-repeat="cat in categories | filter:isLoadedCategory track by cat.id" ng-init="catIndex=$index">\n <div class="item item-divider">\n\n <span ng-bind-html="cat.name"></span> ({{cat.count}})\n </div>\n\n <a class="item item-list-detail">\n <ion-scroll direction="x">\n <img ng-repeat="picture in cat.pictures track by picture.id" ng-src="{{::picture.src}}" title="{{::picture.title}}{{::picture.price ? (\' (\' + (picture.price | formatAmount:picture) +\')\') : \'\' }}" ng-click="openSlideShowModal(catIndex, $index, true)" class="image-list-thumb">\n </ion-scroll>\n </a>\n </ng-repeat>\n </div>\n\n\n\n\n </ion-content>\n</ion-view>\n'),e.put("plugins/market/templates/help/help.html",'\n <a name="join"></a>\n <h2 translate>HELP.JOIN.SECTION</h2>\n\n <a name="join-salt"></a>\n <div class="row responsive-sm">\n <div class="col col-20 gray" translate>LOGIN.SALT</div>\n <div class="col" translate>HELP.JOIN.SALT</div>\n </div>\n\n <a name="join-password"></a>\n <div class="row responsive-sm">\n <div class="col col-20 gray" translate>LOGIN.PASSWORD</div>\n <div class="col" translate>HELP.JOIN.PASSWORD</div>\n </div>\n\n <a name="glossary"></a>\n <h2 translate>HELP.GLOSSARY.SECTION</h2>\n\n <a name="pubkey"></a>\n <div class="row responsive-sm">\n <div class="col col-20 gray" translate>COMMON.PUBKEY</div>\n <div class="col" translate>HELP.GLOSSARY.PUBKEY_DEF</div>\n </div>\n\n <a name="universal_dividend"></a>\n <div class="row responsive-sm">\n <div class="col col-20 gray" translate>COMMON.UNIVERSAL_DIVIDEND</div>\n <div class="col" translate>HELP.GLOSSARY.UNIVERSAL_DIVIDEND_DEF</div>\n </div>\n\n\n'),e.put("plugins/market/templates/help/modal_help.html",'<ion-view class="modal slide-in-up ng-enter active ng-enter-active">\n\n <ion-header-bar class="bar-positive">\n <button class="button button-clear" ng-click="closeModal()" translate>COMMON.BTN_CLOSE\n </button>\n\n <h1 class="title" translate>HELP.TITLE</h1>\n </ion-header-bar>\n\n <ion-content scroll="true" class="padding">\n\n <ng-include src="\'templates/help/help.html\'"></ng-include>\n\n <div class="padding hidden-xs text-center">\n <button class="button button-positive ink" type="submit" ng-click="closeModal()">\n {{\'COMMON.BTN_CLOSE\' | translate}}\n </button>\n </div>\n\n </ion-content>\n</ion-view>\n'),e.put("plugins/market/templates/help/view_help.html",'<ion-view left-buttons="leftButtons">\n <ion-nav-title>\n <span class="visible-xs visible-sm" translate>HELP.TITLE</span>\n </ion-nav-title>\n\n <ion-content scroll="true" class="padding">\n\n <h1 class="hidden-xs hidden-sm" translate>HELP.TITLE</h1>\n\n <ng-include src="\'templates/help/help.html\'"></ng-include>\n\n </ion-content>\n</ion-view>\n'),e.put("plugins/market/templates/home/home_buttons.html",'\n<h2 ng-if="::$root.config.plugins.market.homeMessage" ng-bind-html="::$root.config.plugins.market.homeMessage"></h2>\n\n<div class="item item-divider text-left no-padding-left">\n <span translate>MARKET.HOME.LOCATION_LABEL</span>\n</div>\n\n<form class="row list no-padding center lookupForm" ng-submit="openSearch()">\n\n \x3c!-- search text --\x3e\n <div class="item no-padding">\n <div class="item-input light-bg">\n <i class="icon ion-search placeholder-icon"></i>\n <input type="text" id="marketSearchText" autocomplete="off" placeholder="{{\'MARKET.SEARCH.SEARCH_HELP\'|translate}}" ng-model="search.text" ng-model-options="{ debounce: 950 }" ng-change="doSearch()" ng-return="openSearch()">\n </div>\n </div>\n\n \x3c!-- location --\x3e\n <ng-include src="::\'plugins/es/templates/common/item_location_search.html\'" ng-if="entered && options.location.show" ng-controller="ESSearchPositionItemCtrl"></ng-include>\n\n <button type="submit" class="button button-block button-raised button-positive ink" ng-disabled="!entered">\n {{\'COMMON.BTN_SEARCH\' | translate}}\n <span ng-if=":total:!search.loading && search.total !== undefined">\n ({{:total:(\'MARKET.SEARCH.RESULT_COUNT\'|translate:{count: search.total}) }})\n </span>\n </button>\n</form>\n\n<br class="hidden-xs hidden-sm">\n<br class="hidden-xs hidden-sm">\n<br>\n\n<button type="button" class="button button-block button-balanced button-raised icon icon-left ion-compose ink-dark" ng-click="showNewRecordModal()" translate>MARKET.HOME.BTN_NEW_AD</button>\n\n\n<br class="hidden-xs">\n'),
e.put("plugins/market/templates/join/modal_join.html",'<ion-modal-view class="modal-full-height">\n\n <ion-header-bar class="bar-positive">\n\n <button class="button button-clear visible-xs" ng-if="!slides.slider.activeIndex" ng-click="closeModal()" translate>COMMON.BTN_CANCEL\n </button>\n <button class="button button-icon button-clear icon ion-ios-arrow-back buttons header-item" ng-click="slidePrev()" ng-if="slides.slider.activeIndex">\n </button>\n <button class="button button-icon button-clear icon ion-ios-help-outline visible-xs" ng-if="!isLastSlide" ng-click="showHelpModal()"></button>\n\n <h1 class="title" translate>ACCOUNT.NEW.TITLE</h1>\n\n <button class="button button-clear icon-right visible-xs" ng-if="!isLastSlide" ng-click="doNext()">\n <span translate>COMMON.BTN_NEXT</span>\n <i class="icon ion-ios-arrow-right"></i>\n </button>\n <button class="button button-clear icon-right visible-xs" ng-if="isLastSlide" ng-click="doNewAccount()">\n <i class="icon ion-android-send"></i>\n </button>\n </ion-header-bar>\n\n\n <ion-slides options="slides.options" slider="slides.slider">\n\n \x3c!-- STEP: salt --\x3e\n <ion-slide-page>\n <ion-content class="has-header" scroll="false">\n <form name="saltForm" novalidate="" ng-submit="doNext(\'saltForm\')">\n\n <div class="list" ng-init="setForm(saltForm, \'saltForm\')">\n\n <div class="item item-text-wrap text-center padding hidden-xs">\n <a class="pull-right icon-help" ng-click="showHelpModal(\'join-salt\')"></a>\n <span translate>ACCOUNT.NEW.SALT_WARNING</span>\n </div>\n\n \x3c!-- salt --\x3e\n <div class="item item-input" ng-class="{ \'item-input-error\': saltForm.$submitted && saltForm.username.$invalid}">\n <span class="input-label" translate>LOGIN.SALT</span>\n <input name="username" type="text" placeholder="{{\'LOGIN.SALT_HELP\' | translate}}" autocomplete="off" ng-change="formDataChanged()" ng-model="formData.username" ng-minlength="8" required>\n </div>\n <div class="form-errors" ng-show="saltForm.$submitted && saltForm.username.$error" ng-messages="saltForm.username.$error">\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT_WITH_LENGTH" translate-values="{minLength: 8}"></span>\n </div>\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n \x3c!-- confirm salt --\x3e\n <div class="item item-input" ng-class="{ \'item-input-error\': saltForm.$submitted && saltForm.confirmSalt.$invalid}">\n <span class="input-label pull-right" translate>ACCOUNT.NEW.SALT_CONFIRM</span>\n <input name="confirmUsername" type="text" autocomplete="off" placeholder="{{\'ACCOUNT.NEW.SALT_CONFIRM_HELP\' | translate}}" ng-model="formData.confirmUsername" compare-to="formData.username">\n </div>\n <div class="form-errors" ng-show="saltForm.$submitted && saltForm.confirmUsername.$error" ng-messages="saltForm.confirmUsername.$error">\n <div class="form-error" ng-message="compareTo">\n <span translate="ERROR.SALT_NOT_CONFIRMED"></span>\n </div>\n </div>\n\n <div class="padding hidden-xs text-right">\n <button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL\n </button>\n <button class="button button-calm icon-right ion-chevron-right ink" type="submit" translate>\n COMMON.BTN_NEXT\n <i class="icon ion-arrow-right-a"></i>\n </button>\n </div>\n </div>\n </form>\n </ion-content>\n </ion-slide-page>\n\n \x3c!-- STEP: password--\x3e\n <ion-slide-page>\n <ion-content class="has-header" scroll="false">\n <form name="passwordForm" novalidate="" ng-submit="doNext(\'passwordForm\')">\n\n <div class="item item-text-wrap text-center padding hidden-xs">\n <a class="pull-right icon-help" ng-click="showHelpModal(\'join-password\')"></a>\n <span translate>ACCOUNT.NEW.PASSWORD_WARNING</span>\n </div>\n\n <div class="list" ng-init="setForm(passwordForm, \'passwordForm\')">\n\n \x3c!-- password --\x3e\n <div class="item item-input" ng-class="{ \'item-input-error\': passwordForm.$submitted && passwordForm.password.$invalid}">\n <span class="input-label" translate>LOGIN.PASSWORD</span>\n <input ng-if="!showPassword" name="password" type="password" placeholder="{{\'LOGIN.PASSWORD_HELP\' | translate}}" ng-model="formData.password" ng-change="formDataChanged()" ng-minlength="8" required>\n <input ng-if="showPassword" name="text" type="text" placeholder="{{\'LOGIN.PASSWORD_HELP\' | translate}}" autocomplete="off" ng-model="formData.password" ng-change="formDataChanged()" ng-minlength="8" required>\n </div>\n <div class="form-errors" ng-show="passwordForm.$submitted && passwordForm.password.$error" ng-messages="passwordForm.password.$error">\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT_WITH_LENGTH" translate-values="{minLength: 8}"></span>\n </div>\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n \x3c!-- confirm password --\x3e\n <div class="item item-input" ng-class="{ \'item-input-error\': passwordForm.$submitted && passwordForm.confirmPassword.$invalid}">\n <span class="input-label" translate>ACCOUNT.NEW.PASSWORD_CONFIRM</span>\n <input ng-if="!showPassword" name="confirmPassword" type="password" placeholder="{{\'ACCOUNT.NEW.PASSWORD_CONFIRM_HELP\' | translate}}" ng-model="formData.confirmPassword" compare-to="formData.password">\n <input ng-if="showPassword" name="confirmPassword" type="text" autocomplete="off" placeholder="{{\'ACCOUNT.NEW.PASSWORD_CONFIRM_HELP\' | translate}}" ng-model="formData.confirmPassword" compare-to="formData.password">\n </div>\n <div class="form-errors" ng-show="passwordForm.$submitted && passwordForm.confirmPassword.$error" ng-messages="passwordForm.confirmPassword.$error">\n <div class="form-error" ng-message="compareTo">\n <span translate="ERROR.PASSWORD_NOT_CONFIRMED"></span>\n </div>\n </div>\n\n \x3c!-- Show values --\x3e\n <div class="item item-toggle dark">\n <span translate>COMMON.SHOW_VALUES</span>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="showPassword">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div>\n </div>\n\n <div class="padding hidden-xs text-right">\n <button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL\n </button>\n <button class="button button-calm icon-right ion-chevron-right ink" type="submit" translate>\n COMMON.BTN_NEXT\n </button>\n </div>\n\n <div class="padding hidden-xs">\n </div>\n </form>\n </ion-content>\n </ion-slide-page>\n\n \x3c!-- STEP 5: profile --\x3e\n <ion-slide-page>\n <ion-content class="has-header" scroll="false">\n <form name="profileForm" novalidate="" ng-submit="doNext(\'profileForm\')">\n\n\n <div class="list" ng-init="setForm(profileForm, \'profileForm\')">\n\n <div class="item item-text-wrap text-center padding hidden-xs">\n <span translate>MARKET.JOIN.PROFILE.WARNING</span>\n </div>\n\n \x3c!-- title --\x3e\n <div class="item item-input" ng-class="{\'item-input-error\': profileForm.$submitted && profileForm.title.$invalid}">\n <span class="input-label" translate>MARKET.JOIN.PROFILE.TITLE</span>\n <input name="title" type="text" placeholder="{{\'MARKET.JOIN.PROFILE.TITLE_HELP\' | translate}}" autocomplete="off" ng-model="formData.title" ng-minlength="4" ng-maxlength="100" required>\n </div>\n <div class="form-errors" ng-show="profileForm.$submitted && profileForm.title.$error" ng-messages="profileForm.title.$error">\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT_WITH_LENGTH" translate-values="{minLength: 3}"></span>\n </div>\n <div class="form-error" ng-message="maxlength">\n <span translate="ERROR.FIELD_TOO_LONG_WITH_LENGTH" translate-values="{maxLength: 100}"></span>\n </div>\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n \x3c!-- description --\x3e\n <ion-item class="item-input">\n <span class="input-label" translate>MARKET.JOIN.PROFILE.DESCRIPTION</span>\n <textarea placeholder="{{\'MARKET.JOIN.PROFILE.DESCRIPTION_HELP\' | translate}}" ng-model="formData.description" ng-model-options="{ debounce: 350 }" rows="4" cols="10">\n </textarea>\n </ion-item>\n\n \x3c!-- email --\x3e\n <div class="item item-input" ng-class="{\'item-input-error\': profileForm.$submitted && profileForm.email.$invalid}">\n <span class="input-label" translate>MARKET.JOIN.SUBSCRIPTION.EMAIL</span>\n <input name="email" type="text" placeholder="{{\'MARKET.JOIN.SUBSCRIPTION.EMAIL_HELP\' | translate}}" ng-model="formData.email" autocomplete="off" ng-pattern="emailPattern" ng-minlength="4" ng-maxlength="100">\n </div>\n <div class="form-errors" ng-show="profileForm.$submitted && profileForm.email.$error" ng-messages="profileForm.email.$error">\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT_WITH_LENGTH" translate-values="{minLength: 3}"></span>\n </div>\n <div class="form-error" ng-message="maxlength">\n <span translate="ERROR.FIELD_TOO_LONG_WITH_LENGTH" translate-values="{maxLength: 100}"></span>\n </div>\n <div class="form-error" ng-message="pattern">\n <span translate="ERROR.FIELD_NOT_EMAIL"></span>\n </div>\n </div>\n\n <div class="padding hidden-xs text-right">\n <button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL\n </button>\n <button class="button button-calm icon-right ion-chevron-right ink" type="submit" translate>\n COMMON.BTN_NEXT\n </button>\n </div>\n </div>\n </form>\n </ion-content>\n </ion-slide-page>\n\n \x3c!--<cs-extension-point name="last-slide"></cs-extension-point>--\x3e\n\n \x3c!-- STEP 6: last slide --\x3e\n <ion-slide-page>\n <ion-content class="has-header" scroll="false">\n\n <div class="padding text-center" translate>MARKET.JOIN.LAST_SLIDE_CONGRATULATION</div>\n\n <div class="list">\n\n <ion-item class="item item-text-wrap item-border">\n <div class="dark pull-right padding-right" ng-if="formData.computing">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n </ion-item>\n </div>\n\n <div class="padding hidden-xs text-right">\n <button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL\n </button>\n <button class="button button-positive ink" ng-click="doNewAccount()" translate>\n COMMON.BTN_SEND\n <i class="icon ion-android-send"></i>\n </button>\n </div>\n </ion-content>\n </ion-slide-page>\n\n \n</ion-slides></ion-modal-view>\n'),e.put("plugins/market/templates/login/modal_event_login.html",'<ion-modal-view class="modal-full-height">\n <ion-header-bar class="bar-positive">\n <button class="button button-clear visible-xs" ng-click="closeModal()" translate>COMMON.BTN_CANCEL\n </button>\n <h1 class="title" translate>MARKET.EVENT_LOGIN.TITLE</h1>\n <div class="buttons buttons-right">\n <span class="secondary-buttons">\n <button class="button button-positive button-icon button-clear icon ion-android-done visible-xs" ng-click="doLogin()">\n </button>\n </span></div>\n\n </ion-header-bar>\n\n <ion-content>\n <form name="loginForm" novalidate="" ng-submit="doLogin()">\n\n\n <div class="list" ng-init="setForm(loginForm)">\n\n <div class="item item-text-wrap" ng-bind-html="\'MARKET.EVENT_LOGIN.HELP\' | translate">\n </div>\n\n \x3c!-- salt (=username, to enable browser login cache) --\x3e\n <label class="item item-input" ng-class="{ \'item-input-error\': form.$submitted && form.username.$invalid}">\n <span class="input-label hidden-xs" translate>MARKET.EVENT_LOGIN.EMAIL_OR_PHONE</span>\n <input name="username" type="text" placeholder="{{\'MARKET.EVENT_LOGIN.EMAIL_OR_PHONE_HELP\' | translate}}" ng-model="formData.username" ng-model-options="{ debounce: 650 }" class="highlight-light" ng-pattern="usernamePattern" required>\n </label>\n <div class="form-errors" ng-show="form.$submitted && form.username.$error" ng-messages="form.username.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n <div class="form-error" ng-message="pattern">\n <span translate="MARKET.EVENT_LOGIN.ERROR.INVALID_USERNAME"></span>\n </div>\n </div>\n\n \x3c!-- password\n <label class="item item-input"\n ng-class="{ \'item-input-error\': form.$submitted && form.password.$invalid}">\n <span class="input-label hidden-xs" translate>LOGIN.PASSWORD</span>\n <input name="password" type="password" placeholder="{{\'LOGIN.PASSWORD_HELP\' | translate}}"\n ng-model="formData.password"\n ng-model-options="{ debounce: 650 }"\n select-on-click\n required>\n </label>\n <div class="form-errors"\n ng-show="form.$submitted && form.password.$error"\n ng-messages="form.password.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>--\x3e\n\n\n \x3c!-- remember me --\x3e\n <ion-checkbox ng-model="formData.rememberMe" class="item item-border-large ink">\n <div class="item-content" translate>MARKET.EVENT_LOGIN.REMEMBER_ME</div>\n </ion-checkbox>\n\n \x3c!-- Show public key\n <div class="item item-button-right left">\n <span ng-if="formData.username && formData.password"\n class="input-label" translate>COMMON.PUBKEY</span>\n <a class="button button-light button-small ink animate-if"\n ng-click="showPubkey()"\n ng-if="showPubkeyButton"\n >\n {{\'COMMON.BTN_SHOW_PUBKEY\' | translate}}\n </a>\n <h3 class="gray text-no-wrap" ng-if="!computing">\n {{pubkey}}\n </h3>\n <h3 ng-if="computing">\n <ion-spinner icon="android"></ion-spinner>\n </h3>\n </div>--\x3e\n\n </div>\n\n <div class="padding hidden-xs text-right">\n <button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL\n </button>\n <button class="button button-positive ink" type="submit">\n {{\'COMMON.BTN_LOGIN\' | translate}}\n </button>\n </div>\n\n \x3c!-- Register ?\n <div class="text-center no-padding">\n {{\'LOGIN.NO_ACCOUNT_QUESTION\'|translate}}\n <br class="visible-xs">\n <a ng-click="showJoinModal()" translate>\n LOGIN.CREATE_ACCOUNT\n </a>\n </div>\n\n <div class="text-center no-padding">\n <a ng-click="showAccountSecurityModal()" translate>\n LOGIN.FORGOTTEN_ID\n </a>\n </div>--\x3e\n\n \x3c!--div class="padding hidden-xs text-right">\n <a class="assertive ink" ng-click="openNewAccount()" type="button" translate>COMMON.NO_ACOUNT_QUESTION\n </a>\n </div--\x3e\n </form>\n </ion-content>\n</ion-modal-view>\n'),e.put("plugins/market/templates/login/modal_login.html",'<ion-modal-view class="modal-full-height modal-login">\n <ion-header-bar class="bar-positive">\n <button class="button button-clear visible-xs" ng-click="closeModal()" translate>COMMON.BTN_CANCEL\n </button>\n <h1 class="title" ng-bind-html="\'LOGIN.TITLE\' | translate">\n </h1>\n <div class="buttons buttons-right">\n <span class="secondary-buttons visible-xs">\n <button class="button button-positive button-icon button-clear icon ion-android-done" style="color: #fff;" ng-click="doLogin()">\n </button>\n </span></div>\n\n </ion-header-bar>\n\n <ion-content>\n <form name="loginForm" novalidate="" ng-submit="doLogin()">\n\n\n <div class="list" ng-init="setForm(loginForm)">\n\n <div class="item item-text-wrap" ng-bind-html="\'MARKET.LOGIN.HELP\' | translate">\n </div>\n\n \x3c!-- salt (=username, to enable browser login cache) --\x3e\n <label class="item item-input" ng-class="{ \'item-input-error\': form.$submitted && form.username.$invalid}">\n <span class="input-label hidden-xs" translate>LOGIN.SALT</span>\n <input name="username" type="text" placeholder="{{\'LOGIN.SALT_HELP\' | translate}}" ng-model="formData.username" autocomplete="off" ng-model-options="{ debounce: 650 }" class="highlight-light" required>\n </label>\n <div class="form-errors" ng-show="form.$submitted && form.username.$error" ng-messages="form.username.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n \x3c!-- password --\x3e\n <label class="item item-input" ng-class="{ \'item-input-error\': form.$submitted && form.password.$invalid}">\n <span class="input-label hidden-xs" translate>LOGIN.PASSWORD</span>\n <input name="password" type="password" placeholder="{{\'LOGIN.PASSWORD_HELP\' | translate}}" ng-model="formData.password" ng-model-options="{ debounce: 650 }" select-on-click required>\n </label>\n <div class="form-errors" ng-show="form.$submitted && form.password.$error" ng-messages="form.password.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n\n \x3c!-- remember me --\x3e\n <ion-checkbox ng-model="formData.rememberMe" class="item item-border-large ink">\n <div class="item-content" translate>MARKET.LOGIN.REMEMBER_ME</div>\n </ion-checkbox>\n\n \x3c!-- Show public key\n <div class="item item-button-right left">\n <span ng-if="formData.username && formData.password"\n class="input-label" translate>COMMON.PUBKEY</span>\n <a class="button button-light button-small ink animate-if"\n ng-click="showPubkey()"\n ng-if="showPubkeyButton"\n >\n {{\'COMMON.BTN_SHOW_PUBKEY\' | translate}}\n </a>\n <h3 class="gray text-no-wrap" ng-if="!computing">\n {{pubkey}}\n </h3>\n <h3 ng-if="computing">\n <ion-spinner icon="android"></ion-spinner>\n </h3>\n </div>--\x3e\n\n </div>\n\n <div class="padding hidden-xs text-right">\n <button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL\n </button>\n <button class="button button-positive ink" type="submit">\n {{\'COMMON.BTN_LOGIN\' | translate}}\n </button>\n </div>\n\n \x3c!-- Register ? --\x3e\n <div class="text-center no-padding">\n {{\'LOGIN.NO_ACCOUNT_QUESTION\'|translate}}\n <br class="visible-xs">\n <a ng-click="showJoinModal()" translate>\n LOGIN.CREATE_ACCOUNT\n </a>\n </div>\n\n \x3c!--<div class="text-center no-padding">\n <a ng-click="showAccountSecurityModal()" translate>\n LOGIN.FORGOTTEN_ID\n </a>\n </div>--\x3e\n </form>\n </ion-content>\n</ion-modal-view>\n'),e.put("plugins/market/templates/map/map_country.html",'\n<div class="map-container">\n <div class="center padding" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <svg-map ng-if="!loading" src="{{\'img/maps/\' + selectedCountry + \'.svg\'}}" init="initProps" props="props" events="bindingEvents" on-event="handleEvent($event)">\n </svg-map>\n\n <br>\n\n <p>\n <a ng-click="convert()" target="_blank">Convert !</a>\n <a href="" id="demolink" target="_blank">View on a map, as GeoJSON</a>\n </p>\n\n <p>\n <a ng-repeat="country in countries" ng-class="{\'bold\': country === selectedCountry}" ng-click="onChangeCountry(country)">\n <span ng-if="$index">&nbsp;|&nbsp;</span>\n {{countriesMap[country]}}\n </a>\n </p>\n</div>\n'),e.put("plugins/market/templates/menu_extend.html",'\n\x3c!-- Toolbar section --\x3e\n<div ng-if="::extensionPoint === \'nav-buttons-right\'" class="hidden-xs hidden-sm">\n\n \x3c!-- favorites\n TODO update counter when changes\n <button class="button button-clear icon ion-heart"\n ng-if="login && walletData.favorites.count"\n ui-sref="app.market_favorites">\n <span\n ng-if="walletData.favorites.count"\n class="badge badge-button badge-positive">{{walletData.favorites.count}}</span>\n </button> --\x3e\n</div>\n\n\x3c!-- Menu: main section --\x3e\n<ng-if ng-if="::extensionPoint === \'menu-main\'">\n\n \x3c!-- view market --\x3e\n <ion-item menu-close class="item item-icon-left" active-link="active" active-link-path-prefix="#/app/market" ui-sref="app.market_lookup">\n <i class="icon ion-speakerphone"></i>\n <span translate>MENU.MARKET</span>\n </ion-item>\n\n \x3c!-- view pages --\x3e\n <ion-item menu-close class="item item-icon-left" active-link="active" active-link-path-prefix="#/app/page" ui-sref="app.registry_lookup">\n <i class="icon ion-social-buffer"></i>\n <span translate>MENU.REGISTRY</span>\n </ion-item>\n</ng-if>\n\n\x3c!-- Menu: user section --\x3e\n<ng-if ng-if="::extensionPoint === \'menu-user\'">\n \x3c!-- wallet records --\x3e\n <a menu-close class="item item-icon-left" active-link="active" active-link-path-prefix="#/app/records/wallet" ng-click="loginAndGo(\'app.market_wallet_records\')" ng-class="{\'item-menu-disable\': !login}">\n <i class="icon ion-person" style="font-size: 19px; left: 13px;"></i>\n <i class="icon-secondary ion-speakerphone" style="font-size: 16px; left: 32px; top: -6px;"></i>\n <span translate>MENU.MY_RECORDS</span>\n </a>\n\n \x3c!-- wallet records --\x3e\n <a menu-close class="item item-border item-icon-left" active-link="active" active-link-path-prefix="#/app/favorites" ng-click="loginAndGo(\'app.market_favorites\')" ng-class="{\'item-menu-disable\': !login}">\n <i class="icon ion-heart" style="font-size: 16px; left: 13px;"></i>\n <i class="icon-secondary ion-speakerphone" style="font-size: 16px; left: 32px; top: -6px;"></i>\n <span translate>MENU.FAVORITES</span>\n </a>\n</ng-if>\n\n<ng-if ng-if="::extensionPoint === \'menu-discover\'">\n \x3c!-- view market gallery --\x3e\n <ion-item menu-close class="item item-icon-left" ng-if="$root.settings.expertMode" active-link="active" active-link-path-prefix="#/app/gallery/market" ui-sref="app.market_gallery">\n <i class="icon ion-images"></i>\n <span translate>MARKET.GALLERY.TITLE</span>\n </ion-item>\n\n</ng-if>\n\n'),e.put("plugins/market/templates/record/edit_record.html",'<ion-view left-buttons="leftButtons" id="editMarket">\n <ion-nav-title>\n <span class="visible-xs" ng-if="id" ng-bind-html="formData.title"></span>\n <span class="visible-xs" ng-if="!id && formData.type">{{\'MARKET.EDIT.\' + formData.type + \'.TITLE_NEW\'|upper|translate}}</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <button class="button button-clear button-icon icon visible-xs visible-sm" ng-class="{\'ion-android-send\':!id, \'ion-android-done\': id}" ng-click="save()">\n </button>\n </ion-nav-buttons>\n\n <ion-content scroll="true">\n\n <div class="row no-padding">\n\n <div class="col col-20 hidden-xs hidden-sm">&nbsp;</div>\n\n <div class="col">\n\n <form name="recordForm" novalidate="" ng-submit="save()">\n <div class="list {{::motion.ionListClass}}" ng-init="setForm(recordForm)">\n\n <div class="item hidden-xs item-text-wrap">\n <h1 ng-if="id" ng-bind-html="formData.title"></h1>\n <h1 ng-if="!id && formData.type">{{\'MARKET.EDIT.\' + formData.type + \'.TITLE_NEW\'|upper|translate}}</h1>\n\n </div>\n <div class="item" ng-if="id||options.type.show">\n <h4 class="gray" ng-if="id">\n <i class="icon ion-calendar"></i>\n {{::\'COMMON.LAST_MODIFICATION_DATE\'|translate}}&nbsp;{{formData.time | formatDate}}\n </h4>\n <div class="badge badge-balanced" ng-if="options.type.show" ng-class="{\'badge-editable\': options.type.canEdit}" ng-click="options.type.canEdit ? showRecordTypeModal() : \'\'">\n <span>{{\'MARKET.TYPE.\'+formData.type|upper|translate}}</span>\n </div>\n </div>\n\n \x3c!-- pictures --\x3e\n <ng-include src="::\'plugins/es/templates/common/edit_pictures.html\'"></ng-include>\n\n \x3c!-- form content --\x3e\n <ng-include ng-if="formData.type" src="::\'plugins/market/templates/record/form_record_\'+formData.type+\'.html\'"></ng-include>\n\n \x3c!-- buttons --\x3e\n <div class="item padding hidden-xs hidden-sm text-right">\n <button class="button button-clear button-dark ink" ng-click="cancel()" type="button" translate>\n COMMON.BTN_CANCEL\n </button>\n <button class="button button-positive button-raised ink" type="submit" ng-if="!id" translate>\n COMMON.BTN_PUBLISH\n </button>\n <button class="button button-assertive button-raised ink" type="submit" ng-if="id" translate>\n COMMON.BTN_SAVE\n </button>\n </div>\n </div>\n </form>\n </div>\n\n <div class="col col-20 hidden-xs hidden-sm">&nbsp;</div>\n\n </div>\n \n </ion-content>\n</ion-view>\n'),e.put("plugins/market/templates/record/form_record_auction.html",'\n\x3c!-- category --\x3e\n<a class="item item-icon-right ink item-border" ng-if="options.category.show" ng-class="{\'item-input-error\': form.$submitted && !formData.category.id}" ng-click="showCategoryModal()">\n <span class="item-label" translate>COMMON.CATEGORY</span>\n <span ng-if="!formData.category.id" class="item-note">{{::\'COMMON.CATEGORY_SELECT_HELP\'|translate}}</span>\n <span class="badge badge-royal" ng-bind-html="formData.category.name"></span>&nbsp;\n <i class="gray icon ion-ios-arrow-right"></i>\n</a>\n<div class="form-errors" ng-show="form.$submitted && !formData.category.id">\n <div class="form-error">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n</div>\n\n\x3c!-- title --\x3e\n<div class="item item-input item-floating-label" ng-class="{\'item-input-error\': form.$submitted && form.title.$invalid}">\n <span class="input-label" translate>MARKET.EDIT.RECORD_TITLE</span>\n <input type="text" placeholder="{{\'MARKET.EDIT.RECORD_TITLE_HELP\'|translate}}" name="title" id="market-record-title" ng-model="formData.title" ng-minlength="3" required>\n</div>\n<div class="form-errors" ng-show="form.$submitted && form.title.$invalid" ng-messages="form.title.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT"></span>\n </div>\n</div>\n\n<div class="item item-input item-floating-label" ng-if="options.description.show">\n <span class="input-label" translate>MARKET.EDIT.RECORD_DESCRIPTION</span>\n <textarea placeholder="{{\'MARKET.EDIT.RECORD_DESCRIPTION_HELP\'|translate}}" ng-model="formData.description" rows="8" cols="10"></textarea>\n</div>\n\n\x3c!-- price --\x3e\n<ion-item class="item-input item-floating-label item-button-right" ng-class="{\'item-input-error\': form.$submitted && form.price.$invalid}">\n\n <div class="input-label">\n <span translate>MARKET.EDIT.RECORD_PRICE</span>\n (<span ng-bind-html="formData.currency| currencySymbol:formData.useRelative"></span>)\n </div>\n\n <input type="number" autocomplete="off" name="price" placeholder="{{::\'MARKET.EDIT.AUCTION.START_PRICE_HELP\' | translate}}" ng-model="formData.price" number-float>\n <a class="button button-clear button-stable dark ink" tabindex="-1" style="z-index:110; padding: 0 16px;" ng-if="options.unit.canEdit" ng-click="showUnitPopover($event)">\n <span ng-bind-html="$root.currency.name | currencySymbol:formData.useRelative">\n </span>\n &nbsp;<b class="ion-arrow-down-b" style="font-size: 12pt;"></b>\n </a>\n</ion-item>\n<div class="form-errors" ng-show="form.$submitted && form.price.$invalid" ng-messages="form.price.$error">\n <div class="form-error" ng-message="numberFloat">\n <span translate="ERROR.FIELD_NOT_NUMBER"></span>\n </div>\n <div class="form-error" ng-message="numberInt">\n <span translate="ERROR.FIELD_NOT_INT"></span>\n </div>\n</div>\n\n\x3c!-- fees --\x3e\n<div class="item item-input item-floating-label item-button-right" ng-class="{\'item-input-error\': form.$submitted && form.fees.$invalid}">\n <div class="input-label">\n <span translate>MARKET.EDIT.RECORD_FEES</span>\n (<span ng-bind-html="formData.currency| currencySymbol:formData.useRelative"></span>)\n </div>\n\n <input type="number" autocomplete="off" name="fees" placeholder="{{::\'MARKET.EDIT.RECORD_FEES_HELP\' | translate}}" ng-model="formData.fees" number-float>\n <div class="button button-clear button-stable dark ink" tabindex="-1" style="z-index:110; padding: 0 16px;" ng-if="options.unit.canEdit">\n <span ng-bind-html="$root.currency.name | currencySymbol:formData.useRelative">\n </span>\n </div>\n</div>\n<div class="form-errors" ng-show="form.$submitted && form.fees.$invalid" ng-messages="form.fees.$error">\n <div class="form-error" ng-message="numberFloat">\n <span translate="ERROR.FIELD_NOT_NUMBER"></span>\n </div>\n <div class="form-error" ng-message="numberInt">\n <span translate="ERROR.FIELD_NOT_INT"></span>\n </div>\n</div>\n\n\x3c!-- position --\x3e\n<ng-include src="\'plugins/es/templates/common/edit_position.html\'" ng-controller="ESPositionEditCtrl"></ng-include>\n'),e.put("plugins/market/templates/record/form_record_crowdfunding.html",'\n\x3c!-- category --\x3e\n<a class="item item-icon-right ink item-border" ng-if="options.category.show" ng-class="{\'item-input-error\': form.$submitted && !formData.category.id}" ng-click="showCategoryModal()">\n <span class="item-label" translate>COMMON.CATEGORY</span>\n <span ng-if="!formData.category.id" class="item-note">{{::\'COMMON.CATEGORY_SELECT_HELP\'|translate}}</span>\n <span class="badge badge-royal" ng-bind-html="formData.category.name"></span>&nbsp;\n <i class="gray icon ion-ios-arrow-right"></i>\n</a>\n<div class="form-errors" ng-show="form.$submitted && !formData.category.id">\n <div class="form-error">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n</div>\n\n\x3c!-- title --\x3e\n<div class="item item-input item-floating-label" ng-class="{\'item-input-error\': form.$submitted && form.title.$invalid}">\n <span class="input-label" translate>MARKET.EDIT.RECORD_TITLE</span>\n <input type="text" placeholder="{{\'MARKET.EDIT.CROWDFUNDING.TITLE_HELP\'|translate}}" name="title" id="market-record-title" ng-model="formData.title" ng-minlength="3" ng-maxlength="50" required>\n</div>\n<div class="form-errors" ng-show="form.$submitted && form.title.$invalid" ng-messages="form.title.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT"></span>\n </div>\n <div class="form-error" ng-message="maxlength">\n <span translate="ERROR.FIELD_TOO_LONG_WITH_LENGTH" translate-values="{maxLength: 50}"></span>\n </div>\n</div>\n\n<div class="item item-input item-floating-label" ng-if="options.description.show">\n <span class="input-label" translate>MARKET.EDIT.RECORD_DESCRIPTION</span>\n <textarea placeholder="{{\'MARKET.EDIT.CROWDFUNDING.DESCRIPTION_HELP\'|translate}}" ng-model="formData.description" rows="8" cols="10"></textarea>\n</div>\n\n\x3c!-- price --\x3e\n<ion-item class="item-input item-floating-label item-button-right" ng-class="{\'item-input-error\': form.$submitted && form.price.$invalid}">\n\n <div class="input-label">\n <span translate>MARKET.EDIT.RECORD_PRICE</span>\n (<span ng-bind-html="formData.currency| currencySymbol:formData.useRelative"></span>)\n </div>\n\n <input type="number" autocomplete="off" name="price" placeholder="{{::\'MARKET.EDIT.CROWDFUNDING.PRICE_HELP\' | translate}}" ng-model="formData.price" number-float required>\n <a class="button button-clear button-stable dark ink" tabindex="-1" style="z-index:110; padding: 0 16px;" ng-if="options.unit.canEdit" ng-click="showUnitPopover($event)">\n <span ng-bind-html="$root.currency.name | currencySymbol:formData.useRelative">\n </span>\n &nbsp;<b class="ion-arrow-down-b" style="font-size: 12pt;"></b>\n </a>\n</ion-item>\n<div class="form-errors" ng-show="form.$submitted && form.price.$invalid" ng-messages="form.price.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n <div class="form-error" ng-message="numberFloat">\n <span translate="ERROR.FIELD_NOT_NUMBER"></span>\n </div>\n <div class="form-error" ng-message="numberInt">\n <span translate="ERROR.FIELD_NOT_INT"></span>\n </div>\n</div>\n\n\x3c!-- pubkey --\x3e\n<div class="item item-input item-floating-label" ng-class="{\'item-input-error\': form.$submitted && form.pubkey.$invalid}">\n <span class="input-label" translate>REGISTRY.EDIT.RECORD_PUBKEY</span>\n <input type="text" name="pubkey" placeholder="{{\'REGISTRY.EDIT.RECORD_PUBKEY_HELP\'|translate}}" ng-model="formData.pubkey" autocomplete="off" ng-pattern="pubkeyPattern" ng-model-options="{ debounce: 250 }" required>\n</div>\n<div class="form-errors" ng-show="form.pubkey.$error" ng-messages="form.pubkey.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n <div class="form-error" ng-message="pattern">\n <span translate="ERROR.INVALID_PUBKEY"></span>\n </div>\n</div>\n\n\x3c!-- position --\x3e\n<ng-include src="\'plugins/es/templates/common/edit_position.html\'" ng-controller="ESPositionEditCtrl"></ng-include>\n'),e.put("plugins/market/templates/record/form_record_need.html",'\n\x3c!-- category --\x3e\n<a class="item item-icon-right ink item-border" ng-if="options.category.show" ng-class="{\'item-input-error\': form.$submitted && !formData.category.id}" ng-click="showCategoryModal()">\n <span class="item-label" translate>COMMON.CATEGORY</span>\n <span ng-if="!formData.category.id" class="item-note">{{::\'COMMON.CATEGORY_SELECT_HELP\'|translate}}</span>\n <span class="badge badge-royal" ng-bind-html="formData.category.name"></span>&nbsp;\n <i class="gray icon ion-ios-arrow-right"></i>\n</a>\n<div class="form-errors" ng-show="form.$submitted && !formData.category.id">\n <div class="form-error">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n</div>\n\n\x3c!-- title --\x3e\n<div class="item item-input item-floating-label" ng-class="{\'item-input-error\': form.$submitted && form.title.$invalid}">\n <span class="input-label" translate>MARKET.EDIT.RECORD_TITLE</span>\n <input type="text" placeholder="{{\'MARKET.EDIT.RECORD_TITLE_HELP\'|translate}}" name="title" id="market-record-title" ng-model="formData.title" ng-minlength="3" required>\n</div>\n<div class="form-errors" ng-show="form.$submitted && form.title.$invalid" ng-messages="form.title.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT"></span>\n </div>\n</div>\n\n<div class="item item-input item-floating-label" ng-if="options.description.show">\n <span class="input-label" translate>MARKET.EDIT.RECORD_DESCRIPTION</span>\n <textarea placeholder="{{\'MARKET.EDIT.RECORD_DESCRIPTION_HELP\'|translate}}" ng-model="formData.description" rows="8" cols="10"></textarea>\n</div>\n\n\x3c!-- max price--\x3e\n<ion-item class="item-input item-floating-label item-button-right" ng-class="{\'item-input-error\': form.$submitted && form.price.$invalid}">\n\n <div class="input-label">\n <span translate>MARKET.EDIT.RECORD_PRICE</span>\n (<span ng-bind-html="formData.currency| currencySymbol:formData.useRelative"></span>)\n </div>\n\n <input type="number" autocomplete="off" name="price" placeholder="{{::\'MARKET.EDIT.NEED.MAX_PRICE_HELP\' | translate}}" ng-model="formData.price" number-float>\n <a class="button button-clear button-stable dark ink" tabindex="-1" style="z-index:110; padding: 0 16px;" ng-if="options.unit.canEdit" ng-click="showUnitPopover($event)">\n <span ng-bind-html="$root.currency.name | currencySymbol:formData.useRelative">\n </span>\n &nbsp;<b class="ion-arrow-down-b" style="font-size: 12pt;"></b>\n </a>\n</ion-item>\n<div class="form-errors" ng-show="form.$submitted && form.price.$invalid" ng-messages="form.price.$error">\n <div class="form-error" ng-message="numberFloat">\n <span translate="ERROR.FIELD_NOT_NUMBER"></span>\n </div>\n <div class="form-error" ng-message="numberInt">\n <span translate="ERROR.FIELD_NOT_INT"></span>\n </div>\n</div>\n\n\n\x3c!-- position --\x3e\n<ng-include src="\'plugins/es/templates/common/edit_position.html\'" ng-controller="ESPositionEditCtrl"></ng-include>\n\n\n\n'),e.put("plugins/market/templates/record/form_record_offer.html",'\n\x3c!-- category --\x3e\n<a class="item item-icon-right ink item-border" ng-if="options.category.show" ng-class="{\'item-input-error\': form.$submitted && !formData.category.id}" ng-click="showCategoryModal()">\n <span class="item-label" translate>COMMON.CATEGORY</span>\n <span ng-if="!formData.category.id" class="item-note">{{::\'COMMON.CATEGORY_SELECT_HELP\'|translate}}</span>\n <span class="badge badge-royal" ng-bind-html="formData.category.name"></span>&nbsp;\n <i class="gray icon ion-ios-arrow-right"></i>\n</a>\n<div class="form-errors" ng-show="form.$submitted && !formData.category.id">\n <div class="form-error">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n</div>\n\n\x3c!-- title --\x3e\n<div class="item item-input item-floating-label" ng-class="{\'item-input-error\': form.$submitted && form.title.$invalid}">\n <span class="input-label" translate>MARKET.EDIT.RECORD_TITLE</span>\n <input type="text" placeholder="{{\'MARKET.EDIT.RECORD_TITLE_HELP\'|translate}}" name="title" id="market-record-title" ng-model="formData.title" ng-minlength="3" required>\n</div>\n<div class="form-errors" ng-show="form.$submitted && form.title.$invalid" ng-messages="form.title.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT"></span>\n </div>\n</div>\n\n<div class="item item-input item-floating-label" ng-if="options.description.show">\n <span class="input-label" translate>MARKET.EDIT.RECORD_DESCRIPTION</span>\n <textarea placeholder="{{\'MARKET.EDIT.RECORD_DESCRIPTION_HELP\'|translate}}" ng-model="formData.description" rows="8" cols="10"></textarea>\n</div>\n\n\n\x3c!-- price --\x3e\n<ion-item class="row responsive-sm no-padding">\n\n <div class="col item-button-right padding-left no-margin item-input item-floating-label">\n <div class="input-label" ng-class="{\'gray\': formData.freePrice}">\n <span translate>MARKET.EDIT.RECORD_PRICE</span>\n (<span ng-bind-html="formData.currency| currencySymbol:formData.useRelative"></span>)\n </div>\n\n <input type="number" autocomplete="off" name="price" placeholder="{{::\'MARKET.EDIT.RECORD_PRICE_HELP\' | translate}}" ng-model="formData.price" ng-disabled="formData.freePrice" number-float>\n <a class="button button-clear button-stable button-small-padding dark ink" tabindex="-1" style="z-index:110; padding: 0 16px;" ng-if="options.unit.canEdit" ng-disabled="formData.freePrice" ng-click="showUnitPopover($event)">\n <span ng-bind-html="$root.currency.name | currencySymbol:formData.useRelative">\n </span>\n &nbsp;<b class="ion-arrow-down-b" style="font-size: 12pt;"></b>\n </a>\n </div>\n\n <div class="col col-20 item-input item-text-wrap padding-top" style="min-width: 160px;">\n <ion-checkbox ng-model="formData.freePrice" ng-change="onFreePriceChanged()" class="done in">\n <div class="item-content" translate>\n MARKET.EDIT.FREE_PRICE\n </div>\n </ion-checkbox>\n </div>\n\n</ion-item>\n<div class="form-errors" ng-show="form.$submitted && form.price.$invalid" ng-messages="form.price.$error">\n <div class="form-error" ng-message="numberFloat">\n <span translate="ERROR.FIELD_NOT_NUMBER"></span>\n </div>\n <div class="form-error" ng-message="numberInt">\n <span translate="ERROR.FIELD_NOT_INT"></span>\n </div>\n</div>\n\n\n\x3c!-- fees --\x3e\n<div class="item item-input item-floating-label item-button-right" ng-class="{\'item-input-error\': form.$submitted && form.fees.$invalid}">\n <div class="input-label">\n <span translate>MARKET.EDIT.RECORD_FEES</span>\n (<span ng-bind-html="formData.currency| currencySymbol:formData.useRelative"></span>)\n </div>\n\n <input type="number" autocomplete="off" name="fees" placeholder="{{::\'MARKET.EDIT.RECORD_FEES_HELP\' | translate}}" ng-model="formData.fees" number-float>\n <a class="button button-clear button-stable button-small-padding dark ink" tabindex="-1" style="z-index:110; padding: 0 16px;" ng-if="options.unit.canEdit" ng-click="formData.freePrice && showUnitPopover($event)">\n <span ng-bind-html="$root.currency.name | currencySymbol:formData.useRelative">\n </span>\n &nbsp;<b class="ion-arrow-down-b" style="font-size: 12pt;" ng-if="formData.freePrice"></b>\n </a>\n</div>\n<div class="form-errors" ng-show="form.$submitted && form.fees.$invalid" ng-messages="form.fees.$error">\n <div class="form-error" ng-message="numberFloat">\n <span translate="ERROR.FIELD_NOT_NUMBER"></span>\n </div>\n <div class="form-error" ng-message="numberInt">\n <span translate="ERROR.FIELD_NOT_INT"></span>\n </div>\n</div>\n\n\x3c!-- stock --\x3e\n<div class="item item-input item-floating-label item-button-right" ng-class="{\'item-input-error\': form.$submitted && form.stock.$invalid}">\n <div class="input-label">{{::\'MARKET.EDIT.RECORD_STOCK\' | translate}}</div>\n\n <input type="number" name="stock" placeholder="{{::\'MARKET.EDIT.RECORD_STOCK_HELP\' | translate}}" ng-model="formData.stock" number-int>\n</div>\n<div class="form-errors" ng-show="form.$submitted && form.stock.$invalid" ng-messages="form.stock.$error">\n <div class="form-error" ng-message="numberInt">\n <span translate="ERROR.FIELD_NOT_INT"></span>\n </div>\n</div>\n\n\x3c!-- position --\x3e\n<ng-include src="\'plugins/es/templates/common/edit_position.html\'" ng-controller="ESPositionEditCtrl"></ng-include>\n'),e.put("plugins/market/templates/record/modal_payment.html",'<ion-modal-view id="transfer" class="modal-full-height">\n <ion-header-bar class="bar-positive">\n <button class="button button-clear visible-xs" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button>\n <h1 class="title" translate>MARKET.PAYMENT.MODAL.TITLE</h1>\n\n </ion-header-bar>\n\n <ion-content scroll="true">\n <div class="padding item-no-border">\n <p ng-if="formData.comment" trust-as-html="\'MARKET.VIEW.PAYMENT_WITH_COMMENT\'|translate: formData"></p>\n <p ng-if="!formData.comment" trust-as-html="\'MARKET.VIEW.PAYMENT\'|translate: formData"></p>\n\n <p trust-as-html="\'MARKET.PAYMENT.MODAL.SOFTWARE_HELP\'|translate: formData"></p>\n </div>\n\n <div class="list">\n\n <span class="item item-divider" translate>\n MARKET.PAYMENT.MODAL.PAYMENT_LINK_HELP\n </span>\n\n <ion-item class="item-button-right item-text-wrap" ng-repeat="uri in formData.uris">\n <p>\n <a ng-click="openLink($event, uri)" class="positive">{{uri}}</a>\n </p>\n <a class="button button-clear button-positive ink" title="{{\'COMMON.BTN_COPY\'|translate}}" copy-on-click="{{::uri}}">\n <i class="icon ion-ios-copy-outline"></i>\n </a>\n </ion-item>\n\n \x3c!--<ng-include src="::\'templates/common/qrcode.html\'"></ng-include>\n <br/>--\x3e\n\n <div class="padding hidden-xs text-center" style="width: 100%;">\n <button class="button button-positive ink" ng-click="closeModal()" type="button">\n {{\'COMMON.BTN_CLOSE\' | translate}}\n </button>\n </div>\n </div>\n\n\n\n\n </ion-content>\n\n\n</ion-modal-view>\n'),e.put("plugins/market/templates/record/modal_record_type.html",'<ion-modal-view>\n <ion-header-bar class="bar-positive">\n <button class="button button-clear" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button>\n <h1 class="title" translate>MARKET.TYPE.TITLE</h1>\n </ion-header-bar>\n\n <ion-content class="lookupForm">\n <div class="list padding">\n <h3 translate>MARKET.TYPE.SELECT_TYPE</h3>\n <button class="button button-block button-stable icon icon-left cion-market-offer" ng-click="closeModal(\'offer\')" translate>MARKET.TYPE.OFFER</button>\n\n \x3c!--TODO\n <button class="button button-block button-stable icon icon-left cion-market-auction"\n ng-click="closeModal(\'auction\')"\n translate>MARKET.TYPE.AUCTION</button>--\x3e\n\n <br>\n <span class="item item-divider">\n </span>\n\n <button class="button button-block button-stable icon icon-left cion-market-need" ng-click="closeModal(\'need\')" translate>MARKET.TYPE.NEED</button>\n <button class="button button-block button-stable icon icon-left cion-market-crowdfunding" ng-click="closeModal(\'crowdfunding\')" translate>MARKET.TYPE.CROWDFUNDING</button>\n </div>\n </ion-content>\n</ion-modal-view>\n'),e.put("plugins/market/templates/record/popover_unit.html",'<ion-popover-view class="popover-unit">\n <ion-content scroll="false">\n <div class="list">\n <a class="item item-icon-left" ng-class="{ \'selected\': !useRelative}" ng-click="setUseRelative(false)">\n <i class="icon" ng-class="{ \'ion-ios-checkmark-empty\': !useRelative}"></i>\n <i ng-bind-html="formData.currency | currencySymbol:false"></i>\n </a>\n <a class="item item-icon-left" ng-class="{ \'selected\': $parent.useRelative}" ng-click="setUseRelative(true)">\n <i class="icon" ng-class="{ \'ion-ios-checkmark-empty\': useRelative}"></i>\n <i ng-bind-html="formData.currency | currencySymbol:true"></i>\n </a>\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/market/templates/record/view_popover_actions.html",'<ion-popover-view class="fit has-header">\n <ion-header-bar>\n <h1 class="title" translate>MARKET.VIEW.MENU_TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n\n <a class="item item-icon-left ink visible-xs visible-sm" ng-click="showSharePopover($event)">\n <i class="icon ion-android-share-alt"></i>\n {{\'COMMON.BTN_SHARE\' | translate}}\n </a>\n\n \x3c!--<a class="item item-icon-left assertive ink "\n ng-if="canEdit"\n ng-click="delete()">\n <i class="icon ion-trash-a"></i>\n {{\'COMMON.BTN_DELETE\' | translate}}\n </a>--\x3e\n\n <a class="item item-icon-left ink visible-xs visible-sm" ng-if="canSold" ng-click="sold()">\n <i class="icon ion-minus-circled"></i>\n {{\'MARKET.VIEW.BTN_SOLD_AD\' | translate}}\n </a>\n\n <a class="item item-icon-left ink visible-xs visible-sm" ng-if="canReopen" ng-click="reopen()">\n <i class="icon ion-unlocked"></i>\n {{\'MARKET.VIEW.BTN_REOPEN\' | translate}}\n </a>\n\n \x3c!-- Write to vendor --\x3e\n <a class="item item-icon-left ink visible-xs visible-sm" ng-if="!canEdit" ng-click="showNewMessageModal()">\n <i class="icon ion-compose"></i>\n {{\'MARKET.VIEW.BTN_WRITE\'|translate}}\n </a>\n\n \x3c!-- Follow --\x3e\n <a class="item item-icon-left ink" ng-if="!canEdit" ng-click="hideActionsPopover() && toggleLike($event, {kind: \'follow\'})">\n <i class="icon" ng-class="{\'ion-android-notifications-off\': likeData.follows.wasHit, \'ion-android-notifications\': !likeData.follows.wasHit}"></i>\n <b class="ion-plus icon-secondary" ng-if="!likeData.follows.wasHit" style="font-size: 16px; left: 38px; top: -7px;"></b>\n {{(!likeData.follows.wasHit ? \'MARKET.VIEW.BTN_FOLLOW\' : \'MARKET.VIEW.BTN_STOP_FOLLOW\' )| translate}}\n </a>\n\n \x3c!-- report abuse --\x3e\n <a class="item item-icon-left ink" ng-if="!canEdit && !likeData.abuses.wasHit" ng-click="hideActionsPopover() && reportAbuse($event)">\n <i class="icon ion-android-warning"></i>\n\x3c!-- <b class="ion-plus icon-secondary" style="font-size: 16px; left: 38px; top: -7px;"></b>--\x3e\n {{\'COMMON.BTN_REPORT_ABUSE_DOTS\' | translate}}\n </a>\n <a class="item item-icon-left ink" ng-if="!canEdit && likeData.abuses.wasHit" ng-click="hideActionsPopover() && toggleLike($event, {kind: \'abuse\'})">\n <i class="icon ion-android-warning"></i>\n <b class="ion-close icon-secondary" style="font-size: 16px; left: 38px; top: -7px;"></b>\n {{\'COMMON.BTN_REMOVE_REPORTED_ABUSE\' | translate}}\n </a>\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/market/templates/record/view_record.html",'<ion-view left-buttons="leftButtons" class="market view-record">\n <ion-nav-title>\n <span translate>MARKET.VIEW.TITLE</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <button class="button button-bar button-icon button-clear visible-xs visible-sm" ng-click="edit()" ng-if="canEdit">\n <i class="icon ion-android-create"></i>\n </button>\n <button class="button button-bar button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showActionsPopover($event)">\n </button>\n </ion-nav-buttons>\n\n <ion-content scroll="true" class="refresher-top-bg">\n\n <ion-refresher pulling-text="{{\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="refresh()">\n </ion-refresher>\n\n <div class="row no-padding">\n <div class="col col-15 hidden-xs hidden-sm hidden-md">&nbsp;</div>\n\n <div class="col col-main no-padding">\n\n <div class="center padding" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="list {{::motion.ionListClass}} item-text-wrap no-padding-xs">\n\n \x3c!-- desktop : title and location --\x3e\n <div class="item item-text-wrap hidden-xs hidden-sm" ng-if="!smallscreen">\n\n \x3c!-- title --\x3e\n <h1 ng-bind-html="formData.title"></h1>\n\n \x3c!-- location and category--\x3e\n <h2 class="gray">\n <a class="positive" ng-if="formData.city" ui-sref="app.market_lookup({location:formData.city, lat: formData.geoPoint && formData.geoPoint.lat, lon:formData.geoPoint && formData.geoPoint.lon})">\n <i class="icon ion-location"></i>\n {{::options.location.prefix|translate}}<span ng-bind-html="::formData.city"></span>\n </a>\n <span ng-if="formData.city && formData.category.name">&nbsp;|&nbsp;</span>\n <a ng-if="formData.category.name" ui-sref="app.market_lookup({category: (formData.category.id + \':\' + formData.category.name)})">\n <i class="icon ion-flag"></i>\n <span ng-bind-html="::formData.category.name"></span>\n </a>\n </h2>\n <h4>\n <i class="icon ion-clock"></i>\n <span translate>COMMON.SUBMIT_BY</span>\n <a ui-sref="app.user_identity({pubkey: issuer.issuer, name: issuer.name})">\n <span ng-if="issuer.name" class="positive">\n <i class="icon ion-person"></i>\n {{::issuer.name}}\n </span>\n <span ng-if="!issuer.name" class="gray">\n <i class="icon ion-key"></i>\n {{::issuer.issuer|formatPubkey}}\n </span>\n </a>\n <span>\n {{formData.creationTime|formatFromNow}}\n <span class="gray hidden-xs">|\n {{formData.creationTime | formatDate}}\n </span>\n </span>\n </h4>\n <h4 class="dark" ng-if="formData.time - formData.creationTime > 86400">\n <i class="icon ion-edit"></i>\n <span translate>MARKET.COMMON.LAST_UPDATE</span>\n <span>{{::formData.time | formatDate}}</span>\n </h4>\n \x3c!-- likes --\x3e\n <h4>\n <ng-include src="::\'plugins/es/templates/common/view_likes.html\'"></ng-include>\n </h4>\n <div class="badge badge-shadow" ng-if="::options.type.show" ng-class="{\'badge-calm\': formData.type===\'offer\'||formData.type===\'auction\', \'badge-energized\': formData.type===\'need\'||formData.type===\'crowdfunding\'}">\n <i class="cion-market-{{::formData.type}}"></i>\n <span>{{\'MARKET.TYPE.\'+formData.type|upper|translate}}</span>\n </div>\n </div>\n\n \x3c!-- mobile: title and location --\x3e\n <div class="item item-text-wrap" ng-if="smallscreen">\n\n \x3c!-- title --\x3e\n <h1 ng-bind-html="formData.title"></h1>\n\n\n <h2 class="gray">\n <a class="positive" ng-if="formData.city" ui-sref="app.market_lookup({location:formData.location})">\n <i class="icon ion-location"></i>\n {{::options.location.prefix|translate}}<span ng-bind-html="::formData.city"></span>\n </a>\n <br>\n <a ng-if="formData.category.name" ui-sref="app.market_lookup({category:formData.category.id})">\n <i class="icon ion-flag"></i>\n <span ng-bind-html="::formData.category.name"></span>\n </a>\n\n </h2>\n <h4>\n <i class="icon ion-clock"></i>\n <span translate>COMMON.SUBMIT_BY</span>\n <a ui-sref="app.user_identity({pubkey: issuer.issuer, name: issuer.name})">\n <span class="positive" ng-if="issuer.name">\n <i class="icon ion-person"></i>\n {{::issuer.name}}\n </span>\n <span class="gray" ng-if="!issuer.name">\n <i class="icon ion-key"></i>\n {{::issuer.issuer|formatPubkey}}\n </span>\n </a>\n <span>\n {{formData.time|formatFromNow}}\n <span class="gray hidden-xs">|\n {{formData.time | formatDate}}\n </span>\n </span>\n </h4>\n\n \x3c!-- likes --\x3e\n <h4>\n <ng-include src="\'plugins/es/templates/common/view_likes.html\'"></ng-include>\n </h4>\n\n \x3c!-- fab button--\x3e\n <div class="visible-xs visible-sm">\n\n \x3c!-- like --\x3e\n <button id="fab-like-market-record-{{id}}" class="button button-fab button-fab-top-right button-stable mini spin" ng-click="toggleLike($event)">\n <i class="icon ion-heart" ng-class="{\'gray\': !likeData.likes.wasHit, \'calm\': likeData.likes.wasHit}"></i>\n </button>\n\n </div>\n </div>\n\n\n \x3c!-- mobile: price --\x3e\n <div class="item visible-xs no-padding-top no-padding-bottom">\n\n <div class="badge badge-price badge-shadow" ng-if="options.type.show && !loading" ng-class="::{\'badge-calm\': formData.type===\'offer\'||formData.type===\'auction\', \'badge-energized\': formData.type===\'need\'||formData.type===\'crowdfunding\'}">\n <i class="icon cion-market-{{formData.type}}"></i>\n <span ng-if="::formData.price" ng-bind-html="::formData.price | formatAmount: {currency: formData.currency, useRelative: $root.settings.useRelative} "></span>\n <span ng-if="::!formData.price">{{\'MARKET.TYPE.\'+formData.type+\'_SHORT\'|upper|translate}}</span>\n </div>\n <div class="badge badge-secondary" ng-if="formData.fees">\n <span class="dark">\n <i class="ion-plus" ng-if="::formData.price"></i>\n <ng-bind-html ng-bind-html="::formData.fees | formatAmount: {currency: formData.feesCurrency, useRelative: $root.settings.useRelative}"></ng-bind-html>\n </span>\n <span class="gray">{{\'MARKET.VIEW.RECORD_FEES_PARENTHESIS\'|translate}} | </span>\n <span class="gray">\n <i class="ion-pie-graph"></i>\n {{\'MARKET.VIEW.RECORD_STOCK\'|translate}}\n <ng-if ng-if="formData.stock > 0"><span class="dark">{{::formData.stock}}</span> <i class="ion-checkmark balanced"></i></ng-if>\n <ng-if ng-if="formData.stock === 0"><i class="ion-close assertive"></i> <span class="assertive bold" translate>MARKET.COMMON.SOLD</span></ng-if>\n </span>\n </div>\n <div class="badge badge-secondary badge-assertive" ng-if="!formData.fees&&!formData.stock">\n <i class="ion-close"></i> <span class="bold" translate>MARKET.COMMON.SOLD</span>\n </div>\n </div>\n\n\n\n \x3c!-- Buttons bar--\x3e\n <a id="record-share-anchor-{{id}}"></a>\n <div class="item large-button-bar hidden-xs hidden-sm">\n\n \x3c!-- Share button --\x3e\n <button class="button button-stable button-small-padding icon ion-android-share-alt" ng-click="showSharePopover($event)">\n </button>\n\n \x3c!-- Message button --\x3e\n <button class="button button-stable button-small-padding icon ion-compose" ng-if="!canEdit" ng-click="showNewMessageModal()" title="{{\'MARKET.VIEW.BTN_WRITE\'|translate}}">\n </button>\n\n \x3c!-- Like button --\x3e\n <button class="button button-stable button-small-padding ink-dark" ng-if="!canEdit" title="{{\'COMMON.BTN_LIKE\' | translate }}" ng-click="toggleLike($event)">\n <i class="icon ion-heart" ng-class="{\'gray\': !likeData.likes.wasHit, \'calm\': likeData.likes.wasHit}"></i>\n </button>\n\n \x3c!--<button class="button button-stable icon-left ink-dark"\n ng-if="canEdit"\n ng-click="delete()">\n <i class="icon ion-trash-a assertive"></i>\n <span class="assertive"> {{\'COMMON.BTN_DELETE\' | translate}}</span>\n </button>--\x3e\n <button class="button button-stable icon-left ink-dark" ng-if="canSold" title="{{\'MARKET.VIEW.BTN_SOLD_AD\' | translate}}" ng-click="sold()">\n <i class="icon ion-minus-circled"></i>\n {{\'MARKET.VIEW.BTN_SOLD\' | translate}}\n </button>\n <button class="button button-stable icon-left ink-dark" ng-if="canReopen" ng-click="reopen()">\n <i class="icon ion-unlocked"></i>\n {{\'MARKET.VIEW.BTN_REOPEN\' | translate}}\n </button>\n <button class="button button-calm icon-left ion-android-create ink" ng-if="canEdit" ng-click="edit()">\n {{\'COMMON.BTN_EDIT\' | translate}}\n </button>\n\n <button class="button button-stable button-small-padding icon ion-android-more-vertical" ng-if="!canEdit" ng-click="showActionsPopover($event)">\n </button>\n\n </div>\n\n <ion-item class="item-text-wrap" ng-if="formData.description">\n <p class="text-italic enable-user-select">\n <i class="icon ion-quote"></i>\n <span trust-as-html="formData.description"></span>\n </p>\n </ion-item>\n\n \x3c!-- desktop price --\x3e\n <ion-item class="item-icon-left item-button-right hidden-xs" ng-if="formData.price||formData.fees">\n <ng-if>\n <i class="calm icon ion-pricetag"></i>\n <h1 class="calm" ng-if="formData.price" ng-bind-html="formData.price | formatAmount: {currency: formData.currency, useRelative: $root.settings.useRelative}"></h1>\n <h1 class="calm" ng-if="formData.price === 0" translate>MARKET.COMMON.FREE</h1>\n <h1 class="calm" ng-if="!formData.price && formData.price !== 0 && formData.freePrice" translate>MARKET.COMMON.FREE_PRICE</h1>\n </ng-if>\n <h3>\n \x3c!-- Tx progress --\x3e\n <div ng-if="formData.price && formData.tx">\n <span ng-class="{\'balanced\': formData.tx.pct &gt;= 100, \'positive\': formData.tx.pct > 0 && formData.tx.pct < 100, \'calm\': formData.tx.pct === 0}">\n <i class="ion-android-checkmark-circle" ng-if="::formData.tx.pct>=100"></i>\n <b>{{\'MARKET.COMMON.CROWDFUNDING_PROGRESS\'|translate: formData.tx}}</b>\n </span>\n <ng-if ng-if="formData.tx.sum">\n (<span ng-bind-html="formData.tx.sum | formatAmount: {currency: formData.currency, useRelative: $root.settings.useRelative}"></span>)\n </ng-if>\n \x3c!-- issuers --\x3e\n <ng-if ng-if="formData.tx.issuers.length">\n <span class="gray"> | </span>\n <small><a ng-click="showIssuers($event)" title="{{\'MARKET.VIEW.SHOW_CROWDFUNDING_ISSUERS\'|translate}}">{{\'MARKET.VIEW.CROWDFUNDING_ISSUERS\'|translate: formData.tx}}</a></small>\n </ng-if>\n </div>\n\n \x3c!-- Fees --\x3e\n <ng-if ng-if="formData.fees">\n <span class="dark">\n <i class="ion-plus" ng-if="::formData.price"></i>\n <ng-bind-html ng-bind-html="formData.fees | formatAmount: {currency: formData.feesCurrency, useRelative: $root.settings.useRelative}"></ng-bind-html>\n </span>\n <span class="gray">{{\'MARKET.VIEW.RECORD_FEES_PARENTHESIS\'|translate}} | </span>\n </ng-if>\n\n \x3c!-- stock --\x3e\n <span class="gray" ng-if="formData.type===\'offer\' || formData.type===\'auction\'">\n <i class="ion-pie-graph"></i>\n {{\'MARKET.VIEW.RECORD_STOCK\'|translate}}\n <ng-if ng-if="formData.stock > 0"><span class="dark">{{::formData.stock}}</span> <i class="ion-checkmark balanced"></i></ng-if>\n <ng-if ng-if="formData.stock === 0"><i class="ion-close assertive"></i> <span class="assertive bold" translate>MARKET.COMMON.SOLD</span></ng-if>\n </span>\n </h3>\n </ion-item>\n <span class="item hidden-xs" ng-if="!formData.price && !formData.fees && formData.stock === 0">\n <div class="badge badge-secondary badge-assertive"><i class="ion-close"></i> <span class="bold" translate>MARKET.COMMON.SOLD</span></div>\n </span>\n\n \x3c!-- Payment details --\x3e\n <ion-item class="item-button-right" ng-if="paymentData">\n <p ng-if="::paymentData.comment" trust-as-html="\'MARKET.VIEW.PAYMENT_WITH_COMMENT\'|translate: paymentData"></p>\n <p ng-if="::!paymentData.comment" trust-as-html="\'MARKET.VIEW.PAYMENT\'|translate: paymentData"></p>\n\n \x3c!-- pay help button --\x3e\n <a class="button button-clear button-positive ink" title="{{\'MARKET.VIEW.BTN_PAYMENT_HELP\'|translate}}" ng-click="showPaymentModal($event)">\n <i class="icon ion-help-circled"></i>\n </a>\n </ion-item>\n\n <div class="lazy-load">\n \x3c!-- pictures --\x3e\n <ng-include src="\'plugins/es/templates/common/view_pictures.html\'"></ng-include>\n\n \x3c!-- comments --\x3e\n <ng-include src="\'plugins/es/templates/common/view_comments.html\'"></ng-include>\n </div>\n </div>\n </div>\n\n <div class="col col-33 hidden-xs hidden-sm hidden-md padding padding-top list" style="display: inline-block; max-width: 350px;">\n\n \x3c!-- issuer card --\x3e\n <a class="item item-avatar card-meta item item-border-large dark-100-bg dark animate-ripple animate-show-hide ng-hide" ng-show="!loading" ui-sref="app.user_identity({pubkey: issuer.issuer, name: issuer.name})">\n <div class="item-text-wrap light">\n\n <i ng-if="!issuer.avatar" class="item-image icon ion-person"></i>\n <i ng-if="issuer.avatar" class="item-image avatar" style="background-image: url({{issuer.avatar.src}})"></i>\n\n <h3>\n <span ng-if="issuer.name" class="positive">\n {{::issuer.name}}\n </span>\n <span ng-if="!issuer.name" class="gray">\n <b class="ion-key"></b>\n {{::issuer.issuer|formatPubkey}}\n </span>\n </h3>\n\n <h3 class="align-right" ng-if="issuer.stars" title="{{\'WOT.VIEW.STARS\' | translate }}">\n <span ng-repeat="value in [1,2,3,4,5]" ng-class="{\'energized\': issuer.stars.levelAvg &gt; 3, \'assertive\': issuer.stars.levelAvg &lt;= 2}">\n <b class="ion-android-star" ng-if="value <= issuer.stars.levelAvg"></b>\n <b class="ion-android-star-half" ng-if="value > issuer.stars.levelAvg && value - 0.5 <= issuer.stars.levelAvg"></b>\n <b class="ion-android-star-outline" ng-if="value > issuer.stars.levelAvg && value - 0.5 > issuer.stars.levelAvg"></b>\n </span>\n <span class="gray">{{issuer.stars.levelAvg}}/5 ({{\'WOT.VIEW.STAR_HIT_COUNT\' | translate: issuer.stars }})</span>\n </h3>\n <h4 class="gray" ng-if="issuer.profile.creationTime || issuer.profile.time">\n <i class="ion-clock"></i>\n {{::\'WOT.LOOKUP.REGISTERED\' | translate: {time: issuer.profile.creationTime||issuer.profile.time } }}\n </h4>\n </div>\n </a>\n\n \x3c!-- More similar ads --\x3e\n <div class="list list-record list-record-small list-more-record animate-ripple no-padding" ng-if="!search.loading && search.results.length" ng-init="options.description.show=false">\n\n <div class="item item-divider">\n <span translate>MARKET.VIEW.MORE_LIKE_THIS</span>\n </div>\n\n <div ng-repeat="item in search.results" ng-include="\'plugins/market/templates/search/item_record.html\'">\n </div>\n </div>\n </div>\n\n </div>\n </ion-content>\n</ion-view>\n'),e.put("plugins/market/templates/search/item_record.html",'<a class="item item-record ink no-padding" ui-sref="app.market_view_record({id: item.id, title: item.urlTitle})">\n\n <div class="row row-record">\n <div class="col item-text-wrap item-thumbnail-left">\n <i ng-if="::item.thumbnail" class="item-image" style="background-image: url({{::item.thumbnail.src}})"></i>\n <i ng-if="::!item.thumbnail" class="item-image icon cion-market-{{::item.type}}"></i>\n\n \x3c!-- title --\x3e\n <h2 title="{{item.title|noHtml}}" ng-bind-html="::item.title"></h2>\n\n \x3c!-- category --\x3e\n <h3 class="gray text-nowrap hidden-xxs">\n <span ng-if="::item.category" ng-bind-html="::item.category.name"></span>\n </h3>\n\n \x3c!--TODO --\x3e\n \x3c!--<i class="icon ink"\n title="{{\'MARKET..\'|translate}}"\n ng-click="toggleLike($event)"\n ng-class="{\'ion-ios-heart-outline\': !likeData.likes.wasHit, \'ion-ios-heart calm\': likeData.likes.wasHit}">\n </i>--\x3e\n <br class="hidden-xxs hidden-xs hidden-sm">\n\n \x3c!-- location --\x3e\n <h4>\n <span class="positive" ng-if="item.city">\n <i class="icon ion-location"></i>\n {{::options.location.prefix|translate}}<span ng-bind-html="::item.city"></span>\n </span>\n <span class="gray" ng-if="::item.distance">\n ({{::item.distance|formatDecimal}} {{::geoUnit}})\n </span>\n <span ng-if="::item.stock>1" class="gray"><i class="icon ion-pie-graph"></i> <span class="">{{::item.stock}} <i class="ion-checkmark balanced"></i></span></span>\n </h4>\n\n \x3c!-- creation date --\x3e\n <h4 class="gray" ng-if="item.creationTime">\n <i class="icon ion-clock"></i>\n {{::item.creationTime | formatFromNow}}\n <span class="hidden-xxs">{{::\'MARKET.SEARCH.BY\'|translate}}</span>\n <span class="hidden-xxs dark">{{::item.name || (item.pubkey|formatPubkey)}}</span>\n </h4>\n\n <span ng-if="::item.picturesCount > 1" class="badge badge-balanced badge-picture-count hidden-xxs">{{::item.picturesCount}}&nbsp;<i class="icon ion-camera"></i></span>\n\n \x3c!-- Tx progress --\x3e\n <div ng-if="::item.price && item.tx" class="badge badge-secondary" ng-class="{\'badge-balanced badge-shadow\': item.tx.pct>=100, \'badge-positive badge-shadow\': item.tx.pct < 100 && item.tx.pct > 0, \'badge-calm badge-shadow\': item.tx.pct === 0}">\n <i class="ion-android-checkmark-circle" ng-if="::item.tx.pct>=100"></i>\n <span>{{\'MARKET.COMMON.CROWDFUNDING_PROGRESS\'|translate: item.tx}}</span>\n </div>\n\n </div>\n\n <div class="col" ng-if="options.description.show">\n\n <p class="gray text-italic" ng-if="::!!item.description">\n <i class="icon ion-quote"></i>\n <span ng-bind-html="::item.description | truncText:500"></span>\n </p>\n\n </div>\n\n <div ng-if="::item.stock===0" class="badge badge-closed badge-shadow badge-assertive" translate>MARKET.COMMON.SOLD</div>\n\n \x3c!-- price --\x3e\n <div class="badge badge-price badge-shadow" ng-class="{\'badge-calm\': item.type===\'offer\'||item.type===\'auction\', \'badge-energized\': item.type===\'need\'||item.type===\'crowdfunding\', \'badge-price-closed\': !item.stock}">\n <i class="cion-market-{{item.type}}"></i>\n\n <span ng-if="::item.price" ng-bind-html=":rebind:item.price|formatAmount:{currency: item.currency, useRelative: $root.settings.useRelative, decimalCount: 0}"></span>\n <span ng-if="::item.price === 0">{{::\'MARKET.COMMON.FREE\'|translate}}</span>\n <span ng-if="::!item.price && item.freePrice">{{::\'MARKET.COMMON.FREE_PRICE\'|translate}}</span>\n <span ng-if="::!item.price && item.price !== 0 && !item.freePrice">{{::\'MARKET.TYPE.\'+item.type+\'_SHORT\'|upper|translate}}</span>\n </div>\n </div>\n</a>\n'),e.put("plugins/market/templates/search/list_records_lg.html",'\n<div class="padding-xs padding-sm" style="display: block; height: 60px;">\n <div class="pull-left ng-hide" ng-show="!search.loading">\n <ng-if ng-if="search.lastRecords">\n <h4 translate>MARKET.SEARCH.LAST_RECORDS</h4>\n <small class="gray no-padding" ng-if="search.total">\n <span ng-if="search.geoPoint && search.total">{{\'MARKET.SEARCH.LAST_RECORD_COUNT_LOCATION\'|translate:{count: search.total, location: search.location} }}</span>\n <span ng-if="!search.geoPoint && search.total">{{\'MARKET.SEARCH.LAST_RECORD_COUNT\'|translate:{count: search.total} }}</span>\n </small>\n </ng-if>\n\n <ng-if ng-if="!search.lastRecords">\n <h4 translate>MARKET.SEARCH.RESULTS</h4>\n <small class="gray no-padding" ng-if="search.total">\n <span ng-if="search.geoPoint && search.total">{{\'MARKET.SEARCH.RESULT_COUNT_LOCATION\'|translate:{count: search.total, location: search.location} }}</span>\n <span ng-if="!search.geoPoint && search.total">{{\'MARKET.SEARCH.RESULT_COUNT\'|translate:{count: search.total} }}</span>\n </small>\n </ng-if>\n\n </div>\n\n <div class="pull-right padding-top ng-hide" ng-show="!search.loading && search.total">\n <a class="button button-text button-small ink" ng-click="showSortPopover($event)" ng-class="{\'button-text-positive\': search.sortDirection === \'asc\' || search.sortAttribute === \'price\'}" style="padding-left: 16px;">\n <i class="icon-secondary ion-arrow-up-b" style="top: -5px; left: 5px; font-size: 10px;" ng-class="{\'positive\': search.sortDirection === \'asc\', \'medium\': search.sortDirection !== \'asc\'}"></i>\n <b class="icon-secondary ion-arrow-down-b" style="top: 1px; left: 5px; font-size: 10px;" ng-class="{\'positive\': search.sortDirection === \'desc\', \'medium\': search.sortDirection !== \'desc\'}"></b>\n <span class="hidden-xxs" translate>MARKET.SEARCH.SORT.PREFIX</span>\n <span ng-if="search.sortAttribute !== \'price\'" translate>MARKET.SEARCH.SORT.DATE</span>\n <span ng-if="search.sortAttribute === \'price\'" translate>MARKET.SEARCH.SORT.PRICE</span>\n </a>\n &nbsp;\n <a class="button button-text button-small hidden-xs hidden-sm ink" ng-class="{\'button-text-positive\': search.compactMode}" ng-click="toggleCompactMode()">\n <i class="icon ion-navicon"></i>\n <b class="icon-secondary ion-arrow-down-b" style="top: -8px; left: 5px; font-size: 8px;"></b>\n <b class="icon-secondary ion-arrow-up-b" style="top: 3px; left: 5px; font-size: 8px;"></b>\n {{\'DOCUMENT.LOOKUP.BTN_COMPACT\' | translate}}\n </a>\n\n </div>\n</div>\n\n<div class="center" ng-if="search.loading">\n <ion-spinner icon="android"></ion-spinner>\n</div>\n\n<div class="padding assertive" ng-if="!search.loading && search.results.length===0 && (search.advanced != null || search.lastRecords)" translate>\n COMMON.SEARCH_NO_RESULT\n</div>\n\n<div class="row no-padding" ng-class="{\'ng-hide\': !search.total}">\n \x3c!-- left margin (when NOT compact mode) --\x3e\n <div class="col col-15 no-padding hidden-xs hidden-sm" ng-if="!search.compactMode">&nbsp;</div>\n\n <div class="col no-padding">\n\n <div class="list list-record {{::motion.ionListClass}}" ng-class="{\'flex-row\': search.compactMode}" ng-if="!search.loading && search.results.length">\n\n <div class="no-padding" ng-repeat="item in search.results" ng-include="::\'plugins/market/templates/search/item_record.html\'">\n </div>\n </div>\n </div>\n\n \x3c!-- right margin (when NOT compact mode) --\x3e\n <div class="col col-15 no-padding hidden-xs hidden-sm" ng-if="!search.compactMode">&nbsp;</div>\n</div>\n\n<ion-infinite-scroll ng-if="!search.loading && search.hasMore" spinner="android" on-infinite="showMore()" distance="10%">\n</ion-infinite-scroll>\n'),e.put("plugins/market/templates/search/list_records.html",'\x3c!-- result label --\x3e\n<div class="padding" style="display: block; height: 60px;">\n <div class="pull-left ng-hide" ng-show="!search.loading">\n <ng-if ng-if="search.lastRecords">\n <h4 translate>MARKET.SEARCH.LAST_RECORDS</h4>\n <small class="gray no-padding" ng-if="search.total">\n <span ng-if="search.geoPoint && search.total">{{\'MARKET.SEARCH.LAST_RECORD_COUNT_LOCATION\'|translate:{count: search.total, location: search.location} }}</span>\n <span ng-if="!search.geoPoint && search.total">{{\'MARKET.SEARCH.LAST_RECORD_COUNT\'|translate:{count: search.total} }}</span>\n </small>\n </ng-if>\n\n <ng-if ng-if="!search.lastRecords">\n <h4 translate>MARKET.SEARCH.RESULTS</h4>\n <small class="gray no-padding" ng-if="search.total">\n <span ng-if="search.geoPoint && search.total">{{\'MARKET.SEARCH.RESULT_COUNT_LOCATION\'|translate:{count: search.total, location: search.location} }}</span>\n <span ng-if="!search.geoPoint && search.total">{{\'MARKET.SEARCH.RESULT_COUNT\'|translate:{count: search.total} }}</span>\n </small>\n </ng-if>\n </div>\n\n <div class="pull-right padding-top ng-hide" ng-show="!search.loading && search.total">\n <a class="button button-text button-small ink" ng-click="showSortPopover($event)" ng-class="{\'button-text-positive\': search.sortDirection === \'asc\' || search.sortAttribute === \'price\'}" style="padding-left: 16px;">\n <i class="icon-secondary ion-arrow-up-b" style="top: -5px; left: 5px; font-size: 10px;" ng-class="{\'positive\': search.sortDirection === \'asc\', \'medium\': search.sortDirection !== \'asc\'}"></i>\n <b class="icon-secondary ion-arrow-down-b" style="top: 1px; left: 5px; font-size: 10px;" ng-class="{\'positive\': search.sortDirection === \'desc\', \'medium\': search.sortDirection !== \'desc\'}"></b>\n <span class="hidden-xxs" translate>MARKET.SEARCH.SORT.PREFIX</span>\n <span ng-if="search.sortAttribute !== \'price\'" translate>MARKET.SEARCH.SORT.DATE</span>\n <span ng-if="search.sortAttribute === \'price\'" translate>MARKET.SEARCH.SORT.PRICE</span>\n </a>\n </div>\n</div>\n\n<div class="center" ng-if="search.loading">\n <ion-spinner icon="android"></ion-spinner>\n</div>\n\n<div class="padding assertive" ng-if="!search.loading && search.results.length===0 && (search.advanced != null || search.lastRecords)" translate>\n COMMON.SEARCH_NO_RESULT\n</div>\n\n<div class="list list-record {{::motion.ionListClass}} no-padding" ng-if="!search.loading && search.results.length" ng-init="options.description.show=false">\n\n <div class="no-padding" ng-repeat="item in search.results" ng-include="\'plugins/market/templates/search/item_record.html\'">\n </div>\n\n</div>\n\n<ion-infinite-scroll ng-if="!search.loading && search.hasMore" spinner="android" on-infinite="showMore()" distance="1%">\n</ion-infinite-scroll>\n'),e.put("plugins/market/templates/search/lookup_actions_popover.html",'<ion-popover-view class="fit has-header">\n <ion-header-bar>\n <h1 class="title" translate>COMMON.POPOVER_FILTER_TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n\n \x3c!-- last record --\x3e\n <button type="button" class="item item-icon-left ink visible-sm visible-xs" ng-class="{\'button-text-positive\': search.lastRecords}" ng-if="options.filter.lastRecords" ng-click="doGetLastRecords()">\n <i class="icon ion-clock"></i>\n {{\'MARKET.SEARCH.BTN_LAST_RECORDS\' | translate}}\n </button>\n\n \x3c!-- show closed Ads ? --\x3e\n <a class="item item-icon-left ink" ng-click="toggleShowClosed()">\n <i class="icon ion-android-checkbox-outline-blank" ng-show="!search.showClosed"></i>\n <i class="icon ion-android-checkbox-outline" ng-show="search.showClosed"></i>\n <span translate>MARKET.SEARCH.SHOW_CLOSED_RECORD</span>\n </a>\n\n \x3c!-- show old Ads ? --\x3e\n <a class="item item-icon-left ink" ng-click="toggleShowOld()">\n <i class="icon ion-android-checkbox-outline-blank" ng-show="!search.showOld"></i>\n <i class="icon ion-android-checkbox-outline" ng-show="search.showOld"></i>\n <span translate>MARKET.SEARCH.SHOW_OLD_RECORD</span>\n </a>\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/market/templates/search/lookup_lg.html",'<ion-view left-buttons="leftButtons" class="market">\n <ion-nav-title>\n <span translate>MARKET.SEARCH.TITLE</span>\n </ion-nav-title>\n\n <ion-content class="lookupForm padding no-padding-xs stable-100-bg" bind-notifier="{ rebind:$root.settings.useRelative }">\n\n <div class="hidden-xs hidden-sm" style="display: block; height: 45px;">\n\n \x3c!-- show categories button --\x3e\n <div class="pull-left">\n <a class="button button-text button-small ink" ng-if="options.category.show" ng-class="{\'button-text-positive\': search.showCategories, \'button-text-dark\': !search.showCategories}" ng-click="search.showCategories=!search.showCategories;">\n <span translate>MARKET.SEARCH.BTN_SHOW_CATEGORIES</span>\n <i class="icon" ng-class="{\'ion-arrow-down-b\': !search.showCategories, \'ion-arrow-up-b\': search.showCategories}"></i>\n </a>\n </div>\n\n \x3c!-- new record button --\x3e\n <div class="pull-right">\n <button class="button button-small button-positive button-clear ink padding-right" ng-click="showNewRecordModal()">\n <i class="icon ion-plus"></i>\n <span translate>MARKET.COMMON.BTN_NEW_AD</span>\n </button>\n </div>\n </div>\n\n \x3c!-- categories drop down --\x3e\n <div class="list dropdown-list" ng-mouseleave="search.showCategories=false;" ng-show="search.showCategories" scroll="true" ng-controller="MkListCategoriesCtrl" ng-init="load()">\n <div class="text-center" ng-show="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n <div class="no-border no-padding" ng-show="!loading" ng-include="\'plugins/market/templates/category/list_categories_lg.html\'">\n </div>\n </div>\n\n <form ng-submit="doSearch()" class="light-bg">\n\n <div class="row no-padding responsive-lg">\n \x3c!-- search text --\x3e\n <div class="col no-padding no-margin">\n <div class="item no-padding">\n\n <div class="item-input light-bg">\n <div class="animate-show-hide selected-values ng-hide" ng-show="entered">\n \x3c!-- selected category --\x3e\n <div ng-show="search.category.name" class="button button-small button-text button-stable button-icon-event stable-900-bg" style="margin-right: 10px;">\n &nbsp;<i class="icon ion-flag"></i>\n {{\'MARKET.SEARCH.CATEGORY\'|translate}}\n <span ng-bind-html="search.category.name"></span>\n <i class="icon ion-close" ng-click="removeCategory()">&nbsp;&nbsp;</i>\n </div>\n\n </div>\n\n <i class="icon ion-search placeholder-icon"></i>\n <input type="text" autocomplete="off" class="visible-xs visible-sm" placeholder="{{\'MARKET.SEARCH.SEARCH_HELP\'|translate}}" ng-model="search.text" ng-model-options="{ debounce: 950 }" ng-change="doSearch()">\n <input type="text" autocomplete="off" class="hidden-xs hidden-sm" placeholder="{{\'MARKET.SEARCH.SEARCH_HELP\'|translate}}" id="marketSearchText" ng-model="search.text" on-return="doSearch()">\n\n <button type="button" class="button button-icon button-small pull-right button-small-padding ink" ng-if="search.text" tabindex="-1" ng-click="removeText()">\n <i class="gray ion-close"></i>\n </button>\n </div>\n </div>\n </div>\n\n \x3c!-- location --\x3e\n <div class="col col-40 no-padding no-margin" ng-include src="::\'plugins/es/templates/common/item_location_search.html\'" ng-controller="ESSearchPositionItemCtrl">\n </div>\n\n </div>\n\n \x3c!-- options --\x3e\n <ng-include src="::\'plugins/market/templates/search/lookup_options.html\'"></ng-include>\n </form>\n\n\n\n <div ng-if="!search.loading && !search.category && options.category.show" class="padding-right visible-xs visible-sm" style="display: block; height: 35px;">\n <a class="button button-text button-small button-text-positive pull-right ink" ui-sref="app.market_categories">\n <i class="icon ion-android-funnel"></i>\n <span translate>MARKET.SEARCH.BTN_SHOW_CATEGORIES</span>\n </a>\n </div>\n\n <div class="padding-top padding-xs disable-user-behavior" style="display: block; height: 60px;">\n <div class="hidden-xs hidden-sm pull-left">\n\n <a class="button button-text button-small ink" ng-class="{\'button-text-positive\': search.advanced, \'button-text-stable\': !search.advanced}" ng-click="search.advanced=!search.advanced">\n <span translate>MARKET.SEARCH.BTN_OPTIONS</span>\n <i class="icon" ng-class="{\'ion-arrow-down-b\': !search.advanced, \'ion-arrow-up-b\': search.advanced}"></i>\n </a>\n &nbsp;\n\n </div>\n\n <div class="hidden-xs hidden-sm pull-right">\n\n <a class="button button-text button-small ink icon ion-clock" ng-if="!options.type.show" ng-class="{\'button-text-positive\': search.type==\'last\'}" ng-click="doGetLastRecords()">\n <span translate>MARKET.SEARCH.BTN_LAST_RECORDS</span>\n </a>\n <a class="button button-text button-small ink icon cion-market-offer" ng-if="options.type.show" ng-class="{\'button-text-positive\': search.type==\'offer\'}" ng-click="toggleAdType(\'offer\')">\n <span translate>MARKET.SEARCH.BTN_OFFERS</span>\n </a>\n <a class="button button-text button-small ink icon cion-market-need" ng-if="options.type.show" ng-class="{\'button-text-positive\': search.type==\'need\'}" ng-click="toggleAdType(\'need\')">\n <span translate>MARKET.SEARCH.BTN_NEEDS</span>\n </a>\n <a class="button button-text button-small ink icon cion-market-crowdfunding" ng-if="options.type.show" ng-class="{\'button-text-positive\': search.type==\'crowdfunding\'}" ng-click="toggleAdType(\'crowdfunding\')">\n <span translate>MARKET.SEARCH.BTN_CROWDFUNDING</span>\n </a>\n\n \x3c!--<a class="button button-text button-small ink icon ion-heart"\n ng-if="options.type.show"\n ng-class="{\'button-text-positive\': search.type==\'star\'}"\n ng-click="toggleAdType(\'star\')">\n {{\'MARKET.SEARCH.BTN_FAVORITES\' | translate}}\n </a>--\x3e\n &nbsp;\n <button type="button" class="button button-small button-stable ink" ng-click="doSearch()">\n <span translate>COMMON.BTN_SEARCH</span>\n </button>\n </div>\n </div>\n\n \x3c!-- list of records --\x3e\n <ng-include src="::\'plugins/market/templates/search/list_records_lg.html\'"></ng-include>\n\n </ion-content>\n\n <button id="fab-add-market-record" class="button button-fab button-fab-bottom-right button-assertive icon ion-compose hidden-md hidden-lg spin" ng-click="showNewRecordModal()">\n </button>\n</ion-view>\n'),e.put("plugins/market/templates/search/lookup_options.html",'\n<div class="row no-padding responsive-lg disable-user-behavior" ng-if="search.advanced">\n <div class="col no-padding no-margin">\n \x3c!-- Show closed ad ? --\x3e\n <div class="item item-icon-left item-input item-toggle stable-bg">\n <i class="icon ion-speakerphone gray"></i>\n <b class="icon-secondary ion-close-circled assertive" style="top:7px; left: 34px;"></b>\n <span class="input-label item-icon-left-padding" ng-click="search.showClosed=!search.showClosed">\n {{\'MARKET.SEARCH.SHOW_CLOSED_RECORD\' | translate}}\n </span>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="search.showClosed">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div>\n </div>\n\n <div class="col no-padding no-margin">\n \x3c!-- Show OLD ad ? --\x3e\n <div class="item item-icon-left item-input item-toggle stable-bg">\n <i class="icon ion-clock gray"></i>\n <b class="icon-secondary ion-close-circled assertive" style="top:7px; left: 34px;"></b>\n <span class="input-label item-icon-left-padding" ng-click="search.showOld=!search.showOld">\n {{\'MARKET.SEARCH.SHOW_OLD_RECORD\' | translate}}\n </span>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="search.showOld">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div>\n </div>\n\n</div>\n'),e.put("plugins/market/templates/search/lookup_sort_popover.html","<ion-popover-view class=\"fit\" style=\"height: 210px; width: 200px;\">\n <ion-content scroll=\"false\">\n <div class=\"list\">\n\n \x3c!-- creation date --\x3e\n <a class=\"item ink\" ng-click=\"toggleSort('creationTime', 'desc')\" ng-class=\"{'positive': search.sortAttribute==='creationTime' && search.sortDirection==='desc'}\">\n <span translate>MARKET.SEARCH.SORT.PREFIX</span>\n <span translate>MARKET.SEARCH.SORT.DATE_DESC</span>\n </a>\n <a class=\"item ink\" ng-click=\"toggleSort('creationTime', 'asc')\" ng-class=\"{'positive': search.sortAttribute==='creationTime' && search.sortDirection==='asc'}\">\n <span translate>MARKET.SEARCH.SORT.PREFIX</span>\n <span translate>MARKET.SEARCH.SORT.DATE_ASC</span>\n </a>\n\n \x3c!-- price --\x3e\n <a class=\"item ink\" ng-click=\"toggleSort('price', 'asc')\" ng-class=\"{'positive': search.sortAttribute==='price' && search.sortDirection==='asc'}\">\n <span translate>MARKET.SEARCH.SORT.PREFIX</span>\n <span translate>MARKET.SEARCH.SORT.PRICE_ASC</span>\n </a>\n <a class=\"item ink\" ng-click=\"toggleSort('price', 'desc')\" ng-class=\"{'positive': search.sortAttribute==='price' && search.sortDirection==='desc'}\">\n <span translate>MARKET.SEARCH.SORT.PREFIX</span>\n <span translate>MARKET.SEARCH.SORT.PRICE_DESC</span>\n </a>\n </div>\n </ion-content>\n</ion-popover-view>\n"),e.put("plugins/market/templates/search/lookup.html",'<ion-view left-buttons="leftButtons" class="market">\n <ion-nav-title>\n <span ng-if="entered && !search.category" translate>MARKET.SEARCH.TITLE</span>\n <span ng-if="search.category" ng-bind-html="search.category.name"></span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <button class="button button-icon button-clear icon ion-loop visible-xs visible-sm" ng-click="refresh()">\n </button>\n <button class="button button-icon button-clear visible-xs visible-sm" ng-click="showActionsPopover($event)">\n <i class="icon ion-android-funnel"></i>\n </button>\n </ion-nav-buttons>\n\n <ion-content class="lookupForm stable-100-bg" bind-notifier="{ rebind: $root.settings.useRelative }">\n\n <form ng-submit="doSearch()" class="light-bg">\n\n <a class="item item-icon-right ink ng-hide" ng-show="entered && !search.category && options.category.show" ui-sref="app.market_categories">\n <span class="gray"> <i class="gray ion-android-funnel"></i> {{\'MARKET.SEARCH.BTN_SHOW_CATEGORIES\'|translate}}</span>\n <i class="gray icon ion-ios-arrow-right"></i>\n </a>\n\n <label class="item item-input">\n <i class="icon ion-search placeholder-icon"></i>\n <input type="text" placeholder="{{\'MARKET.SEARCH.SEARCH_HELP\'|translate}}" ng-model="search.text" ng-model-options="{ debounce: 650 }" ng-change="doSearch()">\n\n \x3c!-- FIXME\n <button type="button" class="button button-icon button-small pull-right button-small-padding ink"\n ng-if="search.text"\n tabindex="-1"\n ng-click="removeText()">\n <i class="gray ion-close "></i>\n </button> --\x3e\n </label>\n\n \x3c!-- location --\x3e\n <ng-include src="\'plugins/es/templates/common/item_location_search.html\'" ng-controller="ESSearchPositionItemCtrl" ng-init=""></ng-include>\n\n \x3c!-- options --\x3e\n <ng-include src="::\'plugins/market/templates/search/lookup_options.html\'"></ng-include>\n </form>\n\n \n\n \x3c!-- list of records --\x3e\n <ng-include src="::\'plugins/market/templates/search/list_records.html\'"></ng-include>\n </ion-content>\n\n <button id="fab-add-market-record" class="button button-fab button-fab-bottom-right button-assertive icon ion-plus spin" ng-click="showNewRecordModal()">\n </button>\n</ion-view>\n'),e.put("plugins/market/templates/wallet/view_wallet_extend.html",'\n\n<ng-if ng-if=":state:enable && extensionPoint === \'general\'">\n\n\n <ion-item class="item-icon-left item-text-wrap ink" ng-if="formData.profile.pubkey" copy-on-click="{{:rebind:formData.profile.pubkey}}">\n <i class="icon ion-card"></i>\n <span translate>MARKET.WALLET.DUNITER_PUBKEY</span>\n <h4 id="pubkey" class="dark text-left">{{:rebind:formData.profile.pubkey}}</h4>\n </ion-item>\n\n <div class="item item-icon-left item-text-wrap">\n <i class="icon ion-ios-help-outline positive"></i>\n <span ng-bind-html="\'MARKET.WALLET.DUNITER_ACCOUNT\'|translate:{currency:$root.currency.name}"></span>\n\n <h4 ng-if="formData.profile.pubkey" class="gray" translate>MARKET.WALLET.DUNITER_ACCOUNT_HELP</h4>\n <h4 ng-if="!formData.profile.pubkey" class="gray" translate>MARKET.WALLET.DUNITER_ACCOUNT_NO_PUBKEY_HELP</h4>\n </div>\n\n \x3c!-- star level --\x3e\n <div class="item item-icon-left item-text-wrap" ng-if="likeData.stars">\n\n <i class="icon" ng-class="{\'ion-android-star-outline\': likeData.stars.levelAvg <= 2, \'ion-android-star-half\': likeData.stars.levelAvg > 2 && likeData.stars.levelAvg <= 3, \'ion-android-star energized\': likeData.stars.levelAvg > 3}"></i>\n <span translate>WOT.VIEW.STARS</span>\n <h4 class="dark">{{\'WOT.VIEW.STAR_HIT_COUNT\' | translate: likeData.stars }}</h4>\n\n <div class="badge">\n <span ng-repeat="value in [1,2,3,4,5]" ng-class="{\'energized\': likeData.stars.levelAvg > 3, \'assertive\': likeData.stars.levelAvg <= 2}">\n <b class="ion-android-star" ng-if="value <= likeData.stars.levelAvg"></b>\n <b class="ion-android-star-half" ng-if="value > likeData.stars.levelAvg && value - 0.5 <= likeData.stars.levelAvg"></b>\n <b class="ion-android-star-outline" ng-if="value > likeData.stars.levelAvg && value - 0.5 > likeData.stars.levelAvg"></b>\n </span>\n <small class="dark">({{likeData.stars.levelAvg}}/5)</small>\n </div>\n </div>\n\n <div class="visible-xs visible-sm">\n <div class="item item-divider item-divider-top-border">\n {{\'MENU.MARKET\' | translate}}\n </div>\n\n \x3c!-- market records --\x3e\n <a class="item item-icon-left item-icon-right" ui-sref="app.market_wallet_records">\n <i class="icon ion-speakerphone"></i>\n {{\'MENU.MY_RECORDS\' | translate}}\n <i class="icon ion-ios-arrow-right"></i>\n </a>\n </div>\n\n</ng-if>\n'),e.put("plugins/market/templates/wallet/view_wallet_favorites.html",'<ion-view left-buttons="leftButtons" class="market">\n <ion-nav-title>\n <span class="visible-xs visible-sm" translate>MENU.FAVORITES</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <cs-extension-point name="nav-buttons"></cs-extension-point>\n\n <button class="button button-icon button-clear visible-xs visible-sm" ng-click="showActionsPopover($event)">\n <i class="icon ion-android-funnel"></i>\n </button>\n </ion-nav-buttons>\n\n <ion-content scroll="true" bind-notifier="{ rebind:settings.useRelative, locale:settings.locale.id}">\n\n <ion-refresher pulling-text="{{\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="refresh()">\n </ion-refresher>\n\n \x3c!-- Buttons bar--\x3e\n <div class="hidden-xs hidden-sm padding text-center">\n\n <button class="button button-stable button-small-padding icon ion-loop ink" ng-click="refresh()" title="{{\'COMMON.BTN_REFRESH\' | translate}}">\n </button>\n\n &nbsp;\n\n <button class="button button-stable button-small-padding icon ion-android-funnel ink" ng-click="showActionsPopover($event)" title="{{\'COMMON.BTN_OPTIONS\' | translate}}">\n </button>\n </div>\n\n \x3c!-- list of records --\x3e\n <div class="lookupForm padding no-padding-xs no-padding-sm">\n <ng-include src="::smallscreen ? \'plugins/market/templates/search/list_records.html\' : \'plugins/market/templates/search/list_records_lg.html\'"></ng-include>\n </div>\n </ion-content>\n\n <button id="fab-wallet-add-market-record" class="button button-fab button-fab-bottom-right button-assertive hidden-md hidden-lg drop" ng-click="showNewRecordModal()">\n <i class="icon ion-plus"></i>\n </button>\n</ion-view>\n'),e.put("plugins/market/templates/wallet/view_wallet_records.html",'<ion-view left-buttons="leftButtons" class="market">\n <ion-nav-title>\n <span class="visible-xs visible-sm" translate>MENU.MY_RECORDS</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <cs-extension-point name="nav-buttons"></cs-extension-point>\n\n <button class="button button-icon button-clear visible-xs visible-sm" ng-click="showActionsPopover($event)">\n <i class="icon ion-android-funnel"></i>\n </button>\n </ion-nav-buttons>\n\n <ion-content scroll="true" bind-notifier="{ rebind:settings.useRelative, locale:settings.locale.id}">\n\n <ion-refresher pulling-text="{{\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="refresh()">\n </ion-refresher>\n\n \x3c!-- Buttons bar--\x3e\n <div class="hidden-xs hidden-sm padding text-center">\n\n <button class="button button-stable button-small-padding icon ion-loop ink" ng-click="refresh()" title="{{\'COMMON.BTN_REFRESH\' | translate}}">\n </button>\n\n &nbsp;\n\n <button class="button button-calm ink" ng-click="showNewRecordModal()">\n {{\'MARKET.COMMON.BTN_NEW_AD\' | translate}}\n </button>\n\n <button class="button button-stable button-small-padding icon ion-android-funnel ink" ng-click="showActionsPopover($event)" title="{{\'COMMON.BTN_OPTIONS\' | translate}}">\n </button>\n </div>\n\n \x3c!-- list of records --\x3e\n <div class="lookupForm padding no-padding-xs no-padding-sm">\n <ng-include src="::smallscreen ? \'plugins/market/templates/search/list_records.html\' : \'plugins/market/templates/search/list_records_lg.html\'"></ng-include>\n </div>\n </ion-content>\n\n <button id="fab-wallet-add-market-record" class="button button-fab button-fab-bottom-right button-assertive hidden-md hidden-lg drop" ng-click="showNewRecordModal()">\n <i class="icon ion-plus"></i>\n </button>\n</ion-view>\n'),e.put("plugins/market/templates/wot/view_identity_extend.html",'\n\x3c!-- General section --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'general\'">\n\n <ion-item class="item-icon-left item-text-wrap ink" ng-if="formData.profile.pubkey" copy-on-click="{{:rebind:formData.profile.pubkey}}">\n <i class="icon ion-card"></i>\n <span translate>MARKET.WOT.VIEW.DUNITER_PUBKEY</span>\n <h4 id="pubkey" class="dark text-left">{{:rebind:formData.profile.pubkey}}</h4>\n </ion-item>\n\n <div class="item item-icon-left item-text-wrap item-wallet-event">\n <i class="icon ion-ios-help-outline positive"></i>\n <span ng-bind-html="\'MARKET.WOT.VIEW.DUNITER_ACCOUNT\'|translate:{currency:$root.currency.name}"></span>\n <h4 class="gray" ng-if="formData.profile.pubkey" translate>MARKET.WOT.VIEW.DUNITER_ACCOUNT_HELP</h4>\n <h4 ng-if="!formData.profile.pubkey" trust-as-html="\'MARKET.WOT.VIEW.DUNITER_ACCOUNT_HELP_ASK_USER\'|translate"></h4>\n </div>\n</ng-if>\n\n<ng-if ng-if=":state:enable && extensionPoint === \'after-general\'">\n\n <div class="item item-divider item-divider-top-border">\n {{\'MENU.MARKET\' | translate}}\n </div>\n\n \x3c!-- market records --\x3e\n <a class="item item-icon-left item-icon-right" ui-sref="app.market_identity_records({pubkey: formData.pubkey})">\n <i class="icon ion-speakerphone"></i>\n {{\'MARKET.WOT.VIEW.BTN_RECORDS\' | translate}}\n <i class="icon ion-ios-arrow-right"></i>\n </a>\n\n</ng-if>\n'),e.put("plugins/market/templates/wot/view_identity_records.html",'<ion-view left-buttons="leftButtons" class="market">\n <ion-nav-title>\n <span class="visible-xs visible-sm">{{\'MARKET.PROFILE.IDENTITY_RECORDS_TITLE\'|translate}}</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <cs-extension-point name="nav-buttons"></cs-extension-point>\n\n <button class="button button-icon button-clear visible-xs visible-sm" ng-click="showActionsPopover($event)">\n <i class="icon ion-android-funnel"></i>\n </button>\n </ion-nav-buttons>\n\n <ion-content scroll="true" bind-notifier="{ rebind:settings.useRelative, locale:settings.locale.id}">\n\n <ion-refresher pulling-text="{{\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="refresh()">\n </ion-refresher>\n\n \x3c!-- Buttons bar--\x3e\n <div class="hidden-xs hidden-sm padding text-center">\n\n <button class="button button-stable button-small-padding icon ion-loop ink" ng-click="refresh()" title="{{\'COMMON.BTN_REFRESH\' | translate}}">\n </button>\n <button class="button button-stable button-small-padding icon ion-android-funnel ink" ng-click="showActionsPopover($event)" title="{{\'COMMON.BTN_OPTIONS\' | translate}}">\n </button>\n </div>\n\n \x3c!-- list of records --\x3e\n <div class="lookupForm padding no-padding-xs no-padding-sm">\n <ng-include src="::smallscreen ? \'plugins/market/templates/search/list_records.html\' : \'plugins/market/templates/search/list_records_lg.html\'"></ng-include>\n </div>\n </ion-content>\n\n</ion-view>\n')}]),angular.module("cesium.es.plugin",["cesium.es.services","cesium.es.app.controllers","cesium.es.common.controllers","cesium.es.like.controllers","cesium.es.settings.controllers","cesium.es.wot.controllers","cesium.es.wallet.controllers","cesium.es.profile.controllers","cesium.es.message.controllers","cesium.es.notification.controllers","cesium.es.registry.controllers","cesium.es.subscription.controllers","cesium.es.document.controllers","cesium.es.network.controllers"]),h.prototype.regexp={API_REGEXP:/^([A-Z_]+)(?:[ ]+([a-z_][a-z0-9-_.ğĞ]*))?(?:[ ]+([0-9.]+))?(?:[ ]+([0-9a-f:]+))?(?:[ ]+([0-9]+))(?:\/[^\/]+)?$/,LOCAL_IP_ADDRESS:/^127[.]0[.]0.|192[.]168[.]|10[.]0[.]0[.]|172[.]16[.]/},h.prototype.keyID=function(){var e=this.ep||this.getEP();return e.useBma?[this.pubkey||"Unknown",e.dns,e.ipv4,e.ipv6,e.port,e.useSsl,e.path].join("-"):[this.pubkey||"Unknown",e.ws2pid,e.path].join("-")},h.prototype.copyValues=function(e){var n=this;["version","currency","pub","endpoints","hash","status","block","signature"].forEach((function(t){e[t]=n[t]}))},h.prototype.copyValuesFrom=function(e){var n=this;["version","currency","pub","endpoints","block","signature"].forEach((function(t){n[t]=e[t]}))},h.prototype.json=function(){var e=this,n={};return["version","currency","endpoints","status","block","signature"].forEach((function(t){n[t]=e[t]})),n.raw=this.raw&&this.getRaw(),n.pubkey=this.pubkey,n},h.prototype.getEP=function(){if(this.ep)return this.ep;var e=null,n=this.regexp.API_REGEXP;return this.endpoints.forEach((function(t){var a=!e&&n.exec(t);a&&(e={api:a[1]||"",dns:a[2]||"",ipv4:a[3]||"",ipv6:a[4]||"",port:a[5]||80,path:a[6]||"",useSsl:443==a[5]})})),e||{}},h.prototype.getEndpoints=function(e){return e?("string"==typeof e&&(e=new RegExp("^"+e)),this.endpoints.reduce((function(n,t){return t.match(e)?n.concat(t):n}),[])):this.endpoints},h.prototype.hasEndpoint=function(e){var n=this.regexp[e]||new RegExp("^"+e),t=this.getEndpoints(n);return t&&t.length>0},h.prototype.hasEsEndpoint=function(){var e=this.getEsEndpoints();return e&&e.length>0},h.prototype.getEsEndpoints=function(){return this.getEndpoints(/^(GCHANGE_API|GCHANGE_SUBSCRIPTION_API)/)},h.prototype.getDns=function(){var e=this.ep||this.getEP();return e.dns?e.dns:null},h.prototype.getIPv4=function(){var e=this.ep||this.getEP();return e.ipv4?e.ipv4:null},h.prototype.getIPv6=function(){var e=this.ep||this.getEP();return e.ipv6?e.ipv6:null},h.prototype.getPort=function(){var e=this.ep||this.getEP();return e.port?e.port:null},h.prototype.getHost=function(){var e=this.ep||this.getEP();return(443==e.port||e.useSsl)&&e.dns?e.dns:this.hasValid4(e)?e.ipv4:e.dns?e.dns:e.ipv6?"["+e.ipv6+"]":""},h.prototype.getURL=function(){var e=this.ep||this.getEP(),n=this.getHost();return(443==e.port||e.useSsl?"https":"http")+"://"+n+(e.port?":"+e.port:"")},h.prototype.getServer=function(){var e=this.ep||this.getEP(),n=this.getHost();return n+(n&&e.port?":"+e.port:"")},h.prototype.hasValid4=function(e){return!(!e.ipv4||e.ipv4.match(this.regexp.LOCAL_IP_ADDRESS))},h.prototype.isReachable=function(){return!!this.getServer()},h.prototype.isSsl=function(){return(this.ep||this.getEP()).useSsl},h.prototype.isTor=function(){return(this.ep||this.getEP()).useTor},h.prototype.isHttp=function(){return this.ep||this.getEP(),!bma.useTor},angular.module("cesium.es.services",["cesium.es.http.services","cesium.es.comment.services","cesium.es.social.services","cesium.es.settings.services","cesium.es.crypto.services","cesium.es.profile.services","cesium.es.notification.services","cesium.es.message.services","cesium.es.modal.services","cesium.es.wallet.services","cesium.es.subscription.services","cesium.es.geo.services","cesium.es.document.services","cesium.es.registry.services","cesium.es.network.services","cesium.es.like.services"]),angular.module("cesium.es.comment.services",["ngResource","cesium.services","cesium.es.http.services","cesium.es.profile.services"]).factory("esComment",["$rootScope","$q","UIUtils","BMA","esHttp","csWallet","csWot",function(e,n,t,a,i,o,s){return{instance:function(t){var a={commons:["issuer","creationTime","time","message","reply_to"]},r={index:t,fields:{commons:a.commons},raw:{search:i.post("/"+t+"/comment/_search"),remove:i.record.remove(t,"comment"),wsChanges:i.ws("/ws/_changes"),add:new i.record.post("/"+t+"/comment",{creationTime:!0}),update:new i.record.post("/"+t+"/comment/:id/_update",{creationTime:!0})}};return r.raw.refreshTreeLinks=function(e){return r.raw.addTreeLinks(e,!0)},r.raw.addTreeLinks=function(e,t){(e=e||{}).result=e.result||[],e.mapById=e.mapById||{};var o={};if(_.forEach(_.values(e.mapById),(function(n){if(n.reply_to&&!n.parent){var a=e.mapById[n.reply_to];a||(a=new b(n.reply_to),o[a.id]=n.id,e.mapById[a.id]=a),t&&a.containsReply(n)||a.addReply(n)}})),!_.size(o)){var s=n.defer();return s.resolve(e),s.promise}var l={query:{terms:{_id:_.keys(o)}},sort:[{creationTime:{order:"desc"}},{time:{order:"desc"}}],from:0,size:1e3,_source:a.commons};return console.debug("[ES] [comment] Getting missing comments in tree"),r.raw.search(l).then((function(n){return n.hits.total?(_.forEach(n.hits.hits,(function(n){var t=e.mapById[n._id];t.copyFromJson(n._source),t.html=i.util.parseAsHtml(t.message),delete o[t.id]})),_.size(o)&&console.error("Comments has invalid [reply_to]: "+_.values(o).join(",")),r.raw.addTreeLinks(e)):(console.error("[ES] [comment] Comments has invalid [reply_to]: "+_.values(o).join(",")),e)}))},r.raw.loadDataByRecordId=function(e,n){(n=n||{}).from=n.from||0,n.size=n.size||20,n.loadAvatar=!angular.isDefined(n.loadAvatar)||n.loadAvatar,n.loadAvatarAllParent=!!angular.isDefined(n.loadAvatarAllParent)&&n.loadAvatar&&n.loadAvatarAllParent,n.size<0&&(n.size=1e3);var t={query:{term:{record:e}},sort:[{creationTime:{order:"desc"}},{time:{order:"desc"}}],from:n.from,size:n.size,_source:a.commons},o={total:0,mapById:{},result:[],pendings:{}};return r.raw.search(t).then((function(e){return e.hits.total?(o.total=e.hits.total,o.result=e.hits.hits.reduce((function(e,n){var t=new b(n._id,n._source);return t.html=i.util.parseAsHtml(t.message),o.mapById[t.id]=t,e.concat(t)}),o.result),r.raw.addTreeLinks(o)):o})).then((function(){if(n.loadAvatar)return n.loadAvatarAllParent?s.extendAll(_.values(o.mapById),"issuer"):s.extendAll(o.result,"issuer")})).then((function(){return o.result=o.result.sort((function(e,n){return e.creationTime-n.creationTime})),o}))},r.raw.createOnDeleteListener=function(e){return function(n){var t=_.findIndex(e.result,{id:n.id});-1!==t&&(e.result.splice(t,1),delete e.mapById[n.id],o.isUserPubkey(n.issuer)&&r.raw.remove(n.id,o.data.keypair).catch((function(e){throw console.error(e),new Error("MARKET.ERROR.FAILED_REMOVE_COMMENT")})))}},r.raw.startListenChanges=function(n,a,l){(a=a||{}).result=a.result||[],a.mapById=a.mapById||{},a.pendings=a.pendings||{},l=l||e;var c=r.raw.createOnDeleteListener(a);_.forEach(a.result,(function(e){e.addOnRemoveListener(c)}));var d=Date.now();console.info("[ES] [comment] Starting websocket to listen comments on [{0}/record/{1}]".format(t,n.substr(0,8)));var u=i.websocket.changes(t+"/comment");return u.open().then((function(){console.debug("[ES] [comment] Websocket opened in {0} ms".format(Date.now()-d)),u.on((function(e){e&&l.$applyAsync((function(){var t=a.mapById[e._id];"DELETE"===e._operation?t&&t.remove():e._source&&e._source.record===n&&(t?(t.copyFromJson(e._source),t.html=i.util.parseAsHtml(t.message),r.raw.refreshTreeLinks(a)):a.pendings&&a.pendings[e._source.creationTime]||e._source.issuer==o.data.pubkey?console.debug("Skip comment received by WS (already in pending)"):((t=new b(e._id,e._source)).addOnRemoveListener(c),t.isnew=!0,t.html=i.util.parseAsHtml(t.message),a.mapById[e._id]=t,r.raw.refreshTreeLinks(a).then((function(){return s.extend(t,"issuer")})).then((function(){a.result.push(t)}))))}))}))}))},r.raw.save=function(e,n,t){(n=n||{}).result=n.result||[],n.mapById=n.mapById||{},n.pendings=n.pendings||{};var a,s=t.id,l={creationTime:s?t.creationTime||t.time:moment().utc().unix(),message:t.message,record:e,issuer:o.data.pubkey};return t.reply_to||t.parent?l.reply_to=t.reply_to||t.parent.id:l.reply_to=null,s?(a=n.mapById[s]).copy(t):((a=new b(null,l)).addOnRemoveListener(r.raw.createOnDeleteListener(n)),a.name=o.data.name,a.avatar=o.data.avatar,a.isnew=!0,t.parent&&t.parent.addReply(a),n.result.push(a)),a.html=i.util.parseAsHtml(a.message),s?r.raw.update(l,{id:s}).then((function(){return a})):(n.pendings=n.pendings||{},n.pendings[l.creationTime]=l,r.raw.add(l).then((function(e){return a.id=e,n.mapById[e]=a,delete n.pendings[l.creationTime],a})))},r.raw.stopListenChanges=function(e){console.debug("[ES] [comment] Stopping websocket on comments"),_.forEach(e.result,(function(e){e.cleanAllListeners()})),r.raw.wsChanges().close()},r.load=r.raw.loadDataByRecordId,r.save=r.raw.save,r.changes={start:r.raw.startListenChanges,stop:r.raw.stopListenChanges},r}}}]),angular.module("cesium.es.http.services",["ngResource","ngApi","cesium.services","cesium.config"]).factory("esHttp",["$q","$timeout","$rootScope","$state","$sce","$translate","$window","$filter","CryptoUtils","UIUtils","csHttp","csConfig","csSettings","csCache","BMA","csWallet","csPlatform","Api",function(e,n,t,a,i,o,s,r,l,c,d,u,p,m,E,g,f,h){var T=!!("true"===u.httpsMode||!0===u.httpsMode||"force"===u.httpsMode||s.location&&"https:"===s.location.protocol);function b(a,i,s,b){var v,O,R=this,I={ES_USER_API:"GCHANGE_API",ES_SUBSCRIPTION_API:"GCHANGE_SUBSCRIPTION_API",ES_USER_API_ENDPOINT:"GCHANGE_API( ([a-z_][a-z0-9-_.]*))?( ([0-9.]+))?( ([0-9a-f:]+))?( ([0-9]+))",ANY_API_ENDPOINT:"([A-Z_]+)(?:[ ]+([a-z_][a-z0-9-_.ğĞ]*))?(?:[ ]+([0-9.]+))?(?:[ ]+([0-9a-f:]+))?(?:[ ]+([0-9]+))(?:\\/[^\\/]+)?",MAX_UPLOAD_BODY_SIZE:u.plugins&&u.plugins.es&&u.plugins.es.maxUploadBodySize||2097152,GCHANGE_API:"GCHANGE_API",like:{KINDS:["VIEW","LIKE","DISLIKE","FOLLOW","ABUSE","STAR"]}},N={IMAGE_SRC:y("data:([A-Za-z//]+);base64,(.+)"),URL:k("(www\\.|https?://(www\\.)?)[-a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\+.~#?&//=]*)"),HASH_TAG:k("(?:^|[\t\n\rs ])#([0-9_-\\wḡĞǦğàáâãäåçèéêëìíîïðòóôõöùúûüýÿ]+)"),USER_TAG:k("(?:^|[\t\n\rs ])@("+E.constants.regexp.USER_ID+")"),ES_USER_API_ENDPOINT:y(I.ES_USER_API_ENDPOINT),API_ENDPOINT:y(I.ANY_API_ENDPOINT)},S=0,A=r("truncUrl");function D(e,n,t,a){!e&&p.data&&(e=e||(p.data.plugins&&p.data.plugins.es?p.data.plugins.es.host:null),n=n||(e?p.data.plugins.es.port:null),t=angular.isDefined(t)?t:443==n||p.data.plugins.es.useSsl||T),R.alive=!1,R.host=e,R.port=n||(t||T?443:80),R.useSsl=angular.isDefined(t)?t:443==R.port||T,R.server=d.getServer(e,n)}function C(e){if(!(e=e||p.data).plugins||!e.plugins.es)return!1;var n=e.plugins.es.host,t=443==e.plugins.es.port||e.plugins.es.useSsl||T;return L(n,e.plugins.es.port||(t?443:80),t)}function L(e,n,t){return R.host===e&&R.port===n&&(angular.isUndefined(t)||t==R.useSsl)}function P(e){R.data.isFallback=e}function y(e){return new RegExp("^"+e+"$")}function k(e){return new RegExp(e)}function M(n,t){return t=t||e.defer(),R.data.isFallback&&R.started&&R.stop(),R.data.isFallback=!1,O=null,t.resolve(n),t.promise}function w(e,n){for(var t="@"===(n=n||"#")?N.USER_TAG:N.HASH_TAG,a=e&&t.exec(e),i=a&&[];a;){var o=a[1];_.contains(i,o)||i.push(o),a=(e=e.substr(a.index+a[1].length+1)).length>0&&t.exec(e)}return i}function U(e){return e?e.replace(/</g,"&lt;").replace(/>/g,"&gt;"):e}R.data={isFallback:!1},R.cache={getByPath:{},postByPath:{},wsByPath:{}},R.api=new h(this,"esHttp"),R.started=!1,R.init=D,D(a,i,s),R.useCache=!!angular.isDefined(b)&&b,R.cleanCache=function(){console.debug("[ES] [http] Cleaning requests cache..."),_.keys(R.cache.wsByPath).forEach((function(e){R.cache.wsByPath[e].close()})),R.cache={getByPath:{},postByPath:{},wsByPath:{}},m.clear("esHttp-")},R.copy=function(e){return R.started&&R.stop(),R.init(e.host,e.port,e.useSsl||443==e.port),R.data.isTemporary=!1,R.start(!0)},R.date={now:d.date.now},R.byteCount=function(e){return e="string"==typeof e?e:JSON.stringify(e),encodeURI(e).split(/%(?:u[0-9A-F]{2})?[0-9A-F]{2}|./).length-1},R.getUrl=function(e){return d.getUrl(R.host,R.port,e,R.useSsl)},R.get=function(n,t){t=R.useCache&&t;var a=n+(t?"#"+t:""),i=function(o){if(!R.started)return R._startPromise||console.warn("[ES] [http] Trying to get [{0}] before start(). Waiting...".format(n)),R.ready().then((function(n){return n?i(o):e.reject("ERROR.ES_CONNECTION_ERROR")}));var s=R.cache.getByPath[a];return s||(s=t?d.getWithCache(R.host,R.port,n,R.useSsl,t,null,null,"esHttp-"):d.get(R.host,R.port,n,R.useSsl),R.cache.getByPath[a]=s),s(o)};return i},R.post=function(n){var t=function(a,i){if(!R.started)return R._startPromise||console.error("[ES] [http] Trying to post [{0}] before start()...".format(n)),R.ready().then((function(n){return n?t(a,i):e.reject("ERROR.ES_CONNECTION_ERROR")}));var o=R.cache.postByPath[n];return o||(o=d.post(R.host,R.port,n,R.useSsl),R.cache.postByPath[n]=o),o(a,i)};return t},R.ws=function(e){return function(){var n=R.cache.wsByPath[e];return n&&!n.isClosed()||((n=d.ws(R.host,R.port,e,R.useSsl)).onclose=function(){delete R.cache.wsByPath[e]},R.cache.wsByPath[e]=n),n}},R.wsChanges=function(e){var n=R.ws("/ws/_changes")();if(!e)return n;var t=n.open;return n.open=function(){return t.call(n).then((function(n){n?n.send(e):console.warn("Trying to access ws changes, but no sock anymore... already open ?")}))},n},R.isAlive=function(){return d.get(R.host,R.port,"/node/summary",R.useSsl)().then((function(e){var n=e&&e.duniter&&e.duniter.software||"unknown";return"gchange-pod"===n||"cesium-plus-pod"===n||(console.error("[ES] [http] Not a Gchange Pod, but a {0} node. Please check '/summary/node'".format(n)),!1)})).catch((function(){return!1}))},R.checkNodeAlive=function(e){if(e)return P(!C()),!0;if(angular.isUndefined(e))return R.isAlive().then(R.checkNodeAlive);var n=p.data.plugins&&p.data.plugins.es||{};O=O||{host:n.host,port:n.port};var t=n.fallbackNodes&&S<n.fallbackNodes.length&&n.fallbackNodes[S++];if(!t)return o("ERROR.ES_CONNECTION_ERROR",{server:R.server}).then(c.alert.info),!1;var a=d.getServer(t.host,t.port);return c.loading.hide(),o("CONFIRM.ES_USE_FALLBACK_NODE",{old:R.server,new:a}).then(c.alert.confirm).then((function(e){return!!e&&(R.cleanCache(),R.init(t.host,t.port,t.useSsl||443==t.port),R.isAlive().then(R.checkNodeAlive))}))},R.isStarted=function(){return R.started},R.ready=function(){return R.started?e.when(!0):R._startPromise||R.start()},R.start=function(n){return R._startPromise?R._startPromise:R.started?e.when(R.alive):(R._startPromise=f.ready().then((function(){n||R.init()})).then((function(){console.debug("[ES] [http] Starting on [{0}]{1}...".format(R.server,R.useSsl?" (SSL on)":""));var e=Date.now();return R.checkNodeAlive().then((function(n){return R.alive=n,n?(v=[p.api.data.on.reset(t,M,R)],console.debug("[ES] [http] Started in "+(Date.now()-e)+"ms"),R.api.node.raise.start(),R.started=!0,delete R._startPromise,S=0,!0):(console.error("[ES] [http] Could not start [{0}]: node unreachable".format(R.server)),R.started=!0,delete R._startPromise,S=0,!1)}))})),R._startPromise)},R.stop=function(){return console.debug("[ES] [http] Stopping..."),_.forEach(v,(function(e){e()})),v=[],P(!1),delete R._startPromise,R.alive?(R.cleanCache(),R.alive=!1,R.started=!1,R.api.node.raise.stop()):R.started=!1,e.when()},R.restart=function(){return R.stop(),n(R.start,200)},R.image={},R.image.fromHit=function(e,n){if(e&&e._source){var t=e._source[n];if(t&&t._content_type&&t._content_type.startsWith("image/")){var a={};if(t._content)a.src="data:"+t._content_type+";base64,"+t._content;else{var i=t._content_type.substr(6),o=[e._index,e._type,e._id,"_image",n].join("/");o="/"+o+"."+i,a.src=R.getUrl(o)}
return t._title&&(a.title=t._title),t._name&&(a.name=t._name),a}}},R.api.registerEvent("node","start"),R.api.registerEvent("node","stop");var x={getServer:d.getServer,node:{summary:R.get("/node/summary"),parseEndPoint:function(e){var n=N.API_ENDPOINT.exec(e);if(n)return{api:n[1]||"",dns:n[2]||"",ipv4:n[3]||"",ipv6:n[4]||"",port:n[5]||80,path:n[6]||"",useSsl:443==n[5]}},same:L,sameAsSettings:C,isFallback:function(){return R.data.isFallback}},websocket:{changes:R.wsChanges,block:R.ws("/ws/block"),peer:R.ws("/ws/peer")},wot:{member:{uids:R.get("/wot/members")}},network:{peering:{self:R.get("/network/peering")},peers:R.get("/network/peers")},record:{post:function(n,t){t=t||{};var a=R.post(n);return function(n,i){if(!g.isLogin())return e.reject("Wallet must be login before sending record to ES node");t.creationTime&&!n.creationTime&&(n.creationTime=moment().utc().unix());var o=moment().utc().unix();n.time=!n.time||n.time<o?o:n.time+1;var s=g.data.keypair,r=angular.copy(n);delete r.signature,delete r.hash,r.issuer=g.data.pubkey,r.version||(r.version=2),t.tagFields&&function(e,n){n=n||["title","description"],e.tags=n.reduce((function(n,t){var a=e[t],i=a&&w(a);return i?n.concat(i):n}),[])}(r,t.tagFields);var c=JSON.stringify(r);return l.util.hash(c).then((function(e){return l.sign(e,s).then((function(n){return c='{"hash":"{0}","signature":"{1}",'.format(e,n)+c.substring(1),a(c,i).then((function(e){return m.clear("esHttp-"),e})).catch((function(e){var n=R.byteCount(r);if(n>I.MAX_UPLOAD_BODY_SIZE)throw{message:"ERROR.ES_MAX_UPLOAD_BODY_SIZE",length:n};throw e}))}))}))}},remove:function(n,t){return function(a){if(!g.isLogin())return e.reject("Wallet must be login before sending record to ES node");var i={version:2,index:n,type:t,id:a,issuer:g.data.pubkey,time:moment().utc().unix()},o=JSON.stringify(i);return l.util.hash(o).then((function(e){return l.sign(e,g.data.keypair).then((function(n){return o='{"hash":"{0}","signature":"{1}",'.format(e,n)+o.substring(1),R.post("/history/delete")(o).then((function(e){return e}))}))}))}},count:function(e,n,t){var a=R.get("/{0}/{1}/_search?size=0".format(e,n),t);return function(e){return a(e).then((function(e){return e&&e.hits&&e.hits.total}))}}},image:{fromAttachment:function(e){if(!e||!e._content_type||!e._content||0===e._content.length)return null;var n={src:"data:"+e._content_type+";base64,"+e._content};return e._title&&(n.title=e._title),e._name&&(n.name=e._name),n},toAttachment:function(e){if(!e||!e.src)return null;var n=N.IMAGE_SRC.exec(e.src);if(!n)return null;var t={_content_type:n[1],_content:n[2]};return e.title&&(t._title=e.title),e.name&&(t._name=e.name),t}},hit:{empty:function(){return{_id:null,_index:null,_type:null,_version:null,_source:{}}}},util:{parseTags:w,parseAsHtml:function(e,n){var t=e?U(e.trim()):void 0;if(t){(n=n||{}).tagState=n.tagState||"app.user_lookup",n.nameState=n.nameState||"app.user_identity_name",!n.newLine&&angular.isDefined(n.newLine)||(t=t.replace(/\n/g,"<br>\n"));var a=function(e){for(var n=e&&N.URL.exec(e),t=n&&[];n;){var a=n[0];_.contains(t,a)||t.push(a),n=(e=e.substr(n.index+n[0].length+1))&&N.URL.exec(e)}return t}(t);_.forEach(a,(function(e){var n=e.startsWith("http://")||e.startsWith("https://")?e:"http://"+e,a='<a on-tap="openLink($event, \'{0}\')" href="{1}" target="_blank">{2}</a>'.format(n,n,A(e));t=t.replace(e,a)}));var i=w(t);_.forEach(i,(function(e){var a="<a ui-sref=\"{0}({hash: '{1}'})\">#{2}</a>".format(n.tagState,e,e);t=t.replace("#"+e,a)}));var o=w(t,"@");_.forEach(o,(function(e){var a="<a ui-sref=\"{0}({name: '{1}'})\">@{2}</a>".format(n.nameState,e,e);t=t.replace("@"+e,a)}));var s=function(e,n,t){for(var a=k("(?:^|[\\r\\s])("+(n=n||"##")+"([^#></]+)<br>)"),i=e&&a.exec(e),o=i&&[],s=i&&[];i;){var r=i[1];_.contains(o,r)||(o.push(r),s.push({line:r,title:i[2]})),i=(e=e.substr(i.index+i[1].length+1)).length>0&&a.exec(e)}return s}(t,"#+[ ]*");_.forEach(s,(function(e){var n=e.line.lastIndexOf("#",5)+1;t=t.replace(e.line,"<h{0}>{1}</h{2}>".format(n,e.title,n))}))}return t},escapeHtmlTags:U,findObjectInTree:function e(n,t){if(n)return n[t]?n[t]:Array.isArray(n)?n.reduce((function(n,a){return n||e(a,t)}),!1):"object"==typeof n?_.reduce(_.keys(n),(function(a,i){return a||e(n[i],t)}),!1):void 0}},cache:d.cache,constants:I};x.constants.regexp=N,angular.merge(R,x)}T&&console.debug("[ES] [https] Enable SSL (forced by config or detected in URL)");var v=new b(void 0,void 0,void 0,!0);return v.instance=function(e,n,t,a){return new b(e,n,t,a)},v.lightInstance=function(e,n,t,a){function i(t,a){return d.get(e,n,t)(a).then((function(e){return e&&e.hits&&e.hits.total}))}return n=n||80,t=angular.isDefined(t)?t:443==+n,{host:e,port:n,useSsl:t,node:{summary:d.getWithCache(e,n,"/node/summary",t,d.cache.LONG,!1,a)},network:{peering:{self:d.get(e,n,"/network/peering",t,a)},peers:d.get(e,n,"/network/peers",t,a)},blockchain:{current:d.get(e,n,"/blockchain/current?_source=number,hash,medianTime",t,a)},record:{count:function(e,n){return i("/{0}/{1}/_search?size=0".format(e,n))}},subscription:{count:function(e){return i("/subscription/record/_search?size=0&q="+_.keys(e||{}).reduce((function(n,t){return(n&&n+" AND "||"")+t+":"+e[t]}),""))}}}},v}]),angular.module("cesium.es.settings.services",["cesium.services","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&e.registerEagerLoadingService("esSettings")}]).factory("esSettings",["$rootScope","$q","$timeout","Api","esHttp","csConfig","csSettings","CryptoUtils","Device","UIUtils","csWallet",function(e,n,t,a,i,o,s,r,l,c,d){var u,p,m={includes:["locale","useRelative","useLocalStorage","expertMode","logoutIdle"],excludes:["newIssueVersion","timeout","cacheTimeMs","time","login","build"],plugins:{es:{excludes:["enable","host","port","useSsl","fallbackNodes","minVersion","document","maxUploadBodySize","defaultCountry","market"],notifications:{}}},helptip:{excludes:["installDocUrl"]}},E=angular.merge({plugins:{es:{askEnable:!1,notifications:{readTime:!0,txSent:!0,txReceived:!0,certSent:!0,certReceived:!0},invitations:{readTime:!0},defaultCountry:void 0,enableGoogleApi:!1,googleApiKey:void 0,wot:{enableMixedSearch:!0},geoDistance:"50km"}}},{plugins:{es:{minVersion:"1.2.0",document:{index:"user",type:"profile"}}}},{plugins:{es:o.plugins&&o.plugins.es||{}}}),g=this,f=new a("esSettings"),h=!1;function T(e,t){return t=t||n.defer(),angular.merge(e,E),t.resolve(e),t.promise}function b(e,a){return a=a||n.defer(),e&&e.pubkey&&e.keypair?r.isLoaded()?(console.debug("[ES] [settings] Loading user settings..."),(i=e.pubkey,o=e.keypair,l=Date.now(),n.all([r.box.keypair.fromSignKeypair(o),g.get({id:i}).catch((function(e){if(e&&e.ucode&&404==e.ucode)return null;throw e}))]).then((function(e){var n=e[0];if((e=e[1])&&e._source){var t=e._source;if(t.time!==s.data.time){var a=r.util.decode_base58(t.nonce);return r.box.open(t.content,a,n.boxPk,n.boxSk).then((function(e){var n=JSON.parse(e||"{}");return n.time=t.time,console.debug("[ES] [settings] Loaded user settings in "+(Date.now()-l)+"ms"),n})).catch((function(e){return console.error("[ES] [settings] Could not read stored settings: "+(e&&e.message||"decryption error")),delete s.data.time,null}))}console.debug("[ES] [settings] Loaded user settings in "+(Date.now()-l)+"ms (no update need)")}}))).then((function(e){if(e)return angular.merge(s.data,e),u=e,console.debug("[ES] [settings] Successfully load settings from ES"),O()})).then((function(){a.resolve(e)})).catch((function(e){a.reject(e)})),a.promise):(console.debug("[ES] [settings] Waiting crypto lib loading..."),t((function(){return b(e,a)}),50)):(a.resolve(),a.promise);var i,o,l}function v(e){if(!h){var a=p&&p.length>0;R();var o=g.isEnable();d.isLogin()&&(!a&&o?b(d.data):function e(a){if(!d.isLogin())return n.when();var o=function e(n,t){var a={};return t.includes&&_.forEach(_.keys(t),(function(e){"includes"!==e&&"excludes"!==e&&t.includes.push(e)})),_.forEach(_.keys(n),(function(i){t.includes&&!_.contains(t.includes,i)||t.excludes&&_.contains(t.excludes,i)||(n[i]&&"object"==typeof n[i]&&t[i]&&"object"==typeof t[i]?a[i]=e(n[i],t[i]):a[i]=n[i])})),a}(a,m);if(u&&angular.equals(o,u))return n.when();if(!r.isLoaded())return console.debug("[ES] [settings] Waiting crypto lib loading..."),t((function(){return e()}),50);var l=i.date.now();return console.debug("[ES] [settings] Saving user settings... at time "+l),n.all([r.box.keypair.fromSignKeypair(d.data.keypair),r.util.random_nonce()]).then((function(e){var n=e[0],t=e[1],i={issuer:d.data.pubkey,nonce:r.util.encode_base58(t),time:l},s=JSON.stringify(o);return r.box.pack(s,t,n.boxPk,n.boxSk).then((function(e){return i.content=e,a.time?g.update(i,{id:i.issuer}):g.add(i)}))})).then((function(){return s.data.time=l,u=o,console.debug("[ES] [settings] Saved user settings in "+(i.date.now()-l)+"ms"),O()})).catch((function(e){throw console.error(e),e}))}(e))}}function O(){return h?n.when():(h=!0,s.store().then((function(){h=!1})).catch((function(e){throw h=!1,e})))}function R(){var n=g.isEnable();return!n&&p&&p.length>0?(console.debug("[ES] [settings] Disable"),_.forEach(p,(function(e){e()})),p=[],i.stop().then((function(){f.state.raise.changed(n)}))):!n||p&&0!==p.length?void 0:i.start().then((function(t){if(t){if(console.debug("[ES] [settings] Enable"),function(){p=[s.api.data.on.reset(e,T,this),d.api.data.on.login(e,b,this)]}(),d.isLogin())return b(d.data).then((function(){f.state.raise.changed(n)}));f.state.raise.changed(n)}else console.error("[ES] node could not be started !!")}))}return g.api=f,g.get=i.get("/user/settings/:id"),g.add=i.record.post("/user/settings"),g.update=i.record.post("/user/settings/:id/_update"),g.isEnable=function(){return s.data.plugins&&s.data.plugins.es&&s.data.plugins.es.enable&&!!s.data.plugins.es.host},g.setPluginSaveSpecs=function(e,n){e&&n&&(m.plugins[e]=angular.copy(n))},f.registerEvent("state","changed"),s.ready().then((function(){return s.api.data.on.changed(e,v,this),i.api.node.on.stop(e,(function(){u=null}),this),R()})),g}]),angular.module("cesium.es.social.services",["cesium.es.crypto.services"]).factory("SocialUtils",["$filter","$q","CryptoUtils","BMA","csWallet","esCrypto",function(e,n,t,a,i,o){function s(){var s={URI:"([a-zAZ0-9]+)://[ a-zA-Z0-9-_:/;*?!^\\+=@&~#|<>%.]+",EMAIL:"[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$",PHONE:"[+]?[0-9. ]{9,15}",socials:{facebook:"https?://((fb.me)|((www.)?facebook.com))",twitter:"https?://(www.)?twitter.com",googleplus:"https?://plus.google.com(/u)?",youtube:"https?://(www.)?youtube.com",github:"https?://(www.)?github.com",tumblr:"https?://(www.)?tumblr.com",snapchat:"https?://(www.)?snapchat.com",linkedin:"https?://(www.)?linkedin.com",vimeo:"https?://(www.)?vimeo.com",instagram:"https?://(www.)?instagram.com",wordpress:"https?://([a-z]+)?wordpress.com",diaspora:"https?://(www.)?((diaspora[-a-z]+)|(framasphere)).org",duniter:"duniter://[a-zA-Z0-9-_:/;*?!^\\+=@&~#|<>%.]+",bitcoin:"bitcoin://[a-zA-Z0-9-_:/;*?!^\\+=@&~#|<>%.]+",curve25519:"curve25519://("+a.constants.regexp.PUBKEY+"):([a-zA-Z0-9]+)@([a-zA-Z0-9-_:/;*?!^\\+=@&~#|<>%.]+)"}};function r(e){return new RegExp("^"+e+"$")}function l(e){var n;if(s.URI.test(e)){var t=s.URI.exec(e)[1],a=e;if("http"==t||"https"==t){var i=e.indexOf("/",t.length+3);i>0&&(a=e.substring(0,i))}_.keys(s.socials).forEach((function(e){if(s.socials[e].test(a))return n=e,!1})),n||(n="web")}else s.EMAIL.test(e)?n="email":s.PHONE.test(e)&&(n="phone");return n||console.warn("[ES] [social] Unable to detect type of social URL: "+e),n}function c(e){if((e=e?e.trim():e)&&e.length>0)return e.startsWith("www.")&&(e="http://"+e),{type:l(e),url:e}}function d(n){if(!n||!n.length)return[];var t={};return n.forEach((function(n){if("curve25519"==n.type?(delete n.issuer,n.valid&&angular.merge(n,c(n.url))):n=c(n.url),n){var a=e("formatSlug")(n.url);t[a]=n}})),_.values(t)}return s.URI=r(s.URI),s.EMAIL=r(s.EMAIL),s.PHONE=r(s.PHONE),_.keys(s.socials).forEach((function(e){s.socials[e]=r(s.socials[e])})),{get:c,reduce:d,createForEncryption:function(e,n){return{recipient:e,type:"curve25519",url:n}},open:function e(a,r,l){if(l=l||i.data.pubkey,!t.isLoaded())return console.debug("[socials] Waiting crypto lib loading..."),$timeout((function(){return e(a,r,l)}),100);var c=_.filter(a||[],(function(e){var n=e.url&&"curve25519"==e.type&&s.socials.curve25519.exec(e.url);return!!n&&(e.recipient=n[1],e.nonce=n[2],e.url=n[3],e.issuer=r,e.valid=e.recipient===l,e.valid)}));return c.length?o.box.open(c,void 0,"issuer","url").then((function(){return d(a)})):n.when(d(a))},pack:function e(a){if(!t.isLoaded())return console.debug("[socials] Waiting crypto lib loading..."),$timeout((function(){return e(a)}),100);var i=_.filter(a||[],(function(e){return"curve25519"==e.type&&e.url&&e.recipient}));return i.length?t.util.random_nonce().then((function(e){return n.all(i.reduce((function(n,t){return n.concat(o.box.pack(t,void 0,"recipient","url",e))}),[]))})).then((function(e){return e.reduce((function(e,n){return e.concat({type:"curve25519",url:"curve25519://{0}:{1}@{2}".format(n.recipient,n.nonce,n.url)})}),[])})):n.when(a)}}}var r=s();return r.instance=s,r}]),angular.module("cesium.es.crypto.services",["ngResource","cesium.services"]).factory("esCrypto",["$q","$rootScope","CryptoUtils",function(e,n,t){function a(n){if(!n)throw new Error("Missing keypair");return n.boxPk&&n.boxSk?e.when(n):e.all([t.box.keypair.skFromSignSk(n.signSk),t.box.keypair.pkFromSignPk(n.signPk)]).then((function(e){return{boxSk:e[0],boxPk:e[1]}}))}return{box:{getKeypair:a,pack:function(n,i,o,s,r){if(!n[o=o||"recipient"])return e.reject({message:"ES_WALLET.ERROR.RECIPIENT_IS_MANDATORY"});"string"==typeof(s=s||"content")&&(s=[s]),n=angular.copy(n);var l=t.util.decode_base58(n[o]);return e.all([a(i),t.box.keypair.pkFromSignPk(l),r?e.when(r):t.util.random_nonce()]).then((function(a){var i=a[0].boxSk,o=a[1],r=a[2];return e.all(s.reduce((function(e,a){return n[a]?e.concat(t.box.pack(n[a],r,o,i)):e}),[])).then((function(e){var a=0;return _.forEach(s,(function(t){n[t]?n[t]=e[a++]:n[t]=null})),n.nonce=t.util.encode_base58(r),n}))}))},open:function(n,i,o,s){o=o||"issuer","string"==typeof(s=s||"content")&&(s=[s]);var r=(new Date).getTime(),l={},c=[a(i)];return e.all(n.reduce((function(e,n){var a=n[o];if(!a)throw"Record has no "+o;return l[a]?res:e.concat(t.box.keypair.pkFromSignPk(t.util.decode_base58(a)).then((function(e){l[a]=e})))}),c)).then((function(a){var i=a[0];return e.all(n.reduce((function(e,n){var a=l[n[o]],r=t.util.decode_base58(n.nonce);return n.valid=!0,e.concat(s.reduce((function(e,o){return n[o]?e.concat(t.box.open(n[o],r,a,i.boxSk).then((function(e){n[o]=e})).catch((function(e){console.error(e),console.warn("[ES] [crypto] a record may have invalid cypher "+o),n.valid=!1}))):e}),[]))}),[]))})).then((function(){return console.debug("[ES] [crypto] All record decrypted in "+((new Date).getTime()-r)+"ms"),n}))}}}}]),angular.module("cesium.es.profile.services",["cesium.services","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&e.registerEagerLoadingService("esProfile")}]).factory("esProfile",["$rootScope","$q","esHttp","SocialUtils","csWot","csWallet","csPlatform","esLike",function(e,n,t,a,i,o,s,r){var l,c=this;function d(e,n){return((n=n||{}).raw?c.raw.getAll:c.raw.get)({id:e}).then((function(i){if(i&&i.found&&i._source){var s={name:i._source.title,source:i._source};return s.name&&s.name.length,s.avatar=t.image.fromHit(i,"avatar"),n.raw||(s.description=t.util.parseAsHtml(s.source.description)),s.source.socials&&s.source.socials.length&&(s.source.socials=_.uniq(s.source.socials,!1,(function(e){return e.url}))),o.isLogin()?a.open(s.source.socials,e).then((function(){return s})):(s.source.socials=_.filter(s.source.socials,(function(e){return"curve25519"!=e.type})),s)}})).catch((function(e){if(e&&e.ucode&&404==e.ucode)return null;throw e}))}function u(e,n,a,i){if(!n||!n.hits||!n.hits.total)return e;var o,s={};a=a||{},i=i||"pubkey",_.forEach(n.hits.hits,(function(n){var r="avatar";if("user"===n._index){if(!(o=a&&a[n._id])){var l={};l[i]=n._id,o=[l],e.push(l)}}else if("user"!==n._index){s[n._index]||(s[n._index]=!0,e.push({id:"divider-"+n._index,divider:!0,index:n._index}));var c={id:n._index+"-"+n._id,index:n._index,templateUrl:"plugins/es/templates/wot/lookup_item_{0}.html".format(n._index),state:"app.view_{0}".format(n._index),stateParams:{id:n._id,title:n._source.title},creationTime:n._source.creationTime,memberCount:n._source.memberCount,type:n._source.type};o=[c],e.push(c),r="thumbnail"}avatar=t.image.fromHit(n,r),_.forEach(o,(function(e){e.avatar=avatar,function(e,n,a){e.avatar=e.avatar||t.image.fromHit(n,"avatar"),e.name=n._source.title,e.name&&e.name.length,e.description=n._source.description||e.description,e.city=n._source.city||e.city,e.profile=e.profile||{},e.profile.issuer=n._id,e.profile.creationTime=n._source.creationTime,e.profile.time=n._source.time,n._source.pubkey&&!e.pubkey&&(e.pubkey=n._source.pubkey),n.highlight&&(n.highlight.title&&(e.name=n.highlight.title[0]),n.highlight.tags&&(e.tags=n.highlight.tags.reduce((function(e,n){return e.concat(n.replace("<em>","").replace("</em>",""))}),[])))}(e,n)}))})),_.keys(s).length&&e.splice(0,0,{id:"divider-identities",divider:!0,index:"profile"})}function p(e,n){var a={highlight:{fields:{title:{},tags:{}}},from:(n=n||{}).from||0,size:n.size||100,_source:n._source||["title","avatar._content_type","time","city","creationTime","time"]};if(e){a.query={},a.query.bool={should:[{match:{title:{query:e,boost:2}}},{prefix:{title:e}}]};var i=e?t.util.parseTags(e):void 0;i&&a.query.bool.should.push({terms:{tags:i}})}else delete a.highlight,a.sort=n.sort||{creationTime:"desc"};return n.mixedSearch&&(console.debug("[ES] [profile] Mixed search: enable"),e&&(a.indices_boost={user:100,page:1,group:.01}),a._source=a._source.concat(["description","membersCount","type"])),(n.mixedSearch?c.raw.mixedSearch:c.raw.search)(a).then((function(e){var n=[];return u(n,e),n}))}function m(e,a,i,o){if(o=o||n.defer(),!(e||a&&a.length))return o.resolve(a),o.promise;var s;console.debug("[ES] [profile] Searching on user profiles..."),i=i||"pubkey";var r=(e=e?e.toLowerCase().trim():e)?t.util.parseTags(e):void 0,l={query:{},highlight:{fields:{title:{},tags:{}}},from:0,size:100,_source:["title","avatar._content_type","pubkey","creationTime"]};if(a.length>0){s={},_.forEach(a,(function(e){var n=e[i];if(n){var t=s[n];t?t.push(e):(t=[e],s[n]=t)}}));var d=_.keys(s);l.size=d.length<=l.size?l.size:d.length,e?(l.query.constant_score={filter:{bool:{should:[{terms:{_id:d}},{bool:{must:[{match:{title:{query:e,boost:2}}},{prefix:{title:e}}]}}]}}},r&&l.query.constant_score.filter.bool.should.push({terms:{tags:r}})):(delete l.highlight,l.query.constant_score={filter:{terms:{_id:d}}})}else{if(!e)return o.resolve(a),o.promise;l.query.bool={should:[{match:{title:{query:e,boost:2}}},{prefix:{title:e}}]},r&&l.query.bool.should.push({terms:{tags:r}})}return(0,c.raw.search)(l).then((function(e){u(a,e,s,i),o.resolve(a)})).catch((function(e){e&&e.ucode&&404==e.ucode?o.resolve(a):o.reject(e)})),o.promise}function E(e,t){return t=t||n.defer(),e&&e.pubkey?(d(e.pubkey).then((function(n){n&&(e.name=n.name,e.avatar=n.avatar,e.profile=n.source,e.profile.description=n.description),t.resolve(e)})).catch((function(n){t.reject(e)})),t.promise):(t.resolve(),t.promise)}function g(){var n=t.alive;!n&&l&&l.length>0?(console.debug("[ES] [profile] Disable"),_.forEach(l,(function(e){e()})),l=[]):!n||l&&0!==l.length||(console.debug("[ES] [profile] Enable"),function(){l=[i.api.data.on.load(e,E,this),i.api.data.on.search(e,m,this)]}())}return c.raw={getFields:t.get("/user/profile/:id?&_source_exclude=avatar._content&_source=:fields"),get:t.get("/user/profile/:id?&_source_exclude=avatar._content"),getAll:t.get("/user/profile/:id"),search:t.post("/user/profile/_search"),mixedSearch:t.post("/user,page/profile,record/_search")},s.ready().then((function(){return t.api.node.on.start(e,g,this),t.api.node.on.stop(e,g,this),g()})),{search:function(e){return p(void 0,e)},searchText:p,getAvatarAndName:function(e){return c.raw.getFields({id:e,fields:"title,avatar._content_type,pubkey,creationTime,time"}).then((function(e){var n;return e&&e._source&&((n={name:e._source.title,pubkey:e._source.pubkey}).avatar=t.image.fromHit(e,"avatar"),n.creationTime=e._source.creationTime,n.time=e._source.time),n})).catch((function(e){if(e&&e.ucode&&404==e.ucode)return null;throw e}))},get:d,add:t.record.post("/user/profile",{tagFields:["title","description"],creationTime:!0}),update:t.record.post("/user/profile/:id/_update",{tagFields:["title","description"],creationTime:!0}),remove:t.record.remove("user","profile"),avatar:t.get("/user/profile/:id?_source=avatar"),fillAvatars:function(e,n){return m(null,e,n)},like:r.instance("user","profile")}}]),angular.module("cesium.es.notification.services",["cesium.services","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&e.registerEagerLoadingService("esNotification")}]).factory("esNotification",["$rootScope","$q","$timeout","$translate","$state","esHttp","csConfig","csSettings","csWallet","csWot","UIUtils","BMA","CryptoUtils","csPlatform","Api",function(e,n,t,a,i,o,s,r,l,c,d,u,p,m,E){var g,f={MESSAGE_CODES:["MESSAGE_RECEIVED"],INVITATION_CODES:["INVITATION_TO_CERTIFY"],DEFAULT_LOAD_SIZE:20},h={commons:["type","code","params","reference","recipient","time","hash","read_signature"]},b=this,v=new E(this,"esNotification");function O(e,n){(n=n||{}).codes=n.codes||{},n.codes.excludes=n.codes.excludes||f.EXCLUDED_CODES;var t={bool:{must:[{term:{recipient:e}}]}};if(n.codes&&n.codes.includes)t.bool.must.push({terms:{code:n.codes.includes}});else{var a=[];r.getByPath("plugins.es.notifications.txSent",!1)||a.push("TX_SENT"),r.getByPath("plugins.es.notifications.txReceived",!0)||a.push("TX_RECEIVED"),r.getByPath("plugins.es.notifications.certSent",!1)||a.push("CERT_SENT"),r.getByPath("plugins.es.notifications.certReceived",!0)||a.push("CERT_RECEIVED"),n.codes.excludes&&_.forEach(n.codes.excludes,(function(e){a.push(e)})),a.length&&(t.bool.must_not={terms:{code:a}})}return n.readTime&&t.bool.must.push({range:{time:{gt:n.readTime}}}),t}function R(e,n){var t={query:O(e,n)};return t.query.bool.must.push({missing:{field:"read_signature"}}),b.raw.postCount(t).then((function(e){return e.count}))}function I(n){if(n&&l.isLogin())if(_.contains(f.INVITATION_CODES,n.code))v.event.raise.newInvitation(n);else{if(!_.contains(f.MESSAGE_CODES,n.code)){var t=new T(n,C);return t.id=n.id||t.id,c.extendAll([t]).then((function(){e.$$phase?N(t):e.$apply((function(){N(t)}))})).then((function(){return A(t)}))}v.event.raise.newMessage(n)}}function N(e){return l.data.notifications=l.data.notifications||{},l.data.notifications.unreadCount++,v.data.raise.new(e),e}function S(e){return e?String(e).replace(/<[^>]*>/gm,"").replace(/&[^;]+;/gm,""):""}function A(t,o){n.all([a(o||"COMMON.NOTIFICATION.TITLE"),a(t.message,t)]).then((function(n){D(S(n[0]),{body:S(n[1]),icon:t.avatar&&t.avatar.src||"./img/logo.png",lang:a.use(),tag:t.id,onclick:function(){e.$applyAsync((function(){"function"==typeof t.markAsRead&&t.markAsRead(),t.state&&i.go(t.state,t.stateParams)}))}})}))}function D(e,n){if("Notification"in window)if("granted"===Notification.permission){var t=new Notification(e,n);t.onclick=n.onclick||t.onclick}else"denied"!==Notification.permission&&Notification.requestPermission((function(t){"granted"===t&&D(e,n)}))}function C(e){!e.read&&e.id&&(e.id?(e.read=!0,p.sign(e.hash,l.data.keypair).then((function(n){return b.raw.postReadById(n,{id:e.id})})).catch((function(e){console.error("[ES] [notification] Error while trying to mark event as read.",e)}))):console.error("[ES] [notification] Could not mark as read: no 'id' found!",e))}function L(e){e.notifications=e.notifications||{},e.notifications.unreadCount=null,b.raw.ws.getUserEvent().close()}function P(e,a){if(a=a||n.defer(),!e||!e.pubkey||!e.keypair)return a.resolve(),a.promise;console.debug("[ES] [notification] Loading count...");var i=Date.now();return R(e.pubkey,{readTime:r.data.wallet?r.data.wallet.notificationReadTime:0,excludeCodes:f.EXCLUDED_CODES}).then((function(n){e.notifications=e.notifications||{},e.notifications.unreadCount=n,n>0&&t((function(){A({message:"COMMON.NOTIFICATION.HAS_UNREAD",count:n,state:"app.view_notifications"},"COMMON.APP_NAME")}),500),console.debug("[ES] [notification] Loaded count ({0}) in {1}ms".format(n,Date.now()-i)),a.resolve(e)})).catch((function(e){a.reject(e)})).then((function(){console.debug("[ES] [notification] Starting listen user event...");var n=b.raw.ws.getUserEvent();return g.push(n.close),n.on(I,{pubkey:e.pubkey,locale:r.data.locale.id}).catch((function(e){console.error("[ES] [notification] Unable to listen user event",e),d.alert.error("ACCOUNT.ERROR.WS_CONNECTION_FAILED")}))})),a.promise}function y(){var n=o.alive;if(!n&&g&&g.length>0)console.debug("[ES] [notification] Disable"),_.forEach(g,(function(e){e()})),g=[],l.isLogin()&&L(l.data);else if(n&&(!g||0===g.length)&&(console.debug("[ES] [notification] Enable"),function(){g=[l.api.data.on.login(e,P,this),l.api.data.on.init(e,L,this),l.api.data.on.reset(e,L,this)]}(),l.isLogin()))return P(l.data)}return f.EXCLUDED_CODES=f.MESSAGE_CODES.concat(f.INVITATION_CODES),b.raw={postCount:o.post("/user/event/_count"),postSearch:o.post("/user/event/_search"),postReadById:o.post("/user/event/:id/_read"),ws:{getUserEvent:o.ws("/ws/event/user/:pubkey/:locale"),getChanges:o.ws("/ws/_changes")}},v.registerEvent("data","new"),v.registerEvent("event","newInvitation"),v.registerEvent("event","newMessage"),m.ready().then((function(){return o.api.node.on.start(e,y,this),o.api.node.on.stop(e,y,this),y()})),b.load=function(e,n){(n=n||{}).from=n.from||0,n.size=n.size||f.DEFAULT_LOAD_SIZE;var t={query:O(e,n),sort:[{time:{order:"desc"}}],from:n.from,size:n.size,_source:h.commons};return b.raw.postSearch(t).then((function(e){if(!e.hits||!e.hits.total)return[];var n=e.hits.hits.reduce((function(e,n){var t=new T(n._source,C);return t.id=n._id,e.concat(t)}),[]);return c.extendAll(n)}))},b.unreadCount=R,b.html5={emit:D},b.api=v,b.websocket={event:b.raw.ws.getUserEvent,change:b.raw.ws.getChanges},b.constants=f,b}]),angular.module("cesium.es.message.services",["ngResource","cesium.services","cesium.crypto.services","cesium.wot.services","cesium.es.http.services","cesium.es.wallet.services","cesium.es.notification.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&e.registerEagerLoadingService("esMessage")}]).factory("esMessage",["$q","$rootScope","$timeout","UIUtils","Api","CryptoUtils","csPlatform","csConfig","csSettings","esHttp","csWallet","esWallet","csWot","esNotification",function(e,n,t,a,i,o,s,r,l,c,d,u,p,m){var E,g={commons:["issuer","recipient","title","content","time","nonce","read_signature"],notifications:["issuer","time","hash","read_signature"]},f={postSearch:c.post("/message/inbox/_search"),postSearchByType:c.post("/message/:type/_search"),getByTypeAndId:c.get("/message/:type/:id"),postReadById:c.post("/message/inbox/:id/_read")},h=new i(this,"esMessage");function b(e){e.messages=e.messages||{},e.messages.unreadCount=null}function v(e){e.messages&&delete e.messages}function O(n,t){if(t=t||e.defer(),!n||!n.pubkey)return t.resolve(),t.promise;console.debug("[ES] [message] Loading count...");var a=(new Date).getTime();return function(e){if(!(e=e||(d.isLogin()?d.data.pubkey:e)))throw new Error("no pubkey, and user not connected.");var n={query:{bool:{must:[{term:{recipient:e}},{missing:{field:"read_signature"}}]}}};return c.post("/message/inbox/_count")(n).then((function(e){return e.count}))}(n.pubkey).then((function(e){n.messages=n.messages||{},n.messages.unreadCount=e,console.debug("[ES] [message] Loaded count ("+e+") in "+((new Date).getTime()-a)+"ms"),t.resolve(n)})).catch((function(e){console.error("Error chile counting message: "+(e.message?e.message:e)),t.resolve(n)})),t.promise}function R(e){console.debug("[ES] [message] detected new message (from notification service)");var n=new T(e);n.issuer=n.pubkey,delete n.pubkey,p.extend(n,"issuer").then((function(){d.data.messages=d.data.messages||{},d.data.messages.unreadCount++,h.data.raise.new(n)}))}function I(e,n,t,a){return t=t||"/message/inbox",u.box.record.pack(e,n,a,["title","content"]).then((function(e){return c.record.post(t)(e)}))}function N(n,t){if(n=n||d.data.pubkey,!d.isLogin())return e.when([]);(t=t||{}).type=t.type||"inbox",t.from=t.from||0,t.size=t.size||1e3,t._source=t._source||g.commons;var a={sort:{time:"desc"},from:t.from,size:t.size,_source:t._source};return"inbox"==t.type?a.query={bool:{filter:{term:{recipient:n}}}}:a.query={bool:{filter:{term:{issuer:n}}}},f.postSearchByType(a,{type:t.type}).then((function(e){if(!e||!e.hits||!e.hits.total)return[];var n=e.hits.hits.reduce((function(e,n){var a=n._source||{};return a.id=n._id,a.read="outbox"==t.type||!!a.read_signature,delete a.read_signature,e.concat(a)}),[]);return console.debug("[ES] [message] Loading {0} {1} messages".format(n.length,t.type)),n}))}function S(n,t,a){var i=(new Date).getTime(),s={},r=[u.box.getKeypair(t)];return e.all(n.reduce((function(e,n){return s[n.issuer]?res:e.concat(o.box.keypair.pkFromSignPk(o.util.decode_base58(n.issuer)).then((function(e){s[n.issuer]=e})))}),r)).then((function(t){var i=t[0];return e.all(n.reduce((function(e,n){var t=s[n.issuer],r=o.util.decode_base58(n.nonce);return n.valid=!0,e.concat(o.box.open(n.title,r,t,i.boxSk).then((function(e){n.title=e})).catch((function(e){console.error(e),console.warn("[ES] [message] may have invalid cypher title"),n.valid=!1})),o.box.open(n.content,r,t,i.boxSk).then((function(e){n.content=e,a?function(e){e.content&&(e.summary=e.content.replace(/(^|[\n\r]+)\s*>[^\n\r]*/g,"").trim(),e.summary.length>140&&(e.summary=e.summary.substr(0,137)+"..."))}(n):e&&(n.html=c.util.parseAsHtml(e))})).catch((function(e){console.error(e),console.warn("[ES] [message] may have invalid cypher content"),n.valid=!1})))}),[]))})).then((function(){return console.debug("[ES] [message] All messages decrypted in "+((new Date).getTime()-i)+"ms"),n}))}function A(n){var t=r.developers||[{pubkey:"38MEAZN68Pz1DTvT3tqgxx4yQP6snJCQhPqEFxbDk4aE"}];n&&n.content&&t&&t.length&&(console.info("[ES] [message] Sending logs to developers..."),n.issuer=d.data.pubkey,n.title=n.title||"Sending log",n.time=c.date.now(),d.getKeypair().then((function(a){return e.all(t.reduce((function(e,t){return t.pubkey?e.concat(I(angular.merge({recipient:t.pubkey},n),a)):e}),[]))})).then((function(e){console.info("[ES] [message] Logs sent to {0} developers".format(e.length))})))}function D(){var e=c.alive;!e&&E&&E.length>0?(console.debug("[ES] [message] Disable"),_.forEach(E,(function(e){e()})),E=[],d.isLogin()&&v(d.data)):!e||E&&0!==E.length||(console.debug("[ES] [message] Enable"),function(){E=[d.api.data.on.login(n,O,this),d.api.data.on.init(n,b,this),d.api.data.on.reset(n,v,this),m.api.event.on.newMessage(n,R,this),d.api.error.on.send(n,A,this)]}(),d.isLogin()&&O(d.data))}return h.registerEvent("data","new"),h.registerEvent("data","delete"),h.registerEvent("data","sent"),s.ready().then((function(){return c.api.node.on.start(n,D,this),c.api.node.on.stop(n,D,this),D()})),{api:h,search:f.postSearch,notifications:{load:function(n){if(!d.isLogin())return e.when([]);(n=n||{}).from=n.from||0,n.size=n.size||10;var t={sort:{time:"desc"},query:{bool:{filter:{term:{recipient:d.data.pubkey}}}},from:n.from,size:n.size,_source:g.notifications};return f.postSearch(t).then((function(e){if(!e||!e.hits||!e.hits.total)return[];var n=e.hits.hits.reduce((function(e,n){var t=n._source;return t.id=n._id,t.read=!!t.read_signature,delete t.read_signature,e.concat(t)}),[]);return p.extendAll(n,"issuer")}))}},load:function(n){return d.isLogin()?((n=n||{}).type=n.type||"inbox",n._source=g.commons,n.summary=!angular.isDefined(n.summary)||n.summary,N(d.data.pubkey,n).then((function(e){return S(e,d.data.keypair,n.summary)})).then((function(e){var t="inbox"==n.type?"issuer":"recipient";return p.extendAll(e,t)})).then((function(e){return d.data.messages=d.data.messages||{},d.data.messages.count=e.length,e}))):e.when([])},get:function(e,n){return(n=n||{}).type=n.type||"inbox",n.summary=!!angular.isDefined(n.summary)&&n.summary,f.getByTypeAndId({id:e,type:n.type}).then((function(e){if(e.found){var t=e._source;return t.id=e._id,t.read="outbox"==n.type||!!t.read_signature,delete t.read_signature,S([t],d.data.keypair,n.summary).then((function(){var e="inbox"==n.type?"issuer":"recipient";return p.extend(t,e)}))}}))},send:function(e){return d.getKeypair().then((function(n){return I(e,n).then((function(t){return l.data.plugins.es.message&&angular.isDefined(l.data.plugins.es.message.outbox)&&!l.data.plugins.es.message.outbox?t:I(e,n,"/message/outbox","issuer").catch((function(e){return console.error("Failed to store message to outbox: "+e),t}))})).then((function(e){return h.data.raise.sent(e),e}))}))},remove:function(e,n){return n=n||"inbox",c.record.remove("message",n)(e).then((function(t){return"inbox"==n&&(d.data.messages=d.data.messages||{},d.data.messages.count=d.data.messages.count>0?d.data.messages.count-1:0),h.data.raise.delete(e),t}))},removeAll:function(n){return n=n||"inbox",N(d.data.pubkey,{type:n,from:0,size:1e3,_source:!1}).then((function(t){if(t&&t.length){var a=_.pluck(t,"id");return e.all(t.reduce((function(e,t){return e.concat(c.record.remove("message",n)(t.id))}),[])).then((function(){return a}))}})).then((function(e){"inbox"==n&&(d.data.messages=d.data.messages||{},d.data.messages.count=0,d.data.messages.unreadCount=0),_.forEach(e,h.data.raise.delete)}))},markAsRead:function(n,t){if(t=t||"inbox",n.read){var a=e.defer();return a.resolve(),a.promise}return n.read=!0,d.getKeypair().then((function(e){return o.sign(n.hash,e)})).then((function(e){return f.postReadById(e,{id:n.id})})).then((function(){"inbox"==t&&(d.data.messages=d.data.messages||{},d.data.messages.unreadCount=d.data.messages.unreadCount?d.data.messages.unreadCount-1:0)}))},markAllAsRead:function(){return N(d.data.pubkey,{type:"inbox",from:0,size:1e3,_source:["hash","read_signature"]}).then((function(n){if(n&&n.length)return n=_.filter(n,{read:!1}),e.all(n.reduce((function(e,n){return e.concat(o.sign(n.hash,d.data.keypair).then((function(e){return f.postReadById(e,{id:n.id})})))}),[]))})).then((function(){d.data.messages=d.data.messages||{},d.data.messages.unreadCount=0}))},fields:{commons:g.commons}}}]),angular.module("cesium.es.modal.services",["cesium.modal.services","cesium.es.message.services"]).factory("esModals",["$state","ModalUtils","UIUtils","csWallet",function(e,n,t,a){function i(){if(a.data.notifications.unreadCount=0,a.data.notifications&&a.data.notifications.history.length){var e=a.data.notifications.history[0],n=e?e.time:0;csSettings.data.wallet=csSettings.data.wallet||{},n&&csSettings.data.wallet.notificationReadTime!=n&&(csSettings.data.wallet.notificationReadTime=n,csSettings.store())}}return{showMessageCompose:function(e){return n.show("plugins/es/templates/message/modal_compose.html","ESMessageComposeModalCtrl",e,{focusFirstInput:!0})},showNotifications:function(n,a){return t.popover.show(a,{templateUrl:"plugins/es/templates/common/popover_notification.html",scope:n,autoremove:!1,afterHidden:i}).then((function(n){n&&(n.onRead&&"function"==typeof n.onRead&&n.onRead(),n.state&&e.go(n.state,n.stateParams))}))},showNewInvitation:function(e){return n.show("plugins/es/templates/invitation/modal_new_invitation.html","ESNewInvitationModalCtrl",e)},showNewPage:function(t){return n.show("plugins/es/templates/registry/modal_record_type.html",void 0,{title:"REGISTRY.EDIT.TITLE_NEW"}).then((function(n){n&&e.go("app.registry_add_record",{type:n})}))},showNetworkLookup:function(e){return n.show("plugins/es/templates/network/modal_network.html","ESNetworkLookupModalCtrl",e,{focusFirstInput:!1})}}}]),angular.module("cesium.es.wallet.services",["ngResource","cesium.platform","cesium.es.http.services","cesium.es.crypto.services"]).factory("esWallet",["$q","$rootScope","$timeout","CryptoUtils","csPlatform","csWallet","esCrypto","esProfile","esHttp",function(e,n,t,a,i,o,s,r,l){var c;function d(e){e.avatar=null,e.profile=null,e.name=null,o.events.cleanByContext("esWallet"),e.keypair&&(delete e.keypair.boxSk,delete e.keypair.boxPk)}function u(n,i){if(i=i||e.defer(),!n||!n.pubkey||!n.keypair)return i.resolve(),i.promise;if(!a.isLoaded())return console.debug("[ES] [wallet] Waiting crypto lib loading..."),t((function(){return u(n,i)}),50);console.debug("[ES] [wallet] Loading user avatar+name...");var o=Date.now();return r.getAvatarAndName(n.pubkey).then((function(e){e?(n.name=e.name,n.avatarStyle=e.avatarStyle,n.avatar=e.avatar,console.debug("[ES] [wallet] Loaded user avatar+name in "+(Date.now()-o)+"ms")):console.debug("[ES] [wallet] No user avatar+name found"),i.resolve(n)})).catch((function(e){i.reject(e)})),i.promise}function p(n,t){t=t||e.defer(),o.events.cleanByContext("esWallet"),console.debug("[ES] [wallet] Loading full user profile...");var a=Date.now();return r.get(n.pubkey).then((function(e){e&&(n.name=e.name,n.avatar=e.avatar,n.profile=e.source,n.profile.description=e.description,console.debug("[ES] [wallet] Loaded full user profile in "+(Date.now()-a)+"ms")),t.resolve()})).catch(t.reject),t.promise}function m(){if(!o.isLogin())throw new Error("Unable to get box keypair: user not connected !");var n=o.data.keypair;return n&&n.boxPk&&n.boxSk?e.when(n):s.box.getKeypair(n).then((function(e){return o.data.keypair.boxSk=e.boxSk,o.data.keypair.boxPk=e.boxPk,console.debug("[ES] [wallet] Secret box keypair successfully computed"),o.data.keypair}))}function E(){var e=l.alive;if(!e&&c&&c.length>0){if(console.debug("[ES] [wallet] Disable"),_.forEach(c,(function(e){e()})),c=[],o.isLogin())return d(o.data)}else if(e&&(!c||0===c.length)&&(console.debug("[ES] [wallet] Enable"),function(){c=[o.api.data.on.login(n,u,this),o.api.data.on.finishLoad(n,p,this),o.api.data.on.init(n,d,this),o.api.data.on.reset(n,d,this)]}(),o.isLogin()))return u(o.data)}return i.ready().then((function(){return l.api.node.on.start(n,E,this),l.api.node.on.stop(n,E,this),E()})),this.box={getKeypair:m,record:{pack:function(e,n,t,a,i){return m().then((function(n){return s.box.pack(e,n,t,a,i)}))},open:function(e,n,t,a){return m().then((function(n){return s.box.open(e,n,t,a)}))}}},this}]),angular.module("cesium.es.geo.services",["cesium.services","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&e.registerEagerLoadingService("esGeo")}]).factory("esGeo",["$rootScope","$q","csConfig","csSettings","csHttp",function(e,n,t,a,i){var o=this;function s(e){return o.raw.google.search({address:e,key:o.raw.google.apiKey}).then((function(e){if(e&&e.results&&e.results.length)return e.results.reduce((function(e,n){return e.concat({display_name:n.address_components&&n.address_components.reduce((function(e,n){return n.long_name?e.concat(n.long_name):e}),[]).join(", "),lat:n.geometry&&n.geometry.location&&n.geometry.location.lat,lon:n.geometry&&n.geometry.location&&n.geometry.location.lng})}),[])}))}o.raw={osm:{search:i.get("nominatim.openstreetmap.org",443,"/search.php?format=json"),license:{name:"OpenStreetMap",url:"https://www.openstreetmap.org/copyright"}},google:{apiKey:void 0,search:i.get("maps.google.com",443,"/maps/api/geocode/json")},searchByIP:i.get("freegeoip.net",443,"/json/:ip")},o.raw.google.apiKey=t.plugins&&t.plugins.es&&t.plugins.es.googleApiKey;var r=!!o.raw.google.apiKey;return a.ready().then((function(){function n(e){r||(o.raw.google.apiKey=e.plugins.es.googleApiKey),o.raw.google.enable=o.raw.google.apiKey&&e.plugins&&e.plugins.es&&e.plugins.es.enableGoogleApi}a.api.data.on.changed(e,n,this),n(a.data)})),{point:{current:function(){return navigator.geolocation?n((function(e,n){console.debug("[ES] [geo] Getting current GPS position..."),navigator.geolocation.getCurrentPosition((function(t){if(!t||!t.coords)return console.error("[ES] [geo] navigator geolocation > Unknown format:",t),void n({message:"navigator geolocation > Unknown format"});e({lat:t.coords.latitude,lon:t.coords.longitude})}),(function(e){n(e)}),{timeout:5e3})})):n.reject()},searchByAddress:function(e){"string"==typeof e&&(e={q:e}),e.q&&(e.q=e.q.trim().replace(/\n/g,",").replace(/(?:^|[\t\n\r\s ])([AZ09-]+)(?:$|[\t\n\r\s ])/g,"").replace(/,[ ,]+/g,", ")),e.addressdetails=1;var n=new Date;return o.raw.osm.search(e).then((function(e){if(e)return e=e.reduce((function(e,n){return"waterway"!=n.class&&"railway"!=n.class&&n.address?(n.address.city=n.address.city||n.address.village||n.address.town||n.address.postcode,n.address.road=n.address.road||n.address.suburb||n.address.hamlet,n.address.postcode&&n.address.city==n.address.postcode&&delete n.address.postcode,n.address.city?e.concat({id:n.place_id,name:n.display_name,address:n.address,lat:n.lat,lon:n.lon,class:n.class,license:o.raw.osm.license}):e):e}),[]),console.debug("[ES] [geo] Found {0} address position(s)".format(e&&e.length||0,(new Date).getTime()-n.getTime()),e),e.length?e:void 0})).catch((function(n){return t=n,a=e.q?e.q:(e.street?e.street+", ":"")+e.city+(e.country?", "+e.country:""),console.debug("[ES] [geo] Search position failed on [OSM]. Trying [google] service"),s(a).catch((function(e){throw console.debug("[ES] [geo] Search position failed on [google] service"),t||e}));var t,a}))},searchByIP:function(e){return o.raw.searchByIP({ip:e}).then((function(e){return e?{lat:e.latitude,lng:e.longitude}:void 0}))},distance:function(e,n,t,a,i){var o=Math.PI*e/180,s=Math.PI*t/180,r=n-a,l=Math.PI*r/180,c=Math.sin(o)*Math.sin(s)+Math.cos(o)*Math.cos(s)*Math.cos(l);return c=60*(c=180*(c=Math.acos(c))/Math.PI)*1.1515,"km"==i?1.609344*c:"N"==i?.8684*c:c}},google:{isEnable:function(){return o.raw.google.enable&&o.raw.google.apiKey},searchByAddress:s}}}]),angular.module("cesium.es.subscription.services",["cesium.platform","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&e.registerEagerLoadingService("esSubscription")}]).factory("esSubscription",["$rootScope","$q","$timeout","esHttp","$state","$sce","$sanitize","esSettings","CryptoUtils","UIUtils","csWallet","csWot","BMA","csPlatform","esWallet",function(e,n,t,a,i,o,s,r,l,c,d,u,p,m,E){var g,f=this;function h(e){e.subscriptions=null}function T(e,t,a){return a=a||n.defer(),e&&e.pubkey&&e.keypair?(console.debug("[ES] [subscription] Loading subscriptions count..."),f.raw.count({pubkey:e.pubkey}).then((function(n){e.subscriptions=e.subscriptions||{},e.subscriptions.count=n&&n.hits&&n.hits.total,console.debug("[ES] [subscription] Loaded count ("+e.subscriptions.count+")"),a.resolve(e)})).catch((function(n){console.error("[ES] [subscription] Error while counting subscription: "+(n.message?n.message:n)),a.resolve(e)})),a.promise):(a.resolve(),a.promise)}function b(){var n=a.alive;if(!n&&g&&g.length>0){if(console.debug("[ES] [subscription] Disable"),_.forEach(g,(function(e){e()})),g=[],d.isLogin())return h(d.data)}else if(n&&(!g||0===g.length)&&(console.debug("[ES] [subscription] Enable"),function(){g=[d.api.data.on.load(e,T,this),d.api.data.on.init(e,h,this),d.api.data.on.reset(e,h,this)]}(),d.isLogin()))return T(d.data)}return f.raw={getAll:a.get("/subscription/record/_search?_source_excludes=recipientContent&q=issuer::issuer"),count:a.get("/subscription/record/_search?size=0&q=issuer::pubkey"),add:a.record.post("/subscription/record"),update:a.record.post("/subscription/record/:id/_update"),category:{get:a.get("/subscription/category/:id"),all:a.get("/subscription/category/_search?sort=order&from=0&size=1000&_source=name,parent,key")}},m.ready().then((function(){return a.api.node.on.start(e,b,this),a.api.node.on.stop(e,b,this),b()})),f.record={load:function(e,n){return f.raw.getAll({issuer:e}).then((function(e){var t=e&&e.hits&&e.hits.total&&e.hits.hits.reduce((function(e,n){var t=n._source;return t.id=n._id,e.concat(t)}),[])||[];return E.box.record.open(t,n,"issuer","issuerContent").then((function(e){return _.forEach(e,(function(e){e.content=JSON.parse(e.issuerContent||"{}"),delete e.issuerContent,delete e.recipientContent})),e}))}))},add:function(e){if(!(e&&e.type&&e.content&&e.recipient))return n.reject("Missing arguments 'record' or 'record.type' or 'record.content' or 'record.recipient'");var t=d.data.pubkey,a=JSON.stringify(e.content);return l.util.random_nonce().then((function(i){return n.all([E.box.record.pack({issuer:t,issuerContent:a},d.data.keypair,"issuer","issuerContent",i),E.box.record.pack({recipient:e.recipient,recipientContent:a},d.data.keypair,"recipient","recipientContent",i)])})).then((function(n){var t=angular.merge(n[0],n[1]);return t.type=e.type,f.raw.add(t).then((function(n){return e.id=n,e}))}))},update:function(e){if(!e||!e.content||!e.recipient)return n.reject("Missing arguments 'record' or 'record.content', or 'record.recipient'");var t=d.data.pubkey,a=JSON.stringify(e.content);return l.util.random_nonce().then((function(i){return n.all([E.box.record.pack({issuer:t,issuerContent:a},d.data.keypair,"issuer","issuerContent",i),E.box.record.pack({recipient:e.recipient,recipientContent:a},d.data.keypair,"recipient","recipientContent",i)])})).then((function(n){var t=angular.merge(n[0],n[1]);return t.type=e.type,f.raw.update(t,{id:e.id}).then((function(){return e}))}))},remove:a.record.remove("subscription","record")},f.category={all:function(){if(f.raw.categories&&f.raw.categories.length){var e=n.defer();return e.resolve(f.raw.categories),e.promise}return f.raw.category.all().then((function(e){if(0===e.hits.total)f.raw.categories=[];else{var n=e.hits.hits.reduce((function(e,n){var t=n._source;return t.id=n._id,e.concat(t)}),[]);_.forEach(n,(function(e){n[e.id]=e})),f.raw.categories=n}return f.raw.categories}))},get:function(e){return f.raw.category.get(e).then((function(e){var n=e._source;return n.id=e._id,n}))}},f.constants={},f}]),angular.module("cesium.es.document.services",["ngResource","cesium.platform","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&e.registerEagerLoadingService("esDocument")}]).factory("esDocument",["$q","$rootScope","$timeout","UIUtils","Api","CryptoUtils","csPlatform","csConfig","csSettings","csWot","csWallet","esHttp",function(e,n,t,a,i,o,s,r,l,c,d,u){var p={commons:["issuer","pubkey","hash","time","recipient","nonce","read_signature"],peer:["*"],movement:["*"]},m={search:u.post("/:index/:type/_search"),searchText:u.get("/:index/:type/_search?q=:text&_source=:source")};function E(e){if(!e||!e.index||!e.type)throw new Error("Missing mandatory options [index, type]");var n="desc";return"peer"==e.type?(e.sort&&!e.sort.time||(n=e.sort&&e.sort.time||n,e.sort={"stats.medianTime":{nested_path:"stats",order:n}}),e._source=p.peer,e.getTimeFunction=function(e){return e.time=e.stats&&e.stats.medianTime,e.time}):"movement"==e.type&&(e.sort&&!e.sort.time||(n=e.sort&&e.sort.time||n,e.sort={medianTime:n}),e._source=e._source||p.movement,e.getTimeFunction=function(e){return e.time=e.medianTime,e.time}),e}function g(e,n){n.issuerField=n.issuerField||"pubkey";var t=(e&&e.hits&&e.hits.hits||[]).reduce((function(e,t){var a=t._source||{};return a.index=t._index,a.type=t._type,a.id=t._id,a.pubkey=a.issuer||n.issuerField&&a[n.issuerField]||a.pubkey,a.time=n.getTimeFunction&&n.getTimeFunction(a)||a.time,a.thumbnail=u.image.fromHit(t,"thumbnail"),e.concat(a)}),[]),a=t.reduce((function(e,n){return n.recipient?(n.recipient={pubkey:n.recipient},e.concat(n.recipient)):e}),[]);return c.extendAll(t.concat(a)).then((function(){return{hits:t,took:e.took,total:e&&e.hits&&e.hits.total||0}}))}return{search:function(e){var n={from:(e=E(e)).from||0,size:e.size||40,sort:e.sort||{time:"desc"},_source:e._source||p.commons};return e.query&&(n.query=e.query),m.search(n,{index:e.index,type:e.type}).then((function(n){return g(n,e)}))},searchText:function(e,n){var t={text:e,index:(n=n||{}).index||"user",type:n.type||"event",from:n.from||0,size:n.size||40,sort:n.sort||"time:desc",source:n._source&&n._source.join(",")||p.commons.join(",")};console.debug("[ES] [wallet] [document] [{0}/{1}] Loading documents...".format(n.index,n.type));var a=Date.now();return m.searchText(t).then((function(e){return g(e,n)})).then((function(e){return console.debug("[ES] [document] [{0}/{1}] Loading {2} documents in {3}ms".format(n.index,n.type,e&&e.hits&&e.hits.length||0,Date.now()-a)),e}))},remove:function(n,t){return n&&n.index&&n.type&&n.id?d.isLogin()?u.record.remove(n.index,n.type)(n.id,t):e.reject("User not login"):e.reject("Could not remove document: missing mandatory fields")},removeAll:function(n,t){return n&&n.length?d.isLogin()?e.all(n.reduce((function(e,n){return e.concat(u.record.remove(n.index,n.type)(n.id))}),[])):e.reject("User not login"):e.when()},fields:{commons:p.commons},fromHit:function(e){return g({hits:{hits:[e]}},E({index:e._index,type:e._type})).then((function(e){return e.hits[0]}))}}}]),angular.module("cesium.es.network.services",["ngApi","cesium.es.http.services"]).factory("esNetwork",["$rootScope","$q","$interval","$timeout","$window","csSettings","csConfig","esHttp","Api","BMA",function(e,n,t,a,i,o,s,r,l,c){factory=function(e){var d,u="https:"===i.location.protocol,p=new l(this,"csNetwork-"+e),m={pod:null,listeners:[],loading:!0,peers:[],filter:{endpointFilter:null,online:!0,ssl:void 0,tor:void 0},sort:{type:null,asc:!0},expertMode:!1,knownBlocks:[],mainBlock:null,searchingPeersOnNetwork:!1,timeout:s.timeout},E=function(e){return e&&[e.number,e.hash].join("-")},g=function(){m.peers=[],m.searchingPeersOnNetwork=!0,m.loading=!0,m.pod=m.pod||r;var e=[];return d&&t.cancel(d),d=t((function(){e.length?v(e):m.loading&&!m.searchingPeersOnNetwork&&(m.loading=!1,t.cancel(d),R(!0),console.debug("[network] Finish: {0} peers found.".format(m.peers.length)))}),1e3),n.when().then((function(){return m.filter.online?m.pod.network.peers().then((function(t){var a=[];if(_.forEach(t.peers,(function(n){"UP"==n.status&&a.push(f(n,e))})),a.length)return n.all(a)})).catch((function(e){console.error(e)})):m.pod.network.peers().then((function(t){var a=[];if(_.forEach(t.peers,(function(n){"UP"!==n.status&&a.push(f(n,e))})),a.length)return n.all(a)}))})).then((function(){m.searchingPeersOnNetwork=!1})).catch((function(e){console.error(e),m.searchingPeersOnNetwork=!1}))},f=function(e,t){t=t||m.newPeers;var a=T(e),i=!1,o=a.reduce((function(e,n){var a=_.findWhere(m.peers,{id:n.id}),o=a?a.buid:null,s=!!a&&a.online;return e.concat(b(n).then((function(e){a?!e||e.online!==m.filter.online&&"all"!==m.filter.online?(console.debug("[network] Peer [{0}] removed (cause: {1})".format(n.server,e?e.online?"UP":"DOWN":"filtered")),m.peers.splice(m.peers.indexOf(a),1),i=!0):e.buid!==o?(console.debug("[network] {0} endpoint [{1}] new current block".format(e.ep&&(e.ep.useBma?"BMA":"WS2P")||"null",e.server)),i=!0):s!==e.online?(console.debug("[network] {0} endpoint [{1}] is now {2}".format(e.ep&&(e.ep.useBma?"BMA":"WS2P")||"null",e.server,e.online?"UP":"DOWN")),i=!0):console.debug("[network] {0} endpoint [{1}] unchanged".format(e.ep&&(e.ep.useBma?"BMA":"WS2P")||"null",e.server)):!e||e.online!==m.filter.online&&"all"!==m.filter.online||(console.debug("[network] {0} endpoint [{1}] is {2}".format(e.ep&&e.ep.api||"",e.server,e.online?"UP":"DOWN")),t.push(e),i=!0)})))}),[]);return(1===o.length?o[0]:n.all(o)).then((function(){return i}))},T=function(e,n){if(!e)return[];var t=new h(e);if(!n){var a=t.getEndpoints();if(!a)return[];var i=a.reduce((function(e,n){var t=r.node.parseEndPoint(n);return t?e.concat(t):e}),[]);if(i.length>1)return i.reduce((function(n,t){return n.concat(T(e,t))}),[]);n=i[0]}return t.ep=n,t.server=t.getServer(),t.dns=t.getDns(),t.blockNumber=t.block&&t.block.replace(/-.+$/,""),t.id=t.keyID(),[t]},b=function(e){return function(e){return!(m.filter&&(m.filter.endpointFilter&&(e.ep&&e.ep.api&&e.ep.api!==m.filter.endpointFilter||!e.hasEndpoint(m.filter.endpointFilter))||!m.filter.online&&"UP"===e.status||angular.isDefined(m.filter.ssl)&&e.isSsl()!=m.filter.ssl||angular.isDefined(m.filter.tor)&&e.isTor()!=m.filter.tor))}(e)?!m.filter.online||"all"===m.filter.online&&"DOWN"===e.status||!e.getHost()?(e.online=!1,n.when(e)):u&&!e.isSsl()?(e.online="UP"===e.status,e.buid=-1,delete e.version,n.when(e)):e.ep.useTor?(e.online="UP"==e.status,e.buid=-1,delete e.software,delete e.version,n.when(e)):(e.api=e.api||r.lightInstance(e.getHost(),e.getPort(),e.isSsl(),m.timeout),e.api.blockchain.current().then((function(n){return e.currentNumber=n.number,e.online=!0,e.buid=E(n),e.medianTime=n.medianTime,-1===m.knownBlocks.indexOf(e.buid)&&m.knownBlocks.push(e.buid),e})).catch((function(n){if(n&&n.ucode==c.errorCodes.NO_CURRENT_BLOCK)return e.online=!0,e.buid=E({number:0,hash:c.constants.ROOT_BLOCK_HASH}),e.difficulty=0,e;if(!e.secondTry){var t=e.ep||e.getEP();if(t.dns&&-1==e.server.indexOf(t.dns))return e.secondTry=!0,e.api=r.lightInstance(t.dns,t.port,t.useSsl),b(e)}return e.online=!1,e.currentNumber=null,e.buid=null,e})).then((function(e){return m.filter.online&&e&&e.online?(e.docCount={},n.all([m.expertMode?e.api.node.summary().then((function(n){e.software=n&&n.duniter&&n.duniter.software||void 0,e.version=n&&n.duniter&&n.duniter.version||"?"})).catch((function(){e.software=void 0,e.version="?"})):n.when(),e.api.record.count(m.document.index,m.document.type).then((function(n){e.docCount.record=n})).catch((function(){e.docCount.record=void 0})),e.api.subscription.count({recipient:e.pubkey,type:"email"}).then((function(n){e.docCount.emailSubscription=n})).catch((function(){e.docCount.emailSubscription=void 0}))])):e})).then((function(){return delete e.api,e}))):n.when()},v=function(e,n){if((e=e||m.newPeers).length){var t=_.map(m.peers,(function(e){return e.id})),a=!1,i=0;_.forEach(e.splice(0),(function(e){t[e.id]||(m.peers.push(e),t[e.id]=e,a=!0,i++)})),a&&(console.debug("[network] Flushing {0} new peers...".format(i)),R(n))}},O=function(e,n,t){if(!e)return 0;var a=0;n>(e=e.toLowerCase()).length&&(n=e.length),a+=e.charCodeAt(0);for(var i=1;i<n;i++)a+=Math.pow(.001,i)*e.charCodeAt(i);return t?1e3-a:a},R=function(e){var n={};_.forEach(m.peers,(function(e){if(e.buid){var t=n[e.buid];t&&t.medianTime?!t.medianTime&&e.medianTime&&(t.medianTime=e.medianTime):(t={buid:e.buid,count:0,medianTime:e.medianTime},n[e.buid]=t),-1!=t.buid&&t.count++}})),_.forEach(_.values(n),(function(e){e.pct=100*e.count/m.peers.length}));var t=_.max(n,(function(e){return e.count}));_.forEach(m.peers,(function(e){e.hasMainConsensusBlock=e.buid==t.buid,e.hasConsensusBlock=e.buid&&!e.hasMainConsensusBlock&&n[e.buid].count>1,e.hasConsensusBlock&&(e.consensusBlockDelta=n[e.buid].medianTime-t.medianTime)})),m.peers=_.uniq(m.peers,!1,(function(e){return e.id})),m.peers=_.sortBy(m.peers,(function(e){var t=0;if(m.sort.type){var a=0;a+="name"==m.sort.type?O(e.name,10,m.sort.asc):0,a+="software"==m.sort.type?O(e.software,10,m.sort.asc):0,a+="api"==m.sort.type&&(e.hasEndpoint("GCHANGE_SUBSCRIPTION_API")&&(m.sort.asc?1:-1)||0)+(e.hasEndpoint("GCHANGE_API")&&(m.sort.asc?.01:-.01)||0)+(e.isSsl()&&(m.sort.asc?.75:-.75)||0)||0,t+=1e10*(a+="doc_count"==m.sort.type&&e.docCount?m.sort.asc?1e9-e.docCount:e.docCount:0)}return t+=1e9*(e.online?1:0),t+=1e8*(e.hasMainConsensusBlock?1:0),t+=1e6*(e.hasConsensusBlock?n[e.buid].pct:0),m.expertMode?(t+=100*(e.difficulty?1e4-e.difficulty:0),t+=1*(e.uid?O(e.uid,2,!0):0)):(t+=100*(e.uid?O(e.uid,2,!0):0),t+=1*(e.uid?0:O(e.pubkey,2,!0))),-t})),!e||!t.buid||m.mainBlock&&m.mainBlock.buid===t.buid||(m.mainBlock=t,p.data.raise.mainBlockChanged(t)),p.data.raise.changed(m)},I=function(e,n){return n=n||{},r.ready().then((function(){N(),m.pod=e||r,m.filter=n.filter?angular.merge(m.filter,n.filter):m.filter,m.sort=n.sort?angular.merge(m.sort,n.sort):m.sort,m.expertMode=angular.isDefined(n.expertMode)?n.expertMode:m.expertMode,m.timeout=angular.isDefined(n.timeout)?n.timeout:s.timeout,console.info("[network] Starting network from [{0}]".format(m.pod.server));var t=Date.now();return m.listeners=[m.pod.websocket.block().onListener((function(e){if(e&&!m.loading){var n=[e.number,e.hash].join("-");-1===m.knownBlocks.indexOf(n)&&(console.debug("[network] Receiving block: "+n.substring(0,20)),m.knownBlocks.push(n),1===m.knownBlocks.length||(m.loading=!0,a((function(){console.debug("[network] new block received by WS: will refresh peers"),g()}),2e3,!1)))}})),m.pod.websocket.peer().onListener((function(e){if(e&&!m.loading){var n=[];f(e,n).then((function(e){e&&(n.length>0?v(n,!0):(console.debug("[network] [ws] Peers updated received"),R(!0)))}))}}))],g().then((function(e){return console.debug("[network] Started in "+(Date.now()-t)+"ms"),e}))}))},N=function(){m.pod&&(console.info("[network-service] Stopping..."),_.forEach(m.listeners,(function(e){e()})),m.listeners=[]),m.pod=null,m.listeners=[],m.peers.splice(0),m.filter={endpointFilter:null,online:!0},m.sort={type:null,asc:!0},m.expertMode=!1,m.knownBlocks=[],m.mainBlock=null,m.loading=!0,m.searchingPeersOnNetwork=!1,m.timeout=s.timeout,m.document={index:o.data.plugins.es&&o.data.plugins.es.document&&o.data.plugins.es.document.index||"user",type:o.data.plugins.es&&o.data.plugins.es.document&&o.data.plugins.es.document.type||"profile"}},S=function(e){return m.pod?I().then((function(){return n(e)})):n(e)};return p.registerEvent("data","changed"),p.registerEvent("data","mainBlockChanged"),p.registerEvent("data","rollback"),{id:e,data:m,start:I,close:N,hasPeers:function(){return m.peers&&m.peers.length>0},getPeers:function(){return m.peers},sort:function(e){e=e||{},m.filter=e.filter?angular.merge(m.filter,e.filter):m.filter,m.sort=e.sort?angular.merge(m.sort,e.sort):m.sort,R(!1)},getTrustedPeers:function(){return S((function(e,n){e(m.peers.reduce((function(e,n){return n.hasMainConsensusBlock&&n.uid?e.concat(n):e}),[]))}))},getKnownBlocks:function(){return m.knownBlocks},getMainBlockUid:function(){return S((function(e,n){e(m.mainBuid)}))},loadPeers:g,isBusy:function(){return m.loading},api:p}};var d=factory("default");return d.instance=factory,d}]),angular.module("cesium.es.like.services",["ngResource","ngApi","cesium.services","cesium.config","cesium.es.http.services"]).factory("esLike",["$q","$timeout","$rootScope","$state","$sce","$translate","$window","$filter","CryptoUtils","UIUtils","csWallet","esHttp",function(e,n,t,a,i,o,s,r,l,c,d,u){return{constants:{KINDS:["VIEW","LIKE","DISLIKE","FOLLOW","ABUSE","STAR"]},instance:function(n,t){var a={postSearch:u.post("/like/record/_search"),getSearch:u.get("/like/record/_search?_source=false&q=:q"),add:u.record.post("/{0}/{1}/:id/_like".format(n,t)),remove:u.record.remove("like","record")};function i(i,o){if((o=o||{}).kind=o.kind&&o.kind.toUpperCase()||"LIKE",!d.isLogin())return e.reject("Wallet must be login before sending record to ES node");var s={version:2,index:n,type:t,id:i,kind:o.kind};return o.comment&&(s.comment=o.comment),angular.isDefined(o.level)&&(s.level=o.level),a.add(s)}return{toggle:function(o,s){return(s=s||{}).kind=s.kind||"LIKE",d.isLogin()?function(e,i){(i=i||{}).kind=i.kind||"LIKE";var o="index:{0} AND type:{1} AND id:{2}".format(n,t,e);return i.kind&&(o+=" AND kind:"+i.kind.toUpperCase()),i.issuer&&(o+=" AND issuer:"+i.issuer),a.getSearch({q:o}).then((function(e){return(e&&e.hits&&e.hits.hits||[]).map((function(e){return e._id}))}))}(o,{kind:s.kind,issuer:d.data.pubkey}).then((function(n){return n&&n.length?e.all(_.map(n,(function(e){return a.remove(e)}))).then((function(){return-1*n.length})):i(o,s).then((function(){return 1}))})):e.reject("Wallet must be login before sending record to ES node")},load:function(e){var i=[{term:{index:n}},{term:{type:t}}],o={query:{bool:{filter:i}},from:(e=e||{}).from||0,size:e.size||20,_source:e._source||["id","kind","time","level","issuer"]};return e.kinds?i.push({terms:{kind:_.map(e.kinds,(function(e){return e.toUpperCase()}))}}):e.kind&&i.push({term:{kind:e.kind.toUpperCase()}}),e.issuer&&i.push({term:{issuer:e.issuer}}),a.postSearch(o).then((function(e){if(e&&e.hits)return{total:e.hits.total||0,hits:_.pluck(e.hits.hits||[],"_source")}}))},add:i,remove:function(e){if(!e)throw new Error("Missing 'id' argument !");return a.remove(e)},count:function(e,i){(i=i||{}).kind=i.kind&&i.kind.toUpperCase()||"LIKE",i.level=angular.isDefined(i.level)?i.level:"STAR"===i.kind;var o={query:{bool:{filter:[{term:{index:n}},{term:{type:t}},{term:{id:e}},{term:{kind:i.kind.toUpperCase()}}]}},size:0};return i.issuer&&(o.query.bool.should={term:{issuer:i.issuer}},o.size=1,o._source=["issuer"]),i.level&&(o.aggs={level_sum:{sum:{field:"level"}}},o._source=o._source||[],o._source.push("level")),a.postSearch(o).then((function(e){var n=e&&e.hits,t=n&&i.issuer?_.findIndex(n.hits,(function(e){return e._source.issuer===i.issuer})):-1,a={total:n&&n.total||0,wasHit:-1!==t||!1,wasHitId:-1!==t&&n.hits[t]._id||!1};return i.level&&(a.level=-1!==t?n.hits[t]._source.level:void 0,a.levelSum=e.aggregations&&e.aggregations.level_sum.value||0,a.levelAvg=a.total&&Math.floor(10*(a.levelSum/a.total+.5))/10-.5||0),a}))}}}}}]),v.$inject=["$scope","UIUtils","$q","Device"],I.$inject=["$scope","$focus","$filter","UIUtils","SocialUtils"],N.$inject=["$scope"],R.$inject=["$scope","$filter","$state","$focus","$timeout","$anchorScroll","UIUtils"],O.$inject=["$scope","UIUtils","$timeout","parameters"],S.$inject=["$scope","$sce"],A.$inject=["$scope","csConfig","esGeo","ModalUtils"],D.$inject=["$scope","$q","csConfig","esGeo","ModalUtils"],C.$inject=["$scope","$timeout","UIUtils","ModalUtils","csConfig","esGeo"],P.$inject=["$scope","$q","$translate","esGeo","parameters"],angular.module("cesium.es.common.controllers",["ngResource","cesium.es.services"]).controller("ESPicturesEditCtrl",v).controller("ESPicturesEditCtrl",v).controller("ESSocialsEditCtrl",I).controller("ESSocialsViewCtrl",N).controller("ESCommentsCtrl",R).controller("ESCategoryModalCtrl",O).controller("ESAvatarModalCtrl",S).controller("ESPositionEditCtrl",A).controller("ESLookupPositionCtrl",D).controller("ESSearchPositionItemCtrl",C).controller("ESSearchPositionModalCtrl",P),y.$inject=["$scope","$q","$timeout","$translate","$ionicPopup","UIUtils","csWallet","esHttp","esLike"],angular.module("cesium.es.like.controllers",["ngResource","cesium.es.services"]).controller("ESLikesCtrl",y),k.$inject=["$scope","esSettings","PluginService"],M.$inject=["$scope","esSettings","PluginService"],w.$inject=["$scope","$state","PluginService","esSettings","UIUtils"],U.$inject=["$scope","$state","csSettings","csWallet"],angular.module("cesium.es.app.controllers",["ngResource","cesium.es.services"]).config(["PluginServiceProvider",function(e){e.extendState("app",{points:{"nav-buttons-right":{templateUrl:"plugins/es/templates/menu_extend.html",controller:"ESMenuExtendCtrl"},"menu-discover":{templateUrl:"plugins/es/templates/menu_extend.html",controller:"ESMenuExtendCtrl"},"menu-user":{templateUrl:"plugins/es/templates/menu_extend.html",controller:"ESMenuExtendCtrl"},"profile-popover-user":{templateUrl:"plugins/es/templates/common/popover_profile_extend.html",controller:"ESProfilePopoverExtendCtrl"}}}),e.extendState("app.home",{points:{"header-buttons":{templateUrl:"plugins/es/templates/home/home_extend.html",controller:"ESExtensionCtrl"}}})}]).controller("ESExtensionCtrl",k).controller("ESJoinCtrl",M).controller("ESMenuExtendCtrl",w).controller("ESProfilePopoverExtendCtrl",U),x.$inject=["$scope","$window","$q","$translate","$ionicPopup","UIUtils","Modals","csHttp","csConfig","csSettings","esHttp","esSettings","esModals"],angular.module("cesium.es.settings.controllers",["cesium.es.services"]).config(["PluginServiceProvider","$stateProvider","csConfig",function(e,n,t){t.plugins&&t.plugins.es&&(e.extendState("app.settings",{points:{plugins:{templateUrl:"plugins/es/templates/settings/settings_extend.html",controller:"ESExtensionCtrl"}}}),n.state("app.es_settings",{url:"/settings/es",views:{menuContent:{templateUrl:"plugins/es/templates/settings/plugin_settings.html",controller:"ESPluginSettingsCtrl"}}}))}]).controller("ESPluginSettingsCtrl",x),F.$inject=["$scope","$controller","$state","csWallet","esModals"],H.$inject=["$scope","$controller","UIUtils","esHttp","esProfile"],angular.module("cesium.es.wallet.controllers",["cesium.es.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&e.extendState("app.view_wallet",{points:{hero:{templateUrl:"plugins/es/templates/wallet/view_wallet_extend.html",controller:"ESWalletLikesCtrl"},"after-general":{templateUrl:"plugins/es/templates/wallet/view_wallet_extend.html",controller:"ESWalletViewCtrl"}}})}]).controller("ESWalletViewCtrl",F).controller("ESWalletLikesCtrl",H),B.$inject=["$scope","$controller","$ionicPopover","UIUtils","csWallet","esHttp","esProfile","esLike","esModals"],angular.module("cesium.es.wot.controllers",["cesium.es.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&e.extendStates(["app.user_identity","app.user_identity_name"],{points:{hero:{templateUrl:"plugins/es/templates/wot/view_identity_extend.html",controller:"ESWotIdentityViewCtrl"},general:{templateUrl:"plugins/es/templates/wot/view_identity_extend.html",controller:"ESWotIdentityViewCtrl"},"after-general":{templateUrl:"plugins/es/templates/wot/view_identity_extend.html",controller:"ESWotIdentityViewCtrl"},buttons:{templateUrl:"plugins/es/templates/wot/view_identity_extend.html",controller:"ESWotIdentityViewCtrl"},"buttons-top-fab":{templateUrl:"plugins/es/templates/wot/view_identity_extend.html",controller:"ESWotIdentityViewCtrl"}}})}]).controller("ESWotIdentityViewCtrl",B),V.$inject=["$scope","$rootScope","$q","$timeout","$state","$focus","$translate","$controller","$ionicHistory","UIUtils","BMA","esHttp","esProfile","ModalUtils","Device"],angular.module("cesium.es.profile.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){e.state("app.user_edit_profile",{url:"/wallet/profile/edit",views:{menuContent:{templateUrl:"plugins/es/templates/user/edit_profile.html",controller:"ESViewEditProfileCtrl"}},cache:!1,data:{auth:!0}})}]).controller("ESViewEditProfileCtrl",V),G.$inject=["$scope","$state","$translate","$ionicHistory","$ionicPopover","$timeout","esModals","UIUtils","csWallet","esMessage"],W.$inject=["$scope","$controller","UIUtils"],Y.$inject=["$scope","Modals","UIUtils","csWallet","esHttp","esMessage","parameters"],$.$inject=["$scope","$state","$timeout","$translate","$ionicHistory","$ionicPopover","UIUtils","esModals","esMessage"],j.$inject=["$scope","UIUtils","$state","$timeout","csWallet","esHttp","esMessage","esModals"],angular.module("cesium.es.message.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){e.state("app.user_message",{url:"/message?type",views:{menuContent:{templateUrl:"plugins/es/templates/message/list.html",controller:"ESMessageListCtrl"}}}).state("app.user_new_message",{cache:!1,url:"/message/new?pubkey&name&title&content",views:{menuContent:{templateUrl:"plugins/es/templates/message/compose.html",controller:"ESMessageComposeCtrl"}}}).state("app.user_view_message",{cache:!1,url:"/message/view/:type/:id",views:{menuContent:{templateUrl:"plugins/es/templates/message/view_message.html",controller:"ESMessageViewCtrl"}}})}]).controller("ESMessageListCtrl",G).controller("ESMessageComposeCtrl",W).controller("ESMessageComposeModalCtrl",Y).controller("ESMessageViewCtrl",$).controller("PopoverMessageCtrl",j),K.$inject=["$scope","$rootScope","$ionicPopover","$state","$timeout","UIUtils","esHttp","csSettings","csWallet","esNotification"],q.$inject=["$scope","$timeout","$controller","UIUtils","$state"],angular.module("cesium.es.notification.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){e.state("app.view_notifications",{url:"/notifications",views:{menuContent:{templateUrl:"plugins/es/templates/notification/view_notifications.html",controller:"NotificationsCtrl"}}})}]).controller("NotificationsCtrl",K).controller("PopoverNotificationsCtrl",q),z.$inject=["$scope","$q","$ionicHistory","csWot","csWallet","UIUtils","ModalUtils","esSubscription"],X.$inject=["$scope","Modals","csSettings","esHttp","csWot","esModals","parameters"],angular.module("cesium.es.subscription.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){e.state("app.edit_subscriptions",{cache:!1,url:"/wallet/subscriptions",views:{menuContent:{templateUrl:"plugins/es/templates/subscription/edit_subscriptions.html",controller:"ViewSubscriptionsCtrl"}},data:{auth:!0,minData:!0}}).state("app.edit_subscriptions_by_id",{cache:!1,url:"/wallets/:id/subscriptions",views:{menuContent:{templateUrl:"plugins/es/templates/subscription/edit_subscriptions.html",controller:"ViewSubscriptionsCtrl"}},data:{login:!0,minData:!0}})}]).controller("ViewSubscriptionsCtrl",z).controller("ModalEmailSubscriptionsCtrl",X),Q.$inject=["$scope","$ionicPopover","$location","$timeout","csSettings","csWallet","UIUtils","esHttp","esDocument"],J.$inject=["$scope","$controller","$timeout","$state"],angular.module("cesium.es.document.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){e.state("app.document_search",{url:"/data/search/:index/:type?q",views:{menuContent:{templateUrl:"plugins/es/templates/document/lookup.html",controller:"ESDocumentLookupCtrl"}},data:{silentLocationChange:!0}})}]).controller("ESDocumentLookupCtrl",Q).controller("ESLastDocumentsCtrl",J),Z.$inject=["$scope","$state","$location","$ionicPopover","$window","$translate","esHttp","UIUtils","csConfig","csSettings","csCurrency","esNetwork","csWot"],ee.$inject=["$scope","$controller","parameters"],ae.$inject=["$scope","$q","$window","$state","UIUtils","csWot","esHttp","csHttp","csSettings"],ne.$inject=["$scope","$controller"],te.$inject=["$scope","$q","csSettings","csCurrency","csHttp","esHttp"],angular.module("cesium.es.network.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){e.state("app.es_network",{url:"/network/data?online&expert",cache:!1,views:{menuContent:{templateUrl:"plugins/es/templates/network/view_es_network.html",controller:"ESNetworkLookupCtrl"}},data:{silentLocationChange:!0}}).state("app.view_es_peer",{url:"/network/data/peer/:server?ssl&tor",cache:!1,views:{menuContent:{templateUrl:"plugins/es/templates/network/view_es_peer.html",controller:"ESPeerViewCtrl"}},data:{preferHttp:!0}})}]).controller("ESNetworkLookupCtrl",Z).controller("ESNetworkLookupModalCtrl",ee).controller("ESPeerViewCtrl",ae).controller("ESNetworkLookupPopoverCtrl",ne).controller("ESPeerInfoPopoverCtrl",te),angular.module("cesium.es.registry.services",["ngResource","cesium.services","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&e.registerEagerLoadingService("esRegistry")}]).factory("esRegistry",["$rootScope","$q","csPlatform","csSettings","csWallet","csWot","esHttp","esComment","esGeo",function(e,n,t,a,i,o,s,r,l){var c,d={commons:["title","description","issuer","time","address","city","creationTime","avatar._content_type","picturesCount","type","category","socials","pubkey","geoPoint"]},u=this;function p(e){e.pages=null}function m(e,t){return t=t||n.defer(),e&&e.pubkey&&e.keypair?(console.debug("[ES] [registry] Loading pages count..."),u.raw.count({pubkey:e.pubkey}).then((function(n){e.pages=e.pages||{},e.pages.count=n&&n.hits&&n.hits.total,console.debug("[ES] [registry] Loaded pages count ("+e.pages.count+")"),t.resolve(e)})).catch((function(n){console.error("[ES] [registry] Error while counting page: "+(n.message?n.message:n)),t.resolve(e)})),t.promise):(t.resolve(),t.promise)}function E(){if(u.raw.categories&&u.raw.categories.length){var e=n.defer();return e.resolve(u.raw.categories),e.promise}return u.raw.category.all().then((function(e){if(0===e.hits.total)u.raw.categories=[];else{var n=e.hits.hits.reduce((function(e,n){var t=n._source;return t.id=n._id,e.concat(t)}),[]);_.forEach(n,(function(e){n[e.id]=e})),u.raw.categories=n}return u.raw.categories}))}function g(e,n){if(e){var t=e._source;return t.category&&t.category.id&&(t.category=n[t.category.id]),e.highlight&&(e.highlight.title&&(t.title=e.highlight.title[0]),e.highlight.description&&(t.description=e.highlight.description[0]),e.highlight.location&&(t.location=e.highlight.location[0]),e.highlight.tags&&(t.tags=e.highlight.tags.reduce((function(e,n){return e.concat(n.replace("<em>","").replace("</em>",""))}),[]))),t.avatar=s.image.fromHit(e,"avatar"),e._source.pictures&&e._source.pictures.reduce&&(t.pictures=e._source.pictures.reduce((function(e,n){return e.concat(s.image.fromAttachment(n.file))}),[])),t}}function f(){var n=s.alive;if(!n&&c&&c.length>0){if(console.debug("[ES] [subscription] Disable"),_.forEach(c,(function(e){e()})),c=[],i.isLogin())return p(i.data)}else if(n&&(!c||0===c.length)&&(console.debug("[ES] [subscription] Enable"),function(){c=[i.api.data.on.login(e,m,this),i.api.data.on.init(e,p,this),i.api.data.on.reset(e,p,this)]}(),i.isLogin()))return m(i.data)}return u.raw={count:s.get("/page/record/_search?size=0&q=issuer::pubkey"),searchText:s.get("/page/record/_search?q=:search"),search:s.post("/page/record/_search"),get:s.get("/page/record/:id"),getCommons:s.get("/page/record/:id?_source="+d.commons.join(",")),category:{get:s.get("/page/category/:id"),all:s.get("/page/category/_search?sort=order&from=0&size=1000&_source=name,parent")}},t.ready().then((function(){return s.api.node.on.start(e,f,this),s.api.node.on.stop(e,f,this),f()})),u.category={all:E,get:function(e){return u.raw.category.get(e).then((function(e){var n=e._source;return n.id=e._id,n}))}},u.record={search:function(e){return(e=e||{}).from=e.from||0,e.size=e.size||20,e._source=e._source||d.commons,e.highlight=e.highlight||{fields:{title:{},description:{}}},n.all([E(),u.raw.search(e)]).then((function(n){var t=n[0];if(!(n=n[1])||!n.hits||!n.hits.total)return{total:0,hits:[]};var a=s.util.findObjectInTree(e.query,"geo_distance"),i=a&&a.geoPoint,o=a&&a.distance&&a.distance.replace(new RegExp("[0-9 ]+","gm"),""),r=n.hits.hits.reduce((function(e,n){var a=g(n,t);return a.id=n._id,i&&a.geoPoint&&o&&(a.distance=l.point.distance(i.lat,i.lon,a.geoPoint.lat,a.geoPoint.lon,o)),e.concat(a)}),[]);return{total:n.hits.total,hits:r}}))},load:function(e,t){return(t=t||{}).raw=!!angular.isDefined(t.raw)&&t.raw,t.fecthPictures=angular.isDefined(t.fetchPictures)?t.fetchPictures:t.raw,n.all([E(),t.fecthPictures?u.raw.get({id:e}):u.raw.getCommons({id:e})]).then((function(e){var n=e[0],a=e[1],i=g(a,n);return t.raw||(i.description=s.util.parseAsHtml(i.description,{tagState:"app.registry_lookup"})),o.extend({pubkey:i.issuer}).then((function(e){return{id:a._id,issuer:e,record:i}}))}))},add:s.record.post("/page/record",{tagFields:["title","description"],creationTime:!0}),update:s.record.post("/page/record/:id/_update",{tagFields:["title","description"]}),remove:s.record.remove("page","record"),fields:{commons:d.commons},picture:{all:s.get("/page/record/:id?_source=pictures")},comment:r.instance("page")},u.currency={all:s.get("/currency/record/_search?_source=currencyName,peers.host,peers.port"),get:s.get("/currency/record/:id/_source")},u}]),ie.$inject=["$scope","$focus","$timeout","$filter","$controller","$location","$translate","$ionicPopover","Device","UIUtils","ModalUtils","BMA","csSettings","csWallet","esModals","esRegistry","esHttp"],oe.$inject=["$scope","$controller","$timeout","UIUtils","csWallet"],se.$inject=["$scope","$rootScope","$state","$q","$timeout","$ionicPopover","$ionicHistory","$translate","$anchorScroll","csConfig","csWallet","esRegistry","UIUtils","esHttp"],re.$inject=["$scope","$timeout","$state","$q","$ionicHistory","$focus","$translate","$controller","Device","UIUtils","ModalUtils","csWallet","esHttp","esRegistry"],angular.module("cesium.es.registry.controllers",["cesium.es.services","cesium.es.common.controllers"]).config(["$stateProvider",function(e){e.state("app.registry_lookup",{url:"/page?q&type&hash&category&location&issuer&reload&lat&lon&d&last",views:{menuContent:{templateUrl:"plugins/es/templates/registry/lookup.html",controller:"ESRegistryLookupCtrl"}},data:{large:"app.registry_lookup_lg",silentLocationChange:!0}}).state("app.registry_lookup_lg",{url:"/page/lg?q&type&hash&category&location&issuer&reload&lat&lon&d&last",views:{menuContent:{templateUrl:"plugins/es/templates/registry/lookup_lg.html",controller:"ESRegistryLookupCtrl"}},data:{silentLocationChange:!0}}).state("app.wallet_pages",{url:"/wallet/pages?refresh",views:{menuContent:{templateUrl:"plugins/es/templates/registry/view_wallet_pages.html",controller:"ESWalletPagesCtrl"}},data:{login:!0,minData:!0}}).state("app.view_page",{url:"/page/view/:id/:title?refresh",views:{menuContent:{templateUrl:"plugins/es/templates/registry/view_record.html",controller:"ESRegistryRecordViewCtrl"}}}).state("app.view_page_anchor",{url:"/page/view/:id/:title/:anchor",views:{menuContent:{templateUrl:"plugins/es/templates/registry/view_record.html",controller:"ESRegistryRecordViewCtrl"}}}).state("app.registry_add_record",{cache:!1,url:"/page/add/:type",views:{menuContent:{templateUrl:"plugins/es/templates/registry/edit_record.html",controller:"ESRegistryRecordEditCtrl"}},data:{auth:!0,minData:!0}}).state("app.registry_edit_record",{cache:!1,url:"/page/edit/:id/:title",views:{menuContent:{templateUrl:"plugins/es/templates/registry/edit_record.html",controller:"ESRegistryRecordEditCtrl"}},data:{auth:!0,minData:!0}})}]).controller("ESRegistryLookupCtrl",ie).controller("ESWalletPagesCtrl",oe).controller("ESRegistryRecordViewCtrl",se).controller("ESRegistryRecordEditCtrl",re),angular.module("cesium.market.services",["cesium.market.converse.services","cesium.market.modal.services","cesium.market.record.services","cesium.market.tx.services","cesium.market.wallet.services","cesium.market.settings.services","cesium.market.category.services"]),angular.module("cesium.market.plugin",["cesium.market.app.controllers","cesium.market.home.controllers","cesium.market.join.controllers","cesium.market.login.controllers","cesium.market.search.controllers","cesium.market.gallery.controllers","cesium.market.record.controllers","cesium.market.wallet.controllers","cesium.market.category.controllers","cesium.market.wot.controllers","cesium.market.document.controllers","cesium.market.services"]).run(["csConfig","Modals","mkModals",function(e,n,t){e.plugins&&e.plugins.market&&e.plugins.market.enable&&(console.debug("[plugin] [market] Override login and join modals"),n.showLogin=t.showLogin,n.showJoin=t.showJoin)}]),angular.module("cesium.market.modal.services",["cesium.modal.services"]).factory("mkModals",["ModalUtils",function(e){return{showHelp:function(n){return e.show("plugins/market/templates/help/modal_help.html","HelpModalCtrl",n)},showJoin:function(n){return e.show("plugins/market/templates/join/modal_join.html","MkJoinModalCtrl",n)},showLogin:function(n){return e.show("plugins/market/templates/login/modal_login.html","MarketLoginModalCtrl",n)},showEventLogin:function(n){return e.show("plugins/market/templates/login/modal_event_login.html","MarketEventLoginModalCtrl",n)}}}]),angular.module("cesium.market.category.services",["ngResource","cesium.services","cesium.es.services","cesium.market.settings.services"]).factory("mkCategory",["$q","$translate","csSettings","BMA","csConfig","esHttp","esComment","esGeo","csWot","csCurrency","mkSettings",function(e,n,t,a,i,o,s,r,l,c,d){var u={},p={get:o.get("/market/category/:id"),all:o.get("/market/category/_search?sort=order&size=1000&_source=name,parent,localizedNames"),search:o.post("/market/category/_search"),add:o.record.post("/market/category",{creationTime:!0}),update:o.record.post("/market/category/:id/_update",{creationTime:!0}),remove:o.record.remove("market","category"),record:{postSearch:o.post("/market/record/_search")}},m={locale:void 0};function E(e,n){var t=e._source;return t.id=e._id,t.localizedNames&&(t.name=t.localizedNames[n.locale]||n.fallbackLocalId&&t.localizedNames[n.fallbackLocalId]||t.name),t}function g(a){if((a=a||{}).withCache=!angular.isDefined(a.withCache)||a.withCache,a.locale=angular.isDefined(a.locale)?a.locale:n.use(),a.fallbackLocalId=t.fixLocale(i.defaultLanguage)||"en",a.withCache&&m.categories&&m.categories.length&&m.locale===a.locale){var o=e.defer();return o.resolve(m.categories),o.promise}return p.all().then((function(e){var n;return 0===e.hits.total?n=[]:(n=e.hits.hits.reduce((function(e,n){var t=E(n,a);return e.concat(t)}),[]),_.forEach(n,(function(e){n[e.id]=e}))),m.categories=n,m.locale!==a.locale&&(m.locale=a.locale,m.filteredCategories=void 0),n}))}function f(a){(a=a||{}).filter=angular.isDefined(a.filter)?a.filter:void 0,a.withCache=!angular.isDefined(a.withCache)||a.withCache,a.locale=angular.isDefined(a.locale)?a.locale:n.use(),a.fallbackLocalId=t.fixLocale(i.defaultLanguage)||"en";var o=a.withCache&&m.filteredCategories&&m.filteredCategories[a.filter];if(o&&o.length&&m.locale===a.locale){var s=e.defer();return s.resolve(o),s.promise}var r=a.filter&&u[a.filter]&&u[a.filter].excludes,l=r&&function(e){return _.contains(r,e)};return p.all().then((function(e){if(0===e.hits.total)return[];var n=e.hits.hits.reduce((function(e,n){var t=E(n,a);return l&&(t.parent&&l(t.parent)||l(t.id))?e:e.concat(t)}),[]);return _.forEach(n,(function(e){n[e.id]=e})),m.filteredCategories=m.filteredCategories||{},m.filteredCategories[a.type]=n,m.locale!==a.locale&&(m.locale=a.locale,m.categories=void 0),n}))}function h(e){return console.debug("[market] [category] Adding category",e),p.add(e)}function T(e){return console.debug("[market] [category] Updating category",e),p.update(e,{id:e.id})}function b(e){var n=_.groupBy(e,(function(e){return e.parent||"roots"}));return _.forEach(n.roots,(function(e){e.children=n[e.id]})),n.roots}return{all:g,filtered:f,asTree:b,get:function(e,n){return(n=n||{}).withCache=!angular.isDefined(n.withCache)||n.withCache,n.withChildren=!angular.isDefined(n.withChildren)||n.withChildren,n.withChildren||n.withCache?g(n).then((function(t){var a=t[e.id];return n.withChildren&&b(t),a})):p.get(e).then((function(e){return E(e)}))},searchText:o.get("/market/category/_search?q=:search"),search:o.post("/market/category/_search"),stats:function n(t){if(!(t=t||{}).currencies)return d.currencies().then((function(e){return t.currencies=e,n(t)}));t.asTree=!angular.isDefined(t.asTree)||t.asTree;var a={size:0,aggs:{category:{nested:{path:"category"},aggs:{by_id:{terms:{field:"category.id",size:1e3}}}}}},i=[],o=[];if(t.withStock&&i.push({range:{stock:{gt:0}}}),!t.withOld){var s=t.minTime?t.minTime:Date.now()/1e3-31536e3;s=60*Math.floor(s/60/60)*60,i.push({range:{time:{gte:s}}})}return t.currencies&&t.currencies.length&&i.push({terms:{currency:t.currencies}}),(o.length||i.length)&&(a.query={bool:{}},o.length&&(a.query.bool.should=o),i.length&&(a.query.bool.filter=i)),e.all([f(t),p.record.postSearch(a,{request_cache:!0})]).then((function(e){var n=e[0],t=(e=e[1]).aggregations.category&&e.aggregations.category.by_id&&e.aggregations.category.by_id.buckets||[],a={};return t.forEach((function(e){var t=n[e.key];t&&(a[e.key]=e.doc_count,t.parent&&(a[t.parent]=(a[t.parent]||0)+e.doc_count))})),n.reduce((function(e,n){return e.concat(angular.merge({count:a[n.id]||0},n))}),[])})).then((function(e){return t.asTree?b(e):e})).catch((function(e){console.error(e)}))},add:h,update:T,remove:function(e){return console.debug("[market] [category] Removing category: "+e),p.remove(e)},saveAll:function n(t,a){if(!(a=a||{}).parent){var i=Date.now();console.debug("[market] [category] Saving all categories...",t)}var o;return(a.existingCategories?e.when(a.existingCategories):g(!1)).then((function(i){return o=a.idsToDelete||_.pluck(i,"id"),e.all(_.map(t||[],(function(e){var t=i[e.id];o=_.without(o,e.id);var a=!t;console.debug("[market] [category] - {0} {1}".format(a?"Add":"Update",e.id));var s={id:e.id,localizedNames:e.localizedNames};e.parent&&(s.parent=e.parent),t&&t.name&&(s.name=e.name||null);var r=a?h(s,e.id):T(s,e.id);return e.children&&e.children.length?r.then((function(){return n(e.children,{parent:e,existingCategories:i,idsToDelete:o})})):r}),[]))})).then((function(){if(!a.parent&&o.length>0)return console.debug("[market] [category] Deleting categories with id:",o),e.all(_.map(o,p.remove))})).then((function(){a.parent||console.debug("[market] [category] Saved in {0}ms".format(Date.now()-i))}))},regexp:{ID:/^cat[0-9]+$/}}}]),angular.module("cesium.market.record.services",["ngApi","cesium.services","cesium.es.services","cesium.market.settings.services","cesium.market.category.services"]).factory("mkRecord",["$q","csSettings","BMA","csConfig","csWallet","csWot","csCurrency","csCache","Api","esHttp","esProfile","esComment","esGeo","esLike","mkSettings","mkCategory",function(e,n,t,a,i,o,s,r,l,c,d,u,p,m,E,g){var f={likeMoreThis:null},h={commons:["category","title","description","issuer","time","creationTime","location","address","city","price","unit","currency","thumbnail._content_type","picturesCount","type","stock","fees","feesCurrency","geoPoint","pubkey","freePrice"],moreLikeThis:["category","title","issuer","time","creationTime","location","address","city","price","unit","currency","thumbnail._content_type","picturesCount","type","stock","fees","feesCurrency","geoPoint","pubkey","freePrice"]},T={postSearch:c.post("/market/record/_search"),searchText:c.get("/market/record/_search?q=:search"),get:c.get("/market/record/:id"),getCommons:c.get("/market/record/:id?_source="+h.commons.join(",")),add:c.record.post("/market/record",{tagFields:["title","description"],creationTime:!0}),update:c.record.post("/market/record/:id/_update",{tagFields:["title","description"],creationTime:!0}),remove:c.record.remove("market","record")},b={moreLikeThis:{current:void 0}},v=new l(this,"mkRecord");function O(e,n,t,a){a=a||{};var i=e._source;return i.category&&i.category.id&&(i.category=n[i.category.id]||i.category),i.price&&a.convertPrice&&t&&"UD"===i.unit&&(i.price=i.price*t),i.fees&&a.convertPrice&&t&&(!i.feesCurrency||i.feesCurrency===i.currency)&&"UD"===i.unit&&(i.fees=i.fees*t),a.html&&e.highlight?(e.highlight.title&&(i.title=e.highlight.title[0]),e.highlight.tags&&(i.tags=e.highlight.tags.reduce((function(e,n){return e.concat(n.replace("<em>","").replace("</em>",""))}),[])),e.highlight.description?i.description=e.highlight.description[0]:i.description=c.util.parseAsHtml(i.description,{tagState:"app.market_lookup"}),e.highlight.location&&(i.location=e.highlight.location[0]),e.highlight.city&&(i.city=e.highlight.city[0]),i.category&&e.highlight["category.name"]&&(i.category.name=e.highlight["category.name"][0])):a.html&&(i.description=c.util.parseAsHtml(i.description,{tagState:"app.market_lookup"})),i.thumbnail=c.image.fromHit(e,"thumbnail"),e._source.pictures&&e._source.pictures.reduce&&(i.pictures=e._source.pictures.reduce((function(e,n){return n&&n.file?e.concat(c.image.fromAttachment(n.file)):e}),[])),i.location&&!i.city&&(i.city=i.location),i}function R(n,t){console.debug("[market] [record] Loading Ads from request: ",n),(n=n||{}).from=n.from||0,n.size=isNaN(n.size)?20:n.size,n._source=n._source||h.commons,n.highlight=n.highlight||{fields:{title:{},description:{},"category.name":{},tags:{}}};var a={request_cache:t&&!0===t.withCache||!1};return e.all([g.all(),s.currentUD().then((function(e){return e})).catch((function(e){return console.error(e),1})),T.postSearch(n,a)]).then((function(e){var t=e[0],a=e[1];if(!(e=e[2])||!e.hits||!e.hits.total)return{total:0,hits:[]};var i=c.util.findObjectInTree(n.query,"geo_distance"),o=i&&i.geoPoint,s=i&&i.distance&&i.distance.replace(new RegExp("[0-9 ]+","gm"),""),r=e.hits.hits.reduce((function(e,n){var i=O(n,t,a,{convertPrice:!0,html:!0});return i.id=n._id,o&&i.geoPoint&&s&&(i.distance=p.point.distance(o.lat,o.lon,i.geoPoint.lat,i.geoPoint.lon,s)),e.concat(i)}),[]);return v.record.raisePromise.search(r).then((function(){return{total:e.hits.total,hits:r}}))})).catch((function(e){throw console.error(e),new Error("MARKET.ERROR.LOOKUP_RECORDS_FAILED")}))}function I(e){var n={from:(e=e||{}).from||0,size:e.size||20,_source:e._source||h.commons},a=[],i=[];if(e.ids&&i.push({terms:{_id:e.ids}}),e.category&&e.category.id){var o=e.category.children&&_.pluck(e.category.children,"id");o&&o.length?i.push({nested:{path:"category",query:{bool:{filter:{terms:{"category.id":o}}}}}}):i.push({nested:{path:"category",query:{bool:{filter:{term:{"category.id":e.category.id}}}}}})}else"number"==typeof e.category&&i.push({nested:{path:"category",query:{bool:{filter:{term:{"category.id":e.category}}}}}});if(e.categories&&e.categories.length&&i.push({nested:{path:"category",query:{bool:{filter:{terms:{"category.id":e.categories}}}}}}),e.type){var s="offer"===e.type?["offer","auction"]:"need"===e.type?["need","crowdfunding"]:[e.type];i.push({terms:{type:s}})}var r=(e.text||"").trim(),l=r.length>0?c.util.parseTags(r):void 0;if(r.length>1)if(t.regexp.PUBKEY.test(r))a=[],i.push({term:{issuer:r}});else{var d=r.toLowerCase();a.push({multi_match:{query:d,fields:["title^2","description"],type:"phrase_prefix"}}),a.push({match:{title:{query:d,boost:2}}}),a.push({prefix:{title:d}}),a.push({match:{description:d}}),a.push({nested:{path:"category",query:{bool:{filter:{match:{"category.name":d}}}}}})}if(l&&i.push({terms:{tags:l}}),!1!==e.withStock&&!0!==e.showClosed&&i.push({range:{stock:{gt:0}}}),e.withPictures&&i.push({range:{picturesCount:{gt:0}}}),!0!==e.withOld&&!0!==e.showOld){var u=e.minTime?e.minTime:E.getMinAdTime();u=60*Math.floor(u/60/60)*60,i.push({range:{time:{gte:u}}})}e.currencies&&e.currencies.length&&i.push({terms:{currency:e.currencies}});var p=e.location&&e.location.trim(),m=e.geoDistance||"50km";if(e.geoPoint&&e.geoPoint.lat&&e.geoPoint.lon)if(p&&p.length){var g=p.toLowerCase().split(",")[0];i.push({or:[{and:[{not:{exists:{field:"geoPoint"}}},{multi_match:{query:g,fields:["city^3","location"]}}]},{geo_distance:{distance:m,geoPoint:{lat:e.geoPoint.lat,lon:e.geoPoint.lon}}}]})}else i.push({geo_distance:{distance:m,geoPoint:{lat:e.geoPoint.lat,lon:e.geoPoint.lon}}});else if(e.geoShape&&e.geoShape.geometry){var f=e.geoShape.geometry.coordinates,T=e.geoShape.geometry.type;p&&("Polygon"===T||"MultiPolygon"===T)&&f&&f.length&&(1===f.length?i.push({geo_polygon:{geoPoint:{points:1===f.length?f[0]:f}}}):i.push({or:f.reduce((function(e,n){return e.concat(n.reduce((function(e,n){return e.concat({geo_polygon:{geoPoint:{points:n}}})}),[]))}),[])}))}return(a.length||i.length)&&(n.query={bool:{}},a.length&&(n.query.bool.should=a,n.query.bool.minimum_should_match=1),i.length&&(n.query.bool.filter=i)),e.sortAttribute&&(n.sort=n.sort||{},n.sort[e.sortAttribute]="asc"===e.sortDirection?"asc":"desc"),n}return v.registerEvent("record","load"),v.registerEvent("record","search"),{category:g,record:{createSearchRequest:I,search:R,load:function(n,t){var a;return(t=t||{}).fetchPictures=!angular.isDefined(t.fetchPictures)||t.fetchPictures,t.convertPrice=!!angular.isDefined(t.convertPrice)&&t.convertPrice,e.all([g.all(),s.currentUD().catch((function(e){return console.error("Could not get current UD",e),1})),t.fetchPictures?T.get({id:n}):T.getCommons({id:n})]).then((function(e){var n=e[0],i=e[1],o=O(a=e[2],n,i,t);return o.id=a._id,!o.currency&&o.price?E.currencies().then((function(e){return o.currency=e&&e[0],o})):o})).then((function(n){return e.all([o.extend({issuer:n.issuer},"issuer",!0),v.record.raisePromise.load(n).catch((function(e){console.debug("[market] [record-service] Error while executing extension point on record load."),console.error(e)}))]).then((function(e){var t=e[0];return{id:n.id,issuer:t,record:n}}))}))},setStock:function(e,n){return T.get({id:e}).then((function(t){if(t&&t._source){var a=t._source;return a.stock=n||0,a.id=e,T.update(a,{id:e})}}))},pictures:function(e){return(e=e||{})._source=e._source||["category","title","price","unit","currency","city","pictures","stock","unitbase","description","type","issuer","creationTime"],e.withPictures=!0,R(I(e)).then((function(e){var n=(e.hits||[]).reduce((function(e,n){return n.pictures&&n.pictures.length?(angular.merge(n,n.pictures[0]),delete n.pictures,delete n.thumbnail,e.concat(n)):e}),[]);return d.fillAvatars(n,"issuer").then((function(){return{hits:n,total:e.total}}))}))},add:T.add,update:T.update,remove:T.remove,moreLikeThis:function(n,t){if(!1!==(t=t||{}).cache&&f.likeMoreThis){var a=f.likeMoreThis.get(n);if(a)return e.when(a)}var l=Date.now(),c=20*(t.size||6),d=E.getMinAdTime(),u=i.isLogin()?i.data.pubkey:void 0,p=[];b.moreLikeThis.current=n;var m={from:t.from||0,size:c,_source:t._source||h.moreLikeThis,query:{more_like_this:{fields:["title","category.name","type","city"],like:[{_index:"market",_type:"record",_id:n}],min_term_freq:1,max_query_terms:12}}};if(t.type||t.category||t.city){var v={};t.type&&(v.type=t.type),t.category&&(v.category={id:t.category}),t.city&&(v.city=t.city),m.query.more_like_this.like.push({_index:"market",_type:"record",doc:v})}var R=function(e,t){if(!((t=void 0!==t?t:6)&&e&&e.hits&&e.hits.total))return{total:0,hits:[]};var a=e.hits.hits.reduce((function(e,n,a){return a>=t||0===n._source.stock||n._source.issuer===u?e:(n._source.time||n._source.creationTime)<d?(p.push(n),e):e.concat(n)}),[]),i=t-a.length;if(i>0&&Date.now()-l<1e4&&b.moreLikeThis.current===n){if(console.debug("[market] [record] Missing 'more like this' Ads (missing {0}. Fetching more...".format(i)),m.from+=c,m.from<e.hits.total)return T.postSearch(m).then((function(e){return R(e,i)})).then((function(n){return{total:e.hits.total,hits:a.concat(n.hits||[])}}));p.length>0&&(p.length>i&&p.splice(i),a=a.concat(p))}return{total:e.hits.total,hits:a}};return e.all([g.all(),s.currentUD().catch((function(e){return console.error("Could not get current UD",e),1})),T.postSearch(m).then(R)]).then((function(e){var t=e[0],a=e[1];return(e=e[2]).hits=_.map(e.hits,(function(e){var n=O(e,t,a,{convertPrice:!0,html:!0});return n.id=e._id,n})),o.extendAll(e.hits,"issuer",!0).then((function(t){return f.likeMoreThis=f.likeMoreThis||r.get("mkRecord",r.constants.MEDIUM),f.likeMoreThis.put(n,e),console.debug("[market] [record] {0} 'More like this' fetched, in {1}ms".format(e.hits.length,Date.now()-l)),e}))}))},fields:{commons:h.commons},picture:{all:c.get("/market/record/:id?_source=pictures")},comment:u.instance("market"),like:m.instance("market","record")},api:v}}]),angular.module("cesium.market.tx.services",["cesium.services","cesium.es.services","cesium.market.settings.services","cesium.market.record.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&e.registerEagerLoadingService("mkTx")}]).factory("mkTx",["$rootScope","$q","csSettings","csPlatform","CryptoUtils","csConfig","esHttp","mkRecord",function(e,n,t,a,i,o,s,r){var l={COMMENTS_PREFIX:"GCHANGE"},c={postSearchByCurrency:{g1:s.post("/g1/movement/_search")}};function d(e){if(!e||!e.id)throw Error("Invalid record: missing record or record.id");return[l.COMMENTS_PREFIX,e.id].join(":").toUpperCase()}function u(e,n){(n=n||{}).withAvg=!!angular.isDefined(n.withAvg)&&n.withAvg,n.withIssuers=!!angular.isDefined(n.withIssuers)&&n.withIssuers;var t=Date.now();console.debug("[market] [tx] Loading TX stats of record {{0}}...".format(e.id)),n.prefix=n.prefix||d(e);var a={size:0,query:{bool:{must:{match:{comment:n.prefix}}}},aggs:{sum:{sum:{field:"amount"}}}};return e.pubkey&&(a.query.bool.filter=[{term:{recipient:e.pubkey}}]),n.withAvg&&(a.aggs.avg={avg:{field:"amount"}}),n.withIssuers&&(a.aggs.issuers={terms:{field:"issuer"}}),function(e,n){var t=c.postSearchByCurrency[e];return t||(t=s.post("/"+e+"/movement/_search"),c.postSearchByCurrency[e]=t),t(n)}(e.currency,a).then((function(a){var i=a.aggregations&&a.aggregations.sum&&a.aggregations.sum.value,o=e.price>0?100*i/e.price:void 0;return e.tx={sum:i,pct:o},n.withAvg&&(e.tx.avg=a.aggregations&&a.aggregations.avg&&a.aggregations.avg.value),n.withIssuers&&(e.tx.issuers=(a.aggregations&&a.aggregations.issuers&&a.aggregations.issuers.buckets||[]).reduce((function(e,n){return e.concat(n.key)}),[])),console.debug("[market] [tx] TX stats loaded in {1}ms".format(e.id,Date.now()-t),e.tx),e}))}function p(e,t){t=t||n.defer();var a=(e||[]).reduce((function(e,n){return"crowdfunding"===n.type&&n.pubkey?e.concat(u(n)):e}),[]);return a.length?n.all(a).then(t.resolve).catch(t.reject):t.resolve(),t.promise}function m(e,t){return t=t||n.defer(),"crowdfunding"===e.type&&e.pubkey?u(e,{withAvg:!0,withIssuers:!0}).then(t.resolve).catch(t.reject):(t.resolve(),t.promise)}return function(){r.api.record.on.search(e,p,this),r.api.record.on.load(e,m,this)}(),{record:{computePrefix:d,fillTx:u},uri:{compute:function(e){if(!e||!e.pubkey)return n.reject("Missing options.pubkey");if(e.currency=e.currency||"g1","g1"===e.currency){var t="june://"+e.pubkey,a=[];return e.amount&&a.push("amount="+e.amount/100),e.comment&&a.push("comment="+e.comment),a.length&&(t+="?"+a.join("&")),n.when([t,"web+"+t])}return n.when([])}},constants:l}}]),angular.module("cesium.market.wallet.services",["cesium.es.services"]).config(["PluginServiceProvider",function(e){e.registerEagerLoadingService("mkWallet")}]).factory("mkWallet",["$rootScope","$q","$timeout","esHttp","$state","$sce","$sanitize","$translate","UIUtils","csSettings","csWallet","csWot","BMA","Device","csPlatform","SocialUtils","CryptoUtils","esWallet","esProfile","esSubscription","mkRecord",function(e,n,t,a,i,o,s,r,l,c,d,u,p,m,E,g,f,h,T,b,v){var O,R,I;function N(e){e.profile=void 0,e.name=void 0,e.favorites=e.favorites||{},e.favorites.count=null,O=void 0,R=void 0}function S(e,t){if(t=t||n.defer(),!e||!e.pubkey||!e.keypair)return t.resolve(),t.promise;if(e.name)return t.resolve(e),t.promise;var i=Date.now();return console.debug("[market] [wallet] Checking user profile..."),T.get(e.pubkey).then((function(a){return a?(e.name=a.name,e.avatar=a.avatar,e.profile=a.source,void(e.profile.description=a.description)):O?function(e){if(O){var t=Date.now();return console.debug("[market] [wallet] Saving user profile..."),e.profile=e.profile||{},angular.merge(e.profile,O),h.box.getKeypair().then((function(t){return n.all([r("MARKET.PROFILE.DEFAULT_TITLE",{pubkey:e.pubkey}),g.pack(angular.copy(e.profile.socials||[]),t)])})).then((function(n){var t=n[0],a=n[1];e.name=e.profile.title||t,e.profile.title=e.name,e.profile.issuer=e.pubkey;var i=angular.copy(e.profile);return i.socials=a,T.add(i)})).then((function(){O=void 0,console.info("[market] [wallet] Saving user profile in {0}ms".format(Date.now()-t))})).catch((function(e){throw O=void 0,console.error("[market] [wallet] Error while saving new profile",e),e}))}}(e):(l.alert.error("MARKET.ERROR.INVALID_LOGIN_CREDENTIALS"),t.reject("RETRY"),t.promise)})).then((function(){return function(e){if(R)return a.network.peering.self().then((function(e){if(e&&e.pubkey){var n=angular.merge({type:"email",recipient:e.pubkey,content:{locale:c.data.locale.id,frequency:"daily"}},R);if("email"!==n.type||n.content.email)return b.record.add(n,d);console.warn("Missing email attribute (subscription content). Cannot subscribe!")}})).then((function(){e.subscriptions=e.subscriptions||{count:0},e.subscriptions.count++,R=void 0})).catch((function(e){throw R=void 0,console.error("[market] [wallet] Error while saving new subscription",e),e}))}(e)})).then((function(){console.info("[market] [wallet] Checked user profile in {0}ms".format(Date.now()-i)),t.resolve(e)})).catch(t.reject),t.promise}function A(e,t){t=t||n.defer();var a=Date.now();return console.debug("[market] [user] Loading favorites..."),v.record.like.load({issuer:e.pubkey,kinds:["LIKE","FOLLOW"],size:0}).then((function(n){e.favorites=e.favorites||{},e.favorites.count=n&&n.total||0})).then((function(){console.info("[market] [wallet] Loaded favorites ({0}) in {1}ms".format(e.favorites.count,Date.now()-a)),t.resolve(e)})).catch(t.reject),t.promise}function D(){var n=a.alive;if(!n&&I&&I.length>0){if(console.debug("[market] [user] Disable"),_.forEach(I,(function(e){e()})),I=[],d.isLogin())return N(d.data)}else if(n&&(!I||0===I.length)&&(console.debug("[market] [user] Enable"),function(){I=[d.api.data.on.loginCheck(e,S,this),d.api.data.on.finishLoad(e,A,this),d.api.data.on.init(e,N,this),d.api.data.on.reset(e,N,this)]}(),d.isLogin()))return N(d.data),S(d.data).then(A)}return E.ready().then((function(){return a.api.node.on.start(e,D,this),a.api.node.on.stop(e,D,this),D()})),this.setDefaultProfile=function(e){O=angular.copy(e)},this.setDefaultSubscription=function(e){R=angular.copy(e)},this}]),angular.module("cesium.market.settings.services",["cesium.services","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&e.registerEagerLoadingService("mkSettings")}]).factory("mkSettings",["$rootScope","$q","$timeout","$ionicHistory","Api","csHttp","esHttp","csConfig","csSettings","esSettings","csCurrency",function(e,n,t,a,i,o,s,r,l,c,d){var u,p=angular.merge({plugins:{market:{enable:!0,compactMode:!1,cesiumApi:{enable:!0,baseUrl:"https://g1.duniter.fr/api"},defaultSearch:{geoDistance:50},maxAdAge:31536e3},converse:{jid:"anonymous.duniter.org",bosh_service_url:"https://chat.duniter.org/http-bind/",auto_join_rooms:["gchange@muc.duniter.org"]}}},{plugins:{market:r.plugins&&r.plugins.market||{}}},{plugins:{converse:r.plugins&&r.plugins.converse||{}}}),m=this,E=n.defer();function g(e,t){return t=t||n.defer(),e.plugins=e.plugins||{},e.plugins.market={},angular.merge(e,p),t.resolve(e),t.promise}function f(e){if(o.version.compare(e.version,"1.2.6")<=0&&e.plugins&&e.plugins.market){console.info("[market] [settings] Detected version previous <= 1.2.6 - Fix older settings..."),delete e.plugins.es.market;var t=e.plugins.market.geoDistance;delete e.plugins.market.geoDistance,e.plugins.market.defaultSearch=e.plugins.market.defaultSearch||{},e.plugins.market.defaultSearch.geoDistance=e.plugins.market.defaultSearch.geoDistance||t,e.plugins.market.maxAdAge=p.plugins.market.maxAdAge}e.plugins.es.document=e.plugins.es.document||{},e.plugins.es.document.index="user,page,group,market",e.plugins.es.document.type="profile,record,comment",function(e,t){if(t=t||n.defer(),m.enable){if(m.raw.currencies=e.plugins.market.currencies,m.raw.currencies||!e.plugins.market.defaultCurrency)return d.get().then((function(e){m.raw.currencies=[e.name],console.debug("[market] [settings] Currencies: ",m.raw.currencies),t&&t.resolve(m.raw.currencies)})).catch((function(e){if(!t)throw e;t.reject(e)}));m.raw.currencies=[e.plugins.market.defaultCurrency],console.debug("[market] [settings] Currencies: ",m.raw.currencies),t&&t.resolve(m.raw.currencies)}else m.raw.currencies=[],t&&t.resolve(m.raw.currencies);t.promise}(e)}return c.setPluginSaveSpecs("market",{includes:["geoDistance","compactMode","maxAdAge"],excludes:["enable","homeMessage","defaultTags","defaultAdminPubkeys","record","defaultSearch"],defaultSearch:{},cesiumApi:{}}),m.raw={currencies:void 0},m.isEnable=function(e){return(e=e||l.data).plugins&&e.plugins.es&&e.plugins.es.enable&&e.plugins.market&&e.plugins.market.enable},m.currencies=function(){return E?E.promise.then((function(){return m.raw.currencies})):n.when(m.raw.currencies)},m.getMaxAdAge=function(){return l.data.plugins.market&&l.data.plugins.market.maxAdAge||p.plugins.market.maxAdAge},m.getMinAdTime=function(){return Date.now()/1e3-m.getMaxAdAge()},m.ready=function(){return E?E.promise:n.when()},c.api.state.on.changed(e,(function(n){(n=n&&m.isEnable())!==m.enable&&(m.enable=n,n?(console.debug("[market] [settings] Enable"),function(){u=[l.api.data.on.reset(e,g,this),l.api.data.on.changed(e,f,this)]}()):(console.debug("[market] [settings] Disable"),_.forEach(u,(function(e){e()})),u=[]),f(l.data),E&&(E.resolve(),E=null))})),m}]),angular.module("cesium.market.converse.services",["cesium.es.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.market&&e.registerEagerLoadingService("mkConverse")}]).factory("mkConverse",["$rootScope","$q","$timeout","$translate","esHttp","UIUtils","csConfig","csWallet","Device","csSettings",function(e,n,t,a,i,o,s,r,l,c){var d,u=!1;function p(e){e.xmpp=null}function m(e,i){var r;if(e.name){if(!u)if(u=!0,s.plugins&&s.plugins.converse&&s.plugins.converse.enable)if(o.screen.isSmall())console.debug("[market] [converse] Disabled on small screen"),u=!0;else{var l=e.name?(r=e.name)?String(r).replace(/[^a-zA-Z0-9]+/gm,""):"":e.pubkey.substring(0,8),d=(new Date).getTime();console.debug("[market] [converse] Starting Chatroom with username {"+l+"}..."),converse.plugins.add("gchange-plugin",{initialize:function(){var e=this._converse;n.all([e.api.waitUntil("chatBoxesFetched"),e.api.waitUntil("roomsPanelRendered")]).then((function(){console.debug("[market] [converse] Chatroom started in "+((new Date).getTime()-d)+"ms")}))}});var p=angular.merge({allow_muc_invitations:!1,auto_login:!0,allow_logout:!0,authentication:"anonymous",jid:"anonymous.duniter.org",auto_away:300,auto_join_on_invite:!0,auto_reconnect:!0,minimized:!0,auto_join_rooms:["gchange@muc.duniter.org"],blacklisted_plugins:["converse-mam","converse-otr","converse-register","converse-vcard"],whitelisted_plugins:["gchange-plugin"],bosh_service_url:"https://chat.duniter.org/http-bind/",allow_registration:!1,show_send_button:!1,muc_show_join_leave:!1,notification_icon:"img/logo.png",i18n:a.use()},c.data.plugins&&c.data.plugins.converse||{});p.auto_join_rooms=_.map(p.auto_join_rooms||[],(function(e){return"string"==typeof e?{jid:e,nick:l}:(e.nick=l,e.minimized=!0,e)})),converse.initialize(p).catch(console.error)}else console.debug("[market] [converse] Disabled by config (property 'plugins.converse.enable')"),u=!0}else t((function(){return m(e)}),1e3);return i?i.resolve()&&i.promise:n.when()}function E(){var n=i.alive;if(!n&&d&&d.length>0){if(console.debug("[market] [converse] Disable"),_.forEach(d,(function(e){e()})),d=[],r.isLogin())return p(r.data)}else if(n&&(!d||0===d.length)&&(console.debug("[market] [converse] Enable"),function(){d=[r.api.data.on.login(e,m,this),r.api.data.on.init(e,p,this),r.api.data.on.reset(e,p,this)]}(),r.isLogin()))return m(r.data)}return l.ready().then((function(){return i.api.node.on.start(e,E,this),i.api.node.on.stop(e,E,this),E()})),this.setDefaultProfile=function(e){angular.copy(e)},this}]),le.$inject=["$scope","PluginService"],angular.module("cesium.market.app.controllers",["ngResource","cesium.es.services","cesium.market.modal.services"]).config(["PluginServiceProvider",function(e){e.extendState("app",{points:{"menu-main":{templateUrl:"plugins/market/templates/menu_extend.html",controller:"MarketMenuExtendCtrl"},"menu-user":{templateUrl:"plugins/market/templates/menu_extend.html",controller:"MarketMenuExtendCtrl"},"menu-discover":{templateUrl:"plugins/market/templates/menu_extend.html",controller:"MarketMenuExtendCtrl"}}})}]).controller("MarketMenuExtendCtrl",le),de.$inject=["$scope","$rootScope","$state","$controller","$focus","$timeout","$translate","$q","ModalUtils","UIUtils","csConfig","csSettings","mkModals"],ce.$inject=["$scope","$controller","UIUtils","csPlatform","$state"],angular.module("cesium.market.home.controllers",["ngResource","cesium.es.services","cesium.market.modal.services"]).config(["PluginServiceProvider",function(e){e.extendState("app.home",{points:{buttons:{templateUrl:"plugins/market/templates/home/home_buttons.html",controller:"MarketHomeButtonsCtrl"},"footer-start":{templateUrl:"plugins/market/templates/category/list_categories_lg.html",controller:"MarketHomeFooterCtrl"}}})}]).controller("MarketHomeButtonsCtrl",de).controller("MarketHomeFooterCtrl",ce),angular.module("cesium.market.join.controllers",["cesium.services","cesium.market.services"]).controller("MkJoinModalCtrl",["$scope","$timeout","$state","UIUtils","CryptoUtils","csSettings","csWallet","csCurrency","mkWallet","mkModals",function(e,n,t,a,i,o,s,r,l,c){e.emailPattern="^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,6}$",e.formData={pseudo:"",description:void 0,email:void 0},e.slides={slider:null,options:{loop:!1,effect:"slide",speed:500}},e.isLastSlide=!1,e.showUsername=!1,e.showPassword=!1,e.smallscreen=a.screen.isSmall(),e.enter=function(){r.get().then((function(n){e.currency=n}))},e.$on("modal.shown",e.enter),e.slidePrev=function(){e.slides.slider.unlockSwipes(),e.slides.slider.slidePrev(),e.slides.slider.lockSwipes(),e.isLastSlide=!1},e.slideNext=function(){e.slides.slider.unlockSwipes(),e.slides.slider.slideNext(),e.slides.slider.lockSwipes(),e.isLastSlide=e.slides.slider.activeIndex===e.slides.slider.slides.length-1},e.showAccountPubkey=function(){e.formData.pubkey||(e.formData.computing=!0,i.scryptKeypair(e.formData.username,e.formData.password).then((function(n){e.formData.pubkey=i.util.encode_base58(n.signPk),e.formData.computing=!1})).catch((function(n){e.formData.computing=!1,console.error(">>>>>>>",n),a.alert.error("ERROR.CRYPTO_UNKNOWN_ERROR")})))},e.formDataChanged=function(){e.formData.computing=!1,e.formData.pubkey=null},e.doNext=function(n){if(!n)switch(e.slides.slider.activeIndex){case 0:n="saltForm";break;case 1:n="passwordForm";break;case 2:n="profileForm"}if(n){if(e[n].$submitted=!0,!e[n].$valid)return;"passwordForm"===n||"pseudoForm"===n?(e.slideNext(),e.showAccountPubkey()):e.slideNext()}},e.doNewAccount=function(n){return n?(a.loading.show(),l.setDefaultProfile({title:e.formData.title,description:e.formData.description}),e.formData.email&&l.setDefaultSubscription({type:"email",content:{email:e.formData.email}}),o.data.wallet=o.data.wallet||{},o.data.wallet.alertIfUnusedWallet=!1,s.login(e.formData.username,e.formData.password).catch(a.onError("ERROR.CRYPTO_UNKNOWN_ERROR")).then(e.closeModal).then((function(){return t.go("app.view_wallet")}))):a.alert.confirm("MARKET.JOIN.CONFIRMATION_WALLET_ACCOUNT").then((function(n){n&&e.doNewAccount(!0)}))},e.showHelpModal=function(n){return n||(n=1==e.slides.slider.activeIndex?"join-salt":2==e.slides.slider.activeIndex?"join-password":void 0),c.showHelp({anchor:n})}}]),pe.$inject=["$scope","$controller","$q","csConfig","csWallet","mkWallet"],ue.$inject=["$scope","$controller"],angular.module("cesium.market.login.controllers",["cesium.services"]).controller("MarketEventLoginModalCtrl",pe).controller("MarketLoginModalCtrl",ue),me.$inject=["$scope","$state","$filter","$q","$location","$translate","$controller","$timeout","UIUtils","ModalUtils","csConfig","csSettings","BMA","esProfile","esHttp","mkCategory","mkRecord","mkSettings"],Ee.$inject=["$scope","$rootScope","$controller","$focus","$timeout","$ionicPopover","$translate","$q","mkCategory","mkRecord","csSettings","esShape"],angular.module("cesium.market.search.controllers",["cesium.market.record.services","cesium.es.services","cesium.map.services","cesium.es.common.controllers"]).config(["$stateProvider",function(e){var n=["q","category","shape","location","reload","type","hash","closed","lat","lon","last","old","dist"].join("&");e.state("app.market_lookup",{url:"/market?"+n,views:{menuContent:{templateUrl:"plugins/market/templates/search/lookup.html",controller:"MkLookupCtrl"}},data:{large:"app.market_lookup_lg",silentLocationChange:!0}}).state("app.market_lookup_lg",{url:"/market/lg?"+n,views:{menuContent:{templateUrl:"plugins/market/templates/search/lookup_lg.html",controller:"MkLookupCtrl"}},data:{silentLocationChange:!0}})}]).controller("MkLookupAbstractCtrl",me).controller("MkLookupCtrl",Ee),ge.$inject=["$scope","$q","$ionicScrollDelegate","$controller","$location","$ionicModal","$interval","csConfig","csSettings","ModalUtils","mkRecord"],fe.$inject=["$scope","$http","$interval","$ionicSlideBoxDelegate","$timeout","UIUtils","parameters"],angular.module("cesium.market.gallery.controllers",["cesium.market.record.services","cesium.es.services","cesium.es.common.controllers"]).config(["$stateProvider",function(e){var n=["q","category","shape","location","reload","type","hash","closed","lat","lon","last","old","dist"].join("&");e.state("app.market_gallery",{cache:!0,url:"/gallery/market?"+n,views:{menuContent:{templateUrl:"plugins/market/templates/gallery/view_gallery.html",controller:"MkViewGalleryCtrl"}}})}]).controller("MkViewGalleryCtrl",ge).controller("MkGallerySlideModalCtrl",fe),he.$inject=["$scope","$rootScope","$anchorScroll","$ionicPopover","$state","$ionicHistory","$q","$controller","$timeout","$filter","$translate","UIUtils","ModalUtils","csCrypto","csConfig","csSettings","csCurrency","csWallet","esModals","esProfile","esHttp","mkRecord","mkTx"],_e.$inject=["$scope","$rootScope","$q","$state","$ionicPopover","$timeout","mkRecord","$ionicHistory","$focus","$controller","UIUtils","ModalUtils","BMA","csConfig","esHttp","csSettings","csCurrency","mkSettings"],Te.$inject=["$scope","parameters","csSettings","mkTx"],angular.module("cesium.market.record.controllers",["cesium.market.record.services","cesium.es.services","cesium.es.common.controllers"]).config(["$stateProvider",function(e){e.state("app.market_view_record",{url:"/market/view/:id/:title?refresh",views:{menuContent:{templateUrl:"plugins/market/templates/record/view_record.html",controller:"MkRecordViewCtrl"}}}).state("app.market_view_record_anchor",{url:"/market/view/:id/:title/:anchor?refresh",views:{menuContent:{templateUrl:"plugins/market/templates/record/view_record.html",controller:"MkRecordViewCtrl"}}}).state("app.market_add_record",{cache:!1,url:"/market/add/:type",views:{menuContent:{templateUrl:"plugins/market/templates/record/edit_record.html",controller:"MkRecordEditCtrl"}}}).state("app.market_edit_record",{cache:!1,url:"/market/edit/:id/:title",views:{menuContent:{templateUrl:"plugins/market/templates/record/edit_record.html",controller:"MkRecordEditCtrl"}}})}]).controller("MkRecordViewCtrl",he).controller("MkRecordEditCtrl",_e).controller("MkRecordPaymentModalCtrl",Te),be.$inject=["$scope","$controller","UIUtils"],ve.$inject=["$scope","$controller","UIUtils","csWallet","mkRecord"],angular.module("cesium.market.wallet.controllers",["cesium.es.services"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,n,t){t.plugins&&t.plugins.es&&n.extendState("app.view_wallet",{points:{general:{templateUrl:"plugins/market/templates/wallet/view_wallet_extend.html",controller:"ESExtensionCtrl"}}}),e.state("app.market_wallet_records",{url:"/records/wallet",views:{menuContent:{templateUrl:"plugins/market/templates/wallet/view_wallet_records.html",controller:"MkWalletRecordsCtrl"}}}).state("app.market_favorites",{cache:!1,url:"/favorites",views:{menuContent:{templateUrl:"plugins/market/templates/wallet/view_wallet_favorites.html",controller:"MkWalletFavoritesCtrl"}}})}]).controller("MkWalletRecordsCtrl",be).controller("MkWalletFavoritesCtrl",ve),Oe.$inject=["$scope","$translate","UIUtils","csConfig","mkCategory","csSettings"],Re.$inject=["$scope","$controller","$state"],Ie.$inject=["$scope","$controller","$ionicPopup","$translate","$q","UIUtils","csConfig","csSettings","mkCategory"],angular.module("cesium.market.category.controllers",["cesium.market.record.services","cesium.market.category.services","cesium.services"]).config(["$stateProvider",function(e){e.state("app.market_categories",{url:"/market/categories",views:{menuContent:{templateUrl:"plugins/market/templates/category/view_categories.html",controller:"MkViewCategoriesCtrl"}},data:{large:"app.market_categories_lg"}}).state("app.market_categories_lg",{url:"/market/categories/lg",views:{menuContent:{templateUrl:"plugins/market/templates/category/view_categories_lg.html",controller:"MkViewCategoriesCtrl"}}}).state("app.market_categories_edit",{url:"/market/categories/edit",views:{menuContent:{templateUrl:"plugins/market/templates/category/edit_categories.html",controller:"MkEditCategoriesCtrl"}}})}]).controller("MkListCategoriesCtrl",Oe).controller("MkViewCategoriesCtrl",Re).controller("MkEditCategoriesCtrl",Ie),Ne.$inject=["$scope","$controller","UIUtils"],angular.module("cesium.market.wot.controllers",["cesium.es.services"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,n,t){t.plugins&&t.plugins.es&&n.extendStates(["app.user_identity","app.user_identity_name"],{points:{general:{templateUrl:"plugins/market/templates/wot/view_identity_extend.html",controller:"ESExtensionCtrl"},"after-general":{templateUrl:"plugins/market/templates/wot/view_identity_extend.html",controller:"ESExtensionCtrl"}}}),e.state("app.market_identity_records",{url:"/market/records/:pubkey",views:{menuContent:{templateUrl:"plugins/market/templates/wot/view_identity_records.html",controller:"MkIdentityRecordsCtrl"}}})}]).controller("MkIdentityRecordsCtrl",Ne),Se.$inject=["$scope","$controller","$timeout","$state","$filter"],angular.module("cesium.market.document.controllers",["cesium.es.services"]).controller("MkLastDocumentsCtrl",Se),angular.module("cesium.graph.plugin",["cesium.graph.services","cesium.graph.common.controllers","cesium.graph.docstats.controllers","cesium.graph.synchro.controllers","cesium.graph.network.controllers"]),angular.module("cesium.graph.services",["cesium.graph.color.services","cesium.graph.data.services"]),angular.module("cesium.graph.data.services",["cesium.es.http.services"]).factory("gpData",["$rootScope","$q","$timeout","esHttp",function(e,n,t,a){var i={node:{},wot:{},blockchain:{},docstat:{},synchro:{execution:{}},raw:{block:{search:a.post("/:currency/block/_search")},blockstat:{search:a.post("/:currency/blockstat/_search")},movement:{search:a.post("/:currency/movement/_search")},user:{event:a.post("/user/event/_search?pretty")},docstat:{search:a.post("/document/stats/_search")},synchro:{search:a.post("/:currency/synchro/_search")}},regex:{}};function o(e){return(e=e||{}).maxRangeSize=e.maxRangeSize||30,e.defaultTotalRangeCount=e.defaultTotalRangeCount||2*e.maxRangeSize,e.rangeDuration=e.rangeDuration||"day",e.endTime=e.endTime||moment().utc().add(1,e.rangeDuration).unix(),e.startTime=e.startTime||moment.unix(e.endTime).utc().subtract(e.defaultTotalRangeCount,e.rangeDuration).unix(),e.firstBlockTime&&e.startTime<e.firstBlockTime&&(e.startTime=e.firstBlockTime),e}return i.docstat.get=function(e){e=o(e);for(var t=[],a=moment.unix(e.startTime).utc().startOf(e.rangeDuration),s=moment.unix(e.endTime).utc().startOf(e.rangeDuration),r=[],l=function(e){var n=e.aggregations;return(n.range&&n.range.buckets||[]).reduce((function(e,n){var t={from:n.from,to:n.to};return _.forEach(n.index&&n.index.buckets||[],(function(e){var n=e.key;_.forEach(e.type&&e.type.buckets||[],(function(e){var a=n+"_"+e.key;t[a]=e.max.value,d[a]||(d[a]=!0)}))})),e.concat(t)}),[])};a.isBefore(s);)if(r.push({from:a.unix(),to:a.add(1,e.rangeDuration).unix()}),r.length===e.maxRangeSize||!a.isBefore(s)){var c={size:0,aggs:{range:{range:{field:"time",ranges:r},aggs:{index:{terms:{field:"index",size:0},aggs:{type:{terms:{field:"type",size:0},aggs:{max:{max:{field:"count"}}}}}}}}}};r=[];var d={},u={request_cache:!angular.isDefined(e.cache)||e.cache};10===t.length?(console.error("Too many parallel jobs!"),a=moment.unix(e.endTime).utc()):t.push(i.raw.docstat.search(c,u).then(l))}return n.all(t).then((function(e){return e=e.reduce((function(e,n){return n&&n.length?e.concat(n):e}),[]),e=_.sortBy(e,"from"),_.keys(d).reduce((function(n,t){return n[t]=_.pluck(e,t),n}),{times:_.pluck(e,"from")})}))},i.synchro.execution.get=function(e){e=o(e);for(var t=[],a=moment.unix(e.startTime).utc().startOf(e.rangeDuration),s=moment.unix(e.endTime).utc().startOf(e.rangeDuration),r=[],l=function(e){var n=e.aggregations;return(n.range&&n.range.buckets||[]).reduce((function(e,n){var t={from:n.from,to:n.to,inserts:n.result.inserts.value,updates:n.result.inserts.value,deletes:n.result.deletes.value,duration:n.duration.value};return _.forEach(n.api&&n.api.buckets||[],(function(e){
t[e.key]=e.peer_count&&e.peer_count.value||0,d[e.key]||(d[e.key]=!0)})),e.concat(t)}),[])};a.isBefore(s);)if(r.push({from:a.unix(),to:a.add(1,e.rangeDuration).unix()}),r.length===e.maxRangeSize||!a.isBefore(s)){var c={size:0,aggs:{range:{range:{field:"time",ranges:r},aggs:{api:{terms:{field:"api",size:0},aggs:{peer_count:{cardinality:{field:"peer"}}}},duration:{sum:{field:"executionTime"}},result:{nested:{path:"result"},aggs:{inserts:{sum:{field:"result.inserts"}},updates:{sum:{field:"result.updates"}},deletes:{sum:{field:"result.deletes"}}}}}}}};r=[];var d={};10===t.length?(console.error("Too many parallel jobs!"),a=moment.unix(e.endTime).utc()):t.push(i.raw.synchro.search(c,{currency:e.currency}).then(l))}return n.all(t).then((function(e){e=e.reduce((function(e,n){return n&&n.length?e.concat(n):e}),[]),e=_.sortBy(e,"from");var n={times:_.pluck(e,"from"),inserts:_.pluck(e,"inserts"),updates:_.pluck(e,"updates"),deletes:_.pluck(e,"deletes"),duration:_.pluck(e,"duration")};return _.keys(d).forEach((function(t){n[t]=_.pluck(e,t)})),n}))},i}]),angular.module("cesium.graph.color.services",[]).factory("gpColor",(function(){var e={css2Rgb:{white:[255,255,255],assertive:[239,71,58],calm:[17,193,243],positive:[56,126,245],balanced:[51,205,95],energized:[255,201,0],royal:[136,106,234],gray:[150,150,150],stable:[248,248,248]}},n={scale:{}};return n.scale.custom=function(e,n,t,a){function i(e){switch(e){case 0:return 0;case 1:return-1;case 2:return 0;case 3:return 1}}n=n>0&&n||.55;for(var o=Math.round(e/2.5),s=t&&3==t.length?angular.copy(t):[255,0,0],r=a&&3==a.length?angular.copy(a):[0,2,3],l=t?[Math.round(255/o),Math.round(255/o),Math.round(255/o)]:[Math.round((s[0]-50)/o),Math.round((255-s[1])/o),Math.round((255-s[2])/o)],c=[i(r[0]),i(r[1]),i(r[2])],d=[0,0,0],u=[],p=0;p<e;p++){for(var m=0;m<3;m++)s[m]+=c[m]*l[m],d[m]++,((s[m]<=0||s[m]>=255)&&0!==c[m]||0===c[m]&&d[m]==o)&&(s[m]<=0?s[m]=0:s[m]>=255&&(s[m]=255),r[m]=(r[m]+1)%4,c[m]=i(r[m]),d[m]=0);u.push("rgba("+s[0]+","+s[1]+","+s[2]+","+n+")")}return u},n.scale.default=function(){return n.scale.custom(25)},n.scale.fix=function(e,t){return Array.apply(null,Array(e||25)).map(String.prototype.valueOf,t||n.rgba.calm(.5))},n.rgba=_.mapObject(e.css2Rgb,(function(e){var n="rgba("+e.join(",")+",";return function(t){return!t||t<0?"rgb("+e.join(",")+")":n+t+")"}})),n.rgba.translucent=function(){return"rgb(0,0,0,0)"},n.constants=e,n})),Ae.$inject=["$scope","$filter","$ionicPopover","$ionicHistory","$state","csSettings","csCurrency","UIUtils"],angular.module("cesium.graph.common.controllers",["cesium.services"]).controller("GpCurrencyAbstractCtrl",Ae),De.$inject=["$scope","$state","$controller","$q","$translate","gpColor","gpData","$filter"],angular.module("cesium.graph.docstats.controllers",["chart.js","cesium.graph.services","cesium.graph.common.controllers"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,n,t){e.state("app.doc_stats_lg",{url:"/data/stats?stepUnit&t&hide&scale",views:{menuContent:{templateUrl:"plugins/graph/templates/docstats/view_stats.html",controller:"GpDocStatsCtrl"}}}),t.plugins&&t.plugins.es}]).controller("GpDocStatsCtrl",De),Ce.$inject=["$scope","$controller","$q","$translate","gpColor","gpData","$filter"],angular.module("cesium.graph.synchro.controllers",["chart.js","cesium.graph.services","cesium.graph.common.controllers"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,n,t){e.state("app.doc_synchro_lg",{url:"/data/synchro?stepUnit&t&hide&scale",views:{menuContent:{templateUrl:"plugins/graph/templates/synchro/view_stats.html",controller:"GpSynchroCtrl"}}}),t.plugins&&t.plugins.es}]).controller("GpSynchroCtrl",Ce),Le.$inject=["$scope","PluginService","esSettings"],Pe.$inject=["$scope","$timeout","PluginService","esSettings","csCurrency","gpData"],angular.module("cesium.graph.network.controllers",["chart.js","cesium.graph.services"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,n,t){t.plugins&&t.plugins.es&&n.extendState("app.es_network",{points:{buttons:{templateUrl:"plugins/graph/templates/network/view_es_network_extend.html",controller:"GpNetworkViewExtendCtrl"}}}).extendState("app.view_es_peer",{points:{general:{templateUrl:"plugins/graph/templates/network/view_es_peer_extend.html",controller:"ESExtensionCtrl"}}})}]).controller("GpNetworkViewExtendCtrl",Le).controller("GpPeerViewExtendCtrl",Pe),angular.module("cesium.map.plugin",["ui-leaflet","cesium.map.services","cesium.map.shape.controllers","cesium.map.home.controllers","cesium.map.user.controllers"]).config((function(){L.AwesomeMarkers.Icon.prototype.options.prefix="ion"})),angular.module("cesium.map.services",["cesium.map.utils.services","cesium.map.shape.services"]),angular.module("cesium.map.utils.services",["cesium.services","ui-leaflet"]).factory("MapUtils",["$timeout","$q","$translate","leafletData","csConfig","csSettings","esGeo","UIUtils","leafletHelpers",function(e,n,t,a,i,o,s,r,l){var c=i.plugins&&i.plugins.es&&i.plugins.es.googleApiKey;function d(e,n){return l.isSameCenterOnMap(e,n)}return constants={locations:{FRANCE:{lat:46.5588603,lng:4.229736328124999,zoom:6}},LOCALIZE_ZOOM:14},constants.DEFAULT_CENTER=o.data&&o.data.plugins&&o.data.plugins.map&&o.data.plugins.map.center||constants.locations.FRANCE,{map:function(e){var n;return(e=angular.merge({center:angular.copy(constants.DEFAULT_CENTER),defaults:{scrollWheelZoom:!0},layers:{baselayers:{osm:{name:"OpenStreetMap",type:"xyz",url:"http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",layerOptions:{subdomains:["a","b","c"],attribution:'&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>',continuousWorld:!0}},cycle:{name:"Google map",type:"xyz",url:"http://{s}.google.com/vt/lyrs=m&x={x}&y={y}&z={z}&key="+c,layerOptions:{subdomains:["mt0","mt1","mt2","mt3"],attribution:'&copy; <a href="http://google.com/copyright">Google</a>',continuousWorld:!0}}}},controls:{custom:[]}},e||{})).layers.overlays&&(n=_.keys(e.layers.overlays).reduce((function(n,t){return n.concat(e.layers.overlays[t].name)}),[]),t(n).then((function(n){_.keys(e.layers.overlays||{}).forEach((function(t){e.layers.overlays[t].name=n[e.layers.overlays[t].name]}))}))),e},center:{get:function(e){var n;if(e&&(e.lat&&((n={}).lat=parseFloat(e.lat)),(e.lng||e.lon)&&((n=n||{}).lng=parseFloat(e.lng||e.lon)),e.zoom&&((n=n||{}).zoom=parseFloat(e.zoom)),n))return l.isValidCenter(n)||(n=angular.merge({},constants.DEFAULT_CENTER,n)),n},isSame:d,isDefault:function(e){var n=constants.DEFAULT_CENTER;return!(!e.lat||!e.lng||n.lat.toFixed(4)!==e.lat.toFixed(4)||n.lng.toFixed(4)!==e.lng.toFixed(4)||n.zoom!==e.zoom)}},updateCenter:function(t,a){return d(a,t)?n.when():e((function(){t.invalidateSize(),t._resetView(a,a.zoom,!0)}),300)},control:{search:function(e){(e=e||{}).initial=!!angular.isDefined(e.initial)&&e.initial,e.marker=!!angular.isDefined(e.marker)&&e.marker,e.propertyName=angular.isDefined(e.propertyName)?e.propertyName:"title",e.position=angular.isDefined(e.position)?e.position:"topleft",e.zoom=angular.isDefined(e.zoom)?e.zoom:constants.LOCALIZE_ZOOM,e.markerLocation=!angular.isDefined(e.markerLocation)||e.markerLocation;var n=t(["MAP.COMMON.SEARCH_DOTS","COMMON.SEARCH_NO_RESULT"]);return{addTo:function(t){n.then((function(n){L.control.search(angular.merge(e,{textPlaceholder:n["MAP.COMMON.SEARCH_DOTS"],textErr:n["COMMON.SEARCH_NO_RESULT"]})).addTo(t)}))}}},localizeMe:function(){return L.easyButton("icon ion-android-locate",(function(e,n){return s.point.current().then((function(e){n.invalidateSize(),n._resetView({lat:e.lat,lng:e.lon},constants.LOCALIZE_ZOOM,!0)})).catch(r.onError("MAP.ERROR.LOCALIZE_ME_FAILED"))}))}},constants:constants}}]),angular.module("cesium.map.shape.services",["cesium.services","cesium.map.utils.services","cesium.graph.color.services"]).factory("esShape",["$rootScope","$q","csPlatform","csCache","esHttp","gpColor",function(e,n,t,a,i,o){var s={shapesById:null},r={commons:["type","geometry","properties"]},l=d3.geoMercator,c={attributes:{geoViewBox:"gchange:geoViewBox",geoScale:"gchange:geoScale",geoTranslate:"gchange:geoTranslate",viewBox:"viewBox"},style:{defaults:{fill:"#1a237e",stroke:"lightgrey"},active:{fill:o.rgba.balanced()}},projection:{degreePrecision:1e-5},positions:["topleft","bottomleft","main","topright","bottomright"]},d={postSearch:i.post("/shape/record/_search"),get:i.get("/shape/record/:id"),getCommons:i.get("/shape/record/:id?_source="+r.commons.join(",")),add:i.record.post("/shape/record"),update:i.record.post("/shape/record/:id/_update"),remove:i.record.remove("shape","record")},u={error:{SELF_INTERSECTION:new RegExp("Self-intersection at or near point \\(([0-9.-]+), ([0-9.-]+),"),HOLE_LIES_OUTSIDE:new RegExp("Hole lies outside shell at or near point \\(([0-9.-]+), ([0-9.-]+),"),HOLE_NOT_WITHIN_POLYGON:new RegExp("Hole is not within polygon")}};function p(e){var n=e._source;return n.id=e._id,n}function m(e){var n=[];e&&e.country&&n.push({nested:{path:"properties",query:{bool:{filter:{term:{"properties.country":e.country}}}}}});var t={size:1e3,_source:"properties.id"};return n.length&&(t.query=t.query||{bool:{}},t.query.bool.filter=n),d.postSearch(t).then((function(e){return e&&e.hits&&e.hits.total?_.pluck(e.hits.hits,"_id"):[]}))}function E(e,n){if(!e)throw new Error("Missing geoJson argument");(n=n||{}).onclick=n.onclick||function(){console.debug("TODO: handle click on a SVG element")},n.selector&&!0!==n.append&&d3.selectAll(n.selector+" svg").remove();var t=n.selector||"body",a=d3.select(t);if(n.selector&&a.empty())throw new Error("Cannot found element '{0}'".format(t));var i=n.width||a.node().getBoundingClientRect().width,o=n.height||i,s=l().translate([0,0]).scale(1),r=d3.geoPath().projection(s),d=a.append("svg").attr("preserveAspectRatio","xMinYMin meet").attr("viewBox",[0,0,i,o].join(" ")).attr("width",i).attr("height",o);n.class&&d.attr("class",n.class);var u=r.bounds(e),p=u[0][0],m=u[0][1],E=u[1][0],g=u[1][1],f=E-p,h=g-m,_=.95/Math.max(f/i,h/o),T=[(i-_*(E+p))/2,(o-_*(g+m))/2];return s.scale(_).translate(T),d.selectAll("path").data(e.features).enter().append("path").attr("d",r).on("mouseover",(function(e){d3.select(this).style("fill",c.style.active.fill).style("cursor","pointer")})).on("mouseout",(function(e){d3.select(this).style("fill",c.style.defaults.fill)})).on("click",(function(e){n.onclick(e,this)})).style("fill",c.style.defaults.fill).style("stroke",c.style.defaults.stroke).append("svg:title").text((function(e){return e.properties&&e.properties.title})),d}function g(e){if(e){var n=e.attr(":"+c.attributes.geoViewBox)||e.attr(":"+c.attributes.geoViewBox.toLowerCase());if(!n){var t="svg"!==e.node().tagName&&d3.select(e.node().parentNode);if(!t||t.empty())return;return g(t)}var a=n.split(" ");if(4!==a.length)throw new Error('Invalid geoViewBox value. Expected: "left-lng top-lat right-lng bottom-lat"');return{leftLng:parseFloat(a[0]),topLat:parseFloat(a[1]),rightLng:parseFloat(a[2]),bottomLat:parseFloat(a[3])}}}function f(e){if(e){var n=e.attr(c.attributes.viewBox)||e.attr(c.attributes.viewBox.toLowerCase());if(!n){var t=e.attr("width"),a=e.attr("height");if(t&&a)return{minX:0,minY:0,width:parseFloat(t),height:parseFloat(a)}}if(!n){var i="svg"!==e.node().tagName&&d3.select(e.node().parentNode);if(!i||i.empty())return;return f(i)}var o=n.split(" ");if(4!==o.length)throw new Error('Invalid geoViewBox value. Expected: "minx-x min-y width height"');return{minX:parseFloat(o[0]),minY:parseFloat(o[1]),width:parseFloat(o[2]),height:parseFloat(o[3])}}}function h(e){if(e){var n=e.attr(":"+c.attributes.geoScale)||e.attr(":"+c.attributes.geoScale.toLowerCase());if(!n){var t="svg"!==e.node().tagName&&d3.select(e.node().parentNode);if(!t||t.empty())return;return h(t)}return parseFloat(n)}}function T(e,n){if(!e||"string"!=typeof e)throw new Error("Missing required 'svgText' argument");var t=(n=n||{}).selector||"body",a=d3.select(t);if(n.selector&&a.empty())throw new Error("Cannot found element: '{0}'".format(t));var i=a.html(e).select("svg");if(i.empty())throw new Error("Invalid value of 'svgText' argument: no <svg> tag found");if(n.class&&i.classed(n.class,!0),n.width&&(i.attr("width",n.width),i.attr("height",n.height||n.width)),!i.attr("width")||!i.attr("height")){var o=f(i);i.attr("width",o&&o.width||n.width||800).attr("height",o&&o.height||n.height||800)}return i}function b(e,n){if((n=n||{}).scale=n.scale||h(e),n.translate=n.translate||function(e){if(e){var n=e.attr(":"+c.attributes.geoTranslate)||e.attr(":"+c.attributes.geoTranslate.toLowerCase());if(!n){var t="svg"!==e.node().tagName&&d3.select(e.node().parentNode);if(!t||t.empty())return;return h(t)}var a=n.split(" ");if(2!==a.length)throw new Error('Invalid geoTranslate value. Expected: "x y"');return[parseFloat(a[0]),parseFloat(a[1])]}}(e),n.scale&&n.translate)return console.debug("[shape] Find project {scale: {0}, translate: {1}}".format(n.scale,n.translate)),n;var t=n.viewBox||f(e),a=n.geoViewBox||g(e);if(!a||!t)throw new Error("Cannot compute projection. Missing options scale and translate, or <svg> viewBox and/or geoViewBox");console.debug("[shape-service] Computing projection...",t,a);var i=[a.leftLng,a.topLat],o=[a.rightLng,a.bottomLat],s=[t.minX,t.minY],r=[t.minX+t.width,t.minY+t.height],d=a.rightLng-a.leftLng,u=(a.topLat,a.bottomLat,l()),p=0,m=0,E=1e3,_=100,T=100,b=100,v=c.projection.degreePrecision,O=Date.now(),R=function(){if(Date.now()-O>=2e3)throw"TIMEOUT"},I=0;try{for(var N,S;;){++I%20==0&&R(),u.translate([p,m]).scale(E);var A,D,C=u.invert(s),L=u.invert(r),P=L[0]-C[0],y=(C[1],L[1],P-d),k=C[0]-i[0],M=L[0]-o[0],w=Math.abs(k)>Math.abs(M)?k:M,U=C[1]-i[1],x=L[1]-o[1],F=Math.abs(U)>Math.abs(x)?U:x;if(Math.abs(y)>=v&&(D=y<0?-1:1,N===(A="scale")&&D!==S&&(_/=2),_>=v))E+=D*_,N=A,S=D,console.debug("Bad width. New scale={0} (delta: {1}}".format(E,_));else if(Math.abs(w)>=v&&(D=w<0?-1:1,N===(A="x")&&D!==S&&(T/=2),T>=v))p+=D*T,N=A,S=D,console.debug("Bad X. New={0} (delta: {1}}".format(p,T));else{if(!(Math.abs(F)>=v&&(D=F<0?1:-1,N===(A="y")&&D!==S&&(b/=2),b>=v))){console.debug("Projection resolved in {0}ms => {translate: [{1}, {2}], scale: {3}}".format(Date.now()-O,p,m,E));break}m+=D*b,N=A,S=D,console.debug("Bad Y. New={0} (delta: {1}}".format(m,b))}}}catch(e){if("TIMEOUT"!==e)throw e;console.error("[shape-service] Stopping projection computation (timeout)")}return{translate:[p,m],scale:E}}function v(e,t){if(!e)throw new Error("Require 'shape' argument");if(!(t=t||e.properties&&e.properties.id))throw new Error("Invalid GeoJSon feature : missing required attribute 'properties.id'");return console.info("[shape] Saving GeoJson feature {{0}} locally...".format(t)),s.shapesById=s.shapesById||a.get("esShape-",a.constants.LONG),s.shapesById.put(t,e),n.when(t)}function O(e,n){switch(n=!angular.isDefined(n)||n,e&&e.type||null){case"FeatureCollection":return e.features=e.features.map((t=O,a=n,function(e){return t(e,a)})),e;case"Feature":return e.geometry=O(e.geometry,n),e;case"Polygon":case"MultiPolygon":return function(e,n){return"Polygon"===e.type?e.coordinates=R(e.coordinates,n):"MultiPolygon"===e.type&&(e.coordinates=_(e.coordinates).map((function(e){return R(e,n)}))),e}(e,n);default:return e}var t,a}function R(e,n){n=!!n,e[0]=I(e[0],!n);for(var t=1;t<e.length;t++)e[t]=I(e[t],n);return e}function I(e,n){return N(e)===n?e:e.reverse()}function N(e){return function(e){var n=0;if(e.length>2){for(var t,a,i=0;i<e.length-1;i++)t=e[i],n+=S((a=e[i+1])[0]-t[0])*(2+Math.sin(S(t[1]))+Math.sin(S(a[1])));n=6378137*n*6378137/2}return n}(e)>=0}function S(e){return e*Math.PI/180}function A(e){switch(e&&e.type||null){case"FeatureCollection":return e.features=e.features.map(A),e;case"Feature":return e.geometry=A(e.geometry),e;case"Polygon":case"MultiPolygon":return"Polygon"===(n=e).type?n.coordinates=[n.coordinates[0]]:"MultiPolygon"===n.type&&(n.coordinates=_(n.coordinates).map((function(e){return[e[0]]}))),n;default:return e}var n}function D(){console.debug("[shape] Cleaning cache..."),a.clear("esShape-")}return t.ready().then((function(){i.api.node.on.stop(e,D,this)})),{get:function(e,t){if(!e)throw new Error("Missing 'id' argument");if((!t||!1!==t.cache)&&s.shapesById){var a=s.shapesById.get(e);if(a)return n.when(a)}return d.getCommons({id:e}).then((function(n){var t=p(n);return v(e,t),t})).catch((function(e){throw console.error("Unable to load shape by id",e),e}))},save:function(e,t){if(t=t||{},!e)throw new Error("Missing 'geoJson' argument");t&&!1===t.strictMode||(e=O(e,!1)),t&&!1===t.removeHole||(e=A(e));var a=t.country||e.properties&&e.properties.country;if(!a)throw new Error("Missing 'options.country' argument");a=a.toLowerCase();var i="function"==typeof t.updateProgression?t.updateProgression:null,o=Date.now();console.debug("[shape-service] Saving shape {country: {0}}...".format(a));var s,r,l=[],c=e.features.length;return n.all([m(),m({country:a})]).then((function(t){return s=t[0],r=t[1],e.features.reduce((function(e,n,t){n.properties=n.properties||{},n.properties.country=a;var o,p=n.properties.id;if(!angular.isUndefined(p)&&s.includes(p)&&p.toLowerCase().startsWith(a))r.splice(r.indexOf(n.properties.id),1),o=function(){return i&&i(p,t,c),console.debug("[shape-service] - Update {id: {0}}".format(n.properties.id)),d.update(n,{id:n.properties.id})};else{for(var m=t;!n.properties.id||s.includes(p);m++)p=a+"-"+m;n.properties.id=p,s.push(p),o=function(){return console.debug("[shape-service] - Add {id: {0}}".format(p)),i&&i(n,t,c),d.add(n)}}return e.then(o).catch((function(e){e=function(e,n){if(console.error("Error while updating {id: {0}}: {1}".format(n,e&&e.message||e)),!e.message)return e;var t=u.error.SELF_INTERSECTION.exec(e.message);return t?{type:"error",message:"MAP.SHAPE.EDIT.ERROR.SELF_INTERSECTION",messageParams:{id:n},lon:parseFloat(t[1]),lat:parseFloat(t[2])}:(t=u.error.HOLE_LIES_OUTSIDE.exec(e.message))?{type:"error",message:"MAP.SHAPE.EDIT.ERROR.HOLE_LIES_OUTSIDE",messageParams:{id:n},lon:parseFloat(t[1]),lat:parseFloat(t[2])}:(t=u.error.HOLE_NOT_WITHIN_POLYGON.exec(e.message))?{type:"error",message:"MAP.SHAPE.EDIT.ERROR.HOLE_NOT_WITHIN_POLYGON",messageParams:{id:n}}:e}(e,n.properties.id),l.push(e&&e.message?e:"Error while updating {id: {0}}: {1}".format(n.properties.id,e))}))}),n.when())})).then((function(){if(r.length)return r.reduce((function(e,n,t){return console.debug("[shape-service] - Delete {id: {0}}".format(n)),d.remove(n).catch((function(e){l.push("Error while deleting {id: {0}}: {1}".format(n,e&&e.message||e))}))}),n.when())})).then((function(){if(l.length)throw console.error(" - "+l.join("\n -")),{message:"MAP.SHAPE.EDIT.ERROR.SAVE_FAILED",errors:l};console.debug("[shape-service] Shape saved in {0}ms".format(Date.now()-o))}))},getAllIds:m,getAllCountries:function(){return d.postSearch({size:0,aggs:{countries:{nested:{path:"properties"},aggs:{names:{terms:{field:"properties.country",size:0}}}}}}).then((function(e){return e&&e.hits&&e.hits.total?e.aggregations.countries.names.buckets.reduce((function(e,n){return e.concat({id:n.key,docCount:n.doc_count})}),[]):[]}))},geoJson:{search:function(e){if(!e)throw new Error("Missing 'options' argument");console.debug("[map] [shape] Loading shape from options: ",e);var n=[],t=[];e.country&&t.push({nested:{path:"properties",query:{bool:{filter:{term:{"properties.country":e.country}}}}}});var a={};return n.length&&(a.query={bool:{}},a.query.bool.should=n,a.query.bool.minimum_should_match=1),t.length&&(a.query=a.query||{bool:{}},a.query.bool.filter=t),a.from=a.from||0,a.size=a.size||100,a.size<100&&(a.size=100),a._source=a._source||r.commons,d.postSearch(a).then((function(e){if(e&&e.hits&&e.hits.total)return{type:"FeatureCollection",features:(e.hits.hits||[]).map(p)}}))}},cache:{put:v,clear:D},svg:{create:E,remove:function(e){if(!e&&!e.selector)throw new Error("Missing 'options.selector' argument");d3.select(e.selector+" svg").remove()},createMosaic:function(e,n){if(!e)throw new Error("Missing 'geoJson' argument");if(!e.features)throw new Error("Missing 'geoJson.features' argument");var t=(n=n||{}).selector||"body",a=d3.select(t).classed("shape-container",!0);if(n.compacted?a.classed("compacted",!0):n.compacted=a.classed("compacted"),n.selector&&a.empty())throw new Error("Cannot found element: '{0}'".format(t));var i=n.width||a.node().getBoundingClientRect().width,o=n.height||i,s=_.groupBy(e.features,(function(e){return e.properties&&e.properties.position||"main"}));a.selectAll("*").remove(),_(c.positions).each((function(r){var l=s[r];if(l){var c,d=t+" ."+r;if(a.append("div").classed(r,!0),"main"===r)c=n.compacted?i:.8*i,E({type:e.type,features:l},angular.merge({},n,{selector:d,append:!1,width:c,height:Math.min(c,o)}));else{l=_.sortBy(l,(function(e){return e.properties&&e.properties.order||999})),c=.1*i;var u=angular.merge({},n,{selector:d,append:!0,width:c,height:Math.min(c,o/12)});_.each(l,(function(n){E({type:e.type,features:[n]},u)}))}}}))},findGeoViewBox:g,createFromText:T,projectionData:b,toGeoJson:function(e,n){if(!e)throw new Error("Missing required 'svgElement' argument");(n=n||{}).attributes=n.attributes||["id","name","title"],n.scale=n.scale||1,n.precision=n.precision>0?n.precision:null;var t=n.selector||"body",a=d3.select(t);if(n.selector&&a.empty())throw new Error("Cannot found element: '{0}'".format(t));if((e="string"==typeof e?T(e,n):e||a.select("svg")).empty())throw new Error("Cannot found element <svg> element");var i=f(e);if(!i)throw new Error("Bad SVG format: missing attribute '{0}'".format(c.attributes.viewBox));var o=n.geoViewBox||g(e);if(!o)throw new Error("Bad SVG format: missing attribute '{0}'".format(c.attributes.geoViewBox));var s,r=b(e,angular.merge({},n,{viewBox:i,geoViewBox:o}));if(r)s=l().translate(r.translate||[0,0]).scale(r.scale||1).invert;else{var d=d3.scaleLinear().range([o.leftLng,o.rightLng]).domain([i.minX,i.width]),u=d3.scaleLinear().range([o.topLat,o.bottomLat]).domain([i.minY,i.height]);s=function(e){return[d(e[0])*n.scale,u(e[1])*n.scale]}}var p=[];return e.selectAll("path").each((function(){var e=d3.select(this),t=function(e,n,t){if(!e||!n)throw new Error("Missing 'element' or 'projection' argument");"function"!=typeof e.node&&(e=d3.select(e));var a=e.node().tagName;if("svg"===a)throw new Error("Invalid 'svgElement': must be child of <svg> tag, but not the <svg> tag itself.");if("rect"===a){var i=e.x.baseVal.value,o=e.y.baseVal.value,s=e.height.baseVal.value,r=e.width.baseVal.value;return{type:"Polygon",coordinates:[[n([i,o]),n([i,o+s]),n([i+r,o+s]),n([i+r,o]),n([i,o])]]}}if("polyline"===a)throw new Error("polyline not implemented yet");if("path"===a){var l=e.attr("d");if(!l)return[];var d,u=(l=l.trim().replace(/([0-9])-([0-9])/g,"$1,$2").replace(/([0-9])([a-zA-Z])/g,"$1 $2").replace(/([a-zA-Z])([-0-9])/g,"$1 $2")).split(" "),p=/^[a-zA-Z]/,m=[],E=[],g=0;_(u||[]).forEach((function(e,n){if(p.test(e)){switch(d=e.substr(0,1)){case"z":case"Z":E.length&&(E.length>1&&(E.push(E[0]),E.length>=4?m.push(E):console.debug("[shape-service] An invalid polygon has been ignore",E)),d=void 0,E=[],g=!1)}e=e.substr(1)}if(g>0)g--;else if(e&&e.trim().length>0){var t=e.split(",");if(t.length>2)return;t=_(t).map(parseFloat);var a,i=E.length,o=i&&E[i-1];if(!o&&m.length){var s=m[m.length-1];o=s.length&&s[s.length-1]}switch(d){case"M":2===t.length&&(a=t),d="L";break;case"m":2===t.length&&(a=o?[t[0]+o[0],t[1]+o[1]]:t),d="l";break;case"L":2===t.length&&(a=t);break;case"l":2===t.length&&(a=o?[t[0]+o[0],t[1]+o[1]]:t);break;case"H":1===t.length&&(a=o?[t[0],o[1]]:[t[0],0]);break;case"h":1===t.length&&(a=o?[t[0]+o[0],o[1]]:[t[0],0]);break;case"V":1===t.length&&(a=o?[o[0],t[0]]:[0,t[0]]);break;case"v":1===t.length&&(a=o?[o[0],t[0]+o[1]]:[0,t[0]]);break;case"C":console.warn("[svg] SVG curve action. Skipping"),d="L",g=1;break;case"c":console.warn("[svg] SVG curve action. Skipping"),d="l",g=1}a?E.push(a):console.warn("[svg] Invalid {0} data: "+e)}})),E.length>=4&&(console.warn("[svg] Invalid polygon found (not closed). Will force last point."),m.push(E));var f,h=[],T=[];return _(m).each((function(e,a){var i=N(e);0===T.length&&(f=i);var o=i!==f;console.debug("At index {0} {clockwise: {1}, isHole: {2}}".format(a,i,o));var s=function(e){var a=[],i=c.projection.degreePrecision,o=0;return _(e).each((function(e){if(2!==e.length)throw new Error("Invalid point: "+e.join(","));var s,r,l=n(e);t&&(l=[Math.round(l[0]/i)*i,Math.round(l[1]/i)*i]),a.length&&(s=l,r=a[a.length-1],s[0]===r[0]&&s[1]===r[1])?o++:a.push(l)})),o>0&&console.debug("[shape-service] Removed {0} duplicated points".format(o)),a}(e);!o&&T.length&&(h.push(T),T=[]),s.length>=4&&T.push(s)})),T.length&&h.push(T),1===h.length?{type:"Polygon",coordinates:h[0]}:{type:"MultiPolygon",coordinates:h}}}(e,s,n.precision),a={};_(n.attributes||[]).forEach((function(n){var t=e.attr(n);t&&(a[n]=t)})),p.push({type:"Feature",properties:a,geometry:t})})),{type:"FeatureCollection",features:p}}},constants:c}}]),ye.$inject=["$scope","$translate","$timeout","$q","$document","UIUtils","csConfig","csSettings","esShape"],ke.$inject=["$scope","$rootScope","$state","$controller","$timeout","$q","leafletData","$translate","FileSaver","UIUtils","MapUtils","csWallet","esShape"],angular.module("cesium.map.shape.controllers",["cesium.services","cesium.map.shape.services"]).config(["$stateProvider",function(e){e.state("app.map_shape_country_edit",{url:"/map/country/edit",views:{menuContent:{templateUrl:"plugins/map/templates/shape/edit_shape.html",controller:"MapCountryEditCtrl"}}})}]).controller("MapShapeViewCtrl",ye).controller("MapCountryEditCtrl",ke),Me.$inject=["$scope","$rootScope","$controller","$state","csPlatform","UIUtils","esShape","csSettings"],angular.module("cesium.map.home.controllers",["ngResource","cesium.es.services","cesium.map.shape.controllers"]).config(["PluginServiceProvider",function(e){e.extendState("app.home",{points:{"footer-end":{templateUrl:"plugins/map/templates/shape/view_shape.html",controller:"MapHomeCtrl"}}})}]).controller("MapHomeCtrl",Me),angular.module("cesium.map.user.controllers",["cesium.services","cesium.map.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&e.extendState("app.user_edit_profile",{points:{"after-position":{templateUrl:"plugins/map/templates/user/edit_profile_extend.html",controller:"MapEditProfileViewCtrl"}}})}]).controller("MapEditProfileViewCtrl",["$scope","$timeout","$q","MapUtils","$translate",function(e,n,t,a,i){var o=[];e.mapId="map-user-profile-"+e.$id,e.map=a.map({markers:{},center:{zoom:13},defaults:{tileLayerOptions:{attribution:'© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'}}}),e.loading=!0,e.enter=function(t,a){return e.formData&&e.formData.title?(e.loading=!0,e.load()):n(e.enter,500)},e.$on("$csExtension.enter",e.enter),e.$on("$ionicParentView.enter",e.enter),e.load=function(){return e.formData.geoPoint&&e.formData.geoPoint.lat&&e.formData.geoPoint.lon?e.map.markers.geoPoint?(e.map.markers.geoPoint.lat=e.formData.geoPoint.lat,void(e.map.markers.geoPoint.lng=e.formData.geoPoint.lon)):i("MAP.PROFILE.MARKER_HELP").then((function(n){e.map.markers.geoPoint={message:n,lat:parseFloat(e.formData.geoPoint.lat),lng:parseFloat(e.formData.geoPoint.lon),draggable:!0,focus:!0},angular.extend(e.map.center,{lat:e.map.markers.geoPoint.lat,lng:e.map.markers.geoPoint.lng});var t=e.$watch("map.markers.geoPoint",(function(){e.loading||e.map.markers.geoPoint&&e.map.markers.geoPoint.lat&&e.map.markers.geoPoint.lng&&(e.formData.geoPoint=e.formData.geoPoint||{},e.formData.geoPoint.lat=e.map.markers.geoPoint.lat,e.formData.geoPoint.lon=e.map.markers.geoPoint.lng)}),!0);o.push(t),e.ionItemClass||(e.ionItemClass="done in"),e.loading=!1})):(_.forEach(o,(function(e){e()})),o=[],delete e.map.markers.geoPoint,e.loading=!1,t.when())},e.$watch("formData.geoPoint",(function(){e.loading||e.load()}),!0)}]),angular.module("gchange",["ionic","ionic-material","ngMessages","pascalprecht.translate","ngApi","angular-cache","angular.screenmatch","angular.bind.notifier","angular-fullscreen-toggle","ImageCropper","ngFileSaver","ngIdle","cesium.plugins","cesium.filters","cesium.config","cesium.platform","cesium.controllers","cesium.templates","cesium.translations","cesium.components","cesium.directives"]).config(["$urlRouterProvider",function(e){e.deferIntercept()}]).run(["$rootScope","$translate","$state","$window","ionicReady","$urlRouter","Device","UIUtils","$ionicConfig","PluginService","csPlatform",function(e,n,t,a,i,o,s,r,l,c,d){d.disableChangeState(),e.$on("$stateChangeStart",(function(n,a,i,o){if(!n.defaultPrevented&&a.data&&!e.tour&&!n.currentScope.tour)return a.data.large&&!r.screen.isSmall()?(n.preventDefault(),void t.go(a.data.large,i)):void 0})),e.$on("$locationChangeSuccess",(function(e,n,a){t.current.data&&!0===t.current.data.silentLocationChange&&a&&a.split("?")[0]===n.split("?")[0]&&e.preventDefault()})),o.listen(),c.start(),i().then((function(){ionic.Platform.isIOS()&&window.StatusBar&&StatusBar.styleLightContent()}))}]),window.ionic.Platform.ready((function(){angular.bootstrap(document,["gchange"])})),angular.module("cesium.components",[]).component("csAvatar",{bindings:{avatar:"<",icon:"@"},template:'<i ng-if="!$ctrl.avatar" class="item-image icon {{$ctrl.icon}}"></i><i ng-if="$ctrl.avatar" class="item-image avatar" style="background-image: url({{::$ctrl.avatar.src}})"></i>'}).component("csBadgeCertification",{bindings:{requirements:"=",parameters:"<",csId:"@"},templateUrl:"templates/common/badge_certification_count.html"}).component("csBadgeGivenCertification",{bindings:{identity:"=",parameters:"<",csId:"@"},templateUrl:"templates/common/badge_given_certification_count.html"}).component("csSortIcon",{bindings:{asc:"=",sort:"=",toggle:"<"},template:'<i class="ion-chevron-up" ng-class="{gray: !$ctrl.asc || $ctrl.sort != $ctrl.toggle}" style="position: relative;left : 5px; top:-5px; font-size: 9px;"></i><i class="ion-chevron-down" ng-class="{gray : $ctrl.asc || $ctrl.sort != $ctrl.toggle}" style="position: relative; left: -2.6px; top: 3px; font-size: 9px;"></i>'}).component("csRemovableSelectionItem",{transclude:!0,controller:function(){this.$onInit=function(){alert("$onInit called: ",this)},this.remove=function(){alert("remove called: ",this)}},template:'<div > <ng-transclude></ng-transclude> <i class="icon ion-close" ng-click="$ctrl.remove();"></i></div>'}),angular.module("cesium.directives",[]).directive("compareTo",(function(){return{require:"?ngModel",link:function(e,n,t,a){a&&t.compareTo&&(a.$validators.compareTo=function(n){return n==e.$eval(t.compareTo)},e.$watch(t.compareTo,(function(){a.$validate()})))}}})).directive("differentTo",(function(){return{require:"?ngModel",link:function(e,n,t,a){a&&t.differentTo&&(a.$validators.differentTo=function(n){return n!=e.$eval(t.differentTo)},e.$watch(t.differentTo,(function(){a.$validate()})))}}})).directive("numberFloat",(function(){var e=new RegExp("^[0-9]+([.,][0-9]+)?$");return{require:"?ngModel",link:function(n,t,a,i){i&&(i.$validators.numberFloat=function(n){return i.$isEmpty(n)||e.test(n)})}}})).directive("numberInt",(function(){var e=new RegExp("^[0-9]+$");return{require:"ngModel",link:function(n,t,a,i){i&&(i.$validators.numberInt=function(n){return i.$isEmpty(n)||e.test(n)})}}})).directive("email",(function(){var e=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])?$");return{require:"ngModel",link:function(n,t,a,i){i&&(i.$validators.email=function(n){return i.$isEmpty(n)||e.test(n)})}}})).directive("requiredIf",(function(){return{require:"?ngModel",link:function(e,n,t,a){a&&t.requiredIf&&(a.$validators.required=function(n){return!e.$eval(t.requiredIf)||!a.$isEmpty(n)},e.$watch(t.requiredIf,(function(){a.$validate()})))}}})).directive("geoPoint",(function(){return{require:"?ngModel",link:function(e,n,t,a){a&&(a.$validators.geoPoint=function(e){return a.$isEmpty(e)||angular.isDefined(e.lat)&&angular.isDefined(e.lon)||angular.isUndefined(e.lat)&&angular.isUndefined(e.lon)})}}})).directive("copyOnClick",["$window","Device","UIUtils",function(e,n,t){return{restrict:"A",link:function(e,a,i){var o=function(a){var o=i.copyOnClick;if(null!=o)if(n.clipboard.enable)n.clipboard.copy(o).then((function(){t.toast.show("INFO.COPY_TO_CLIPBOARD_DONE")})).catch(t.onError("ERROR.COPY_CLIPBOARD"));else{var s=o&&o.indexOf("\n")>=0?o.split("\n").length:1;t.popover.show(a,{scope:e,templateUrl:"templates/common/popover_copy.html",bindings:{value:i.copyOnClick,rows:s,copied:!1},autoselect:".popover-copy "+(s<=1?"input":"textarea"),afterShow:document.execCommand?function(e){try{document.execCommand("copy"),t.toast.show("INFO.COPY_TO_CLIPBOARD_DONE",1e3)}catch(e){console.error("[copy-on-click] Failed to copy using document.execCommand('copy')",e)}}:void 0})}};a.bind("click",o),a.bind("hold",o)}}}]).directive("selectOnClick",["$window",function(e){return{restrict:"A",link:function(n,t,a){t.bind("click",(function(){e.getSelection&&!e.getSelection().toString()&&this.value&&this.setSelectionRange(0,this.value.length)}))}}}]).directive("activeLink",["$location",function(e){return{restrict:"A",link:function(n,t,a,i){var o,s=a.activeLink;a.activeLinkPathPrefix?(o=a.activeLinkPathPrefix.substring(1),n.location=e,n.$watch("location.path()",(function(e){e&&0===e.indexOf(o)?t.addClass(s):t.removeClass(s)}))):a.href&&(o=a.href.substring(1),n.location=e,n.$watch("location.path()",(function(e){e&&e==o?t.addClass(s):t.removeClass(s)})))}}}]).directive("input",["$timeout",function(e){return{restrict:"E",scope:{returnClose:"=",onReturn:"&",onFocus:"&",onBlur:"&"},link:function(n,t,a){t.bind("focus",(function(t){n.onFocus&&e((function(){n.onFocus()}))})),t.bind("blur",(function(t){n.onBlur&&e((function(){n.onBlur()}))})),t.bind("keydown",(function(a){13==a.which&&(n.returnClose&&t[0].blur(),n.onReturn&&e((function(){n.onReturn()})))}))}}}]).directive("trustAsHtml",["$sce","$compile","$parse",function(e,n,t){return{restrict:"A",compile:function(a,i){var o=t(i.trustAsHtml),s=t(i.trustAsHtml,(function(e){return(e||"").toString()}));return n.$$addBindingClass(a),function(t,a,i){n.$$addBindingInfo(a,i.trustAsHtml),t.$watch(s,(function(){a.html(e.getTrustedHtml(e.trustAsHtml(o(t)))||""),n(a.contents())(t)}))}}}}]).directive("modalClose",["$ionicHistory","$timeout",function(e,n){return{restrict:"AC",link:function(t,a){a.bind("click",(function(){t.closeModal&&(e.nextViewOptions({historyRoot:!0,disableAnimate:!0,expire:300}),n((function(){e.nextViewOptions({historyRoot:!1,disableAnimate:!1})}),300),t.closeModal())}))}}}]).directive("csExtensionPoint",["$state","$compile","$controller","$templateCache","PluginService",function(e,n,t,a,i){return{restrict:"E",compile:function(e,n){if(angular.isDefined(n.name)){var t=i.extensions.points.getActivesByName(n.name);t.length>0&&(e.html(""),_.forEach(t,(function(n){e.append(function(e){var n=e.templateUrl?a.get(e.templateUrl):e.template;return n?(e.controller&&(n='<ng-controller ng-controller="'+e.controller+'">'+n+"</div>"),n):(console.error("[plugin] Could not found template for extension :"+(e.templateUrl?e.templateUrl:e.template)),"")}(n))})))}return{pre:function(e,n,t){i.extensions.points.current.set(t.name)},post:function(){i.extensions.points.current.set()}}},scope:{content:"="}}}]).directive("onReadFile",["$parse",function(e){return{restrict:"A",scope:!1,link:function(n,t,a){var i=e(a.onReadFile);t.on("change",(function(e){var t=new FileReader,a={name:this.files[0].name,size:this.files[0].size,type:this.files[0].type};t.onload=function(e){n.$applyAsync((function(){i(n,{file:{fileContent:e.target.result,fileData:a}})}))},t.readAsText((e.srcElement||e.target).files[0])}))}}}]).directive("dropZone",["$parse",function(e){return{restrict:"A",scope:!1,link:function(n,t,a){var i=e(a.dropZone);t.bind("dragover",(function(e){e.stopPropagation(),e.preventDefault()})),t.bind("dragenter",(function(e){e.stopPropagation(),e.preventDefault()})),t.bind("dragleave",(function(e){e.stopPropagation(),e.preventDefault()})),t.bind("drop",(function(e){e.stopPropagation(),e.preventDefault();var t=e.dataTransfer.files[0],a={name:t.name,size:t.size,type:t.type},o=new FileReader;o.onload=function(e){n.$apply((function(){i(n,{file:{file:t,fileContent:e.target.result,fileData:a}})}))},o.readAsText(e.dataTransfer.files[0])}))}}}]).directive("fileSelect",["$parse",function(e){"use strict";return{restrict:"A",scope:!1,template:'<input type="file" style="display: none;" /><ng-transclude></ng-transclude>',transclude:!0,link:function(n,t,a){var i=e(a.fileSelect),o=t.children("input[file]");a.accept&&(o[0].accept=a.accept),o.on("change",(function(e){var t=new FileReader,a=this.files[0],s={name:a.name,size:a.size,type:a.type};t.onload=function(e){n.$applyAsync((function(){i(n,{file:{file:a,fileContent:e.target.result,fileData:s}}),o[0].value=""}))},t.readAsText((e.srcElement||e.target).files[0])})),t.on("click",(function(){o[0].click()}))}}}]),angular.module("cesium.filters",["cesium.config","cesium.platform","pascalprecht.translate","cesium.translations"]).service("filterTranslations",["$rootScope","csPlatform","csSettings","$translate",function(e,n,t,a){var i,o=!1,s=this;function r(){return console.debug("[filter] Loading translations for locale [{0}]".format(a.use())),a(["COMMON.DATE_PATTERN","COMMON.DATE_SHORT_PATTERN","COMMON.UD"]).then((function(e){s.DATE_PATTERN=e["COMMON.DATE_PATTERN"],"COMMON.DATE_PATTERN"===s.DATE_PATTERN&&(s.DATE_PATTERN="YYYY-MM-DD HH:mm"),s.DATE_SHORT_PATTERN=e["COMMON.DATE_SHORT_PATTERN"],"COMMON.DATE_SHORT_PATTERN"===s.DATE_SHORT_PATTERN&&(s.DATE_SHORT_PATTERN="YYYY-MM-DD"),s.DATE_MONTH_YEAR_PATTERN=e["COMMON.DATE_MONTH_YEAR_PATTERN"],"COMMON.DATE_MONTH_YEAR_PATTERN"===s.DATE_MONTH_YEAR_PATTERN&&(s.DATE_MONTH_YEAR_PATTERN="MMM YY"),s.UD=e["COMMON.UD"],"COMMON.UD"===s.UD&&(s.UD="UD")}))}return s.ready=function(){return o?$q.when(data):i||s.start()},s.start=function(){return i=n.ready().then(r).then((function(){o=!0,t.api.locale.on.changed(e,r,this)}))},s.start(),s}]).filter("formatInteger",(function(){return function(e){return e?e<1e7?numeral(e).format("0,0"):numeral(e).format("0,0.000 a"):"0"}})).filter("formatAmount",["csConfig","csSettings","csCurrency","$filter",function(e,n,t,a){var i=1/Math.pow(10,e.decimalCount||2),o="0,0.0"+Array(e.decimalCount||2).join("0"),s=a("currencySymbol");return function(e,a){if(void 0!==e)return(a&&angular.isDefined(a.useRelative)?a.useRelative:n.data.useRelative)?function(e,n){var a=n&&n.currentUD?n.currentUD:t.data.currentUD;if(a){var r=e/a;return r=Math.abs(r)<i&&0!==e?"~ 0":numeral(r).format(o),n&&n.currency?r+" "+s(n.currency,!0):r}console.warn("formatAmount: currentUD not defined")}(e,a):function(e,n){var t=numeral(e/100).format(e>-1e9&&e<1e9?"0,0.00":"0,0.000 a");return n&&n.currency?t+" "+s(n.currency,!1):t}(e,a)}}]).filter("formatAmountNoHtml",["csConfig","csSettings","csCurrency","$filter",function(e,n,t,a){var i=1/Math.pow(10,e.decimalCount||2),o="0,0.0"+Array(e.decimalCount||2).join("0"),s=a("currencySymbolNoHtml");return function(e,a){if(void 0!==e)return(a&&angular.isDefined(a.useRelative)?a.useRelative:n.data.useRelative)?function(e,n){var a=n&&n.currentUD?n.currentUD:t.data.currentUD;if(a){var r=e/a;return r=Math.abs(r)<i&&0!==e?"~ 0":numeral(r).format(o),n&&n.currency?r+" "+s(n.currency,!0):r}console.warn("formatAmount: currentUD not defined")}(e,a):function(e,n){var t=numeral(e/100).format(e>-1e9&&e<1e9?"0,0.00":"0,0.000 a");return n&&n.currency?t+" "+s(n.currency,!1):t}(e,a)}}]).filter("currencySymbol",["filterTranslations","$filter","csSettings",function(e,n,t){return function(a,i){return a?(angular.isDefined(i)?i:t.data.useRelative)?e.UD+"<sub>"+n("abbreviate")(a)+"</sub>":n("abbreviate")(a):""}}]).filter("currencySymbolNoHtml",["filterTranslations","$filter","csSettings",function(e,n,t){return function(a,i){return a?(angular.isDefined(i)?i:t.data.useRelative)?e.UD+" "+n("abbreviate")(a):n("abbreviate")(a):""}}]).filter("formatDecimal",["csConfig","csCurrency",function(e,n){var t=1/Math.pow(10,e.decimalCount||2),a="0,0.0"+Array(e.decimalCount||2).join("0");return function(e){return void 0===e?"0":e===1/0||e===-1/0?(console.warn("formatDecimal: division by zero ? (is currentUD defined ?) = "+n.data.currentUD),"error"):Math.abs(e)<t?"~ 0":numeral(e).format(a)}}]).filter("formatNumeral",(function(){return function(e,n){return void 0===e?"0":Math.abs(e)<1e-4?"~ 0":numeral(e).format(n)}})).filter("formatDate",["filterTranslations",function(e){return function(n){return n?moment.unix(parseInt(n)).local().format(e.DATE_PATTERN||"YYYY-MM-DD HH:mm"):""}}]).filter("formatDateShort",["filterTranslations",function(e){return function(n){return n?moment.unix(parseInt(n)).local().format(e.DATE_SHORT_PATTERN||"YYYY-MM-DD"):""}}]).filter("formatDateMonth",["filterTranslations",function(e){return function(n){return n?moment.unix(parseInt(n)).local().format(e.DATE_MONTH_YEAR_PATTERN||"MMM YY"):""}}]).filter("formatDateForFile",["filterTranslations",function(e){return function(n){return n?moment.unix(parseInt(n)).local().format(e.DATE_FILE_PATTERN||"YYYY-MM-DD"):""}}]).filter("formatTime",(function(){return function(e){return e?moment.unix(parseInt(e)).local().format("HH:mm"):""}})).filter("formatFromNow",(function(){return function(e){return e?moment.unix(parseInt(e)).fromNow():""}})).filter("formatDurationTo",(function(){return function(e){return e?moment.unix(moment().utc().unix()+parseInt(e)).fromNow():""}})).filter("formatDuration",(function(){return function(e){return e?moment(0).from(moment.unix(parseInt(e)),!0):""}})).filter("formatDurationMs",(function(){return function(e){return e?e<1e3?e+"ms":e/1e3+"s":""}})).filter("formatPeriod",(function(){return function(e){return e?moment(0).from(moment.unix(parseInt(e)),!0).split(" ").slice(-1)[0]:null}})).filter("formatFromNowShort",(function(){return function(e){return e?moment.unix(parseInt(e)).fromNow(!0):""}})).filter("capitalize",(function(){return function(e){return e?(e=e.toLowerCase()).substring(0,1).toUpperCase()+e.substring(1):""}})).filter("abbreviate",(function(){var e={};return function(n){var t=n||"";if(e[t])return e[t];if(t.length>3){for(var a="",i=["-","_"," "],o=0;o<t.length;o++){var s=t[o];0===o?a="g"===s||"G"===s?"Ğ":s:o>0&&-1!=i.indexOf(t[o-1])&&(a+=s)}t=a.toUpperCase()}else"G"===(t=t.toUpperCase()).charAt(0)&&(t="Ğ"+(t.length>1?t.substr(1):""));return e[n]=t,t}})).filter("upper",(function(){return function(e){return e?e.toUpperCase():""}})).filter("formatPubkey",(function(){return function(e){return e?e.substr(0,8):""}})).filter("formatHash",(function(){return function(e){return e?e.substr(0,4)+e.substr(e.length-4):""}})).filter("formatCategory",(function(){return function(e){return e&&e.length>28?e.substr(0,25)+"...":e}})).filter("formatSlug",(function(){return function(e){return e?encodeURIComponent(e.toLowerCase().replace(/<[^>]+>/g,"").replace(/[^\w ]+/g,"").replace(/ +/g,"-")):""}})).filter("formatEncodeURI",(function(){return function(e){return e?encodeURIComponent(e):""}})).filter("truncText",(function(){return function(e,n){return n=n||500,!e||e.length<=n?e:e.substr(0,n)+"..."}})).filter("truncUrl",(function(){return function(e,n){n=n||25;var t=e&&(e.startsWith("http://")?7:e.startsWith("https://")?8:0)||0;return t=e.startsWith("www.",t)?t+4:t,!e||e.length-t<=n?e.substr(t):e.substr(t,n)+"..."}})).filter("trustAsHtml",["$sce",function(e){return function(n){return e.trustAsHtml(n)}}]).filter("noHtml",(function(){return function(e){return e?e.trim().replace(/<[^>]+>/g,""):""}})),angular.module("cesium.platform",["cesium.config","cesium.services"]).config(["$translateProvider","csConfig",function(e,n){e.uniformLanguageTag("bcp47").determinePreferredLanguage().useSanitizeValueStrategy(null).fallbackLanguage([n.fallbackLanguage?n.fallbackLanguage:"en"]).useLoaderCache(!0)}]).config(["$httpProvider","csConfig",function(e,n){e.defaults.timeout=n.timeout?n.timeout:3e5,e.defaults.useXDomain=!0,delete e.defaults.headers.common["X-Requested-With"]}]).config(["$compileProvider","csConfig",function(e,n){e.debugInfoEnabled(!!n.debug)}]).config(["$animateProvider",function(e){e.classNameFilter(/\banimate-/)}]).config(["CacheFactoryProvider","csConfig",function(e,n){angular.extend(e.defaults,{maxAge:n.cacheTimeMs||3e5})}]).config(["screenmatchConfigProvider",function(e){e.config.rules="bootstrap"}]).config(["$ionicConfigProvider",function(e){var n=ionic.Platform.isIOS();e.scrolling.jsScrolling(n),e.views.maxCache(5)}]).config(["IdleProvider","csConfig",function(e,n){e.idle(n.logoutIdle||600),e.timeout(n.logoutTimeout||15)}]).factory("$exceptionHandler",["$log",function(e){return function(n,t){t?e.error(n,t):e.error(n)}}]).factory("csPlatform",["ionicReady","$rootScope","$q","$state","$translate","$timeout","UIUtils","BMA","Device","csHttp","csConfig","csCache","csSettings","csCurrency","csWallet",function(e,n,t,a,i,o,s,r,l,c,d,u,p,m,E){var g,f,h,T,b=0,v=!1;function O(){if(!T){var e=n.$on("$stateChangeStart",(function(e,n,t,i){e.defaultPrevented||"app.home"===n.name||"app.settings"===n.name||(e.preventDefault(),f?f.then((function(){a.go(n.name,t)})):s.loading.hide())}));T=e}}function R(){T&&T(),T=null}function I(e){if(e)return!0;g=g||p.data.node;var n=p.data.fallbackNodes&&b<p.data.fallbackNodes.length&&p.data.fallbackNodes[b++];if(!n)throw"ERROR.CHECK_NETWORK_CONNECTION";var t=n.host+(n.port||80==n.port||443==n.port?"":":"+n.port);return r.node.same(n.host,n.port)?(console.debug("[platform] Skipping fallback node [{0}]: same as actual node".format(t)),I()):c.get(n.host,n.port,"/node/summary",443==n.port||r.node.forceUseSsl)().catch((function(e){console.error("[platform] Could not reach fallback node [{0}]: skipping".format(t))})).then((function(e){if(!e)return I();var a={old:r.server,new:t};return a.old===a.new&&(r.port!=n.port?a.new+=":"+n.port:0!=r.useSsl||!n.useSsl&&443!=n.port||(a.new+=" (SSL)")),i("CONFIRM.USE_FALLBACK_NODE",a).then((function(e){return s.alert.confirm(e)})).then((function(e){if(e)return p.data.node=n,p.data.node.temporary=!0,c.cache.clear(),r.copy(n).then(I)}))}))}function N(){return console.debug("[platform] restarting csPlatform"),A().then((function(){return o(S,200)}))}function S(){return O(),f=e().then(t.all([l.ready(),p.ready()])).then((function(){return r.ready().then(I)})).then(m.ready).then(E.ready).then((function(){R(),function(){h=[r.api.node.on.restart(n,N,this)]}(),f=null,v=!0})).catch((function(e){throw f=null,v=!1,a.current.name!==n.errorState&&a.go(n.errorState,{error:"peer"}),e}))}function A(){return v?(_.forEach(h,(function(e){e()})),h=[],E.stop(),m.stop(),r.stop(),o((function(){R(),v=!1,f=null}),500)):t.when()}return{disableChangeState:O,isStarted:function(){return v},ready:function(){return v?t.when():f||S()},restart:N,start:S,stop:A,version:{latest:function(){var e=p.data.latestReleaseUrl&&c.uri.parse(p.data.latestReleaseUrl);return e?c.getWithCache(e.host,"https:"===e.protocol?443:e.port,"/"+e.pathname,void 0,u.constants.LONG)().then((function(e){if(e&&e.name&&e.tag_name&&e.html_url)return{version:e.name,url:e.html_url,isNewer:c.version.compare(d.version,e.name)<0}})).catch((function(e){console.error("[platform] Failed to get Cesium latest version",e)})):t.when()}}}}]).run(["$rootScope","$state","$window","$urlRouter","ionicReady","$ionicPlatform","$ionicHistory","Device","UIUtils","$ionicConfig","PluginService","csPlatform","csWallet","csSettings","csConfig","csCurrency",function(e,n,t,a,i,o,s,r,l,c,d,u,p,m,E,g){e.config=E,e.settings=m.data,e.currency=g.data,e.walletData=p.data,e.device=r,e.errorState="app.home",e.smallscreen=l.screen.isSmall();var f=t.location.href.indexOf("#");e.rootPath=-1!==f?t.location.href.substr(0,f):t.location.href,console.debug("[app] Root path is ["+e.rootPath+"]"),!0!==E.httpsMode&&"true"!==E.httpsMode&&"force"!==E.httpsMode||"https:"===t.location.protocol||e.$on("$stateChangeStart",(function(a,i,o,s){var r="https"+e.rootPath.substr(4)+n.href(i,o);E.httpsModeDebug?console.debug("[app] [httpsMode] --- Should redirect to: "+r):t.location.href=r})),i().then((function(){return r.keyboard.enable&&(r.keyboard.hideKeyboardAccessoryBar(!0),ionic.Platform.isIOS()&&r.keyboard.disableScroll(!0)),"a"!==ionic.Platform.grade.toLowerCase()&&(console.info("[app] Disabling UI effects, because plateform's grade is ["+ionic.Platform.grade+"]"),l.setEffects(!1)),window.StatusBar&&console.debug("[app] Status bar plugin enable"),u.version.latest().then((function(n){n&&n.isNewer?(console.info("[app] New release detected [{0}]".format(n.version)),e.newRelease=n):console.info("[app] Current version [{0}] is the latest release".format(E.version))})),o.registerBackButtonAction((function(e){return s.backView()?s.goBack():(e.preventDefault(),l.alert.confirm("CONFIRM.EXIT_APP").then((function(e){e&&ionic.Platform.exitApp()})))}),100),u.ready()}))}]),"function"!=typeof String.prototype.startsWith&&(console.debug("Adding String.prototype.startsWith() -> was missing on this platform"),String.prototype.startsWith=function(e,n){return 0===this.indexOf(e,n)}),"function"!=typeof String.prototype.trim){console.debug("Adding String.prototype.trim() -> was missing on this platform");var we=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;String.prototype.trim=function(){return this.replace(we,"")}}Math&&"function"!=typeof Math.trunc&&(console.debug("Adding Math.trunc() -> was missing on this platform"),Math.trunc=function(e){return(e-.5).toFixed()}),"function"!=typeof String.prototype.format&&(console.debug("Adding String.prototype.format() -> was missing on this platform"),String.prototype.format=function(){var e=arguments;return this.replace(/{(\d+)}/g,(function(n,t){return void 0!==e[t]?e[t]:n}))});
//# sourceMappingURL=../maps/dist_js/gchange.js.map