Editing Talk:PlayStation 3 Theme (P3T)

Jump to navigation Jump to search
Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.

Latest revision Your text
Line 2: Line 2:


===Standarizing "theme format" names===
===Standarizing "theme format" names===
The standarization of theme names used in the front page can be polemic and initially confusing, but after some brainstorming i realized we need to keep the sony standards naming and at the same time think in another way to name the different methods used with animated themes, and here is where the confussion starts because "the scene" has been using names that are limited in long term for his possible derivations e.g: "slideshow" "pro slideshow" "dynamic pro slideshow", etc... (big mention here to glowball for his experiments, cheers)
This standarization of names can be polemic, and initially confusing, but after some brainstorming i realized we need to "keep the sony standards naming" and at the same time think in another way to name the different methods used, and here is where the confussion starts because "the scene" has been using names that are limited in long term for his derivations e.g: "slideshow" "pro slideshow" "dynamic pro slideshow", etc... (big mention here to glowball for his experiments, cheers)


The point is if you take a "dynamic pro slideshow" as base and add to it a new 3d sphere + more semitransparent layers + etc + etc this is a "dynamic pro slideshow multilayer with a 3d object, etc..." ?... well, it sounds supercool (ironic) for a resume, but not even this long name defines how has been created, to make a list we need the "method" or "technique" used.
The point is if you take a "dynamic pro slideshow" as base and add to it a new 3d sphere + more semitransparent layers + etc + etc this is a "dynamic pro slideshow multilayer with rotating objects" ?... well, it sounds good for a resume, but not even this long text explains how has been buit, to make a list we need the "method" or "technique" used, so i propose something like this:


The big difference (that keeps the standard naming) is static doesnt use an script.js, and dynamic does... we will have problems to give a name to the "methods" but i think this way to focus is better, any idea or suggestion is welcome --[[User:Sandungas|Sandungas]] 11:01, 14 February 2013 (MSK)
#Static background (.JPG)
##Linked to PS3 boot counter ? (btw, i have no idea how the ps3 knows wich was the last background used, background is supposed to change in every boot so there is some kind of counter somewhere :P)
##Linked to day or daytime
#Dinamyc background (.RAF)
##Method 1 (3d model.dae covering all the background, several .dds textuers applyed over the model, the script changes the texture every 10 seconds)
##Method 2 (no 3d model, several .dds textuers in the background, the script changes the the transparency of textures every 10 seconds)
##Method 3 (no 3d model, several .dds textuers in the background, the script moves the textures from right to left with a fadeout every 10 seconds)
##Method 4 etc... (note all this methods in the examples are "slideshows")


