/* OK ITHAKI V249526R10F25F1 — FULL PROFILE / ACCOUNT FILE / POLICY / BIL SETTINGS / CONTROLLER */
(function(){
'use strict';
if(window.__ITHAKI_V249526R10F25F1_OWNER__)return;
window.__ITHAKI_V249526R10F25F1_OWNER__={version:'V249526R10F25F1',realProfileTargets:true,policyFiles:true,bilSettings:true,controllerDetails:true,cookieNotice:true,at:Date.now()};
window.PROFILE_REAL_TARGETS_R10F25=true;
window.FULL_SERVER_ANDROID_INTEGRATION_R10F25=true;
window.ACTIVE_FRONTEND_TRUTH_REPAIR_R10F25=true;
window.ACTIVE_FRONTEND_TRUTH_INSTALLER_FIX_R10F25F1=true;
window.FEED_R10F21F1_PRESERVED_R10F25=true;
window.POLICY_HTTPS_FIREWALL_BACKUPS_COOKIE_PRIVACY_TERMS_DELETE_HOSTING_R10F25=true;
window.BIL_CURRENT_DOCK_TO_SETTINGS_R10F25=true;
window.CONTROLLER_DETAILS_R10F25=true;
const ADMIN_NAME='ΚΑΡΑΤΖΑΣ ΒΑΣΙΛΕΙΟΣ';
const CONTACT_EMAIL='okithaki@gmail.com';
const POLICY_VERSION='249526r10f25f1';
const ANDROID_BUILD='249549';
const I=()=>window.ITH=window.ITH||{};
const S=()=>window.state||I().state||{};
const $=id=>document.getElementById(id);
const esc=s=>String(s==null?'':s).replace(/[&<>"']/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'}[c]));
const isEn=()=>{try{return String(localStorage.getItem('ith_global_language_r10f7')||localStorage.getItem('ith_ui_lang_v249141')||localStorage.getItem('ith_ui_lang')||document.documentElement.lang||'el').toLowerCase().startsWith('en')}catch(_e){return false}};
const tr=(el,en)=>isEn()?en:el;
const bridge=()=>window.OKITHAKI_ANDROID||window.AndroidBridge||null;
function toast(m,ms=6500){try{if(typeof I().toast==='function')return I().toast(String(m),ms)}catch(_e){}try{if(typeof window.toast==='function')return window.toast(String(m),ms)}catch(_e){}alert(String(m))}
function safeName(v){return String(v||'Member').normalize('NFKD').replace(/[^\p{L}\p{N}._-]+/gu,'_').replace(/^_+|_+$/g,'').slice(0,60)||'Member'}
function stamp(){return new Date().toISOString().replace(/[:.]/g,'-')}
function base64Utf8(s){try{return btoa(unescape(encodeURIComponent(String(s||''))))}catch(_e){return btoa(String(s||''))}}
async function digest(text){try{if(window.crypto&&crypto.subtle){const a=await crypto.subtle.digest('SHA-256',new TextEncoder().encode(text));return Array.from(new Uint8Array(a)).map(x=>x.toString(16).padStart(2,'0')).join('')}}catch(_e){}let h=2166136261;for(let i=0;i<text.length;i++){h^=text.charCodeAt(i);h=Math.imul(h,16777619)}return('00000000'+(h>>>0).toString(16)).slice(-8)}
const PROFILE_KEYS=['ith_device','ith_device_id','ith_room','ith_name','ith_avatar','ith_animal','ith_age16','ith_policy_ok','ith_policy_accepted_version','ith_policy_accepted_at','ith_registered_member_v249154','ith_profile_name_locked_v249164','ith_global_language_r10f7','ith_ui_lang_v249141','ith_ui_lang','ith_profile_country_r10f7','ith_profile_birth_year_r10f7','ith_profile_interests_r10f7','ith_profile_bio_r10f7','ith_auto_translate_content_r10f8','ith_professional_enabled_v249386'];
let lastFile=null,lastFilename='',lastPath='',wrappedSave=null,auditBusy=false;
function localProfile(){const o={};for(const k of PROFILE_KEYS){try{const v=localStorage.getItem(k);if(v!==null&&v!=='')o[k]=v}catch(_e){}}return o}
async function accountPayload(){const local=localProfile(),st=S(),base={format:'OK_ITHAKI_PRIVATE_ACCOUNT_FILE',version:'V249526R10F25F1',created_at:new Date().toISOString(),controller:{name:ADMIN_NAME,contact_email:CONTACT_EMAIL},critical_warning_el:'Δεν υπάρχει ανάκτηση του ίδιου λογαριασμού από τον server. Φύλαξε το ιδιωτικό αρχείο σε τουλάχιστον δύο ασφαλή σημεία.',critical_warning_en:'The same account cannot be recovered by the server. Keep the private file in at least two secure locations.',identity:{device_id:String(st.device||local.ith_device||local.ith_device_id||''),room_id:String(st.room||local.ith_room||'ithaki-phone-test'),nickname:String(st.name||local.ith_name||'Member')},profile:{country:local.ith_profile_country_r10f7||'',birth_year:local.ith_profile_birth_year_r10f7||'',interests:local.ith_profile_interests_r10f7||'',bio:local.ith_profile_bio_r10f7||'',avatar:local.ith_avatar||'',animal:local.ith_animal||''},settings:{language:local.ith_global_language_r10f7||local.ith_ui_lang_v249141||'el',age16_confirmed:local.ith_age16==='1',policy_accepted:local.ith_policy_ok==='1',policy_version:local.ith_policy_accepted_version||''},local_storage:local,excluded:['plain passwords','professional passwords','session tokens','FCM tokens','administrator secrets','notification sync secrets'],instructions_el:['Κράτησε ένα αντίγραφο σε USB stick.','Κράτησε δεύτερο αντίγραφο σε άλλον υπολογιστή ή κρυπτογραφημένο αποθηκευτικό χώρο.','Μπορείς να το στείλεις μόνο στο δικό σου προστατευμένο email, Viber ή cloud, γνωρίζοντας ότι η υπηρεσία αυτή θα αποκτήσει αντίγραφο.','Μην το δημοσιεύεις και μην το στέλνεις σε τρίτους.'],instructions_en:['Keep one copy on a USB drive.','Keep a second copy on another computer or encrypted storage.','You may send it only to your own protected email, Viber or cloud, understanding that the service will receive a copy.','Never publish it or send it to another person.']};const raw=JSON.stringify(base);base.integrity={algorithm:'SHA-256-or-local-fallback',digest:await digest(raw)};return base}
function folderInfo(){const b=bridge();let selected='',profile='';try{if(b&&typeof b.getRecoveryFolderUri==='function')selected=String(b.getRecoveryFolderUri()||'')}catch(_e){}try{if(b&&typeof b.getProfileFolder==='function')profile=String(b.getProfileFolder()||'')}catch(_e){}if(selected)return{kind:'selected',label:tr('Επιλεγμένος φάκελος Android','Selected Android folder'),path:selected};if(profile)return{kind:'profile',label:tr('Φάκελος προφίλ εφαρμογής','App profile folder'),path:profile.replace(/[\\/]+$/,'')+'/memories'};return{kind:'browser',label:tr('Φάκελος Λήψεις / Downloads','Browser Downloads folder'),path:tr('Λήψεις / Downloads — ο browser επιλέγει την ακριβή διαδρομή','Downloads — the browser controls the exact path')}}
function browserDownload(blob,name){const a=document.createElement('a');a.href=URL.createObjectURL(blob);a.download=name;document.body.appendChild(a);a.click();setTimeout(()=>{URL.revokeObjectURL(a.href);a.remove()},1800);return'Downloads/'+name}
async function exportAccountFile(show=true){try{const payload=await accountPayload(),json=JSON.stringify(payload,null,2),name='OK_ITHAKI_ACCOUNT_'+safeName(payload.identity.nickname)+'_'+stamp()+'.json',blob=new Blob([json],{type:'application/json;charset=utf-8'}),b=bridge();let path='';try{if(b&&typeof b.setProfileFolder==='function')b.setProfileFolder(payload.identity.nickname)}catch(_e){}try{if(b&&typeof b.exportRecoverySnapshot==='function')path=String(b.exportRecoverySnapshot(name,json)||'')}catch(_e){path=''}try{if((!path||/^(error:|NO_|CREATE_FAILED|OPEN_FAILED)/i.test(path))&&b&&typeof b.saveBase64ToProfile==='function')path=String(b.saveBase64ToProfile('account',name,'application/json',base64Utf8(json))||'')}catch(_e){path=''}if(!path||/^(error:|NO_|CREATE_FAILED|OPEN_FAILED)/i.test(path))path=browserDownload(blob,name);lastFile=blob;lastFilename=name;lastPath=path;try{localStorage.setItem('ith_account_file_last_r10f25',JSON.stringify({path,filename:name,saved_at:Date.now(),digest:payload.integrity.digest}))}catch(_e){}toast(tr('Το ιδιωτικό αρχείο λογαριασμού δημιουργήθηκε. Κράτησε δύο ασφαλή αντίγραφα.','The private account file was created. Keep two secure copies.'),8500);if(show)setTimeout(()=>openAccountPanel(path),120);return{ok:true,path,filename:name}}catch(e){toast(tr('Δεν δημιουργήθηκε αρχείο λογαριασμού: ','Account file was not created: ')+String(e&&e.message||e),9000);return{ok:false,error:String(e&&e.message||e)}}}
async function shareAccountFile(){if(!lastFile){const r=await exportAccountFile(false);if(!r.ok)return false}try{const f=new File([lastFile],lastFilename,{type:'application/json'});if(navigator.share&&(!navigator.canShare||navigator.canShare({files:[f]}))){await navigator.share({files:[f],title:'OK ITHAKI account file',text:tr('Ιδιωτικό αρχείο λογαριασμού. Φύλαξέ το με ασφάλεια.','Private account file. Keep it secure.')});return false}const o=I();if(typeof o.shareBlobV249526R3==='function'){await o.shareBlobV249526R3(f,lastFilename,'application/json');return false}browserDownload(lastFile,lastFilename);toast(tr('Η κοινοποίηση δεν είναι διαθέσιμη. Το αρχείο αποθηκεύτηκε στις Λήψεις.','Sharing is unavailable. The file was saved to Downloads.'))}catch(e){if(e&&e.name!=='AbortError')toast(String(e&&e.message||e),8000)}return false}
function chooseFolder(){const b=bridge();try{if(b&&typeof b.chooseRecoveryFolder==='function'){b.chooseRecoveryFolder();return false}}catch(_e){}toast(tr('Ο browser θα αποθηκεύσει το αρχείο στον φάκελο Λήψεις.','The browser will save the file in Downloads.'),7000);return false}
function openFolder(){const b=bridge(),f=folderInfo();try{if(b&&typeof b.openRecoveryFolder==='function'&&f.kind==='selected'){b.openRecoveryFolder();return false}}catch(_e){}toast(tr('Φάκελος: ','Folder: ')+f.path,9000);return false}
function warningHtml(compact=false){const f=folderInfo();return`<section class="ithR10F25Warning ${compact?'compact':''}"><h3>⚠️ ${tr('Δεν υπάρχει ανάκτηση λογαριασμού από τον server','No server account recovery')}</h3><p>${tr('Για λόγους ασφάλειας και ιδιωτικότητας, ο server δεν διαθέτει email, τηλέφωνο ή μυστικό που να μπορεί να επαναφέρει την ίδια ταυτότητα. Αν χαθούν η συσκευή και το ιδιωτικό αρχείο, ο λογαριασμός δεν μπορεί να ανακληθεί.','For security and privacy, the server has no email, phone number or secret that can restore the same identity. If both the device and private file are lost, the account cannot be recovered.')}</p><ol><li>${tr('Αποθήκευσε το αρχείο λογαριασμού μετά το προφίλ.','Save the account file after the profile.')}</li><li>${tr('Κράτησε αντίγραφο σε USB stick.','Keep a copy on a USB drive.')}</li><li>${tr('Κράτησε δεύτερο αντίγραφο σε υπολογιστή ή στο δικό σου προστατευμένο email/Viber/cloud.','Keep a second copy on a computer or your own protected email/Viber/cloud.')}</li></ol><div class="ithR10F25Path"><small>${esc(f.label)}</small><code>${esc(f.path)}</code></div></section>`}
function detailsHtml(){return`<section id="ithR10F25MyDetails" class="card profilePanelClean ithR10F25Details"><h3>🪪 ${tr('Στοιχεία μου','My details')}</h3><div class="ithR10F25DetailLine"><span>${tr('Διαχειριστής / Υπεύθυνος λειτουργίας','Administrator / Service contact')}</span><b>${ADMIN_NAME}</b></div><div class="ithR10F25DetailLine"><span>${tr('Επικοινωνία','Contact')}</span><a href="mailto:${CONTACT_EMAIL}">${CONTACT_EMAIL}</a></div><p>${tr('Για θέματα ιδιωτικότητας, πρόσβασης, διόρθωσης ή διαγραφής δεδομένων, χρησιμοποίησε το παραπάνω email ή τον μηχανισμό διαγραφής μέσα στο Προφίλ.','For privacy, access, correction or deletion requests, use the email above or the in-profile deletion mechanism.')}</p><div class="ithR10F25Buttons"><button type="button" data-r10f25-privacy>🔐 Privacy Policy</button><button type="button" data-r10f25-terms>📜 Terms of Service</button><button type="button" data-r10f25-security>🛡️ ${tr('Απαιτήσεις ασφάλειας','Security requirements')}</button><button type="button" class="danger" data-r10f25-delete>🗑️ ${tr('Διαγραφή λογαριασμού','Delete account')}</button></div></section>`}
function augmentMainProfile(){const page=$('profilePage');if(!page)return;const hero=page.querySelector('.profileHeroClean,.profileHero,.profile-card,.profileCard')||page.querySelector('.profileCleanWrap')||page;const row=page.querySelector('.saveProfileRow,[data-profile-save-row],.profileSaveRow');if(!page.querySelector('#ithR10F25MainWarning')){const wrap=document.createElement('div');wrap.id='ithR10F25MainWarning';wrap.innerHTML=warningHtml(true)+`<label class="ithR10F25Confirm"><input id="ithR10F25MainConfirm" type="checkbox"><span><b>${tr('Καταλαβαίνω ότι δεν υπάρχει ανάκτηση από τον server.','I understand there is no server recovery.')}</b><small>${tr('Θα φυλάξω το αρχείο λογαριασμού σε τουλάχιστον δύο ασφαλή σημεία.','I will keep the account file in at least two secure locations.')}</small></span></label><div class="ithR10F25Buttons"><button type="button" data-r10f25-folder>📁 ${tr('Επιλογή φακέλου','Choose folder')}</button><button type="button" data-r10f25-account>💾 ${tr('Αρχείο λογαριασμού','Account file')}</button></div>`;if(row&&row.parentNode)row.parentNode.insertBefore(wrap,row);else hero.insertBefore(wrap,hero.firstChild);const save=(row&&row.querySelector('button'))||page.querySelector('button[onclick*="saveProfile"],[data-save-profile]');if(save)save.textContent=tr('💾 Αποθήκευση προφίλ και αρχείου λογαριασμού','💾 Save profile and account file')}if(!page.querySelector('#ithR10F25MyDetails')){const box=document.createElement('div');box.innerHTML=detailsHtml();const node=box.firstElementChild;if(hero!==page&&hero.parentNode)hero.parentNode.insertBefore(node,hero.nextSibling);else page.appendChild(node)}}
function augmentFullProfile(){const p=$('ithR10F9Profile');if(!p)return;const card=p.querySelector('.ithR10F9Card.profile,.profile,.profileCard')||p;if(!p.querySelector('#ithR10F25OverlayWarning')){const actions=p.querySelector('.ithR10F9Actions');if(actions){const block=document.createElement('div');block.id='ithR10F25OverlayWarning';block.innerHTML=warningHtml(true)+`<label class="ithR10F25Confirm"><input id="ithR10F25OverlayConfirm" type="checkbox"><span><b>${tr('Καταλαβαίνω ότι ο server δεν μπορεί να ανακτήσει τον λογαριασμό μου.','I understand the server cannot recover my account.')}</b><small>${tr('Θα κρατήσω το ιδιωτικό αρχείο σε USB και σε δεύτερο ασφαλές σημείο.','I will keep the private file on USB and in a second secure location.')}</small></span></label>`;actions.parentNode.insertBefore(block,actions);const save=actions.querySelector('[data-save-profile]');if(save)save.textContent=tr('💾 Αποθήκευση προφίλ και ιδιωτικού αρχείου','💾 Save profile and private file')}}if(!p.querySelector('#ithR10F25OverlayDetails')){const d=document.createElement('section');d.id='ithR10F25OverlayDetails';d.className='ithR10F9Declared ithR10F25OverlayDetails';d.innerHTML=`<span>${tr('Διαχειριστής','Administrator')}</span><b>${ADMIN_NAME}</b><span>${tr('Επικοινωνία','Contact')}</span><a href="mailto:${CONTACT_EMAIL}">${CONTACT_EMAIL}</a>`;const actions=p.querySelector('.ithR10F9Actions');if(actions)actions.parentNode.insertBefore(d,actions)}}
function confirmationOk(kind){const id=kind==='overlay'?'ithR10F25OverlayConfirm':'ithR10F25MainConfirm';const c=$(id);if(c&&c.checked)return true;toast(tr('Χρειάζεται να επιβεβαιώσεις ότι δεν υπάρχει ανάκτηση από τον server και ότι θα φυλάξεις το αρχείο λογαριασμού.','Confirm that there is no server recovery and that you will keep the account file.'),8500);return false}
function installMainSaveWrapper(){const cur=I().saveProfile;if(typeof cur!=='function'||cur.__r10f25)return;if(wrappedSave===cur)return;const old=cur;const w=async function(){if($('profilePage')&&!confirmationOk('main'))return false;const name=String($('profName')&&$('profName').value||'').trim();const out=await old.apply(this,arguments);setTimeout(async()=>{try{const stored=String(localStorage.getItem('ith_name')||S().name||'').trim();if(name&&stored===name&&localStorage.getItem('ith_policy_ok')==='1'){localStorage.setItem('ith_policy_accepted_version',POLICY_VERSION);await exportAccountFile(true)}}catch(_e){}},650);return out};w.__r10f25=true;w.__original=old;I().saveProfile=w;wrappedSave=w}
function openNotificationSettings(){const f=I().openNotificationSettingsV249238||window.openNotificationSettingsV249238;if(typeof f==='function'){f.call(I());setTimeout(augmentNotificationSettings,90);return false}const c=I().notifyCenter||window.notifyCenter;if(typeof c==='function'){c.call(I());return false}toast(tr('Οι ρυθμίσεις ειδοποιήσεων δεν άνοιξαν.','Notification settings did not open.'));return false}
function augmentNotificationSettings(){const root=$('ith526NotificationSettings')||$('ith525NotificationSettings')||$('notificationSettingsV249238')||document.querySelector('[id*="NotificationSettings"]');if(!root||root.querySelector('#ithR10F25SettingsCard'))return;const s=document.createElement('section');s.id='ithR10F25SettingsCard';s.className='ith526Settings ithR10F25Settings';s.innerHTML=`<b>🛡️ ${tr('Λογαριασμός, πολιτική και στοιχεία','Account, policy and details')}</b><p>${tr('Ο ΒΙΛ ανοίγει αυτή την καρτέλα. Εδώ βρίσκονται το αρχείο λογαριασμού, η πολιτική, οι όροι, ο διαχειριστής και ο έλεγχος λειτουργίας.','Bil opens this panel. Account file, policy, terms, administrator details and the function check are available here.')}</p><div class="ith526Grid"><button data-r10f25-account>💾 ${tr('Αρχείο λογαριασμού','Account file')}</button><button data-r10f25-privacy>🔐 Privacy Policy</button><button data-r10f25-terms>📜 Terms of Service</button><button data-r10f25-why>✨ ${tr('Γιατί ΙΘΑΚΗ','Why ITHAKI')}</button><button data-r10f25-audit>✓ ${tr('Έλεγχος λειτουργίας','Function check')}</button></div><small>${ADMIN_NAME} · ${CONTACT_EMAIL}</small><div id="ithR10F25SettingsAudit"></div>`;root.appendChild(s)}
function policyIntro(el,title,subtitle){return`<section class="ithR10F25LegalHero"><h2>${esc(title)}</h2><p>${esc(subtitle)}</p><div><b>${el?'Διαχειριστής / Υπεύθυνος':'Administrator / Controller contact'}:</b> ${ADMIN_NAME}<br><b>${el?'Επικοινωνία':'Contact'}:</b> <a href="mailto:${CONTACT_EMAIL}">${CONTACT_EMAIL}</a></div></section>`}
function privacyHtml(el){return policyIntro(el,el?'Πολιτική Απορρήτου':'Privacy Policy',el?'Πώς λειτουργεί η επεξεργασία δεδομένων στην OK ITHAKI.':'How data processing works in OK ITHAKI.')+`<section><h3>1. ${el?'Υπεύθυνος και επικοινωνία':'Controller and contact'}</h3><p>${el?'Υπεύθυνος λειτουργίας και σημείο επικοινωνίας: '+ADMIN_NAME+'. Email: '+CONTACT_EMAIL+'. Το email χρησιμοποιείται για αιτήματα πρόσβασης, διόρθωσης, διαγραφής, περιορισμού, φορητότητας, εναντίωσης και ζητήματα ασφάλειας.':'Service controller/contact: '+ADMIN_NAME+'. Email: '+CONTACT_EMAIL+'. Use this address for access, correction, erasure, restriction, portability, objection and security requests.'}</p></section><section><h3>2. ${el?'Δεδομένα και σκοποί':'Data and purposes'}</h3><p>${el?'Η υπηρεσία επεξεργάζεται μόνο τα λειτουργικά δεδομένα που χρειάζονται για προφίλ, Ροή, μηνύματα, κοινότητες, κλήσεις, media, ασφάλεια, αναφορές και ειδοποιήσεις. Δεν απαιτεί υποχρεωτικά email ή τηλέφωνο για λογαριασμό.':'The service processes operational data needed for profiles, Feed, messages, communities, calls, media, safety, reports and notifications. Account email or phone is not mandatory.'}</p></section><section><h3>3. ${el?'Ανάκτηση λογαριασμού':'Account recovery'}</h3><p><b>${el?'Ο server δεν μπορεί να ανακτήσει την ίδια ταυτότητα λογαριασμού.':'The server cannot recover the same account identity.'}</b> ${el?'Ο χρήστης πρέπει να φυλάξει το ιδιωτικό αρχείο λογαριασμού σε τουλάχιστον δύο ασφαλή σημεία.':'The user must keep the private account file in at least two secure locations.'}</p></section><section><h3>4. ${el?'Δικαιώματα και διαγραφή':'Rights and deletion'}</h3><p>${el?'Ο χρήστης μπορεί να ζητήσει πρόσβαση, διόρθωση, διαγραφή, περιορισμό, φορητότητα, εναντίωση και ανάκληση συγκατάθεσης όπου εφαρμόζεται. Η επιλογή «Διαγραφή λογαριασμού» βρίσκεται στο Προφίλ και στέλνει αίτημα διαγραφής στον server πριν καθαρίσει τα τοπικά δεδομένα. Το δικαίωμα διαγραφής υπόκειται στις νόμιμες εξαιρέσεις.':'Users may request access, correction, erasure, restriction, portability, objection and consent withdrawal where applicable. The Profile includes a Delete account action that requests server deletion before clearing local data. Erasure remains subject to lawful exceptions.'}</p></section><section><h3>5. Cookies / local storage</h3><p>${el?'Απαραίτητη τοπική αποθήκευση χρησιμοποιείται για γλώσσα, προφίλ, ασφάλεια, συνεδρία και επιλογές. Μη απαραίτητα cookies, analytics ή trackers δεν πρέπει να ενεργοποιούνται πριν από σαφή επιλογή μέσω cookie banner.':'Necessary local storage is used for language, profile, security, session and preferences. Non-essential cookies, analytics or trackers must not be enabled before a clear choice through a cookie banner.'}</p></section><section><h3>6. ${el?'Διατήρηση, φιλοξενία και διαβιβάσεις':'Retention, hosting and transfers'}</h3><p>${el?'Η δημόσια λειτουργία απαιτεί hosting συμβατό με GDPR: σύμβαση επεξεργασίας δεδομένων, κατάλληλη τοποθεσία ή νόμιμο μηχανισμό διαβίβασης, περιορισμένη πρόσβαση, καταγραφή συμβάντων και ασφαλή διαγραφή/λήξη αντιγράφων. Η φράση «GDPR-compliant hosting» είναι απαίτηση λειτουργίας και όχι αυτόματη πιστοποίηση του σημερινού παρόχου χωρίς συμβατικό έλεγχο.':'Public operation requires GDPR-compliant hosting: a data processing agreement, suitable location or lawful transfer mechanism, restricted access, incident logging and secure deletion/backup expiry. “GDPR-compliant hosting” is an operating requirement, not automatic certification of the current provider without contractual verification.'}</p></section>`}
function termsHtml(el){return policyIntro(el,el?'Όροι Χρήσης':'Terms of Service',el?'Κανόνες χρήσης της πλατφόρμας και ευθύνες των μελών.':'Platform rules and member responsibilities.')+`<section><h3>1. ${el?'Αποδοχή και ηλικία':'Acceptance and age'}</h3><p>${el?'Η υπηρεσία προορίζεται για χρήστες 16+ ή για μικρότερους μόνο όπου υπάρχει έγκυρη γονική συναίνεση. Η χρήση προϋποθέτει αποδοχή των όρων και της πολιτικής απορρήτου.':'The service is intended for users aged 16+ or younger users only where valid parental consent exists. Use requires acceptance of these Terms and the Privacy Policy.'}</p></section><section><h3>2. ${el?'Επιτρεπτή χρήση':'Acceptable use'}</h3><ul><li>${el?'Όχι απειλές, παρενόχληση, stalking, εκφοβισμός ή εκβιασμός.':'No threats, harassment, stalking, bullying or extortion.'}</li><li>${el?'Όχι απάτες, spam, bots, flood ή μαζική χειραγώγηση.':'No fraud, spam, bots, flooding or mass manipulation.'}</li><li>${el?'Όχι σεξουαλική εκμετάλλευση, υλικό κακοποίησης ανηλίκων, μη συναινετικό σεξουαλικό υλικό, βίαιη κακοποίηση ή άλλο παράνομο περιεχόμενο.':'No sexual exploitation, child sexual abuse material, non-consensual sexual content, violent abuse or other illegal content.'}</li><li>${el?'Σεβασμός ιδιωτικότητας, πνευματικών δικαιωμάτων και δικαιωμάτων τρίτων.':'Respect privacy, intellectual property and third-party rights.'}</li></ul></section><section><h3>3. ${el?'Έλεγχοι και διαχείριση':'Checks and moderation'}</h3><p>${el?'Η υπηρεσία μπορεί να χρησιμοποιεί BotGuard, rate limits, έλεγχο spam/flood, έλεγχο αρχείων στην προεπισκόπηση και στον server, antivirus όπου είναι διαθέσιμο, αυτοματοποιημένες ενδείξεις περιεχομένου, αναφορές χρηστών και ανθρώπινο έλεγχο. Κανένα φίλτρο δεν εγγυάται 100% ανίχνευση.':'The service may use BotGuard, rate limits, spam/flood checks, file checks in Preview and on server upload, antivirus where available, automated content signals, user reports and human review. No filter guarantees 100% detection.'}</p></section><section><h3>4. ${el?'Περιεχόμενο και άδεια λειτουργίας':'Content and service licence'}</h3><p>${el?'Το περιεχόμενο παραμένει του χρήστη. Ο χρήστης δίνει την τεχνικά αναγκαία άδεια αποθήκευσης, μετατροπής, συμπίεσης και εμφάνισης στους προορισμούς που επιλέγει.':'Content remains the user’s. The user grants the technically necessary licence to store, transform, compress and display it in the destinations selected.'}</p></section><section><h3>5. ${el?'Περιορισμός, αναφορά και ένσταση':'Restriction, reporting and appeal'}</h3><p>${el?'Περιεχόμενο ή λογαριασμοί μπορούν να περιοριστούν όταν παραβιάζουν τους όρους, τον νόμο ή την ασφάλεια. Πρέπει να υπάρχει εύχρηστη αναφορά, αιτιολόγηση όπου απαιτείται και διαδρομή επικοινωνίας/ένστασης.':'Content or accounts may be restricted when they violate these Terms, law or safety. Easy reporting, reasons where required and a contact/appeal route should be available.'}</p></section><section><h3>6. ${el?'Διαθεσιμότητα και αλλαγές':'Availability and changes'}</h3><p>${el?'Η υπηρεσία μπορεί να αλλάζει για ασφάλεια, συντήρηση και συμμόρφωση. Δεν παρέχεται εγγύηση αδιάλειπτης λειτουργίας, αλλά απαιτούνται λογικά μέτρα συνέχειας, backup και αποκατάστασης.':'The service may change for security, maintenance and compliance. Uninterrupted operation is not guaranteed, but reasonable continuity, backup and recovery measures are required.'}</p></section>`}
function securityHtml(el){return policyIntro(el,el?'Τεχνικές και οργανωτικές απαιτήσεις':'Technical and organisational requirements',el?'Λίστα που πρέπει να εφαρμόζεται πραγματικά — όχι μόνο να αναγράφεται.':'A checklist that must be implemented in reality, not merely stated.')+`<section class="ithR10F25Checklist"><h3>HTTPS (SSL/TLS)</h3><p>${el?'Όλη η δημόσια κίνηση πρέπει να περνά από έγκυρο HTTPS/TLS, με αυτόματη ανανέωση πιστοποιητικού και ανακατεύθυνση HTTP→HTTPS.':'All public traffic must use valid HTTPS/TLS, automatic certificate renewal and HTTP→HTTPS redirect.'}</p><h3>Firewall</h3><p>${el?'Να επιτρέπονται μόνο οι απολύτως αναγκαίες θύρες, με περιορισμένη πρόσβαση διαχείρισης, ενημερώσεις και καταγραφή συμβάντων.':'Only strictly necessary ports should be allowed, with restricted administration access, updates and incident logging.'}</p><h3>Backups</h3><p>${el?'Κρυπτογραφημένα, τακτικά και δοκιμασμένα backups, με ξεχωριστό χώρο, πολιτική διατήρησης και πραγματική δοκιμή επαναφοράς.':'Encrypted, regular and tested backups, separate storage, a retention policy and real restore tests.'}</p><h3>Cookie banner</h3><p>${el?'Banner πριν από μη απαραίτητα cookies/analytics/trackers, με πραγματική δυνατότητα απόρριψης και αλλαγής επιλογής. Απαραίτητα τεχνικά cookies ή local storage εξηγούνται χωριστά.':'A banner before non-essential cookies/analytics/trackers, with a real reject option and preference changes. Necessary technical cookies or local storage are explained separately.'}</p><h3>Privacy Policy στο site</h3><p>${el?'Μόνιμα προσβάσιμη πολιτική με υπεύθυνο, στοιχεία επικοινωνίας, δεδομένα, σκοπούς, νομικές βάσεις, αποδέκτες, διατήρηση, δικαιώματα, διαβιβάσεις και ασφάλεια.':'A permanently accessible policy with controller, contact details, data, purposes, legal bases, recipients, retention, rights, transfers and security.'}</p><h3>Terms of Service</h3><p>${el?'Σαφείς όροι για ηλικία, περιεχόμενο, απαγορεύσεις, moderation, αναφορές, περιορισμούς, άδεια χρήσης περιεχομένου και αλλαγές υπηρεσίας.':'Clear terms for age, content, prohibitions, moderation, reporting, restrictions, content licence and service changes.'}</p><h3>${el?'Μηχανισμός διαγραφής λογαριασμού':'Account deletion mechanism'}</h3><p>${el?'Ορατό κουμπί στο Προφίλ, επιβεβαίωση, αίτημα προς server, καθαρισμός τοπικών δεδομένων και ενημέρωση για τυχόν νόμιμες εξαιρέσεις/χρόνους backup.':'A visible Profile button, confirmation, server request, local-data clearing and information about lawful exceptions/backup expiry.'}</p><h3>GDPR-compliant hosting</h3><p>${el?'Σύμβαση επεξεργασίας (DPA), έλεγχος υπο-εκτελούντων, κατάλληλη τοποθεσία ή νόμιμες διαβιβάσεις, περιορισμός πρόσβασης, ειδοποίηση περιστατικών και ασφαλής λήξη/διαγραφή δεδομένων. Απαιτείται έλεγχος της πραγματικής σύμβασης του hosting.':'A DPA, subprocessor review, suitable location or lawful transfers, restricted access, incident notification and secure data expiry/deletion. The actual hosting contract must be verified.'}</p></section>`}
function cookiesHtml(el){return policyIntro(el,el?'Πολιτική Cookies και τοπικής αποθήκευσης':'Cookies and local storage policy',el?'Απαραίτητη αποθήκευση, προαιρετικά cookies και επιλογές χρήστη.':'Necessary storage, optional cookies and user choices.')+`<section><h3>${el?'Απαραίτητη αποθήκευση':'Necessary storage'}</h3><p>${el?'Η εφαρμογή χρησιμοποιεί localStorage και, όπου απαιτείται, τεχνικά δεδομένα συνεδρίας για γλώσσα, προφίλ, ασφάλεια, σύνδεση και προτιμήσεις. Αυτά είναι αναγκαία για τις λειτουργίες που ζητά ο χρήστης.':'The app uses localStorage and, where required, technical session data for language, profile, security, connection and preferences. These are necessary for requested functionality.'}</p></section><section><h3>${el?'Μη απαραίτητα cookies':'Non-essential cookies'}</h3><p>${el?'Analytics, διαφήμιση ή trackers τρίτων δεν πρέπει να ενεργοποιούνται χωρίς προηγούμενη σαφή επιλογή. Ο χρήστης πρέπει να μπορεί να αρνηθεί χωρίς να χάνει βασική πρόσβαση και να αλλάξει την επιλογή αργότερα.':'Analytics, advertising or third-party trackers must not be enabled without a prior clear choice. Users should be able to refuse without losing basic access and change the choice later.'}</p></section>`}
function openLegal(tab='privacy',lang){const el=(lang||tr('el','en'))!=='en';const menu=$('memberMenu');if(!menu)return false;const tabs={privacy:privacyHtml(el),terms:termsHtml(el),security:securityHtml(el),cookies:cookiesHtml(el)};if(!tabs[tab])tab='privacy';menu.classList.add('show','localPanel','legalPanel');menu.innerHTML=`<div class="ithR10F25Legal"><header><button data-r10f25-close>‹</button><div><b>⚖️ OK ITHAKI</b><small>${el?'Πολιτική, όροι και πραγματικές απαιτήσεις':'Policy, terms and real requirements'}</small></div><button data-r10f25-close>×</button></header><nav><button class="${tab==='privacy'?'active':''}" data-r10f25-tab="privacy">Privacy Policy</button><button class="${tab==='terms'?'active':''}" data-r10f25-tab="terms">Terms of Service</button><button class="${tab==='security'?'active':''}" data-r10f25-tab="security">${el?'Ασφάλεια':'Security'}</button><button class="${tab==='cookies'?'active':''}" data-r10f25-tab="cookies">Cookies</button><button data-r10f25-lang="${el?'en':'el'}">${el?'EN':'EL'}</button></nav><main>${tabs[tab]}</main><footer><button class="green" data-r10f25-accept>✓ ${el?'Αποδοχή πολιτικής και όρων':'Accept policy and terms'}</button><button class="danger" data-r10f25-delete>🗑️ ${el?'Διαγραφή λογαριασμού':'Delete account'}</button><button data-r10f25-close>${el?'Κλείσιμο':'Close'}</button></footer></div>`;menu.querySelectorAll('[data-r10f25-close]').forEach(b=>b.onclick=()=>I().closeMember&&I().closeMember());menu.querySelectorAll('[data-r10f25-tab]').forEach(b=>b.onclick=()=>openLegal(b.dataset.r10f25Tab,el?'el':'en'));menu.querySelector('[data-r10f25-lang]').onclick=()=>openLegal(tab,el?'en':'el');menu.querySelector('[data-r10f25-accept]').onclick=acceptPolicy;menu.querySelector('[data-r10f25-delete]').onclick=deleteAccount;return false}
function acceptPolicy(){try{localStorage.setItem('ith_policy_ok','1');localStorage.setItem('ith_policy_accepted_version',POLICY_VERSION);localStorage.setItem('ith_policy_accepted_at',new Date().toISOString());const st=S();st.policyOk=true}catch(_e){}try{if(typeof I().acceptLegalPolicy==='function'&&I().acceptLegalPolicy!==acceptPolicy)I().acceptLegalPolicy()}catch(_e){try{I().closeMember&&I().closeMember()}catch(__e){}}toast(tr('Η πολιτική και οι όροι αποδέχθηκαν.','Policy and terms accepted.'),5000);setTimeout(()=>{try{I().renderProfile&&I().renderProfile()}catch(_e){}},120);return false}
function deleteAccount(){const f=I().deleteAccountData;if(typeof f==='function')return f.call(I());toast(tr('Ο μηχανισμός διαγραφής δεν είναι διαθέσιμος.','The deletion mechanism is unavailable.'));return false}
function openAccountPanel(path=''){const menu=$('memberMenu');if(!menu)return false;const f=folderInfo(),last=(()=>{try{return JSON.parse(localStorage.getItem('ith_account_file_last_r10f25')||'null')}catch(_e){return null}})(),shown=path||lastPath||(last&&last.path)||f.path;menu.classList.add('show','fullAvatarMenuV249231');menu.innerHTML=`<div class="ithR10F25Panel"><header><button data-r10f25-close>‹</button><div><b>🛡️ ${tr('Αρχείο λογαριασμού και ανάκτηση','Account file and recovery')}</b><small>OK ITHAKI V249526R10F25 · Android V249547</small></div><button data-r10f25-close>×</button></header>${warningHtml(false)}<section class="ithR10F25Card"><h3>📍 ${tr('Πού αποθηκεύεται','Where it is saved')}</h3><code>${esc(shown)}</code><div class="ithR10F25Buttons"><button data-r10f25-folder>📁 ${tr('Επιλογή φακέλου','Choose folder')}</button><button data-r10f25-open-folder>🗂️ ${tr('Άνοιγμα φακέλου','Open folder')}</button></div></section><section class="ithR10F25Card"><h3>💾 ${tr('Δημιουργία και αντίγραφα','Create and copy')}</h3><div class="ithR10F25Buttons"><button class="green" data-r10f25-export>💾 ${tr('Νέο αρχείο','New file')}</button><button data-r10f25-share>↗ ${tr('Email / Viber / cloud','Email / Viber / cloud')}</button></div><p>${tr('Για USB stick, αντέγραψε το αρχείο από τον φάκελο που φαίνεται παραπάνω.','For a USB drive, copy the file from the folder shown above.')}</p></section><section class="ithR10F25Card"><b>🪪 ${ADMIN_NAME}</b><p><a href="mailto:${CONTACT_EMAIL}">${CONTACT_EMAIL}</a></p></section></div>`;menu.querySelectorAll('[data-r10f25-close]').forEach(b=>b.onclick=()=>I().closeMember&&I().closeMember());menu.querySelector('[data-r10f25-folder]').onclick=chooseFolder;menu.querySelector('[data-r10f25-open-folder]').onclick=openFolder;menu.querySelector('[data-r10f25-export]').onclick=()=>exportAccountFile(true);menu.querySelector('[data-r10f25-share]').onclick=shareAccountFile;return false}
function whyCard(icon,title,body,items){return`<article><h3>${icon} ${esc(title)}</h3><p>${esc(body)}</p>${items&&items.length?`<ul>${items.map(x=>`<li>${esc(x)}</li>`).join('')}</ul>`:''}</article>`}
function openWhy(){const menu=$('memberMenu');if(!menu)return false;const el=!isEn();const cards=el?[
['📡','Mesh χωρίς internet','Κάθε κινητό μπορεί χειροκίνητα να λειτουργήσει ως μικρός τοπικός server για γραπτά μηνύματα και SOS μέσω hotspot, ίδιου Wi‑Fi ή υποστηριζόμενου Wi‑Fi Direct.',['Χειροκίνητη εκκίνηση και ραντάρ.','AES-GCM όπου υποστηρίζεται.','Ασφαλής επιστροφή στην κανονική σύνδεση.']],
['🔔','Ειδοποιήσεις ΙΘΑΚΗΣ και άλλων εφαρμογών','Με ρητή άδεια Android, το κέντρο μπορεί να οργανώνει email, Viber και άλλες ειδοποιήσεις με τύπο, ώρα και ημερολόγιο.',['Ο ΒΙΛ ανοίγει τις ρυθμίσεις του καμπανακιού.','Μηνύματα και κλήσεις παραμένουν ξεχωριστά.']],
['🤖','BotGuard, spam και κακόβουλο λογισμικό','Rate limits, flood/repetition checks, προσωρινά blocks, έλεγχος πραγματικής υπογραφής αρχείων και antivirus όπου είναι διαθέσιμο.',['Ο έλεγχος αρχείων γίνεται μόνο στην Προεπισκόπηση και στο upload του server.','Δεν μπλοκάρει το απλό φόρτωμα της Ροής.']],
['🚨','Σεξουαλικό περιεχόμενο, βία και εγκληματικότητα','Αυτοματοποιημένες ενδείξεις, αναφορές χρηστών και ανθρώπινος έλεγχος για πιθανό παράνομο σεξουαλικό υλικό, εκμετάλλευση, βία, απειλές, απάτες, παρενόχληση και άλλο επικίνδυνο περιεχόμενο.',['Κανένα φίλτρο δεν εγγυάται 100% ανίχνευση.','Το ύποπτο περιεχόμενο μπορεί να μπλοκάρεται ή να οδηγείται σε έλεγχο.']],
['🔐','Privacy by design και δικαιώματα','Ψευδώνυμο, χωρίς υποχρεωτικό email/τηλέφωνο, ελαχιστοποίηση δεδομένων, ορατή πολιτική, όροι, διαγραφή λογαριασμού και στοιχεία υπευθύνου.',['Διαχειριστής: '+ADMIN_NAME,'Επικοινωνία: '+CONTACT_EMAIL]],
['🛡️','Πραγματικές απαιτήσεις υποδομής','Η δημόσια λειτουργία χρειάζεται HTTPS/SSL, firewall, κρυπτογραφημένα και δοκιμασμένα backups, cookie banner πριν από μη απαραίτητα cookies, Privacy Policy, Terms of Service και hosting συμβατό με GDPR.',['Η συμμόρφωση απαιτεί πραγματική εφαρμογή και τεκμηρίωση.','Δεν είναι αυτόματη νομική πιστοποίηση.']]
]:[
['📡','Offline Mesh','Each phone can manually act as a small local server for text and SOS over hotspot, same Wi-Fi or supported Wi-Fi Direct.',['Manual start and radar.','AES-GCM where supported.','Safe return to normal connectivity.']],
['🔔','ITHAKI and external notifications','With explicit Android permission, email, Viber and other notifications can be organised by type, time and calendar.',['Bil opens bell settings.','Messages and calls stay separate.']],
['🤖','BotGuard, spam and malware safety','Rate limits, flood/repetition checks, temporary blocks, real file-signature checks and antivirus where available.',['File checks run only in Preview and server upload.','Feed loading is not scanned.']],
['🚨','Sexual content, violence and crime','Automated signals, user reports and human review address potentially illegal sexual material, exploitation, violence, threats, scams, harassment and other dangerous content.',['No filter guarantees 100% detection.','Suspicious content may be blocked or queued for review.']],
['🔐','Privacy by design and rights','Pseudonyms, no mandatory email/phone, data minimisation, visible policy, Terms, account deletion and controller contact.',['Administrator: '+ADMIN_NAME,'Contact: '+CONTACT_EMAIL]],
['🛡️','Real infrastructure requirements','Public operation requires HTTPS/SSL, firewall, encrypted and tested backups, a cookie banner before non-essential cookies, Privacy Policy, Terms of Service and GDPR-compliant hosting.',['Compliance requires real implementation and documentation.','This is not automatic legal certification.']]
];menu.classList.add('show','fullAvatarMenuV249231');menu.innerHTML=`<div class="ithR10F25Why"><header><button data-r10f25-close>‹</button><div><b>✨ ${el?'Γιατί OK ITHAKI':'Why OK ITHAKI'}</b><small>${el?'Ιδιωτικότητα, ασφάλεια και ανθεκτική επικοινωνία':'Privacy, safety and resilient communication'}</small></div><button data-r10f25-close>×</button></header><section class="hero"><h2>${el?'Η προστασία πρέπει να λειτουργεί στην πράξη':'Protection must work in practice'}</h2><p>${el?'Η OK ITHAKI συνδυάζει ανθρώπινη επικοινωνία, offline δυνατότητες, ελάχιστα δεδομένα, ορατά δικαιώματα και ελέγχους που δεν μπλοκάρουν τη Ροή.':'OK ITHAKI combines human communication, offline capability, minimal data, visible rights and checks that do not block the Feed.'}</p></section><div class="grid">${cards.map(x=>whyCard(...x)).join('')}</div><section class="legal"><b>⚖️ GDPR / ePrivacy / DSA</b><p>${el?'Οι αρχές αυτές απαιτούν πραγματικές τεχνικές και οργανωτικές διαδικασίες, σαφή ενημέρωση, αναφορές, δικαιώματα και συνεχή έλεγχο. Η οθόνη δεν αποτελεί από μόνη της πιστοποίηση συμμόρφωσης.':'These principles require real technical and organisational procedures, clear information, reporting, rights and ongoing review. This screen alone is not a compliance certification.'}</p></section><div class="ithR10F25Buttons"><button data-r10f25-privacy>🔐 Privacy Policy</button><button data-r10f25-terms>📜 Terms of Service</button><button data-r10f25-security>🛡️ ${el?'Απαιτήσεις ασφάλειας':'Security requirements'}</button><button data-r10f25-account>💾 ${el?'Αρχείο λογαριασμού':'Account file'}</button></div></div>`;menu.querySelectorAll('[data-r10f25-close]').forEach(b=>b.onclick=()=>I().closeMember&&I().closeMember());return false}
async function runAudit(){if(auditBusy)return false;auditBusy=true;const checks=[];try{checks.push([!!$('profilePage'),'Κύρια σελίδα Προφίλ']);checks.push([!!document.querySelector('#profilePage #ithR10F25MainWarning'),'Ρητή προειδοποίηση ανάκτησης']);checks.push([!!document.querySelector('#profilePage #ithR10F25MyDetails'),'Στοιχεία διαχειριστή']);checks.push([typeof I().openLegalPolicy==='function','Privacy Policy / Terms']);checks.push([typeof I().deleteAccountData==='function','Μηχανισμός διαγραφής']);checks.push([!!$('ith526BilDock')||!!window.__ITHAKI_V249526_FINAL_OWNER__,'Τρέχων ΒΙΛ']);checks.push([!!document.querySelector('script[src*="v249526r10f25_full_profile_account_policy_bil.js"]'),'R10F25 integrated final script']);try{const r=await fetch('/api/build/v249526r10f21f1?_v='+Date.now(),{cache:'no-store'}),d=await r.json();checks.push([r.ok&&d.feed_file_checks_disabled===true,'Ροή χωρίς file scan'])}catch(_e){checks.push([false,'Online έλεγχος Ροής'])}try{const r=await fetch('/api/build/v249526r10f25f1?_v='+Date.now(),{cache:'no-store'}),d=await r.json();checks.push([r.ok&&d.installer_same_file_copy_fixed===true&&d.legal_static_route===true,'Πλήρης server + Android έκδοση'])}catch(_e){checks.push([false,'Online έλεγχος R10F25F1'])}try{const r=await fetch('/legal/privacy-policy-r10f25-el.html?_v='+Date.now(),{cache:'no-store'});checks.push([r.ok,'Privacy Policy στο site'])}catch(_e){checks.push([false,'Privacy Policy στο site'])}const html=checks.map(x=>`<div class="ithR10F25Audit ${x[0]?'ok':'warn'}"><b>${x[0]?'✓':'!'}</b><span>${esc(x[1])}</span></div>`).join('');document.querySelectorAll('#ithR10F25SettingsAudit').forEach(x=>x.innerHTML=html);toast(checks.every(x=>x[0])?tr('Ο έλεγχος λειτουργίας ολοκληρώθηκε επιτυχώς.','Function check passed.'):tr('Ο έλεγχος βρήκε σημεία που χρειάζονται προσοχή.','The check found items needing attention.'),7000)}finally{auditBusy=false}return false}
function ensureCookieBanner(){let pref='';try{pref=localStorage.getItem('ith_cookie_choice_r10f25')||''}catch(_e){}if(pref||$('ithR10F25Cookie'))return;const b=document.createElement('aside');b.id='ithR10F25Cookie';b.innerHTML=`<div><b>🍪 ${tr('Cookies και τοπική αποθήκευση','Cookies and local storage')}</b><p>${tr('Χρησιμοποιείται απαραίτητη τοπική αποθήκευση για γλώσσα, προφίλ, ασφάλεια και λειτουργία. Μη απαραίτητα cookies ή analytics δεν ενεργοποιούνται χωρίς επιλογή.','Necessary local storage is used for language, profile, security and operation. Non-essential cookies or analytics are not enabled without a choice.')}</p></div><button data-r10f25-necessary>${tr('Μόνο απαραίτητα','Necessary only')}</button><button data-r10f25-cookie-policy>${tr('Πολιτική cookies','Cookie policy')}</button>`;document.body.appendChild(b)}
function capture(e){const bil=e.target.closest&&e.target.closest('#ith526BilDock,#ith525BilDock,#ithBilStableV249475,#athinaFabV249258,[data-ithaki-bil]');if(bil){e.preventDefault();e.stopImmediatePropagation();openNotificationSettings();return false}const why=e.target.closest&&e.target.closest('[data-v249461-action="why"],.ithHomeWhyBtnV249264,[onclick*="openWhyIthakiV249262"]');if(why){e.preventDefault();e.stopImmediatePropagation();openWhy();return false}const overlaySave=e.target.closest&&e.target.closest('#ithR10F9Profile [data-save-profile]');if(overlaySave&&!confirmationOk('overlay')){e.preventDefault();e.stopImmediatePropagation();return false}const a=e.target.closest&&e.target.closest('[data-r10f25-account],[data-r10f25-folder],[data-r10f25-open-folder],[data-r10f25-privacy],[data-r10f25-terms],[data-r10f25-security],[data-r10f25-delete],[data-r10f25-why],[data-r10f25-audit],[data-r10f25-necessary],[data-r10f25-cookie-policy]');if(!a)return;const key=Object.keys(a.dataset).find(k=>k.startsWith('r10f25'));if(!key)return;e.preventDefault();e.stopImmediatePropagation();if(key==='r10f25Account')return openAccountPanel();if(key==='r10f25Folder')return chooseFolder();if(key==='r10f25OpenFolder')return openFolder();if(key==='r10f25Privacy')return openLegal('privacy');if(key==='r10f25Terms')return openLegal('terms');if(key==='r10f25Security')return openLegal('security');if(key==='r10f25Delete')return deleteAccount();if(key==='r10f25Why')return openWhy();if(key==='r10f25Audit')return runAudit();if(key==='r10f25Necessary'){try{localStorage.setItem('ith_cookie_choice_r10f25','necessary')}catch(_e){}$('ithR10F25Cookie')?.remove();return false}if(key==='r10f25CookiePolicy')return openLegal('cookies')}
function installRecoveryCallback(){const old=window.onOkIthakiRecoveryFolderSelected;if(old&&old.__r10f25)return;const f=function(uri){try{if(typeof old==='function')old(uri)}catch(_e){}if(uri)setTimeout(()=>exportAccountFile(true),180);return false};f.__r10f25=true;window.onOkIthakiRecoveryFolderSelected=f}
function expose(){I().openLegalPolicy=openLegal;I().openPolicyR10F25=openLegal;I().openWhyIthakiR10F25=openWhy;I().openAccountProtectionR10F25=openAccountPanel;I().exportAccountFileR10F25=exportAccountFile;I().openBilSettingsR10F25=openNotificationSettings;I().runFunctionAuditR10F25=runAudit;window.openWhyIthakiR10F25=openWhy;window.openPolicyR10F25=openLegal}
function css(){if($('ithR10F25Css'))return;const s=document.createElement('style');s.id='ithR10F25Css';s.textContent=`
.ithR10F25Warning{margin:12px 0;padding:14px;border-radius:20px;border:1px solid rgba(255,174,72,.52);background:linear-gradient(135deg,rgba(132,53,19,.29),rgba(58,20,29,.29));color:#fff}.ithR10F25Warning h3{margin:0 0 7px;color:#ffd59a}.ithR10F25Warning p,.ithR10F25Warning li{line-height:1.48}.ithR10F25Warning ol{margin:8px 0;padding-left:22px}.ithR10F25Path{display:grid;gap:4px;padding:9px;border-radius:14px;background:#0004}.ithR10F25Path code{overflow-wrap:anywhere;color:#bfe9ff}.ithR10F25Confirm{display:flex!important;gap:10px!important;align-items:flex-start!important;padding:12px!important;margin:10px 0!important;border:1px solid rgba(255,191,96,.46)!important;border-radius:16px!important;background:rgba(255,182,72,.1)!important}.ithR10F25Confirm input{width:22px!important;height:22px!important;flex:0 0 auto}.ithR10F25Confirm span{display:grid;gap:4px}.ithR10F25Confirm small{color:var(--muted,#afc2cf)}.ithR10F25Details{border-color:rgba(255,215,112,.38)!important;background:linear-gradient(145deg,rgba(255,215,112,.08),rgba(74,181,255,.06))!important}.ithR10F25Details h3{margin:0 0 10px;color:#ffe09a}.ithR10F25DetailLine{display:grid;grid-template-columns:minmax(140px,.8fr) 1fr;gap:10px;padding:9px 0;border-bottom:1px solid #ffffff13}.ithR10F25DetailLine span{color:#a9bfcc}.ithR10F25Details a,.ithR10F25OverlayDetails a,.ithR10F25Legal a,.ithR10F25Card a{color:#7ddcff}.ithR10F25Buttons{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px}.ithR10F25Buttons button{flex:1 1 150px;min-height:43px}.ithR10F25Buttons .danger{border-color:#ff6e6e!important}.ithR10F25Panel,.ithR10F25Why{height:100%;overflow:auto;padding:10px 10px calc(var(--bar,72px) + 25px);background:linear-gradient(180deg,#06101b,#0b1826);color:#fff}.ithR10F25Panel>header,.ithR10F25Why>header,.ithR10F25Legal>header{position:sticky;top:0;z-index:20;display:grid;grid-template-columns:auto 1fr auto;gap:9px;align-items:center;padding:10px;border-radius:17px;background:#081522f5;border:1px solid #ffffff1c}.ithR10F25Panel>header div,.ithR10F25Why>header div,.ithR10F25Legal>header div{display:grid}.ithR10F25Panel>header small,.ithR10F25Why>header small,.ithR10F25Legal>header small{color:#a9bfcc}.ithR10F25Card{margin-top:10px;padding:14px;border:1px solid #ffffff18;border-radius:19px;background:#ffffff0a}.ithR10F25Card h3{margin:0 0 8px;color:#ffe09a}.ithR10F25Card code{display:block;overflow-wrap:anywhere;color:#bfe9ff}.ithR10F25Why .hero{margin-top:10px;padding:18px;border-radius:23px;border:1px solid #ffdc7838;background:radial-gradient(circle at 15% 0,#ffd87030,transparent 38%),#ffffff08}.ithR10F25Why .hero h2{margin:0 0 8px;color:#ffe09a}.ithR10F25Why .grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin-top:10px}.ithR10F25Why article{padding:14px;border:1px solid #ffffff17;border-radius:20px;background:#ffffff08}.ithR10F25Why article h3{margin:0 0 7px;color:#ffe09a}.ithR10F25Why article p,.ithR10F25Why article li{line-height:1.45}.ithR10F25Why .legal{margin-top:10px;padding:14px;border-radius:18px;border:1px solid #60ccff55;background:#3ba7d51a}.ithR10F25Legal{height:100%;overflow:auto;padding:10px 10px calc(var(--bar,72px) + 30px);background:#07121e;color:#fff}.ithR10F25Legal nav{display:flex;gap:7px;overflow:auto;padding:10px 2px}.ithR10F25Legal nav button{white-space:nowrap}.ithR10F25Legal nav .active{border-color:#ffe09a;background:#ffe09a20}.ithR10F25Legal main{display:grid;gap:10px}.ithR10F25Legal main>section{padding:14px;border-radius:19px;border:1px solid #ffffff16;background:#ffffff08}.ithR10F25Legal main h3{margin:0 0 8px;color:#ffe09a}.ithR10F25Legal main p,.ithR10F25Legal main li{line-height:1.55}.ithR10F25LegalHero{background:radial-gradient(circle at 12% 0,#ffd36e30,transparent 40%),#ffffff08!important;border-color:#ffd36e45!important}.ithR10F25LegalHero h2{margin:0 0 8px;color:#ffe09a}.ithR10F25Legal footer{display:flex;gap:8px;flex-wrap:wrap;margin-top:12px}.ithR10F25Legal footer .green{border-color:#36f0a0;background:#36f0a018}.ithR10F25Legal footer .danger{border-color:#ff7070;background:#ff707015}.ithR10F25Checklist h3:not(:first-child){margin-top:17px}.ithR10F25Audit{display:flex;gap:8px;padding:7px;margin-top:5px;border-radius:12px;background:#ffffff08}.ithR10F25Audit b{width:23px;height:23px;display:grid;place-items:center;border-radius:50%;background:#8b6420}.ithR10F25Audit.ok b{background:#16744e}.ithR10F25Settings{border-color:#ffdc7860!important}.ithR10F25OverlayDetails{gap:4px!important}.ithR10F25OverlayDetails b{font-size:17px!important}.ithR10F25OverlayDetails a{font-weight:800}.ithR10F25Cookie{position:fixed;left:12px;right:12px;bottom:calc(var(--bar,72px) + 10px);z-index:2147483646;display:grid;grid-template-columns:1fr auto auto;gap:9px;align-items:center;padding:13px;border-radius:19px;border:1px solid #ffdc7855;background:#071522f7;color:#fff;box-shadow:0 20px 55px #0008}.ithR10F25Cookie p{margin:4px 0 0;color:#b7c7d1;line-height:1.38}.ithR10F25Cookie button{min-height:40px}.ithR10F25Cookie [data-r10f25-necessary]{border-color:#36f0a0;background:#36f0a018}
@media(max-width:700px){.ithR10F25Why .grid{grid-template-columns:1fr}.ithR10F25DetailLine{grid-template-columns:1fr}.ithR10F25Cookie{grid-template-columns:1fr}.ithR10F25Cookie button{width:100%}.ithR10F25Buttons button{flex-basis:100%}}
`;document.head.appendChild(s)}
function maintain(){css();expose();installMainSaveWrapper();augmentMainProfile();augmentFullProfile();augmentNotificationSettings();const bil=$('ith526BilDock')||$('ith525BilDock')||$('ithBilStableV249475');if(bil){bil.title=tr('ΒΙΛ — ρυθμίσεις ειδοποιήσεων','Bil — notification settings');bil.setAttribute('aria-label',bil.title);bil.dataset.ithakiBil='settings-r10f25'}document.querySelectorAll('.proFooter').forEach(function(f){f.textContent='OK ITHAKI · Ιδιωτικότητα · Ανθρώπινη επικοινωνία'});document.documentElement.setAttribute('data-ithaki-r10f25','active-frontend-truth-profile-policy-bil-controller')}
function install(){css();expose();installRecoveryCallback();document.addEventListener('click',capture,true);new MutationObserver(()=>{clearTimeout(install._m);install._m=setTimeout(maintain,45)}).observe(document.documentElement,{subtree:true,childList:true});maintain();setInterval(maintain,1800);setTimeout(ensureCookieBanner,900);try{localStorage.setItem('ith_frontend_build','V249526R10F25F1-installer-self-copy-fix')}catch(_e){}}
if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',install,{once:true});else install();
})();
