€•BčŒsphinx.addnodes”Œdocument”“”)”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)”}”(hhh]”(hŒ pending_xref”“”)”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒEnglish”…””}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ/process/botching-up-ioctls”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Simplified)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ./translations/zh_CN/process/botching-up-ioctls”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ./translations/zh_TW/process/botching-up-ioctls”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ./translations/ja_JP/process/botching-up-ioctls”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ./translations/ko_KR/process/botching-up-ioctls”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ./translations/sp_SP/process/botching-up-ioctls”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒItalian”uh1h hhŒ _document”hŒsource”NŒline”NubhŒwarning”“”)”}”(hŒ×In caso di dubbi sulla correttezza del contenuto di questa traduzione, l'unico riferimento valido è la documentazione ufficiale in inglese. Per maggiori informazioni consultate le :ref:`avvertenze `.”h]”hŒ paragraph”“”)”}”(hŒ×In caso di dubbi sulla correttezza del contenuto di questa traduzione, l'unico riferimento valido è la documentazione ufficiale in inglese. Per maggiori informazioni consultate le :ref:`avvertenze `.”h]”(hŒˇIn caso di dubbi sulla correttezza del contenuto di questa traduzione, l’unico riferimento valido è la documentazione ufficiale in inglese. Per maggiori informazioni consultate le ”…””}”(hhŠhžhhŸNh Nubh)”}”(hŒ!:ref:`avvertenze `”h]”hŒinline”“”)”}”(hhłh]”hŒ avvertenze”…””}”(hhˇhžhhŸNh Nubah}”(h]”h ]”(Œxref”Œstd”Œstd-ref”eh"]”h$]”h&]”uh1hľhhąubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”Œ-translations/it_IT/process/botching-up-ioctls”Œ refdomain”hŒreftype”Œref”Œ refexplicit”ˆŒrefwarn”ˆŒ reftarget”Œ it_disclaimer”uh1hhŸŒ3Documentation/translations/it_IT/disclaimer-ita.rst”h KhhŠubhŒ.”…””}”(hhŠhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhÖh KhhŁubah}”(h]”h ]”h"]”h$]”h&]”uh1hĄhhhžhhŸhÖh NubhŒ field_list”“”)”}”(hhh]”hŒfield”“”)”}”(hhh]”(hŒ field_name”“”)”}”(hŒOriginal”h]”hŒOriginal”…””}”(hhóhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hńhhîhŸŒ[/var/lib/git/docbuild/linux/Documentation/translations/it_IT/process/botching-up-ioctls.rst”h KubhŒ field_body”“”)”}”(hŒ-Documentation/process/botching-up-ioctls.rst ”h]”h¨)”}”(hŒ,Documentation/process/botching-up-ioctls.rst”h]”hŒ,Documentation/process/botching-up-ioctls.rst”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh Khjubah}”(h]”h ]”h"]”h$]”h&]”uh1jhhîubeh}”(h]”h ]”h"]”h$]”h&]”uh1hěhŸjh Khhéhžhubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhhhžhhŸjh KubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒ*(Come evitare di) Raffazzonare delle ioctl”h]”hŒ*(Come evitare di) Raffazzonare delle ioctl”…””}”(hj/hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hj*hžhhŸjh Kubh¨)”}”(hŒ?Preso da: https://blog.ffwll.ch/2013/11/botching-up-ioctls.html”h]”(hŒ Preso da: ”…””}”(hj=hžhhŸNh NubhŒ reference”“”)”}”(hŒ5https://blog.ffwll.ch/2013/11/botching-up-ioctls.html”h]”hŒ5https://blog.ffwll.ch/2013/11/botching-up-ioctls.html”…””}”(hjGhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jIuh1jEhj=ubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh K hj*hžhubh¨)”}”(hŒ?Scritto da : Daniel Vetter, Copyright Š 2013 Intel Corporation”h]”hŒ?Scritto da : Daniel Vetter, Copyright Š 2013 Intel Corporation”…””}”(hj\hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh K hj*hžhubh¨)”}”(hXUna cosa che gli sviluppatori del sottosistema grafico del kernel Linux hanno imparato negli ultimi anni è l'inutilitĂ  di cercare di creare un'interfaccia unificata per gestire la memoria e le unitĂ  esecutive di diverse GPU. Dunque, oggigiorno ogni driver ha il suo insieme di ioctl per allocare memoria ed inviare dei programmi alla GPU. Il che è va bene dato che non c'è piĂš un insano sistema che finge di essere generico, ma al suo posto ci sono interfacce dedicate. Ma al tempo stesso è piĂš facile incasinare le cose.”h]”hXUna cosa che gli sviluppatori del sottosistema grafico del kernel Linux hanno imparato negli ultimi anni è l’inutilitĂ  di cercare di creare un’interfaccia unificata per gestire la memoria e le unitĂ  esecutive di diverse GPU. Dunque, oggigiorno ogni driver ha il suo insieme di ioctl per allocare memoria ed inviare dei programmi alla GPU. Il che è va bene dato che non c’è piĂš un insano sistema che finge di essere generico, ma al suo posto ci sono interfacce dedicate. Ma al tempo stesso è piĂš facile incasinare le cose.”…””}”(hjjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh K hj*hžhubh¨)”}”(hXŸPer evitare di ripetere gli stessi errori ho preso nota delle lezioni imparate mentre raffazzonavo il driver drm/i915. La maggior parte di queste lezioni si focalizzano sui tecnicismi e non sulla visione d'insieme, come le discussioni riguardo al modo migliore per implementare una ioctl per inviare compiti alla GPU. Probabilmente, ogni sviluppatore di driver per GPU dovrebbe imparare queste lezioni in autonomia.”h]”hXĄPer evitare di ripetere gli stessi errori ho preso nota delle lezioni imparate mentre raffazzonavo il driver drm/i915. La maggior parte di queste lezioni si focalizzano sui tecnicismi e non sulla visione d’insieme, come le discussioni riguardo al modo migliore per implementare una ioctl per inviare compiti alla GPU. Probabilmente, ogni sviluppatore di driver per GPU dovrebbe imparare queste lezioni in autonomia.”…””}”(hjxhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh Khj*hžhubj))”}”(hhh]”(j.)”}”(hŒ Prerequisiti”h]”hŒ Prerequisiti”…””}”(hj‰hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hj†hžhhŸjh Kubh¨)”}”(hŒ™Prima i prerequisiti. Seguite i seguenti suggerimenti se non volete fallire in partenza e ritrovarvi ad aggiungere un livello di compatibilitĂ  a 32-bit.”h]”hŒ™Prima i prerequisiti. Seguite i seguenti suggerimenti se non volete fallire in partenza e ritrovarvi ad aggiungere un livello di compatibilitĂ  a 32-bit.”…””}”(hj—hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh K hj†hžhubhŒ bullet_list”“”)”}”(hhh]”(hŒ list_item”“”)”}”(hŒ¸Usate solamente interi a lunghezza fissa. Per evitare i conflitti coi tipi definiti nello spazio utente, il kernel definisce alcuni tipi speciali, come: ``__u32``, ``__s64``. Usateli. ”h]”h¨)”}”(hŒˇUsate solamente interi a lunghezza fissa. Per evitare i conflitti coi tipi definiti nello spazio utente, il kernel definisce alcuni tipi speciali, come: ``__u32``, ``__s64``. Usateli.”h]”(hŒ™Usate solamente interi a lunghezza fissa. Per evitare i conflitti coi tipi definiti nello spazio utente, il kernel definisce alcuni tipi speciali, come: ”…””}”(hj°hžhhŸNh NubhŒliteral”“”)”}”(hŒ ``__u32``”h]”hŒ__u32”…””}”(hjşhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj°ubhŒ, ”…””}”(hj°hžhhŸNh Nubjš)”}”(hŒ ``__s64``”h]”hŒ__s64”…””}”(hjĚhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj°ubhŒ . Usateli.”…””}”(hj°hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh K#hjŹubah}”(h]”h ]”h"]”h$]”h&]”uh1jŞhj§hžhhŸjh NubjŤ)”}”(hXDAllineate tutto alla lunghezza naturale delle piattaforma in uso e riempite esplicitamente i vuoti. Non necessariamente le piattaforme a 32-bit allineano i valori a 64-bit rispettandone l'allineamento, ma le piattaforme a 64-bit lo fanno. Dunque, per farlo correttamente in entrambe i casi dobbiamo sempre riempire i vuoti. ”h]”h¨)”}”(hXCAllineate tutto alla lunghezza naturale delle piattaforma in uso e riempite esplicitamente i vuoti. Non necessariamente le piattaforme a 32-bit allineano i valori a 64-bit rispettandone l'allineamento, ma le piattaforme a 64-bit lo fanno. Dunque, per farlo correttamente in entrambe i casi dobbiamo sempre riempire i vuoti.”h]”hXEAllineate tutto alla lunghezza naturale delle piattaforma in uso e riempite esplicitamente i vuoti. Non necessariamente le piattaforme a 32-bit allineano i valori a 64-bit rispettandone l’allineamento, ma le piattaforme a 64-bit lo fanno. Dunque, per farlo correttamente in entrambe i casi dobbiamo sempre riempire i vuoti.”…””}”(hjîhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh K'hjęubah}”(h]”h ]”h"]”h$]”h&]”uh1jŞhj§hžhhŸjh NubjŤ)”}”(hXrSe una struttura dati contiene valori a 64-bit, allora fate si che la sua dimensione sia allineata a 64-bit, altrimenti la sua dimensione varierĂ  su sistemi a 32-bit e 64-bit. Avere una dimensione differente causa problemi quando si passano vettori di strutture dati al kernel, o quando il kernel effettua verifiche sulla dimensione (per esempio il sistema drm lo fa). ”h]”h¨)”}”(hXqSe una struttura dati contiene valori a 64-bit, allora fate si che la sua dimensione sia allineata a 64-bit, altrimenti la sua dimensione varierĂ  su sistemi a 32-bit e 64-bit. Avere una dimensione differente causa problemi quando si passano vettori di strutture dati al kernel, o quando il kernel effettua verifiche sulla dimensione (per esempio il sistema drm lo fa).”h]”hXqSe una struttura dati contiene valori a 64-bit, allora fate si che la sua dimensione sia allineata a 64-bit, altrimenti la sua dimensione varierĂ  su sistemi a 32-bit e 64-bit. Avere una dimensione differente causa problemi quando si passano vettori di strutture dati al kernel, o quando il kernel effettua verifiche sulla dimensione (per esempio il sistema drm lo fa).”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh K-hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jŞhj§hžhhŸjh NubjŤ)”}”(hXËI puntatori sono di tipo ``__u64``, con un *cast* da/a ``uintptr_t`` da lato spazio utente e da/a ``void __user *`` nello spazio kernel. Sforzatevi il piĂš possibile per non ritardare la conversione, o peggio maneggiare ``__u64`` nel vostro codice perchĂŠ questo riduce le verifiche che strumenti come sparse possono effettuare. La macro u64_to_user_ptr() può essere usata nel kernel per evitare avvisi riguardo interi e puntatori di dimensioni differenti. ”h]”h¨)”}”(hXÉI puntatori sono di tipo ``__u64``, con un *cast* da/a ``uintptr_t`` da lato spazio utente e da/a ``void __user *`` nello spazio kernel. Sforzatevi il piĂš possibile per non ritardare la conversione, o peggio maneggiare ``__u64`` nel vostro codice perchĂŠ questo riduce le verifiche che strumenti come sparse possono effettuare. La macro u64_to_user_ptr() può essere usata nel kernel per evitare avvisi riguardo interi e puntatori di dimensioni differenti.”h]”(hŒI puntatori sono di tipo ”…””}”(hjhžhhŸNh Nubjš)”}”(hŒ ``__u64``”h]”hŒ__u64”…””}”(hj&hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjubhŒ , con un ”…””}”(hjhžhhŸNh NubhŒemphasis”“”)”}”(hŒ*cast*”h]”hŒcast”…””}”(hj:hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hjubhŒ da/a ”…””}”(hjhžhhŸNh Nubjš)”}”(hŒ ``uintptr_t``”h]”hŒ uintptr_t”…””}”(hjLhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjubhŒ da lato spazio utente e da/a ”…””}”(hjhžhhŸNh Nubjš)”}”(hŒ``void __user *``”h]”hŒ void __user *”…””}”(hj^hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjubhŒi nello spazio kernel. Sforzatevi il piĂš possibile per non ritardare la conversione, o peggio maneggiare ”…””}”(hjhžhhŸNh Nubjš)”}”(hŒ ``__u64``”h]”hŒ__u64”…””}”(hjphžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjubhŒä nel vostro codice perchĂŠ questo riduce le verifiche che strumenti come sparse possono effettuare. La macro u64_to_user_ptr() può essere usata nel kernel per evitare avvisi riguardo interi e puntatori di dimensioni differenti.”…””}”(hjhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh K3hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jŞhj§hžhhŸjh Nubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ*”uh1jĽhŸjh K#hj†hžhubeh}”(h]”Œ prerequisiti”ah ]”h"]”Œ prerequisiti”ah$]”h&]”uh1j(hj*hžhhŸjh Kubj))”}”(hhh]”(j.)”}”(hŒLe Basi”h]”hŒLe Basi”…””}”(hjĄhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hjžhžhhŸjh KhjžhžhubjŚ)”}”(hhh]”(jŤ)”}”(hXŕAbbiate un modo chiaro per capire dallo spazio utente se una nuova ioctl, o l'estensione di una esistente, sia supportata dal kernel in esecuzione. Se non potete fidarvi del fatto che un vecchio kernel possa rifiutare correttamente un nuovo *flag*, modalitĂ , o ioctl, (probabilmente perchĂŠ avevate raffazzonato qualcosa nel passato) allora dovrete implementare nel driver un meccanismo per notificare quali funzionalitĂ  sono supportate, o in alternativa un numero di versione. ”h]”h¨)”}”(hXßAbbiate un modo chiaro per capire dallo spazio utente se una nuova ioctl, o l'estensione di una esistente, sia supportata dal kernel in esecuzione. Se non potete fidarvi del fatto che un vecchio kernel possa rifiutare correttamente un nuovo *flag*, modalitĂ , o ioctl, (probabilmente perchĂŠ avevate raffazzonato qualcosa nel passato) allora dovrete implementare nel driver un meccanismo per notificare quali funzionalitĂ  sono supportate, o in alternativa un numero di versione.”h]”(hŒóAbbiate un modo chiaro per capire dallo spazio utente se una nuova ioctl, o l’estensione di una esistente, sia supportata dal kernel in esecuzione. Se non potete fidarvi del fatto che un vecchio kernel possa rifiutare correttamente un nuovo ”…””}”(hjÄhžhhŸNh Nubj9)”}”(hŒ*flag*”h]”hŒflag”…””}”(hjĚhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hjÄubhŒč, modalitĂ , o ioctl, (probabilmente perchĂŠ avevate raffazzonato qualcosa nel passato) allora dovrete implementare nel driver un meccanismo per notificare quali funzionalitĂ  sono supportate, o in alternativa un numero di versione.”…””}”(hjÄhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh KChjŔubah}”(h]”h ]”h"]”h$]”h&]”uh1jŞhj˝hžhhŸjh NubjŤ)”}”(hXëAbbiate un piano per estendere le ioctl con nuovi *flag* o campi alla fine di una struttura dati. Il sistema drm verifica la dimensione di ogni ioctl in arrivo, ed estende con zeri ogni incongruenza fra kernel e spazio utente. Questo aiuta, ma non è una soluzione completa dato che uno spazio utente nuovo su un kernel vecchio non noterebbe che i campi nuovi alla fine della struttura vengono ignorati. Dunque, anche questo avrĂ  bisogno di essere notificato dal driver allo spazio utente. ”h]”h¨)”}”(hXęAbbiate un piano per estendere le ioctl con nuovi *flag* o campi alla fine di una struttura dati. Il sistema drm verifica la dimensione di ogni ioctl in arrivo, ed estende con zeri ogni incongruenza fra kernel e spazio utente. Questo aiuta, ma non è una soluzione completa dato che uno spazio utente nuovo su un kernel vecchio non noterebbe che i campi nuovi alla fine della struttura vengono ignorati. Dunque, anche questo avrĂ  bisogno di essere notificato dal driver allo spazio utente.”h]”(hŒ2Abbiate un piano per estendere le ioctl con nuovi ”…””}”(hjîhžhhŸNh Nubj9)”}”(hŒ*flag*”h]”hŒflag”…””}”(hjöhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hjîubhX˛ o campi alla fine di una struttura dati. Il sistema drm verifica la dimensione di ogni ioctl in arrivo, ed estende con zeri ogni incongruenza fra kernel e spazio utente. Questo aiuta, ma non è una soluzione completa dato che uno spazio utente nuovo su un kernel vecchio non noterebbe che i campi nuovi alla fine della struttura vengono ignorati. Dunque, anche questo avrĂ  bisogno di essere notificato dal driver allo spazio utente.”…””}”(hjîhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh KKhjęubah}”(h]”h ]”h"]”h$]”h&]”uh1jŞhj˝hžhhŸjh NubjŤ)”}”(hXZVerificate tutti i campi e *flag* inutilizzati ed i riempimenti siano a 0, altrimenti rifiutare la ioctl. Se non lo fate il vostro bel piano per estendere le ioctl andrĂ  a rotoli dato che qualcuno userĂ  delle ioctl con strutture dati con valori casuali dallo stack nei campi inutilizzati. Il che si traduce nell'avere questi campi nell'ABI, e la cui unica utilitĂ  sarĂ  quella di contenere spazzatura. Per questo dovrete esplicitamente riempire i vuoti di tutte le vostre strutture dati, anche se non le userete in un vettore. Il riempimento fatto dal compilatore potrebbe contenere valori casuali. ”h]”h¨)”}”(hXYVerificate tutti i campi e *flag* inutilizzati ed i riempimenti siano a 0, altrimenti rifiutare la ioctl. Se non lo fate il vostro bel piano per estendere le ioctl andrĂ  a rotoli dato che qualcuno userĂ  delle ioctl con strutture dati con valori casuali dallo stack nei campi inutilizzati. Il che si traduce nell'avere questi campi nell'ABI, e la cui unica utilitĂ  sarĂ  quella di contenere spazzatura. Per questo dovrete esplicitamente riempire i vuoti di tutte le vostre strutture dati, anche se non le userete in un vettore. Il riempimento fatto dal compilatore potrebbe contenere valori casuali.”h]”(hŒVerificate tutti i campi e ”…””}”(hjhžhhŸNh Nubj9)”}”(hŒ*flag*”h]”hŒflag”…””}”(hj hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hjubhX< inutilizzati ed i riempimenti siano a 0, altrimenti rifiutare la ioctl. Se non lo fate il vostro bel piano per estendere le ioctl andrĂ  a rotoli dato che qualcuno userĂ  delle ioctl con strutture dati con valori casuali dallo stack nei campi inutilizzati. Il che si traduce nell’avere questi campi nell’ABI, e la cui unica utilitĂ  sarĂ  quella di contenere spazzatura. Per questo dovrete esplicitamente riempire i vuoti di tutte le vostre strutture dati, anche se non le userete in un vettore. Il riempimento fatto dal compilatore potrebbe contenere valori casuali.”…””}”(hjhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh KShjubah}”(h]”h ]”h"]”h$]”h&]”uh1jŞhj˝hžhhŸjh NubjŤ)”}”(hŒEAbbiate un semplice codice di test per ognuno dei casi sopracitati. ”h]”h¨)”}”(hŒCAbbiate un semplice codice di test per ognuno dei casi sopracitati.”h]”hŒCAbbiate un semplice codice di test per ognuno dei casi sopracitati.”…””}”(hjBhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh K]hj>ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŞhj˝hžhhŸjh Nubeh}”(h]”h ]”h"]”h$]”h&]”j”j•uh1jĽhŸjh KChjžhžhubeh}”(h]”Œle-basi”ah ]”h"]”Œle basi”ah$]”h&]”uh1j(hj*hžhhŸjh K