===Backgrounds linked to clock time===
The big difference (that keeps the standard naming) is static doesnt use an script.js, and dynamic does... we will have problems to give a name to the "methods" but i think this way to focus is better, any idea or suggestion is wellcome --[[User:Sandungas|Sandungas]] 11:01, 14 February 2013 (MSK)
*[http://rghost.net/59623568 PS3 Themes background testkit v1.zip]
A collection of themes using the background examples explained in front page, the zip contains several example themes xml's and 24 numbered backgrounds + 2 special backgrounds with the text "win" and "failsafe" in both 4:3 and 16:9 aspect ratios for a total of 52 backgrounds, this background are intented to create special events and collisions (feel free to add more examples to the .zip, upload again, and replace the link by "testkit v2", v3, etc...)
 
*Notes
To see an interesting example of how backgrounds are linked to the system clock, compile "Test 15bg to seconds.xml" theme, then install and "apply", and... press "x" button again over "apply" repeatedly as faster as possible (lol), you will see how the background numbers increases 1 by 1. Now wait 3 seconds and press "apply" again and the number in screen has increased in +3. This means every time the theme is applyed (or everytime the PS3 boots) is readed the system clock, and a background is choosen based in the seconds of the clock. This is also a way to make a theme with (semi) random backgrounds that will be selected based in the time when the PS3 was turned on.
 
===p3t format, p3tcompiler, and p3textractor notes===
 
{{Boxframe1|content=
'''p3tcompiler'''
*p3t format uses several tables to store the "standard names of the files" without file extension (original names and file extensions of the files used to build the theme are lost)
*backgrounds lost his file names,, instead of the original name of the file is used the "standard" name... either "hd" and "sd" for static themes... or "anim" for dynamic themes
*backgrounds are stored in a table in the same order that are placed in the original "Theme Name.xml". There is no conversion to this .jpg files, the start position of static backgrounds can be found by looking for "FF D8 FF E0 00 10 4A 46 49 46 00 01 02 01 00 48 00 48 00 00" in the .p3t file in a hexeditor
*The original name of the .xml is lost (there is no place to store it, just his tags in a table)
*The order of items and tables in the p3t file is fixed and always the same (with a few exceptions). The compiler reorders the items to his convenience
*Items in the p3t file that respect the original order of the xml are all contents of: <icontable>, <bgimagetable>, <pointertable> ?
*Compiler version 2.00 with dynamic background ouput unrecognized attribut name "anim" for dynamic background and fail to make the p3t, when the 1.80 compile it.
 
'''p3textractor'''
*rename problems
**"notification" image is renamed to "src"
**if the theme contains multiple backgrounds, extracted backgrounds are not renamed in the correct order using "hd_1", "sd_2" etc... (but are correctly ordered in the p3t)
**png filextensions are duplicated (in the extraction process is needed to convert images to .gim then to png, the resulting files are renamed to "file.gim.png")
**png and .gim filenames are numbered by adding a "_1" at the end, but is not needed (is only needed in the backgrounds when there are several of the same type)
**"Theme Name.p3t.xml" instead of "Theme Name.xml"
*xml problems
**the order or items inside <info> and <icontable> in the extracted xml is different than the one contained in the .p3t
}}
 
{{Boxcode|width=auto|float=left|title=p3t format, standard order of tags after compilation''' (based in the tags stored in the xml table inside the .p3t file)|code=<syntaxhighlight lang="xml">
<infotable>
<info>
comment
previewsize <!-- added by the compiler -->
name
author
url
authoriconsize <!-- added by the compiler -->
authoricon
iconsize <!-- added by the compiler -->
version
mtime <!-- added by the compiler -->
genre
preview
icon
<localizedinfo>
<icontable>
<pointertable>
<notification>
<setable>
<bgimagetable>
<font>
<color>
</syntaxhighlight>}}
 
{{clear}}
 
==Maximum number of installed themes==
Inside game_ext_plugin.rco/english.xml
<Text name="msg_error_install_theme_over_delete_other_theme">The maximum number of themes that can be installed has been reached.
To install this theme, you must delete an existing theme.</Text>
 
==Preinstalled themes resources==
<Mugi> the ones in the RCO's are used by the classic theme
 
<Mugi> the default theme uses the DDS icons from icontex.qrc
 
<Mugi> looks like i was wrong, the classic theme doesnt' use the icosn from the RCO either
 
<Mugi> maybe sony changed it since the last time i toyed with this, no clue
 
<Mugi> im sure it did at some point
 
==Firmware resources overrided by themes==
===[[system_plugin]].rco===
{{Boxcode|code=<syntaxhighlight lang="xml">
<!-- This XML representation of an RCO structure was generated by Rcomage v1.1.2 -->
<RcoFile UMDFlag="0" rcomageXmlVer="1.1" type="ps3" minFirmwareVer="unknownId0x130">
<MainTree name="system_plugin">
<ImageTree>
...
<Image name="tex_pointer_arrow" src="tex_pointer_arrow.gim" format="gim" compression="zlib" unknownByte="0" />
<Image name="tex_pointer_finger" src="tex_pointer_finger.gim" format="gim" compression="zlib" unknownByte="0" />
<Image name="tex_pointer_pen" src="tex_pointer_pen.gim" format="gim" compression="zlib" unknownByte="0" />
<Image name="tex_pointer_hand" src="tex_pointer_hand.gim" format="gim" compression="zlib" unknownByte="0" />
<Image name="tex_pointer_grab" src="tex_pointer_grab.gim" format="gim" compression="zlib" unknownByte="0" />
<Image name="tex_pointer_click" src="tex_pointer_click.gim" format="gim" compression="zlib" unknownByte="0" />
...
<Image name="tex_notification" src="tex_notification.gim" format="gim" compression="zlib" unknownByte="0" />
...
</ImageTree>
<SoundTree>
<Sound name="snd_cursor" src="snd_cursor.ch*.vag" format="vag" channels="2" /> <!-- Cursor movements: left, right, up, down -->
<Sound name="snd_decide" src="snd_decide.ch*.vag" format="vag" channels="2" /> <!-- Question -->
<Sound name="snd_cancel" src="snd_cancel.ch*.vag" format="vag" channels="2" /> <!-- Close/exit a options menu -->
<Sound name="snd_category_decide" src="snd_category_decide.ch*.vag" format="vag" channels="2" /> <!-- ??? (not remapeable from theme) -->
<Sound name="snd_option" src="snd_option.ch*.vag" format="vag" channels="2" /> <!-- Open/enter a options menu -->
<Sound name="snd_error" src="snd_error.ch*.vag" format="vag" channels="2" /> <!-- Error (not remapeable from theme) -->
<Sound name="snd_system_ok" src="snd_system_ok.ch*.vag" format="vag" channels="2" /> <!-- Accept -->
<Sound name="snd_system_ng" src="snd_system_ng.ch*.vag" format="vag" channels="2" /> <!-- ??? (not remapeable from theme) -->
<Sound name="snd_trophy" src="snd_trophy.ch*.vag" format="vag" channels="1" /> <!-- Trophy unlocked (not remapeable from theme) -->
</SoundTree>
<TextTree>
...
</TextTree>
<ObjectTree>
...
</ObjectTree>
<AnimTree>
...
</AnimTree>
</MainTree>
</RcoFile>
</syntaxhighlight>}}
 
====Navigation sounds====
All the sounds are 2 channels stereo (except trophy sound that is 1 channel mono), every channel is a separated file with its name ending in 0 or 1... (for mono 0 is both channels... and for stereo 0 is left and 1 right ?), the complete list of files extracted raw without conversion from [[system_plugin]].rco are:
snd_cancel.ch0.vag
snd_cancel.ch1.vag
snd_category_decide.ch0.vag
snd_category_decide.ch1.vag
snd_cursor.ch0.vag
snd_cursor.ch1.vag
snd_decide.ch0.vag
snd_decide.ch1.vag
snd_error.ch0.vag
snd_error.ch1.vag
snd_option.ch0.vag
snd_option.ch1.vag
snd_system_ng.ch0.vag
snd_system_ng.ch1.vag
snd_system_ok.ch0.vag
snd_system_ok.ch1.vag
snd_trophy.ch0.vag
 
Only 5 of them can be remapped from an official .p3t theme
{{Boxcode|code=<syntaxhighlight lang="xml">
<theme>
<!-- Navigation sounds ------------------------------------------------------------------------------->
<setable>
<se id="se_cursor" src="se_cursor.vag"/> <!-- Cursor movements: left, right, up, down -->
<se id="se_optionmenu" src="se_optionmenu.vag"/> <!-- Open/enter a options menu -->
<se id="se_cancel" src="se_cancel.vag"/> <!-- Close/exit a options menu -->
<se id="se_decide" src="se_decide.vag"/> <!-- Question -->
<se id="se_system_ok" src="se_system_ok.vag"/> <!-- Accept -->
</setable>
</theme>
</syntaxhighlight>}}
 
====Mouse pointers====
All them can be remapped from an official .p3t theme
{{Boxcode|code=<syntaxhighlight lang="xml">
<theme>
<!-- Mouse pointers ---------------------------------------------------------------------------------->
<pointertable>
<pointer id="pointer_arrow" src="pointer_arrow.png" base_x="20" base_y="5"/> <!-- Arrow (default) -->
<pointer id="pointer_pen" src="pointer_pen.png" base_x="5" base_y="40"/> <!-- Pen (text input) -->
<pointer id="pointer_finger" src="pointer_finger.png" base_x="15" base_y="10"/> <!-- Hand Over Clickable Object -->
<pointer id="pointer_click" src="pointer_click.png" base_x="15" base_y="10"/> <!-- Hand Clicking Object -->
<pointer id="pointer_hand" src="pointer_hand.png" base_x="25" base_y="20"/> <!-- Hand Over Draggable Object -->
<pointer id="pointer_grab" src="pointer_grab.png" base_x="25" base_y="20"/> <!-- Hand Dragging Object -->
</pointertable>
</theme>
</syntaxhighlight>}}
 
====Notification window frame====
{{Boxcode|code=<syntaxhighlight lang="xml">
<theme>
<!-- Notification window ----------------------------------------------------------------------------->
<notification src="notification.png"/>
</theme>
</syntaxhighlight>}}
 
===[[lines.qrc]]===
====Background====
{{Boxcode|code=<syntaxhighlight lang="xml">
<theme>
<!-- Background -------------------------------------------------------------------------------------->
<bgimagetable>
<bgimage hd="hd_1.jpg" sd="sd_1.jpg"/>
</bgimagetable>
</theme>
</syntaxhighlight>}}
 
===[[icons.qrc]]===
====Color====
{{Boxcode|code=<syntaxhighlight lang="xml">
<theme>
<!-- Color ------------------------------------------------------------------------------------------->
<color selection="10"/> <!-- 1 to 12: color of a month, 0: changes with the month  -->
</theme>
</syntaxhighlight>}}
 
===[[icontex.qrc]]===
====Icons textures====
{{Boxcode|code=<syntaxhighlight lang="xml">
<theme>
<!-- Icons -------------------------------------------------------------------------------------------->
<icontable>
<!----------------------- horizontal row ------------------->
<icon id="icon_user" src="icon_user.png"/>
<icon id="icon_setting" src="icon_setting.png"/>
<icon id="icon_photo" src="icon_photo.png"/>
<icon id="icon_music" src="icon_music.png"/>
<icon id="icon_video" src="icon_video.png"/>
<icon id="icon_game" src="icon_game.png"/>
<icon id="icon_network" src="icon_network.png"/>
<icon id="icon_friend" src="icon_friend.png"/>
<icon id="icon_tv" src="icon_tv.png"/>
<!-------------------------- user column ----------------------->
<icon id="icon_poweroff" src="icon_poweroff.png"/>
<icon id="icon_newuser" src="icon_newuser.png"/>
<!---------------------- settings column --------------------->
<icon id="icon_update" src="icon_update.png"/>
<icon id="icon_game_setting" src="icon_game_setting.png"/>
<icon id="icon_bdvd_setting" src="icon_bdvd_setting.png"/>
<icon id="icon_music_setting" src="icon_music_setting.png"/>
<icon id="icon_chat_setting" src="icon_chat_setting.png"/>
<icon id="icon_system_setting" src="icon_system_setting.png"/>
<icon id="icon_theme_setting" src="icon_theme_setting.png"/>
<icon id="icon_datetime_setting" src="icon_datetime_setting.png"/>
<icon id="icon_powersave_setting" src="icon_powersave_setting.png"/>
<icon id="icon_accessory" src="icon_accessory.png"/>
<icon id="icon_printer_setting" src="icon_printer_setting.png"/>
<icon id="icon_display_setting" src="icon_display_setting.png"/>
<icon id="icon_sound_setting" src="icon_sound_setting.png"/>
<icon id="icon_security_setting" src="icon_security_setting.png"/>
<icon id="icon_remoteplay_setting" src="icon_remoteplay_setting.png"/>
<icon id="icon_network_setting" src="icon_network_setting.png"/>
<icon id="icon_setting_item" src="icon_setting_item.png"/>
<!------------ photo/music/video columns ---------------------------->
<icon id="icon_photo_default" src="icon_photo_default.png"/>
<icon id="icon_photo_album_default" src="icon_photo_album_default.png"/>
<icon id="icon_music_default" src="icon_music_default.png"/>
<icon id="icon_music_album_default" src="icon_music_album_default.png"/>
<icon id="icon_video_default" src="icon_video_default.png"/>
<icon id="icon_video_album_default" src="icon_video_album_default.png"/>
<!-------------------------- game column ----------------------->
<icon id="icon_gamedata" src="icon_gamedata.png"/>
<icon id="icon_savedata" src="icon_savedata.png"/>
<icon id="icon_savedata_minis" src="icon_savedata_minis.png"/>
<icon id="icon_vmc" src="icon_vmc.png"/>
<icon id="icon_newvmc" src="icon_newvmc.png"/>
<icon id="icon_trophy" src="icon_trophy.png"/>
<!----------------------- network column --------------------------->
<icon id="icon_onlinemanual" src="icon_onlinemanual.png"/>
<icon id="icon_remoteplay" src="icon_remoteplay.png"/>
<icon id="icon_inet_search" src="icon_inet_search.png"/>
<icon id="icon_browser" src="icon_browser.png"/>
<icon id="icon_download" src="icon_download.png"/>
<!--------------------------- psn column ---------------------------->
<icon id="icon_accountmanage" src="icon_accountmanage.png"/>
<!----------------------- friends column ------------------------>
<icon id="icon_blocklist" src="icon_blocklist.png"/>
<icon id="icon_addfriend" src="icon_addfriend.png"/>
<icon id="icon_playermet" src="icon_playermet.png"/>
<icon id="icon_chat" src="icon_chat.png"/>
<icon id="icon_chatroom" src="icon_chatroom.png"/>
<icon id="icon_chatroom_text" src="icon_chatroom_text.png"/>
<icon id="icon_mbox" src="icon_mbox.png"/>
<icon id="icon_mbox_received" src="icon_mbox_received.png"/>
<icon id="icon_mbox_sent" src="icon_mbox_sent.png"/>
<icon id="icon_mbox_create" src="icon_mbox_create.png"/>
<!------------------------------ devices ----------------->
<icon id="icon_ms" src="icon_ms.png"/>
<icon id="icon_sd" src="icon_sd.png"/>
<icon id="icon_cf" src="icon_cf.png"/>
<icon id="icon_usb" src="icon_usb.png"/>
<icon id="icon_psp" src="icon_psp.png"/>
<icon id="icon_pspms" src="icon_pspms.png"/>
<icon id="icon_usbcamera" src="icon_usbcamera.png"/>
<icon id="icon_usbaad" src="icon_usbaad.png"/>
<!------------------------- media player ---------------------->
<icon id="icon_playing" src="icon_playing.png"/>
<icon id="icon_mediaserver_search" src="icon_mediaserver_search.png"/>
<icon id="icon_playlist" src="icon_playlist.png"/>
<icon id="icon_playlist_add" src="icon_playlist_add.png"/>
<icon id="icon_video_upload" src="icon_video_upload.png"/>
<!------------------------ default icons ------------------------>
<icon id="icon_default_h" src="icon_default_h.png"/>
<icon id="icon_default_v" src="icon_default_v.png"/>
</icontable>
</theme>
</syntaxhighlight>}}
 
===Fonts ?===
 
====Font====
{{Boxcode|code=<syntaxhighlight lang="xml">
<theme>
<!-- Font -------------------------------------------------------------------------------------------->
<font selection="1"/> <!-- 0: original, 1: rounded, 2: pop -->
</theme>
</syntaxhighlight>}}
 
 
==Firmware theme settings==
===[[sysconf_plugin]].rco===
{{Boxcode|code=<syntaxhighlight lang="xml">
<RcoFile UMDFlag="0" rcomageXmlVer="1.1" type="ps3" minFirmwareVer="unknownId0x120">
<MainTree name="sysconf_plugin">
<ImageTree>
...
</ImageTree>
<FontTree>
...
<FontStyle name="fontstyle_sanserif" unknownShort1="0x1" unknownShort2="0x0" unknownInt3="0x0" unknownInt4="0x41600000" />
...
</FontTree>
<TextTree>
...
</TextTree>
<ObjectTree>
...
<Page name="page_theme_config" unknownInt0="0x1110000" onInit="event:native:/OnInitMenuThemeConfig" onCancel="event:native:/OnCancelMenuThemeConfig" onContextMenu="nothing" onActivate="event:native:/OnActivateMenuThemeConfig">
<XList name="xlist_theme_config" posX="0" posY="0" objectScale="0" redScale="1" greenScale="1" blueScale="1" alphaScale="1" width="0" height="0" posUnknown="0" scaleWidth="1" scaleHeight="1" elementScale="1" iconOffset="0x0" onLoad="event:native:/OnInitXmListThemeConfig" unknown17="0x0" unknown18="0x0" unknown19="0x0" unknownInt20="0x0" unknownInt21="0x0" unknown22="0x0" unknownInt23="0x0" onMove="event:native:/OnCursorMoveXmListThemeConfig" onScrollIn="event:native:/OnScrollInXmListThemeConfig" onScrollOut="nothing" onPush="event:native:/OnPushXmListThemeConfig" onContext="nothing" onCancel="event:native:/OnCancelMenuThemeConfig" unknownEvent36="nothing"></XList>
</Page>
<Page name="page_theme_config_theme" unknownInt0="0x1110000" onInit="nothing" onCancel="event:native:/OnCancelThemeConfig" onContextMenu="nothing" onActivate="nothing"></Page>
<Page name="page_theme_config_color" unknownInt0="0x1110000" onInit="nothing" onCancel="event:native:/OnCancelThemeConfig" onContextMenu="nothing" onActivate="nothing"></Page>
<Page name="page_theme_config_background" unknownInt0="0x1110000" onInit="nothing" onCancel="event:native:/OnCancelThemeConfig" onContextMenu="nothing" onActivate="nothing"></Page>
<Page name="page_theme_config_font" unknownInt0="0x1110000" onInit="nothing" onCancel="event:native:/OnCancelThemeConfig" onContextMenu="nothing" onActivate="nothing"></Page>
<Page name="page_theme_info" unknownInt0="0x1110000" onInit="event:native:/OnInitPageThemeInfo" onCancel="event:native:/OnCancelPageThemeInfo" onContextMenu="nothing" onActivate="event:native:/OnActivatePageThemeInfo">
<Plane name="plane_theme_info" posX="0" posY="0" objectScale="0" redScale="1" greenScale="1" blueScale="1" alphaScale="1" width="0" height="0" posUnknown="0" scaleWidth="1" scaleHeight="1" elementScale="1" iconOffset="0x0" onLoad="nothing" unknown17="0x0" unknown18="0x0" unknown19="0x0" unknownInt20="0x0" unknownInt21="0x0" unknown22="0x0" image="nothing" unknownInt24="0x0">
<Plane name="plane_preview" posX="0" posY="0" objectScale="0" redScale="1" greenScale="1" blueScale="1" alphaScale="1" width="0" height="0" posUnknown="0" scaleWidth="1" scaleHeight="1" elementScale="1" iconOffset="0x200000" onLoad="nothing" unknown17="0x59040100" unknown18="0x5a040100" unknown19="0x100" unknownInt20="0x1045b" unknownInt21="0x1045c" unknown22="0x0" image="nothing" unknownInt24="0x0"></Plane>
<IList name="list_theme_info" posX="0" posY="0" objectScale="0" redScale="1" greenScale="1" blueScale="1" alphaScale="1" width="0" height="0" posUnknown="0" scaleWidth="1" scaleHeight="1" elementScale="1" iconOffset="0x110000" onLoad="event:native:/OnInitIlistThemeInfo" unknown17="0x61040100" unknown18="0x62040100" unknown19="0x100" unknownInt20="0x0" unknownInt21="0x10463" unknown22="0x0" unknown23="0x0" unknown24="0x0" unknownRef25="nothing" unknownRef27="nothing" unknownEvent29="nothing" unknownRef31="nothing" unknownRef33="nothing" unknownRef35="nothing" unknownRef37="nothing">
<Scroll name="scroll_theme_info" posX="0" posY="0" objectScale="0" redScale="1" greenScale="1" blueScale="1" alphaScale="1" width="8" height="172" posUnknown="1" scaleWidth="1" scaleHeight="1" elementScale="1" iconOffset="0x0" onLoad="nothing" unknown17="0x0" unknown18="0x0" unknown19="0x0" unknownInt20="0x0" unknownInt21="0x0" unknown22="0x0" unknownFloat23="100" unknownFloat24="100" unknown25="0x0" unknownRef26="nothing" unknownRef28="nothing" unknownRef30="nothing" unknownRef32="nothing" unknownRef34="nothing"></Scroll>
</IList>
</Plane>
</Page>
...
</ObjectTree>
</MainTree>
</RcoFile>
</syntaxhighlight>}}
Please note that all contributions to PS3 Developer wiki are considered to be released under the GNU Free Documentation License 1.2 (see PS3 Developer wiki:Copyrights for details). If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource. Do not submit copyrighted work without permission!

To protect the wiki against automated edit spam, we kindly ask you to solve the following hCaptcha:

Cancel Editing help (opens in new window)

Templates used on this page: